diff --git a/configs/privapp-permissions-fpcam.xml b/configs/privapp-permissions-fpcam.xml new file mode 100644 index 0000000000000000000000000000000000000000..cef62e45f5eaad7330c6fbd2f4db5b9eeb57cebc --- /dev/null +++ b/configs/privapp-permissions-fpcam.xml @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/device.mk b/device.mk index 9e8d1f614103c756bbffbe9b1f9d8b1912464785..ba5cf5d942c539329ba1b231d2a15afb0f0facbb 100644 --- a/device.mk +++ b/device.mk @@ -241,6 +241,13 @@ PRODUCT_COPY_FILES += \ PRODUCT_PACKAGES += \ fastbootd +# FPCamera +PRODUCT_PACKAGES += \ + FairphoneCameraService + +PRODUCT_COPY_FILES += \ + $(LOCAL_PATH)/configs/privapp-permissions-fpcam.xml:$(TARGET_COPY_OUT_SYSTEM)/etc/permissions/privapp-permissions-fpcam.xml + # Gatekeeper PRODUCT_PACKAGES += \ android.hardware.gatekeeper@1.0.vendor:64 diff --git a/parts/Android.bp b/parts/Android.bp new file mode 100644 index 0000000000000000000000000000000000000000..7d131ca3780ccd012533856833b84cba82e8e0c8 --- /dev/null +++ b/parts/Android.bp @@ -0,0 +1,24 @@ +// +// Copyright (C) 2023-2024 The LineageOS Project +// +// SPDX-License-Identifier: Apache-2.0 +// + +android_app { + name: "FairphoneCameraService", + + srcs: ["src/**/*.java"], + resource_dirs: ["res"], + certificate: "platform", + platform_apis: true, + system_ext_specific: true, + privileged: true, + + static_libs: [ + "org.lineageos.settings.resources", + ], + + optimize: { + proguard_flags_files: ["proguard.flags"], + }, +} diff --git a/parts/AndroidManifest.xml b/parts/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..0fdf13aa1df2236130f44c13c62b10dcb7ef2b84 --- /dev/null +++ b/parts/AndroidManifest.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/parts/proguard.flags b/parts/proguard.flags new file mode 100644 index 0000000000000000000000000000000000000000..2145628447c1c517cc772218a1f8f2a336bfcaff --- /dev/null +++ b/parts/proguard.flags @@ -0,0 +1,3 @@ +-keep class org.lineageos.settings.fpcamera.* { + *; +} diff --git a/parts/res/values/strings-de.xml b/parts/res/values/strings-de.xml new file mode 100644 index 0000000000000000000000000000000000000000..d833090869795351a7c1f430bbac9fefd40cb582 --- /dev/null +++ b/parts/res/values/strings-de.xml @@ -0,0 +1,9 @@ + + + + Fairphone-Kamera aktivieren + Aktivieren Sie diese Option, um die Fairphone-Kamera-App nutzen zu können. + diff --git a/parts/res/values/strings-es.xml b/parts/res/values/strings-es.xml new file mode 100644 index 0000000000000000000000000000000000000000..be515e4e4f0a999d5b5a4975eb219879e9f96642 --- /dev/null +++ b/parts/res/values/strings-es.xml @@ -0,0 +1,9 @@ + + + + Activar la cámara de Fairphone + Activa esta opción para poder usar la aplicación de cámara de Fairphone. + diff --git a/parts/res/values/strings-fr.xml b/parts/res/values/strings-fr.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6c7a112cc06c4438690207a3a6d535d597e3d5a --- /dev/null +++ b/parts/res/values/strings-fr.xml @@ -0,0 +1,9 @@ + + + + Activer l\'appareil photo de Fairphone + Activez cette option pour pouvoir utiliser l\'application appareil photo de Fairphone. + diff --git a/parts/res/values/strings-it.xml b/parts/res/values/strings-it.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e0409ddfabdf7d060badbba150069b3a5ff98b8 --- /dev/null +++ b/parts/res/values/strings-it.xml @@ -0,0 +1,9 @@ + + + + Attivare la fotocamera di Fairphone + Attiva questa opzione per poter utilizzare l\'app fotocamera di Fairphone. + diff --git a/parts/res/values/strings.xml b/parts/res/values/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..50d54cd2318fb7a838ff8babb26390d70162c151 --- /dev/null +++ b/parts/res/values/strings.xml @@ -0,0 +1,9 @@ + + + + Fairphone\'s camera + Activate this option to be able to use Fairphone\'s camera app. + diff --git a/parts/res/xml/fp_camera_settings.xml b/parts/res/xml/fp_camera_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..3ec65a7f4ed47453e4355bbff928aa062ce168cb --- /dev/null +++ b/parts/res/xml/fp_camera_settings.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/parts/src/org/lineageos/settings/BootCompletedReceiver.java b/parts/src/org/lineageos/settings/BootCompletedReceiver.java new file mode 100644 index 0000000000000000000000000000000000000000..3668216899899e05699d5b8b26932cfa15a77790 --- /dev/null +++ b/parts/src/org/lineageos/settings/BootCompletedReceiver.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2023-2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.lineageos.settings; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; + +import org.lineageos.settings.fpcamera.FPCameraUtils; + +public class BootCompletedReceiver extends BroadcastReceiver { + + private static final String TAG = "FairphoneCamera"; + + @Override + public void onReceive(final Context context, Intent intent) { + Log.d(TAG, "Received boot completed intent"); + FPCameraUtils.startService(context); + } +} diff --git a/parts/src/org/lineageos/settings/fpcamera/FPCameraActivity.java b/parts/src/org/lineageos/settings/fpcamera/FPCameraActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..51e3504edc454f3b31d0c10c4f0cef2cf8b56896 --- /dev/null +++ b/parts/src/org/lineageos/settings/fpcamera/FPCameraActivity.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2023-2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.lineageos.settings.fpcamera; + +import android.app.Activity; +import android.app.Fragment; +import android.os.Bundle; +import android.view.MenuItem; + +import com.android.settingslib.collapsingtoolbar.CollapsingToolbarBaseActivity; + +import org.lineageos.settings.R; + +public class FPCameraActivity extends CollapsingToolbarBaseActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + getFragmentManager().beginTransaction().replace(R.id.content_frame, + new FPCameraFragment(), "fpCamera").commit(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finishAfterTransition(); + return true; + } + return super.onOptionsItemSelected(item); + } +} diff --git a/parts/src/org/lineageos/settings/fpcamera/FPCameraFragment.java b/parts/src/org/lineageos/settings/fpcamera/FPCameraFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..e12f2d49dfe707402a2eba4ab6870726a286f15b --- /dev/null +++ b/parts/src/org/lineageos/settings/fpcamera/FPCameraFragment.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2023-2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.lineageos.settings.fpcamera; + +import android.os.Bundle; + +import androidx.preference.Preference; +import androidx.preference.PreferenceFragment; +import androidx.preference.SwitchPreference; + +import org.lineageos.settings.R; + +import java.io.IOException; + +public class FPCameraFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener { + + private static final String PREF_FP_CAMERA = "fp_camera_pref"; + + private SwitchPreference mFPCameraPref; + + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(R.xml.fp_camera_settings); + + mFPCameraPref = findPreference(PREF_FP_CAMERA); + mFPCameraPref.setOnPreferenceChangeListener(this); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mFPCameraPref) { + boolean value = (Boolean) newValue; + return FPCameraUtils.setApplicationEnabledSetting(getActivity(), value); + } + return false; + } + + @Override + public void onStop() { + super.onStop(); + } +} diff --git a/parts/src/org/lineageos/settings/fpcamera/FPCameraUtils.java b/parts/src/org/lineageos/settings/fpcamera/FPCameraUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..b8bf62f0690c3ff2e2b3fce0a49351495e65a814 --- /dev/null +++ b/parts/src/org/lineageos/settings/fpcamera/FPCameraUtils.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2023-2024 The LineageOS Project + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.lineageos.settings.fpcamera; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.UserHandle; +import android.util.Log; + +import androidx.preference.PreferenceManager; + +public class FPCameraUtils { + + private static final String TAG = "FPCameraUtils"; + private static final String PREF_FIRST_BOOT = "first_boot"; + private static final String FP_CAMERA_PACKAGE = "com.fp.camera"; + + public static boolean setApplicationEnabledSetting(Context context, boolean enable) { + PackageManager pm = context.getPackageManager(); + try { + pm.setApplicationEnabledSetting(FP_CAMERA_PACKAGE, + enable ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP); + return true; + } catch (Exception e) { + Log.e(TAG, "Failed to " + (enable ? "enable" : "disable") + " " + FP_CAMERA_PACKAGE, e); + return false; + } + } + + public static void startService(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + if (isFirstBoot(prefs)) { + boolean isFPCamDisabled = setApplicationEnabledSetting(context, false); + if (isFPCamDisabled) { + prefs.edit().putBoolean(PREF_FIRST_BOOT, false).apply(); + } + } + } + + private static boolean isFirstBoot(SharedPreferences prefs) { + return prefs.getBoolean(PREF_FIRST_BOOT, true); + } +} diff --git a/proprietary-files.txt b/proprietary-files.txt index fd9af2a1b6ffa9e39fa90e5258a047ab7de53e06..940eef5a2869d1bf346a29a4b3dd1b79e8921d93 100644 --- a/proprietary-files.txt +++ b/proprietary-files.txt @@ -159,7 +159,65 @@ vendor/lib64/libcamxstatscore.so vendor/lib64/libcamxswprocessalgo.so vendor/lib64/libcamxtintlessalgo.so +# Camera (FPCamera) +-priv-app/FPCamera/FPCamera.apk +system_ext/etc/public.libraries-tct.txt +system_ext/lib64/libtctcameraalgo_jni.tct.so +vendor/etc/camera/capture_cache +vendor/etc/camera/capture_model +vendor/etc/camera/capture_policy +vendor/etc/camera/cnet_h384w512_quan_0317_int8.tflite +vendor/etc/camera/intsense_config_singlebokeh.bin +vendor/etc/camera/modnet_c12v2_in_h416_w544.bin +vendor/etc/camera/modnet_c12v2_in_h416_w544.mnn +vendor/etc/camera/MotionDetParameter.cfg +vendor/etc/camera/params_back_000_200.txt +vendor/etc/camera/params_back_2000_4000.txt +vendor/etc/camera/params_back_200_400.txt +vendor/etc/camera/params_back_4000_10000.txt +vendor/etc/camera/params_back_400_2000.txt +vendor/etc/camera/params_front_0000_1000.txt +vendor/etc/camera/params_front_1000_2500.txt +vendor/etc/camera/params_front_2500_4000.txt +vendor/etc/camera/params_front_4000_5000.txt +vendor/etc/camera/params_SuperIQ.txt +vendor/etc/camera/params.txt +vendor/etc/camera/params_wide_0000_1000.txt +vendor/etc/camera/params_wide_1000_3000.txt +vendor/etc/camera/params_wide_3000_8000.txt +vendor/etc/camera/params_wide_8000_10000.txt +vendor/etc/camera/params_zoom_0100_0250.txt +vendor/etc/camera/params_zoom_0250_1400.txt +vendor/etc/camera/params_zoom_10000_18000.txt +vendor/etc/camera/params_zoom_1400_2300.txt +vendor/etc/camera/params_zoom_2300_10000.txt +vendor/etc/camera/quantize_scene_0528_freeze_graph.tflite +vendor/etc/camera/sg_cap_cache +vendor/etc/camera/sg_cap_model +vendor/etc/camera/sg_cap_policy +vendor/lib64/libmotionDet.so +vendor/lib64/libtcltflite.so +vendor/lib64/libtctcameraalgo.so +vendor/lib64/com.tct.cameraalgo.gs.so +vendor/lib64/com.tct.cameraalgo.hdr.so +vendor/lib64/com.tct.cameraalgo.hwmfnr.so +vendor/lib64/com.tct.cameraalgo.mirror.so +vendor/lib64/com.tct.cameraalgo.morpholdc.so +vendor/lib64/com.tct.cameraalgo.morphonight.so +vendor/lib64/com.tct.cameraalgo.morphozoom.so +vendor/lib64/com.tct.cameraalgo.singlebokeh.so +vendor/lib64/com.tct.cameraalgo.tcldualbokeh.so +vendor/lib64/com.tct.cameraalgo.watermark.so +vendor/lib64/libmorpho_image_refiner.so +vendor/lib64/libanc_single_bokeh.so +vendor/lib64/libanc_single_bokeh_rear.so +vendor/lib64/libtcl_dualcam_bokeh_cap.so +vendor/lib64/libtclSceneDetector.so +vendor/lib64/libmorpho_super_resolution.so +vendor/lib64/libmorpho_dcface.so + # Camera components +vendor/lib64/camera/components/com.morpho.node.hdr.so vendor/lib64/camera/components/com.morpho.node.ldc.so vendor/lib64/camera/components/com.morpho.node.moviesolid.so vendor/lib64/camera/components/com.morpho.node.sat.so @@ -197,6 +255,7 @@ vendor/lib64/camera/components/com.qtistatic.stats.aec.so vendor/lib64/camera/components/com.qtistatic.stats.af.so vendor/lib64/camera/components/com.qtistatic.stats.awb.so vendor/lib64/camera/components/com.qtistatic.stats.pdlib.so +vendor/lib64/camera/components/com.tct.node.scenedetect.so # Camera firmware vendor/firmware/CAMERA_ICP.elf diff --git a/rootdir/etc/init.target.rc b/rootdir/etc/init.target.rc index dbb78cec899fdbd7ad18dcb94e1867dc910dbb9a..f98501add9629742d8bf7641096325fa87606f7b 100644 --- a/rootdir/etc/init.target.rc +++ b/rootdir/etc/init.target.rc @@ -47,6 +47,7 @@ on init start keymaster-4-0 chmod 0660 /dev/fpsensor chown system system /dev/fpsensor + chown system camera /sys/devices/platform/soc/ac4a000.qcom,cci0/ac4a000.qcom,cci0:qcom,ois@0/ois_gain_get on early-fs start vold diff --git a/sepolicy/vendor/file_contexts b/sepolicy/vendor/file_contexts index a88844517f6b34b235f0a4285a4dbe5fcf6986f3..c98f85e0264439c2e030029580b2852dcb9df62f 100644 --- a/sepolicy/vendor/file_contexts +++ b/sepolicy/vendor/file_contexts @@ -5,6 +5,26 @@ /dev/stmvl53l1_ranging u:object_r:vl53l1_device:s0 /sys/class/board_id/version u:object_r:tct_mmitest_sysfs:s0 +# FPCamera +/vendor/lib64/libtctcameraalgo\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/com\.tct\.cameraalgo\.(.*)\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libundistort\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libfaceprotection\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libtflite_undist\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libtensorflowlite\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libmorpho_image_refiner\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libmpbase\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libtcl_dualcam_bokeh_cap\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libVDSuperPhotoAPI\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libancbase\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libanc_single_bokeh\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libanc_single_bokeh_rear\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libmorpho_super_resolution\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libanc_hdr\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/vendor.qti.hardware.camera.postproc@1.0\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libqcomisphidl\.so u:object_r:same_process_hal_file:s0 +/vendor/lib64/libmorpho_dcface\.so u:object_r:same_process_hal_file:s0 + # Fingerprint /data/fpsensor(/.*)? u:object_r:fpsensor_data_file:s0 /dev/fpsensor u:object_r:fpsensor_fp_device:s0 diff --git a/sepolicy/vendor/genfs_contexts b/sepolicy/vendor/genfs_contexts index b8d09cfb7954145e59cf781a7b85ac8e9acbec0c..dc5c5ceead504a570c69ff2f6a48f2b27fae4876 100644 --- a/sepolicy/vendor/genfs_contexts +++ b/sepolicy/vendor/genfs_contexts @@ -1,3 +1,6 @@ +# FPCamera +genfscon sysfs /devices/platform/soc/ac4a000.qcom,cci0/ac4a000.qcom,cci0:qcom,ois@0/ois_gain_get u:object_r:tct_mmitest_sysfs:s0 + # LED genfscon sysfs /devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-05/c440000.qcom,spmi:qcom,pm6150l@5:qcom,wled@d800/backlight/backlight/brightness u:object_r:sysfs_leds:s0 diff --git a/sepolicy/vendor/hal_camera_default.te b/sepolicy/vendor/hal_camera_default.te index 9ce0a3b56188eecb5303f26b516e4f138c1cefd2..6c8ab87e6450f99da3869af4c564ff68f18b12bc 100644 --- a/sepolicy/vendor/hal_camera_default.te +++ b/sepolicy/vendor/hal_camera_default.te @@ -2,6 +2,7 @@ allow hal_camera_default vl53l1_device:chr_file rw_file_perms; allow hal_camera_default vendor_xdsp_device:chr_file r_file_perms; allow hal_camera_default mnt_vendor_file:dir r_dir_perms; -allow hal_camera_default tct_mmitest_sysfs:file r_file_perms; +allow hal_camera_default tct_mmitest_sysfs:file rw_file_perms; +get_prop(hal_camera_default, vendor_tct_default_prop) set_prop(hal_camera_default, vendor_t2m_sys_prop) diff --git a/sepolicy/vendor/property_contexts b/sepolicy/vendor/property_contexts index 0c8be86de9836d55c5d6670c2ab40e8f80bdc38f..ca2cbd323648f6219b828f18a1b1678966526d37 100644 --- a/sepolicy/vendor/property_contexts +++ b/sepolicy/vendor/property_contexts @@ -1,18 +1,38 @@ # Bluetooth -persist.vendor.bt.a2dp_offload_cap u:object_r:vendor_bluetooth_prop:s0 +persist.vendor.bt.a2dp_offload_cap u:object_r:vendor_bluetooth_prop:s0 # Bluetooth MAC -ro.vendor.t2m.btmac u:object_r:vendor_t2m_sys_prop:s0 +ro.vendor.t2m.btmac u:object_r:vendor_t2m_sys_prop:s0 # Camera -vendor.t2m.camera_main.vcm_id u:object_r:vendor_t2m_sys_prop:s0 +vendor.t2m.camera_main.vcm_id u:object_r:vendor_t2m_sys_prop:s0 + +# FPCamera +persist.vendor.tct.camera.dualbokeh.dump u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.jpeg.dump u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.mirror.dump u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.morphomfnr.enable u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.morphozoom.dump u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.morphozoom.enable u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.tcldistortion.dump u:object_r:vendor_tct_default_prop:s0 +persist.vendor.tct.camera.watermark.dump u:object_r:vendor_tct_default_prop:s0 +persist.camera.morpholdc.isEnable u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.dualbokeh.blurlevel u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.dualbokeh.degree u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.dualbokeh.printfocus u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.dump.mode u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.tcldistortion.drawface u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.tcldistortion.enable u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.thumbnail.dump u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.thumbRotate.enable u:object_r:vendor_tct_default_prop:s0 +vendor.tct.camera.writeICCProfile u:object_r:vendor_tct_default_prop:s0 # Light Sensor Calibration -ro.vendor.tct.backcaldata u:object_r:vendor_tct_default_prop:s0 -ro.vendor.tct.frontcaldata u:object_r:vendor_tct_default_prop:s0 +ro.vendor.tct.backcaldata u:object_r:vendor_tct_default_prop:s0 +ro.vendor.tct.frontcaldata u:object_r:vendor_tct_default_prop:s0 # Serial Nums -vendor.t2m.camera_main.sn u:object_r:vendor_t2m_sys_prop:s0 -vendor.t2m.camera_aux.sn u:object_r:vendor_t2m_sys_prop:s0 -vendor.t2m.camera_front.sn u:object_r:vendor_t2m_sys_prop:s0 -vendor.t2m.fingerprint.chipid u:object_r:vendor_t2m_sys_prop:s0 +vendor.t2m.camera_main.sn u:object_r:vendor_t2m_sys_prop:s0 +vendor.t2m.camera_aux.sn u:object_r:vendor_t2m_sys_prop:s0 +vendor.t2m.camera_front.sn u:object_r:vendor_t2m_sys_prop:s0 +vendor.t2m.fingerprint.chipid u:object_r:vendor_t2m_sys_prop:s0