readded the original files, builds break without it

This commit is contained in:
lv
2023-12-17 09:51:56 -05:00
parent a7e2b88e56
commit 3ea3407add
85 changed files with 48612 additions and 2 deletions

View File

@@ -0,0 +1,80 @@
From 51ee2c02c249cec676666e96c38ef490691472b8 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 14 May 2020 19:54:55 +0200
Subject: [PATCH 09/27] Add persist.sys.phh.samsung.camera_ids property to
access hidden Samsung cameras
Change-Id: I2c7bf535272acc28ed2277e96c78ddd28a0b4593
---
services/camera/libcameraservice/Android.bp | 1 +
.../common/hidl/HidlProviderInfo.cpp | 14 ++++++++++++--
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 981c56942c..7c4e4d9bcd 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -164,6 +164,7 @@ cc_library_shared {
"android.hardware.camera.device@3.6",
"android.hardware.camera.device@3.7",
"android.hardware.camera.device-V1-ndk",
+ "vendor.samsung.hardware.camera.provider@3.0",
"media_permission-aidl-cpp",
],
diff --git a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
index 630090b4ac..1acf9c2990 100644
--- a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
+++ b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
@@ -27,6 +27,7 @@
#include <utils/Trace.h>
#include <android/hardware/camera/device/3.7/ICameraDevice.h>
+#include <vendor/samsung/hardware/camera/provider/3.0/ISehCameraProvider.h>
namespace {
const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
@@ -134,6 +135,7 @@ status_t HidlProviderInfo::initializeHidlProvider(
mMinorVersion = 6;
}
}
+
// We need to check again since cast2_6.isOk() succeeds even if the provider
// version isn't actually 2.6.
if (interface2_6 == nullptr){
@@ -170,6 +172,9 @@ status_t HidlProviderInfo::initializeHidlProvider(
return mapToStatusT(status);
}
+ auto samsungCast = vendor::samsung::hardware::camera::provider::V3_0::ISehCameraProvider::castFrom(interface);
+ auto samsungProvider = samsungCast.isOk() ? static_cast<sp<vendor::samsung::hardware::camera::provider::V3_0::ISehCameraProvider>>(samsungCast) : nullptr;
+
hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
if (!linked.isOk()) {
ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
@@ -200,7 +205,7 @@ status_t HidlProviderInfo::initializeHidlProvider(
// Get initial list of camera devices, if any
std::vector<std::string> devices;
- hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices](
+ auto cb = [&status, this, &devices](
Status idStatus,
const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) {
status = idStatus;
@@ -217,7 +222,12 @@ status_t HidlProviderInfo::initializeHidlProvider(
mProviderPublicCameraIds.push_back(id);
}
}
- } });
+ } };
+ hardware::Return<void> ret;
+ if(samsungProvider != nullptr && property_get_bool("persist.sys.phh.samsung.camera_ids", false))
+ ret = samsungProvider->sehGetCameraIdList(cb);
+ else
+ ret = interface->getCameraIdList(cb);
if (!ret.isOk()) {
ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s",
__FUNCTION__, mProviderName.c_str(), linked.description().c_str());
--
2.34.1

View File

@@ -0,0 +1,67 @@
From ce308a54ba2c124fe2f13b82cb3eec26ccb939a5 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 13 Mar 2021 14:20:03 -0500
Subject: [PATCH 14/27] Support Samsung R multi-cams
Change-Id: If46f385e8dd16185cbf37ab083e6a1242e1d1555
---
services/camera/libcameraservice/Android.bp | 1 +
.../libcameraservice/common/hidl/HidlProviderInfo.cpp | 8 +++++++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 7c4e4d9bcd..1faeb60ba7 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -165,6 +165,7 @@ cc_library_shared {
"android.hardware.camera.device@3.7",
"android.hardware.camera.device-V1-ndk",
"vendor.samsung.hardware.camera.provider@3.0",
+ "vendor.samsung.hardware.camera.provider@4.0",
"media_permission-aidl-cpp",
],
diff --git a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
index 1acf9c2990..367ffb8cdc 100644
--- a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
+++ b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
@@ -28,6 +28,7 @@
#include <android/hardware/camera/device/3.7/ICameraDevice.h>
#include <vendor/samsung/hardware/camera/provider/3.0/ISehCameraProvider.h>
+#include <vendor/samsung/hardware/camera/provider/4.0/ISehCameraProvider.h>
namespace {
const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
@@ -173,7 +174,9 @@ status_t HidlProviderInfo::initializeHidlProvider(
}
auto samsungCast = vendor::samsung::hardware::camera::provider::V3_0::ISehCameraProvider::castFrom(interface);
+ auto samsung40Cast = vendor::samsung::hardware::camera::provider::V4_0::ISehCameraProvider::castFrom(interface);
auto samsungProvider = samsungCast.isOk() ? static_cast<sp<vendor::samsung::hardware::camera::provider::V3_0::ISehCameraProvider>>(samsungCast) : nullptr;
+ auto samsung40Provider = samsung40Cast.isOk() ? static_cast<sp<vendor::samsung::hardware::camera::provider::V4_0::ISehCameraProvider>>(samsung40Cast) : nullptr;
hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
if (!linked.isOk()) {
@@ -211,6 +214,7 @@ status_t HidlProviderInfo::initializeHidlProvider(
status = idStatus;
if (status == Status::OK) {
for (auto& name : cameraDeviceNames) {
+ ALOGE("Listing camera ID %s", name.c_str());
uint16_t major, minor;
std::string type, id;
status_t res = parseDeviceName(name, &major, &minor, &type, &id);
@@ -224,7 +228,9 @@ status_t HidlProviderInfo::initializeHidlProvider(
}
} };
hardware::Return<void> ret;
- if(samsungProvider != nullptr && property_get_bool("persist.sys.phh.samsung.camera_ids", false))
+ if(samsung40Provider != nullptr && property_get_bool("persist.sys.phh.samsung.camera_ids", false))
+ ret = samsung40Provider->sehGetCameraIdList(cb);
+ else if(samsungProvider != nullptr && property_get_bool("persist.sys.phh.samsung.camera_ids", false))
ret = samsungProvider->sehGetCameraIdList(cb);
else
ret = interface->getCameraIdList(cb);
--
2.34.1

View File

@@ -0,0 +1,57 @@
From 0fa119c66801a5e2a0fce1055bfbc261d65c00fb Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 16 Apr 2022 14:30:14 -0400
Subject: [PATCH 22/27] Add a prop to change Samsung flash strength
---
services/camera/libcameraservice/Android.bp | 1 +
.../common/hidl/HidlProviderInfo.cpp | 14 +++++++++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 1faeb60ba7..8c588065cf 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -166,6 +166,7 @@ cc_library_shared {
"android.hardware.camera.device-V1-ndk",
"vendor.samsung.hardware.camera.provider@3.0",
"vendor.samsung.hardware.camera.provider@4.0",
+ "vendor.samsung.hardware.camera.device@5.0",
"media_permission-aidl-cpp",
],
diff --git a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
index 367ffb8cdc..362945a1ea 100644
--- a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
+++ b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
@@ -29,6 +29,7 @@
#include <android/hardware/camera/device/3.7/ICameraDevice.h>
#include <vendor/samsung/hardware/camera/provider/3.0/ISehCameraProvider.h>
#include <vendor/samsung/hardware/camera/provider/4.0/ISehCameraProvider.h>
+#include <vendor/samsung/hardware/camera/device/5.0/ISehCameraDevice.h>
namespace {
const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
@@ -781,7 +782,18 @@ HidlProviderInfo::HidlDeviceInfo3::HidlDeviceInfo3(
status_t HidlProviderInfo::HidlDeviceInfo3::setTorchMode(bool enabled) {
using hardware::camera::common::V1_0::TorchMode;
const sp<hardware::camera::device::V3_2::ICameraDevice> interface = startDeviceInterface();
- Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
+ int32_t flashStrength = property_get_int32("persist.sys.phh.flash_strength", 1);
+
+ auto sehCast = vendor::samsung::hardware::camera::device::V5_0::ISehCameraDevice::castFrom(interface);
+ android::sp<vendor::samsung::hardware::camera::device::V5_0::ISehCameraDevice> seh = sehCast;
+
+ Status s;
+ if(seh != nullptr) {
+ s = seh->sehSetTorchModeStrength(enabled ? TorchMode::ON : TorchMode::OFF, flashStrength);
+ } else {
+ s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
+ }
+
return mapToStatusT(s);
}
--
2.34.1

View File

@@ -0,0 +1,52 @@
From 7ba94ce583e1ab8b6bf86f798865082bd1bd86e9 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 2 May 2022 17:37:09 -0400
Subject: [PATCH 23/27] Support variable flash strength on samsung hal 4.0
---
services/camera/libcameraservice/Android.bp | 1 +
.../libcameraservice/common/hidl/HidlProviderInfo.cpp | 6 ++++++
2 files changed, 7 insertions(+)
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 8c588065cf..769862aaa2 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -167,6 +167,7 @@ cc_library_shared {
"vendor.samsung.hardware.camera.provider@3.0",
"vendor.samsung.hardware.camera.provider@4.0",
"vendor.samsung.hardware.camera.device@5.0",
+ "vendor.samsung.hardware.camera.device@4.0",
"media_permission-aidl-cpp",
],
diff --git a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
index 362945a1ea..62c57cd4f7 100644
--- a/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
+++ b/services/camera/libcameraservice/common/hidl/HidlProviderInfo.cpp
@@ -30,6 +30,7 @@
#include <vendor/samsung/hardware/camera/provider/3.0/ISehCameraProvider.h>
#include <vendor/samsung/hardware/camera/provider/4.0/ISehCameraProvider.h>
#include <vendor/samsung/hardware/camera/device/5.0/ISehCameraDevice.h>
+#include <vendor/samsung/hardware/camera/device/4.0/ISehCameraDevice.h>
namespace {
const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
@@ -787,9 +788,14 @@ status_t HidlProviderInfo::HidlDeviceInfo3::setTorchMode(bool enabled) {
auto sehCast = vendor::samsung::hardware::camera::device::V5_0::ISehCameraDevice::castFrom(interface);
android::sp<vendor::samsung::hardware::camera::device::V5_0::ISehCameraDevice> seh = sehCast;
+ auto sehCast2 = vendor::samsung::hardware::camera::device::V4_0::ISehCameraDevice::castFrom(interface);
+ android::sp<vendor::samsung::hardware::camera::device::V4_0::ISehCameraDevice> seh2 = sehCast2;
+
Status s;
if(seh != nullptr) {
s = seh->sehSetTorchModeStrength(enabled ? TorchMode::ON : TorchMode::OFF, flashStrength);
+ } else if(seh2 != nullptr) {
+ s = seh2->sehSetTorchModeStrength(enabled ? TorchMode::ON : TorchMode::OFF, flashStrength);
} else {
s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
}
--
2.34.1

View File

@@ -0,0 +1,25 @@
From 1d2d5b9d635f06d8b686a326c33d893d441cd106 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 6 Aug 2018 12:49:00 +0200
Subject: [PATCH 06/40] Show APN Settings for CDMA carriers
---
telephony/java/android/telephony/CarrierConfigManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 741721d14ac1..2b08fa644779 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -8712,7 +8712,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
sDefaults.putBoolean(KEY_PREFER_2G_BOOL, false);
sDefaults.putBoolean(KEY_4G_ONLY_BOOL, false);
- sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, false);
+ sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, true);
sDefaults.putBoolean(KEY_SHOW_CDMA_CHOICES_BOOL, false);
sDefaults.putBoolean(KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORT_EMERGENCY_SMS_OVER_IMS_BOOL, false);
--
2.34.1

View File

@@ -0,0 +1,26 @@
From afe65799c5be40b760f0bf4208f3062f52f6d999 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 24 Mar 2019 23:05:14 +0100
Subject: [PATCH 08/40] Support samsung Pie and Q light hal
Change-Id: I01f94acd7d0672733e48854d80368f9ac6f861c6
---
services/core/jni/Android.bp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 0d49f5fffb4b..1fc974ebc56f 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -186,6 +186,8 @@ cc_defaults {
"android.system.suspend.control.internal-cpp",
"android.system.suspend-V1-ndk",
"service.incremental",
+ "vendor.samsung.hardware.light@2.0",
+ "vendor.samsung.hardware.light@3.0",
],
static_libs: [
--
2.34.1

View File

@@ -0,0 +1,67 @@
From 74f65c6b4812fcbe4c0e7e9805d7d9c5af597cea Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 12 Aug 2019 23:08:26 +0200
Subject: [PATCH 09/40] Add support for samsung touch, physical and hover
proximity sensor as fallback to real proximity sensor
Change-Id: I7a0f8b4665c802140d19197d850b77b2a7ac1865
---
.../display/DisplayPowerController.java | 35 +++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 864ea43c8b01..d1be15c62fc8 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -2186,6 +2186,27 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
? Sensor.TYPE_PROXIMITY : SensorUtils.NO_FALLBACK;
mProximitySensor = SensorUtils.findSensor(mSensorManager, proxSensor.type, proxSensor.name,
fallbackType);
+ if(mProximitySensor == null) {
+ java.util.List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
+ for(Sensor sensor: sensors) {
+ if("com.samsung.sensor.physical_proximity".equals(sensor.getStringType()))
+ mProximitySensor = sensor;
+ }
+ }
+ if(mProximitySensor == null) {
+ java.util.List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
+ for(Sensor sensor: sensors) {
+ if("com.samsung.sensor.hover_proximity".equals(sensor.getStringType()))
+ mProximitySensor = sensor;
+ }
+ }
+ if(mProximitySensor == null) {
+ java.util.List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
+ for(Sensor sensor: sensors) {
+ if("com.samsung.sensor.touch_proximity".equals(sensor.getStringType()))
+ mProximitySensor = sensor;
+ }
+ }
if (mProximitySensor != null) {
mProximityThreshold = Math.min(mProximitySensor.getMaximumRange(),
TYPICAL_PROXIMITY_THRESHOLD);
@@ -3304,6 +3325,20 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
public void onSensorChanged(SensorEvent event) {
if (mProximitySensorEnabled) {
final long time = SystemClock.uptimeMillis();
+ if("com.samsung.sensor.touch_proximity".equals(mProximitySensor.getStringType())) {
+ int v = (int)event.values[0];
+ boolean positive = (v <= 4);
+ android.util.Log.d("PHH", "Samsung sensor changed " + positive + ":" + v);
+ handleProximitySensorEvent(time, positive);
+ return;
+ }
+ if("com.samsung.sensor.hover_proximity".equals(mProximitySensor.getStringType())) {
+ float v = event.values[0];
+ boolean positive = (v >= 0.5f && v <= 4.5);
+ android.util.Log.d("PHH", "Samsung hover sensor changed " + positive + ":" + v);
+ handleProximitySensorEvent(time, positive);
+ return;
+ }
final float distance = event.values[0];
boolean positive = distance >= 0.0f && distance < mProximityThreshold;
handleProximitySensorEvent(time, positive);
--
2.34.1

View File

@@ -0,0 +1,121 @@
From e46a9f944f561ec28a22fca69531c429cd6e2e5b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 24 Mar 2018 08:01:48 +0100
Subject: [PATCH 22/40] backlight: Fix backlight control on Galaxy S9(+)
Change-Id: I1fbbb47939c377597ef8ad6b88b2acea5f4acaa6
:backlight: S9 brightness override only for screen
Change-Id: Ie16a46336fa64850014b962429f7a20ff569222f
:backlight: [WIP] Fix OP6 brightness
Change-Id: If08959ece6cac1f27e1f1a0bd966ee8e1813241d
:backlight: Try to make brightness more generic using property set by rw-system
Change-Id: I0f20ca4b1f0fa1fcfd19833aa291fbdf16d6eedd
:backlight: Add Qualcomm starlte
Change-Id: I12a445344deb8b2e59a2f6ce6b24c1ffe5675092
:backlight: Switch samsung light fingerprint match to regexp, to include Note9
Change-Id: I2995f7bab615aec125927a5a027ad8f9ae43405f
Add a property toggle to enable high brightness range on samsung device
Change-Id: I649a3985ef87f46a5515a63935fdae9cdcbd8ec5
:backlight: Add japanese S9
Change-Id: I5e245469f5f51fed14c6080e5be72506e10389e0
:backlight: Fix backlight on S10*. Add an additional property to check, so testers can try it more easily
Change-Id: Ia224e641cad8561201b4dee3d896362bee80c903
:backlight: Make samsung light HAL more overridable
Change-Id: Ie04f394f8a614da8070f330bcadbcbe12895bed0
Use new backlight control API only for backlight, not for other lights
Change-Id: I35c35fabff8b275f35671dcb8578b96dcad526f1
:backlight: fixup
Change-Id: I4e85178327d2bb63d5d0a37786058843662a89ba
---
.../android/server/lights/LightsService.java | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index fea6b29d9260..caf9eba7d9a8 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -32,6 +32,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.os.Trace;
import android.provider.Settings;
import android.util.Slog;
@@ -295,6 +296,51 @@ public class LightsService extends SystemService {
return;
}
int brightnessInt = BrightnessSynchronizer.brightnessFloatToInt(brightness);
+
+ if(mHwLight.id == 0) {
+ String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
+ if(fp.matches(".*astarqlte.*")) {
+ int newBrightness = brightnessInt;
+ if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
+ newBrightness = (int) (brightnessInt * 365.0 / 255.0);
+ }
+ setLightLocked(newBrightness, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
+
+ int useSamsungBacklight = SystemProperties.getInt("persist.sys.phh.samsung_backlight", -1);
+ if(useSamsungBacklight != 0) {
+ if(useSamsungBacklight > 0 ||
+ fp.matches(".*beyond.*lte.*") ||
+ fp.matches(".*(crown|star)[q2]*lte.*") ||
+ fp.matches(".*(SC-0[23]K|SCV3[89]).*")) {
+ int ratio = 100;
+ if(useSamsungBacklight > 1)
+ ratio = useSamsungBacklight;
+ int newBrightness = brightnessInt * ratio;
+ if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
+ newBrightness = (int) (brightnessInt * 40960.0 / 255.0);
+ }
+ setLightLocked(newBrightness, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
+ }
+
+ boolean qcomExtendBrightness = SystemProperties.getBoolean("persist.extend.brightness", false);
+ int scale = SystemProperties.getInt("persist.display.max_brightness", 1023);
+ //This is set by vndk-detect
+ int qcomScale = SystemProperties.getInt("persist.sys.qcom-brightness", -1);
+ if(qcomScale != -1) {
+ qcomExtendBrightness = true;
+ scale = qcomScale;
+ }
+
+ if(qcomExtendBrightness) {
+ setLightLocked(brightnessInt * scale / 255, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+ return;
+ }
+ }
+
int color = brightnessInt & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
--
2.34.1

View File

@@ -0,0 +1,27 @@
From 2e3edc114941d9f984065a8dc62c1ae6ebe53dc6 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 27 Dec 2021 17:57:11 -0500
Subject: [PATCH 24/40] Once we integrate Samsung Power hal in libpowermanager,
libpowermanager and its deps require linking against
vendor.samsung.hardware.miscpower@2.0
Change-Id: I9084f64e505009abe9420d28b44199605cee52d8
---
services/core/jni/Android.bp | 1 +
1 file changed, 1 insertion(+)
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 1fc974ebc56f..c73b29739cbf 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -188,6 +188,7 @@ cc_defaults {
"service.incremental",
"vendor.samsung.hardware.light@2.0",
"vendor.samsung.hardware.light@3.0",
+ "vendor.samsung.hardware.miscpower@2.0",
],
static_libs: [
--
2.34.1

View File

@@ -0,0 +1,102 @@
From 045b26b61ba6c6a0f74b0ed4b06ad67c8cb160e3 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 14 Dec 2022 17:21:00 -0500
Subject: [PATCH 30/40] Call Samsung's ISehSysInputDev to report screen state
to touchscreen driver
This fixes touchscreen not waking up on Galaxy F23
---
services/core/Android.bp | 1 +
.../server/display/LocalDisplayAdapter.java | 32 +++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index faf7da35813a..ebd4373e25c1 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -174,6 +174,7 @@ java_library_static {
"motorola.hardware.health-V1.0-java",
"overlayable_policy_aidl-java",
"com.android.sysprop.watchdog",
+ "vendor.samsung.hardware.sysinput-V1.2-java", // HIDL
],
javac_shard_size: 50,
}
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 58a182a61e44..84c3982458ff 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -33,6 +33,7 @@ import android.os.Trace;
import android.util.DisplayUtils;
import android.util.LongSparseArray;
import android.util.Slog;
+import android.util.Log;
import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayAddress;
@@ -48,6 +49,8 @@ import com.android.server.LocalServices;
import com.android.server.lights.LightsManager;
import com.android.server.lights.LogicalLight;
+import vendor.samsung.hardware.sysinput.V1_1.ISehSysInputDev;
+
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
@@ -228,6 +231,8 @@ final class LocalDisplayAdapter extends DisplayAdapter {
private DisplayEventReceiver.FrameRateOverride[] mFrameRateOverrides =
new DisplayEventReceiver.FrameRateOverride[0];
+ private boolean triedSamsungHal = false;
+ private ISehSysInputDev samsungSysinput = null;
LocalDisplayDevice(IBinder displayToken, long physicalDisplayId,
SurfaceControl.StaticDisplayInfo staticDisplayInfo,
@@ -815,17 +820,44 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
mSidekickActive = false;
}
+ if (!triedSamsungHal) {
+ triedSamsungHal = true;
+ try {
+ samsungSysinput = ISehSysInputDev.getService();
+ } catch(Throwable t) {}
+ }
final int mode = getPowerModeForState(state);
Trace.traceBegin(Trace.TRACE_TAG_POWER, "setDisplayState("
+ "id=" + physicalDisplayId
+ ", state=" + Display.stateToString(state) + ")");
+
+ if (samsungSysinput != null) {
+ try {
+ Log.d("PHH", "setTspEnable 1, " + state + ", true");
+ samsungSysinput.setTspEnable(1, state, true);
+ } catch(Throwable t) {
+ Log.d("PHH", "Failed settings tsp enable", t);
+ }
+ }
+
try {
mSurfaceControlProxy.setDisplayPowerMode(token, mode);
Trace.traceCounter(Trace.TRACE_TAG_POWER, "DisplayPowerMode", mode);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_POWER);
}
+
+ if (samsungSysinput != null) {
+ try {
+ Log.d("PHH", "setTspEnable 1, " + state + ", false");
+ samsungSysinput.setTspEnable(1, state, false);
+ } catch(Throwable t) {
+ Log.d("PHH", "Failed settings tsp enable", t);
+ }
+ }
+
setCommittedState(state);
+
// If we're entering a suspended (but not OFF) power state and we
// have a sidekick available, tell it now that it can take control.
if (Display.isSuspendedState(state) && state != Display.STATE_OFF
--
2.34.1

View File

@@ -0,0 +1,566 @@
From 9608e159585b0fad82cede7fd9dca5e50a71672b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 18 Dec 2022 18:20:40 -0500
Subject: [PATCH 32/40] FOD support for Asus ZF8 and Samsung devices
Thanks Asus for providing a free device to make this support
And thanks @davigamer987 for donating enough to get a Samsung FOD device
to make this
Change-Id: Ib328f39217c3f9b42e13e186496b3f6391643637
---
packages/SystemUI/Android.bp | 1 +
packages/SystemUI/res/values/config.xml | 2 +-
.../biometrics/UdfpsControllerOverlay.kt | 7 +-
.../android/systemui/biometrics/UdfpsView.kt | 138 ++++++++++
services/core/Android.bp | 7 +-
.../server/biometrics/AuthService.java | 238 +++++++++++++++++-
6 files changed, 388 insertions(+), 5 deletions(-)
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index b4027197344d..0637dd4b4471 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -178,6 +178,7 @@ android_library {
"LowLightDreamLib",
"motion_tool_lib",
"vendor.lineage.powershare-V1.0-java",
+ "vendor.goodix.hardware.biometrics.fingerprint-V2.1-java",
],
manifest: "AndroidManifest.xml",
additional_manifests: ["LineageManifest.xml"],
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 0743bcdde621..99f21ed21d15 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -585,7 +585,7 @@
<!-- The radius of the enrollment progress bar, in dp -->
<integer name="config_udfpsEnrollProgressBar" translatable="false">
- 70
+ 50
</integer>
<!-- The time (in ms) needed to trigger the lock icon view's long-press affordance -->
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
index b6b5d26b398c..88c2976d81ab 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt
@@ -120,7 +120,9 @@ class UdfpsControllerOverlay @JvmOverloads constructor(
gravity = android.view.Gravity.TOP or android.view.Gravity.LEFT
layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
flags = (Utils.FINGERPRINT_OVERLAY_LAYOUT_PARAM_FLAGS or
- WindowManager.LayoutParams.FLAG_SPLIT_TOUCH)
+ WindowManager.LayoutParams.FLAG_SPLIT_TOUCH) or
+ WindowManager.LayoutParams.FLAG_DIM_BEHIND
+ dimAmount = 0.0f
privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY
// Avoid announcing window title.
accessibilityTitle = " "
@@ -189,6 +191,9 @@ class UdfpsControllerOverlay @JvmOverloads constructor(
windowManager.addView(this, coreLayoutParams.updateDimensions(animation))
sensorRect = sensorBounds
touchExplorationEnabled = accessibilityManager.isTouchExplorationEnabled
+ dimUpdate = {
+ windowManager.updateViewLayout(this, coreLayoutParams.updateDimensions(animation).apply { dimAmount = it })
+ }
overlayTouchListener = TouchExplorationStateChangeListener {
if (accessibilityManager.isTouchExplorationEnabled) {
setOnHoverListener { v, event -> onTouch(v, event, true) }
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
index e61c614f0292..cdaad81b9222 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
@@ -19,18 +19,27 @@ import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
+import android.graphics.PixelFormat
import android.graphics.PointF
import android.graphics.Rect
import android.graphics.RectF
+import android.os.FileObserver
import android.util.AttributeSet
import android.util.Log
import android.view.MotionEvent
+import android.view.SurfaceHolder
+import android.view.SurfaceView
+import android.view.ViewGroup
import android.widget.FrameLayout
import com.android.systemui.R
import com.android.systemui.doze.DozeReceiver
+import java.io.File
+
+import vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon
private const val TAG = "UdfpsView"
+
/**
* The main view group containing all UDFPS animations.
*/
@@ -38,6 +47,54 @@ class UdfpsView(
context: Context,
attrs: AttributeSet?
) : FrameLayout(context, attrs), DozeReceiver {
+ private var currentOnIlluminatedRunnable: Runnable? = null
+ private val mySurfaceView = SurfaceView(context)
+ init {
+ mySurfaceView.setVisibility(INVISIBLE)
+ mySurfaceView.setZOrderOnTop(true)
+ addView(mySurfaceView, FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))
+ mySurfaceView.holder.addCallback(object: SurfaceHolder.Callback{
+ override fun surfaceCreated(p0: SurfaceHolder) {
+ Log.d("PHH", "Surface created!")
+ val paint = Paint(0 /* flags */);
+ paint.setAntiAlias(true);
+ paint.setStyle(Paint.Style.FILL);
+ val colorStr = android.os.SystemProperties.get("persist.sys.phh.fod_color", "00ff00");
+ try {
+ val parsedColor = Color.parseColor("#" + colorStr);
+ val r = (parsedColor shr 16) and 0xff;
+ val g = (parsedColor shr 8) and 0xff;
+ val b = (parsedColor shr 0) and 0xff;
+ paint.setARGB(255, r, g, b);
+ } catch(t: Throwable) {
+ Log.d("PHH", "Failed parsing color #" + colorStr, t);
+ }
+ var canvas: Canvas? = null
+ try {
+ canvas = p0.lockCanvas();
+Log.d("PHH", "Surface dimensions ${canvas.getWidth()*1.0f} ${canvas.getHeight()*1.0f}")
+ canvas.drawOval(RectF(0.0f, 0.0f, canvas.getWidth()*1.0f, canvas.getHeight()*1.0f), paint);
+ } finally {
+ // Make sure the surface is never left in a bad state.
+ if (canvas != null) {
+ p0.unlockCanvasAndPost(canvas);
+ }
+ }
+
+ currentOnIlluminatedRunnable?.run()
+ }
+
+ override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) {
+Log.d("PHH", "Got surface size $p1 $p2 $p3")
+ }
+
+ override fun surfaceDestroyed(p0: SurfaceHolder) {
+Log.d("PHH", "Surface destroyed!")
+ }
+ })
+ mySurfaceView.holder.setFormat(PixelFormat.RGBA_8888)
+
+ }
// Use expanded overlay when feature flag is true, set by UdfpsViewController
var useExpandedOverlay: Boolean = false
@@ -66,6 +123,8 @@ class UdfpsView(
/** Parameters that affect the position and size of the overlay. */
var overlayParams = UdfpsOverlayParams()
+ var dimUpdate: (Float) -> Unit = {}
+
/** Debug message. */
var debugMessage: String? = null
set(value) {
@@ -146,15 +205,94 @@ class UdfpsView(
!(animationViewController?.shouldPauseAuth() ?: false)
}
+ fun goodixCmd(id: Int) {
+ val goodixSvc = IGoodixFingerprintDaemon.getService()
+ if(goodixSvc != null) {
+ goodixSvc.sendCommand(id, ArrayList(), { returnCode, resultData -> {
+ Log.e("PHH-Enroll", "Goodix send command returned code "+ returnCode);
+ }});
+ }
+ }
+
+ val asusGhbmOnAchieved = "/sys/class/drm/ghbm_on_achieved"
+ var hasAsusGhbm = File(asusGhbmOnAchieved).exists()
+ var samsungActualMaskBrightness = "/sys/class/lcd/panel/actual_mask_brightness"
+ val hasSamsungMask = File(samsungActualMaskBrightness).exists()
+ var fodFileObserver: FileObserver? = null
+
fun configureDisplay(onDisplayConfigured: Runnable) {
isDisplayConfigured = true
animationViewController?.onDisplayConfiguring()
mUdfpsDisplayMode?.enable(onDisplayConfigured)
+
+ mySurfaceView.setVisibility(VISIBLE)
+ Log.d("PHH", "setting surface visible!")
+
+ val brightness = File("/sys/class/backlight/panel0-backlight/brightness").readText().toDouble()
+ val maxBrightness = File("/sys/class/backlight/panel0-backlight/max_brightness").readText().toDouble()
+
+ // Assume HBM is max brightness
+ val dim = 1.0 - Math.pow( (brightness / maxBrightness), 1/2.3);
+ Log.d("PHH-Enroll", "Brightness is $brightness / $maxBrightness, setting dim to $dim")
+ if (hasAsusGhbm) {
+ dimUpdate(dim.toFloat())
+ }
+ if (hasSamsungMask) {
+ dimUpdate(dim.toFloat())
+ }
+
+ if(android.os.SystemProperties.get("ro.vendor.build.fingerprint").contains("ASUS")) {
+ goodixCmd(200001)
+ }
}
fun unconfigureDisplay() {
isDisplayConfigured = false
animationViewController?.onDisplayUnconfigured()
mUdfpsDisplayMode?.disable(null /* onDisabled */)
+
+ if (hasAsusGhbm) {
+ fodFileObserver = object: FileObserver(asusGhbmOnAchieved, FileObserver.MODIFY) {
+ override fun onEvent(event: Int, path: String): Unit {
+ Log.d("PHH-Enroll", "Asus ghbm event")
+ try {
+ val spotOn = File(asusGhbmOnAchieved).readText().toInt()
+ if(spotOn == 0) {
+ dimUpdate(0.0f)
+ fodFileObserver?.stopWatching()
+ fodFileObserver = null
+ }
+ } catch(e: Exception) {
+ Log.d("PHH-Enroll", "Failed dimpdate off", e)
+ }
+ }
+ };
+ fodFileObserver?.startWatching();
+ } else if (hasSamsungMask) {
+ fodFileObserver = object: FileObserver(asusGhbmOnAchieved, FileObserver.MODIFY) {
+ override fun onEvent(event: Int, path: String): Unit {
+ Log.d("PHH-Enroll", "samsung mask brightness event")
+ try {
+ val spotOn = File(samsungActualMaskBrightness).readText().toInt()
+ if(spotOn == 0) {
+ dimUpdate(0.0f)
+ fodFileObserver?.stopWatching()
+ fodFileObserver = null
+ }
+ } catch(e: Exception) {
+ Log.d("PHH-Enroll", "Failed dimpdate off", e)
+ }
+ }
+ };
+ fodFileObserver?.startWatching();
+ } else {
+ dimUpdate(0.0f)
+ }
+
+ mySurfaceView.setVisibility(INVISIBLE)
+ Log.d("PHH", "setting surface invisible!")
+ if(android.os.SystemProperties.get("ro.vendor.build.fingerprint").contains("ASUS")) {
+ goodixCmd(200003)
+ }
}
}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index ebd4373e25c1..c4c8ee1f565a 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -174,7 +174,12 @@ java_library_static {
"motorola.hardware.health-V1.0-java",
"overlayable_policy_aidl-java",
"com.android.sysprop.watchdog",
- "vendor.samsung.hardware.sysinput-V1.2-java", // HIDL
+ // HIDL
+ "vendor.samsung.hardware.sysinput-V1.2-java",
+ "vendor.goodix.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.samsung.hardware.biometrics.fingerprint-V3.0-java",
+ "vendor.oplus.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.oppo.hardware.biometrics.fingerprint-V2.1-java",
],
javac_shard_size: 50,
}
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index 7e6f35acc398..063e3599d6cd 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -77,6 +77,22 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import android.hardware.display.DisplayManager;
+
+import android.graphics.Point;
+import android.util.DisplayMetrics;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.PrintWriter;
+
+import android.os.FileObserver;
+import android.os.Build;
+
+import vendor.samsung.hardware.biometrics.fingerprint.V3_0.ISehBiometricsFingerprint;
+import vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon;
+import vendor.samsung.hardware.sysinput.V1_0.ISehSysInputDev;
+
/**
* System service that provides an interface for authenticating with biometrics and
* PIN/pattern/password to BiometricPrompt and lock screen.
@@ -95,6 +111,9 @@ public class AuthService extends SystemService {
@VisibleForTesting
final IAuthService.Stub mImpl;
+ private FileObserver fodFileObserver = null;
+ private ISehBiometricsFingerprint mSamsungFingerprint = null;
+
/**
* Class for injecting dependencies into AuthService.
* TODO(b/141025588): Replace with a dependency injection framework (e.g. Guice, Dagger).
@@ -652,6 +671,72 @@ public class AuthService extends SystemService {
registerAuthenticators(hidlConfigs);
mInjector.publishBinderService(this, mImpl);
+ try {
+ mSamsungFingerprint = ISehBiometricsFingerprint.getService();
+ android.util.Log.e("PHH", "Got samsung fingerprint HAL");
+ } catch(Exception e) {
+ android.util.Log.e("PHH", "Failed getting Samsung fingerprint HAL", e);
+ }
+ if(samsungHasCmd("fod_enable") && mSamsungFingerprint != null) {
+ samsungCmd("fod_enable,1,1,0");
+ String actualMaskBrightnessPath = "/sys/class/lcd/panel/actual_mask_brightness";
+ android.util.Log.e("PHH-Enroll", "Reading actual brightness file gives " + readFile(actualMaskBrightnessPath));
+ fodFileObserver = new FileObserver(actualMaskBrightnessPath, FileObserver.MODIFY) {
+ @Override
+ public void onEvent(int event, String path) {
+ String actualMask = readFile(actualMaskBrightnessPath);
+ try {
+ mSamsungFingerprint = ISehBiometricsFingerprint.getService();
+ } catch(Exception e) {}
+ Slog.d("PHH-Enroll", "New actual mask brightness is " + actualMask);
+ try {
+ int eventReq = 0;
+ if("0".equals(actualMask)) {
+ eventReq = 1; //released
+ } else {
+ eventReq = 2; //pressed
+ }
+ if(mSamsungFingerprint != null) {
+ mSamsungFingerprint.sehRequest(22 /* SEM_FINGER_STATE */, eventReq, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting samsung event for mask observer", e);
+ }
+ }
+ };
+ fodFileObserver.startWatching();
+ }
+
+ String asusGhbmOnAchieved = "/sys/class/drm/ghbm_on_achieved";
+ if( (new File(asusGhbmOnAchieved)).exists()) {
+ fodFileObserver = new FileObserver(asusGhbmOnAchieved, FileObserver.MODIFY) {
+ boolean wasOn = false;
+ @Override
+ public void onEvent(int event, String path) {
+ String spotOn = readFile(asusGhbmOnAchieved);
+ if("1".equals(spotOn)) {
+ if(!wasOn) {
+ try {
+ IGoodixFingerprintDaemon goodixDaemon = IGoodixFingerprintDaemon.getService();
+
+ //Send UI ready
+ goodixDaemon.sendCommand(200002, new java.util.ArrayList<Byte>(), (returnCode, resultData) -> {
+ Slog.e(TAG, "Goodix send command touch pressed returned code "+ returnCode);
+ });
+ } catch(Throwable t) {
+ Slog.d("PHH-Enroll", "Failed sending goodix command", t);
+ }
+ }
+ wasOn = true;
+ } else {
+ wasOn = false;
+ }
+ }
+ };
+ fodFileObserver.startWatching();
+ }
+
}
/**
@@ -775,18 +860,104 @@ public class AuthService extends SystemService {
? modality : (modality & ~BiometricAuthenticator.TYPE_CREDENTIAL);
}
+ private int[] dynamicUdfpsProps() {
+ DisplayManager mDM = (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
+ Point displayRealSize = new Point();
+ DisplayMetrics displayMetrics = new DisplayMetrics();
+ mDM.getDisplay(0).getRealSize(displayRealSize);
+ mDM.getDisplay(0).getMetrics(displayMetrics);
+
+ if(readFile("/sys/class/fingerprint/fingerprint/position") != null) {
+ try {
+ ISehSysInputDev s = ISehSysInputDev.getService();
+ s.getTspFodInformation(0, (a, b) -> {
+ Slog.d("PHH-Enroll", "TspFod info " + a + ", " + b);
+ });
+ s.getTspFodPosition(0, (a, b) -> {
+ Slog.d("PHH-Enroll", "TspFod info " + a + ", " + b);
+ });
+ }catch(Throwable t) {
+ Slog.d("PHH-Enroll", "heya ", t);
+ }
+
+
+ android.util.Log.d("PHH", "Samsung fingerprint");
+ String[] fodPositionArray = readFile("/sys/class/fingerprint/fingerprint/position").split(",");
+ float bottomMM = Float.parseFloat(fodPositionArray[0]);
+ float areaSizeMM = Float.parseFloat(fodPositionArray[5]);
+ float heightMM = Float.parseFloat(fodPositionArray[2]);
+ float bottomInch = bottomMM * 0.0393700787f;
+ float areaSizeInch = areaSizeMM * 0.0393700787f;
+ float heightInch = heightMM * 0.0393700787f;
+ int bottomPx = (int)(bottomInch * displayMetrics.ydpi);
+ int areaSizePx = (int)(areaSizeInch * displayMetrics.ydpi);
+ int midDistPx = (int)(areaSizeInch * displayMetrics.ydpi / 2.0f);
+
+ float mW = areaSizePx/2;
+ float mH = areaSizePx/2;
+ float mX = displayRealSize.x/2;
+ //float mY = displayRealSize.y - bottomPx - midDistPx;
+ float mY = displayRealSize.y - (bottomInch * displayMetrics.ydpi) - (areaSizeInch * displayMetrics.ydpi / 2.0f);
+
+ samsungCmd(String.format("fod_rect,%d,%d,%d,%d", (int)(mX - mW/2), (int)(mY - mW/2), (int)(mX + mW/2), (int)(mY + mW/2)));
+ Slog.d("PHH-Enroll", "Display real size is " + displayRealSize.y + ", dpy " + displayMetrics.ydpi);
+
+ int udfpsProps[] = new int[3];
+ udfpsProps[0] = (int)mX;
+ udfpsProps[1] = (int)mY;
+ udfpsProps[2] = (int)mW;
+
+ try {
+ mSamsungFingerprint = ISehBiometricsFingerprint.getService();
+ Slog.d("PHH-Enroll", "Samsung ask for sensor status");
+ mSamsungFingerprint.sehRequest(6, 0, new java.util.ArrayList(), (int retval, java.util.ArrayList<Byte> out) -> {
+ Slog.d("PHH-Enroll", "Result is " + retval);
+ for(int i=0; i<out.size(); i++) {
+ Slog.d("PHH-Enroll", "\t" + i + ":" + out.get(i));
+ }
+ } );
+ Slog.d("PHH-Enroll", "Samsung ask for sensor brightness value");
+ mSamsungFingerprint.sehRequest(32, 0, new java.util.ArrayList(), (int retval, java.util.ArrayList<Byte> out) -> {
+ Slog.d("PHH-Enroll", "Result is " + retval);
+ for(int i=0; i<out.size(); i++) {
+ Slog.d("PHH-Enroll", "\t" + i + ":" + out.get(i));
+ }
+ } );
+
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting samsung3.0 fingerprint recognition", e);
+ }
+ return udfpsProps;
+ }
+
+ if(android.os.SystemProperties.get("ro.vendor.build.fingerprint").contains("ASUS_I006D")) {
+ int udfpsProps[] = new int[3];
+ udfpsProps[0] = displayRealSize.x/2;
+ udfpsProps[1] = 1741;
+ udfpsProps[2] = 110;
+ return udfpsProps;
+ }
+
+ return new int[0];
+ }
private FingerprintSensorPropertiesInternal getHidlFingerprintSensorProps(int sensorId,
@BiometricManager.Authenticators.Types int strength) {
// The existence of config_udfps_sensor_props indicates that the sensor is UDFPS.
- final int[] udfpsProps = getContext().getResources().getIntArray(
+ int[] udfpsProps = getContext().getResources().getIntArray(
com.android.internal.R.array.config_udfps_sensor_props);
// Non-empty workaroundLocations indicates that the sensor is SFPS.
final List<SensorLocationInternal> workaroundLocations =
getWorkaroundSensorProps(getContext());
- final boolean isUdfps = !ArrayUtils.isEmpty(udfpsProps);
+ boolean isUdfps = !ArrayUtils.isEmpty(udfpsProps);
+ if(!isUdfps) udfpsProps = dynamicUdfpsProps();
+ isUdfps = !ArrayUtils.isEmpty(udfpsProps);
+
+ if(udfpsProps.length > 0) {
+ Slog.d("PHH-Enroll", "Got udfps infos " + udfpsProps[0] + ", " + udfpsProps[1] + ", " + udfpsProps[2]);
+ }
// config_is_powerbutton_fps indicates whether device has a power button fingerprint sensor.
final boolean isPowerbuttonFps = getContext().getResources().getBoolean(
@@ -854,4 +1025,67 @@ public class AuthService extends SystemService {
componentInfo, resetLockoutRequiresHardwareAuthToken,
resetLockoutRequiresChallenge);
}
+
+ private static boolean samsungHasCmd(String cmd) {
+ try {
+ File f = new File("/sys/devices/virtual/sec/tsp/cmd_list");
+ if(!f.exists()) return false;
+
+ android.util.Log.d("PHH", "Managed to grab cmd list, checking...");
+ BufferedReader b = new BufferedReader(new FileReader(f));
+ String line = null;
+ while( (line = b.readLine()) != null) {
+ if(line.equals(cmd)) return true;
+ }
+ android.util.Log.d("PHH", "... nope");
+ return false;
+ } catch(Exception e) {
+ android.util.Log.d("PHH", "Failed reading cmd_list", e);
+ return false;
+ }
+ }
+
+ public static void samsungCmd(String cmd) {
+ try {
+ writeFile("/sys/devices/virtual/sec/tsp/cmd", cmd);
+
+ String status = readFile("/sys/devices/virtual/sec/tsp/cmd_status");
+ String ret = readFile("/sys/devices/virtual/sec/tsp/cmd_result");
+
+ android.util.Log.d("PHH", "Sending command " + cmd + " returned " + ret + ":" + status);
+ } catch(Exception e) {
+ android.util.Log.d("PHH", "Failed sending command " + cmd, e);
+ }
+ }
+
+ private static void writeFile(String path, String value) {
+ try {
+ PrintWriter writer = new PrintWriter(path, "UTF-8");
+ writer.println(value);
+ writer.close();
+ } catch(Exception e) {
+ android.util.Log.d("PHH", "Failed writing to " + path + ": " + value);
+ }
+ }
+
+ private static void writeFile(File file, String value) {
+ try {
+ PrintWriter writer = new PrintWriter(file, "UTF-8");
+ writer.println(value);
+ writer.close();
+ } catch(Exception e) {
+ android.util.Log.d("PHH", "Failed writing to " + file + ": " + value);
+ }
+ }
+
+ private static String readFile(String path) {
+ try {
+ File f = new File(path);
+
+ BufferedReader b = new BufferedReader(new FileReader(f));
+ return b.readLine();
+ } catch(Exception e) {
+ return null;
+ }
+ }
}
--
2.34.1

View File

@@ -0,0 +1,39 @@
From 1a3206a559815eaa16f9429ad7005bf9b9166e00 Mon Sep 17 00:00:00 2001
From: ItsLynix <71310187+ItsLynix@users.noreply.github.com>
Date: Sat, 28 Jan 2023 10:25:16 +0100
Subject: [PATCH 34/40] SystemUI: Implement alternate brightness path for FOD
Change-Id: I0d9d7352c507529a3aa66e7a7d78220887a5a532
---
.../com/android/systemui/biometrics/UdfpsView.kt | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
index cdaad81b9222..6cc9ab3da570 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
@@ -228,8 +228,19 @@ Log.d("PHH", "Surface destroyed!")
mySurfaceView.setVisibility(VISIBLE)
Log.d("PHH", "setting surface visible!")
- val brightness = File("/sys/class/backlight/panel0-backlight/brightness").readText().toDouble()
- val maxBrightness = File("/sys/class/backlight/panel0-backlight/max_brightness").readText().toDouble()
+ val brightnessFile = File("/sys/class/backlight/panel/brightness")
+ val maxBrightnessFile = File("/sys/class/backlight/panel/max_brightness")
+
+ var brightness: Double = 0.0
+ var maxBrightness: Double = 0.0
+
+ if (brightnessFile.exists() && maxBrightnessFile.exists()) {
+ brightness = brightnessFile.readText().toDouble()
+ maxBrightness = maxBrightnessFile.readText().toDouble()
+ } else {
+ brightness = File("/sys/class/backlight/panel0-backlight/brightness").readText().toDouble()
+ maxBrightness = File("/sys/class/backlight/panel0-backlight/max_brightness").readText().toDouble()
+ }
// Assume HBM is max brightness
val dim = 1.0 - Math.pow( (brightness / maxBrightness), 1/2.3);
--
2.34.1

View File

@@ -0,0 +1,125 @@
From 97ffa12b05a61bf23af04c575dca064141ead52f Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 17 Jun 2023 08:31:55 -0400
Subject: [PATCH 37/40] Add Mediatek power hints on touch
Mediatek has multiple HALs (which existed concurrently), so it is a bit
of a mess.
From what I can tell, mOldMtkPerf is used on Android 10 vendors, while
mMtkPerf is used on Android 11/12 vendors.
If anyone has an Android 9 vendor and want to take a look, I think it
would be something like this:
vendor.mediatek.hardware.power.V2_0.IPower.powerHint()
On some devices, sending the touch boost isn't very helpful. Our guess
is that Android 12 rendering got a lot heavier, and then touch boost is
not enough. So, we add a property to /cheat/ and report a bigger boost:
APP_ROTATE.
On the few devices we've seen, touch boost only boosts scheduler, while
app rotate will also for cpu min frequency.
Experimentally using this app rotate boost indeed makes the device much
smoother.
Change-Id: I92729336e8a27b925a1c3aede24c95e971d41b88
---
services/core/Android.bp | 1 +
.../com/android/server/wm/DisplayPolicy.java | 50 +++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index c4c8ee1f565a..8514ad55da09 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -175,6 +175,7 @@ java_library_static {
"overlayable_policy_aidl-java",
"com.android.sysprop.watchdog",
// HIDL
+ "vendor.mediatek.hardware.mtkpower-V1.1-java",
"vendor.samsung.hardware.sysinput-V1.2-java",
"vendor.goodix.hardware.biometrics.fingerprint-V2.1-java",
"vendor.samsung.hardware.biometrics.fingerprint-V3.0-java",
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 41f84c05a749..024f27a42d76 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -221,6 +221,9 @@ public class DisplayPolicy {
private boolean mCanSystemBarsBeShownByUser;
private boolean mNavButtonForcedVisible;
+ private vendor.mediatek.hardware.mtkpower.V1_1.IMtkPerf mMtkPerf;
+ private vendor.mediatek.hardware.mtkpower.V1_0.IMtkPower mOldMtkPerf;
+
StatusBarManagerInternal getStatusBarManagerInternal() {
synchronized (mServiceAcquireLock) {
if (mStatusBarManagerInternal == null) {
@@ -473,6 +476,20 @@ public class DisplayPolicy {
mScreenOnEarly = true;
mScreenOnFully = true;
}
+ try {
+ mMtkPerf = vendor.mediatek.hardware.mtkpower.V1_1.IMtkPerf.getService();
+ } catch(Throwable t) {
+ android.util.Log.d("PHH-Power", "Retrieving mtkpower 1.0", t);
+ mMtkPerf = null;
+ }
+
+ try {
+ mOldMtkPerf = vendor.mediatek.hardware.mtkpower.V1_0.IMtkPower.getService();
+ } catch(Throwable t) {
+ android.util.Log.d("PHH-Power", "Retrieving mtkpower 1.0", t);
+ mOldMtkPerf = null;
+ }
+
final Looper looper = UiThread.getHandler().getLooper();
mHandler = new PolicyHandler(looper);
@@ -552,6 +569,17 @@ public class DisplayPolicy {
mService.mPowerManagerInternal.setPowerBoost(
Boost.INTERACTION, duration);
}
+ if(mOldMtkPerf != null) {
+ try {
+ android.util.Log.d("PHH-Power", "mtk1 fling power hint");
+ int hint = 36; // MTKPOWER_HINT_APP_TOUCH
+ if("rotate".equals(SystemProperties.get("persist.sys.phh.touch_hint")))
+ hint = 35; // MTKPOWER_HINT_APP_ROTATE
+ mOldMtkPerf.mtkPowerHint(hint, duration);
+ } catch(Throwable t) {
+ android.util.Log.d("PHH-Power", "Failed sending touch power hint", t);
+ }
+ }
}
@Override
@@ -570,6 +598,28 @@ public class DisplayPolicy {
if (listener != null) {
listener.onTouchStart();
}
+ if(mMtkPerf != null) {
+ try {
+ android.util.Log.d("PHH-Power", "mtk power hint");
+ int hint = 25; //MTKPOWER_HINT_APP_TOUCH
+ if("rotate".equals(SystemProperties.get("persist.sys.phh.touch_hint")))
+ hint = 24; // MTKPOWER_HINT_APP_ROTATE
+ mMtkPerf.perfCusLockHint(hint, 1000);
+ } catch(Throwable t) {
+ android.util.Log.d("PHH-Power", "Failed sending touch power hint", t);
+ }
+ }
+ if(mOldMtkPerf != null) {
+ try {
+ android.util.Log.d("PHH-Power", "mtk1 power hint");
+ int hint = 36; // MTKPOWER_HINT_APP_TOUCH
+ if("rotate".equals(SystemProperties.get("persist.sys.phh.touch_hint")))
+ hint = 35; // MTKPOWER_HINT_APP_ROTATE
+ mOldMtkPerf.mtkPowerHint(hint, 1000);
+ } catch(Throwable t) {
+ android.util.Log.d("PHH-Power", "Failed sending touch power hint", t);
+ }
+ }
}
@Override
--
2.34.1

View File

@@ -0,0 +1,48 @@
From a0186f96b11f3ce778e6edb42dde69f1ee373dd9 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 5 Jul 2023 10:50:36 -0400
Subject: [PATCH 38/40] Detect Moto dynamic hardware feature
Moto added a custom node in sysconfig XMLs:
<unavailable-feature-conditional />
This node reads a property and enables a feature based on it.
Take those into account to enable NFC on Moto devices which have
NFC-less variants
---
.../java/com/android/server/SystemConfig.java | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 00b01051adae..ffcc75e63d66 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -979,6 +979,25 @@ public class SystemConfig {
}
XmlUtils.skipCurrentTag(parser);
} break;
+ case "unavailable-feature-conditional": {
+ if (allowFeatures) {
+ String fname = parser.getAttributeValue(null, "name");
+ String prop = parser.getAttributeValue(null, "prop");
+ if (fname == null || prop == null) {
+ Slog.w(TAG, "<" + name + "> without name in " + permFile
+ + " at " + parser.getPositionDescription());
+ } else {
+ if(android.os.SystemProperties.getBoolean(prop, false)) {
+ addFeature(fname, 0);
+ } else {
+ mUnavailableFeatures.add(fname);
+ }
+ }
+ } else {
+ logNotAllowedInPartition(name, permFile, parser);
+ }
+ XmlUtils.skipCurrentTag(parser);
+ } break;
case "allow-in-power-save-except-idle": {
if (allowOverrideAppRestrictions) {
String pkgname = parser.getAttributeValue(null, "package");
--
2.34.1

View File

@@ -0,0 +1,211 @@
From 8fe0669d57555ce564caa476bd0278bb208c2d94 Mon Sep 17 00:00:00 2001
From: jgudec <jakov.gudec@gmail.com>
Date: Fri, 18 Aug 2023 08:41:49 +0100
Subject: [PATCH 39/40] Add initial Xiaomi FOD implementation for recent Xiaomi
devices
Huge thanks to phhusson for the help and guidance.
Change-Id: I123556a7d6c48e9ace36281336991ed231cf62a5
---
packages/SystemUI/Android.bp | 2 +
.../android/systemui/biometrics/UdfpsView.kt | 43 +++++++++++++++++
services/core/Android.bp | 1 +
.../server/biometrics/AuthService.java | 46 +++++++++++++++++++
4 files changed, 92 insertions(+)
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp
index 0637dd4b4471..f41b178f55b1 100644
--- a/packages/SystemUI/Android.bp
+++ b/packages/SystemUI/Android.bp
@@ -179,6 +179,8 @@ android_library {
"motion_tool_lib",
"vendor.lineage.powershare-V1.0-java",
"vendor.goodix.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.xiaomi.hw.touchfeature-V1.0-java",
+ "vendor.xiaomi.hardware.fingerprintextension-V1.0-java"
],
manifest: "AndroidManifest.xml",
additional_manifests: ["LineageManifest.xml"],
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
index 6cc9ab3da570..8ab00fc34f0d 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
@@ -37,6 +37,12 @@ import java.io.File
import vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon
+import vendor.xiaomi.hw.touchfeature.V1_0.ITouchFeature
+import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint
+
+import android.os.Handler
+import android.os.HandlerThread
+
private const val TAG = "UdfpsView"
@@ -220,6 +226,12 @@ Log.d("PHH", "Surface destroyed!")
val hasSamsungMask = File(samsungActualMaskBrightness).exists()
var fodFileObserver: FileObserver? = null
+ val xiaomiDispParam = "/sys/class/mi_display/disp-DSI-0/disp_param"
+ var hasXiaomiLhbm = File(xiaomiDispParam).exists()
+
+ private val handlerThread = HandlerThread("UDFPS").also { it.start() }
+ val myHandler = Handler(handlerThread.looper)
+
fun configureDisplay(onDisplayConfigured: Runnable) {
isDisplayConfigured = true
animationViewController?.onDisplayConfiguring()
@@ -255,6 +267,34 @@ Log.d("PHH", "Surface destroyed!")
if(android.os.SystemProperties.get("ro.vendor.build.fingerprint").contains("ASUS")) {
goodixCmd(200001)
}
+
+ if(hasXiaomiLhbm){
+ Log.d("PHH-Enroll", "Xiaomi scenario in UdfpsView reached!")
+ mySurfaceView.setVisibility(INVISIBLE)
+
+ IXiaomiFingerprint.getService().extCmd(android.os.SystemProperties.getInt("persist.phh.xiaomi.fod.enrollment.id", 4), 1);
+ var res = ITouchFeature.getService().setTouchMode(0, 10, 1);
+ if(res != 0){
+ Log.d("PHH-Enroll", "SetTouchMode 10,1 was NOT executed successfully. Res is " + res)
+ }
+
+ myHandler.postDelayed({
+ var ret200 = ITouchFeature.getService().setTouchMode(0, 10, 1);
+
+ if(ret200 != 0){
+ Log.d("PHH-Enroll", "myHandler.postDelayed 200ms -SetTouchMode was NOT executed successfully. Ret is " + ret200)
+ }
+
+ myHandler.postDelayed({
+ Log.d("PHH-Enroll", "myHandler.postDelayed 600ms - line prior to setTouchMode 10,0")
+ var ret600 = ITouchFeature.getService().setTouchMode(0, 10, 0);
+
+ if(ret600 != 0){
+ Log.d("PHH-Enroll", "myHandler.postDelayed 600ms -SetTouchMode 10,0 was NOT executed successfully. Ret is " + ret600)
+ }
+ }, 600)
+ }, 200)
+ }
}
fun unconfigureDisplay() {
@@ -296,6 +336,9 @@ Log.d("PHH", "Surface destroyed!")
}
};
fodFileObserver?.startWatching();
+ } else if(hasXiaomiLhbm) {
+ IXiaomiFingerprint.getService().extCmd(android.os.SystemProperties.getInt("persist.phh.xiaomi.fod.enrollment.id", 4), 0);
+ ITouchFeature.getService().setTouchMode(0, 10, 0);
} else {
dimUpdate(0.0f)
}
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 8514ad55da09..58458734053b 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -181,6 +181,7 @@ java_library_static {
"vendor.samsung.hardware.biometrics.fingerprint-V3.0-java",
"vendor.oplus.hardware.biometrics.fingerprint-V2.1-java",
"vendor.oppo.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
javac_shard_size: 50,
}
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
index 7d6f9a12057f..22827ecdaf89 100644
--- a/services/core/java/com/android/server/biometrics/AuthService.java
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
@@ -66,6 +66,7 @@ import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
+import android.text.TextUtils;
import android.util.Slog;
import com.android.internal.R;
@@ -93,6 +94,7 @@ import vendor.samsung.hardware.biometrics.fingerprint.V3_0.ISehBiometricsFingerp
import vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon;
import vendor.samsung.hardware.sysinput.V1_0.ISehSysInputDev;
+import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
/**
* System service that provides an interface for authenticating with biometrics and
* PIN/pattern/password to BiometricPrompt and lock screen.
@@ -114,6 +116,7 @@ public class AuthService extends SystemService {
private FileObserver fodFileObserver = null;
private ISehBiometricsFingerprint mSamsungFingerprint = null;
+ private IXiaomiFingerprint mXiaomiFingerprint = null;
/**
* Class for injecting dependencies into AuthService.
* TODO(b/141025588): Replace with a dependency injection framework (e.g. Guice, Dagger).
@@ -677,6 +680,12 @@ public class AuthService extends SystemService {
} catch(Exception e) {
android.util.Log.e("PHH", "Failed getting Samsung fingerprint HAL", e);
}
+ try {
+ mXiaomiFingerprint = IXiaomiFingerprint.getService();
+ android.util.Log.e("PHH", "Got xiaomi fingerprint HAL");
+ } catch(Exception e) {
+ android.util.Log.e("PHH", "Failed getting xiaomi fingerprint HAL", e);
+ }
if(samsungHasCmd("fod_enable") && mSamsungFingerprint != null) {
samsungCmd("fod_enable,1,1,0");
String actualMaskBrightnessPath = "/sys/class/lcd/panel/actual_mask_brightness";
@@ -737,6 +746,31 @@ public class AuthService extends SystemService {
fodFileObserver.startWatching();
}
+ String xiaomiFodPressedStatusPath = "/sys/class/touch/touch_dev/fod_press_status";
+ if(new File(xiaomiFodPressedStatusPath).exists() && mXiaomiFingerprint != null) {
+ fodFileObserver = new FileObserver(xiaomiFodPressedStatusPath, FileObserver.MODIFY) {
+ @Override
+ public void onEvent(int event, String path) {
+ String isFodPressed = readFile(xiaomiFodPressedStatusPath);
+ Slog.d("PHH-Enroll", "Fod pressed status: " + isFodPressed);
+ Slog.d("PHH-Enroll", "Within xiaomi scenario for FOD");
+
+ try {
+ if("0".equals(isFodPressed)) {
+ Slog.d("PHH-Enroll", "Fod un-pressed!");
+ mXiaomiFingerprint.extCmd(android.os.SystemProperties.getInt("phh.xiaomi.fod.enrollment.id", 4), 0);
+ } else if("1".equals(isFodPressed)) {
+ Slog.d("PHH-Enroll", "Fod pressed!");
+ mXiaomiFingerprint.extCmd(android.os.SystemProperties.getInt("phh.xiaomi.fod.enrollment.id", 4), 1);
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed Xiaomi async extcmd", e);
+ }
+ }
+ };
+ fodFileObserver.startWatching();
+ }
+
}
/**
@@ -938,6 +972,18 @@ public class AuthService extends SystemService {
return udfpsProps;
}
+ if(!TextUtils.isEmpty(android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y"))) {
+ int[] udfpsProps = new int[3];
+ String[] coordinates = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y").split(",");
+ udfpsProps[0] = displayRealSize.x/2;
+ udfpsProps[1] = Integer.parseInt(coordinates[1]) + 100;
+
+ String[] widthHeight = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height").split(",");
+
+ udfpsProps[2] = (Integer.parseInt(widthHeight[0]) /2);
+ return udfpsProps;
+ }
+
return new int[0];
}
--
2.34.1

View File

@@ -0,0 +1,67 @@
From 3bb8617db39e8249dde5d7fc01d07e375f9fba57 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sun, 15 Oct 2023 11:21:58 +0800
Subject: [PATCH 40/40] SystemUI: Add MTK's brightness path for FOD
Rewrote the part for easier extension
Change-Id: Ifec88c625210301b5d1146bba0275cd9699243e8
---
.../android/systemui/biometrics/UdfpsView.kt | 30 ++++++++++++++-----
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
index 8ab00fc34f0d..e43650d9d3f9 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.kt
@@ -34,6 +34,7 @@ import android.widget.FrameLayout
import com.android.systemui.R
import com.android.systemui.doze.DozeReceiver
import java.io.File
+import java.io.FileNotFoundException
import vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon
@@ -240,18 +241,31 @@ Log.d("PHH", "Surface destroyed!")
mySurfaceView.setVisibility(VISIBLE)
Log.d("PHH", "setting surface visible!")
- val brightnessFile = File("/sys/class/backlight/panel/brightness")
- val maxBrightnessFile = File("/sys/class/backlight/panel/max_brightness")
+ val brightnessFiles = listOf(
+ File("/sys/class/backlight/panel/brightness"),
+ File("/sys/class/backlight/panel0-backlight/brightness"),
+ File("/sys/devices/platform/soc/soc:mtk_leds/leds/lcd-backlight/brightness")
+ )
+ val maxBrightnessFiles = listOf(
+ File("/sys/class/backlight/panel/max_brightness"),
+ File("/sys/class/backlight/panel0-backlight/max_brightness"),
+ File("/sys/devices/platform/soc/soc:mtk_leds/leds/lcd-backlight/max_brightness")
+ )
var brightness: Double = 0.0
var maxBrightness: Double = 0.0
+ var bmFilesExist: Boolean = false
- if (brightnessFile.exists() && maxBrightnessFile.exists()) {
- brightness = brightnessFile.readText().toDouble()
- maxBrightness = maxBrightnessFile.readText().toDouble()
- } else {
- brightness = File("/sys/class/backlight/panel0-backlight/brightness").readText().toDouble()
- maxBrightness = File("/sys/class/backlight/panel0-backlight/max_brightness").readText().toDouble()
+ brightnessFiles.zip(maxBrightnessFiles) {bFile, mFile ->
+ if (bFile.exists() && mFile.exists()) {
+ bmFilesExist = true
+ brightness = bFile.readText().toDouble()
+ maxBrightness = mFile.readText().toDouble()
+ }
+ }
+
+ if (!bmFilesExist) {
+ throw FileNotFoundException("No brightness files under expected paths")
}
// Assume HBM is max brightness
--
2.34.1

View File

@@ -0,0 +1,35 @@
From c27f6299504342badced594ae52d0f77eda447eb Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 14 Aug 2019 23:37:10 +0200
Subject: [PATCH 01/10] On Samsung, we need to send a hack-message to HAL to
get all Sensors
Change-Id: Id6a1fa48340de61c418493668e9abd22c2599376
---
services/sensorservice/SensorDevice.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index de050e02d0..3daeece62b 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -38,6 +38,7 @@
#include <cstddef>
#include <thread>
+#include <android-base/properties.h>
using namespace android::hardware::sensors;
using android::hardware::Return;
using android::util::ProtoOutputStream;
@@ -77,6 +78,8 @@ SensorDevice::SensorDevice() {
}
void SensorDevice::initializeSensorList() {
+ if(::android::base::GetBoolProperty("persist.sys.phh.samsung_sensors", false))
+ setMode(5555);
if (mHalWrapper == nullptr) {
return;
}
--
2.34.1

View File

@@ -0,0 +1,37 @@
From ca1a996ac9076302682afe4138ccf907675c664e Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 31 Mar 2021 23:36:03 +0200
Subject: [PATCH 04/10] Remove Samsung system permission on sensors
---
libs/sensor/Sensor.cpp | 1 +
libs/sensor/include/sensor/Sensor.h | 1 +
2 files changed, 2 insertions(+)
diff --git a/libs/sensor/Sensor.cpp b/libs/sensor/Sensor.cpp
index b865c4d5d6..56dc219f33 100644
--- a/libs/sensor/Sensor.cpp
+++ b/libs/sensor/Sensor.cpp
@@ -433,6 +433,7 @@ const String8& Sensor::getStringType() const {
}
const String8& Sensor::getRequiredPermission() const {
+ if (mRequiredPermission == "com.samsung.permission.SSENSOR") return mFakeRequiredPermission;
return mRequiredPermission;
}
diff --git a/libs/sensor/include/sensor/Sensor.h b/libs/sensor/include/sensor/Sensor.h
index bae8a1380b..afaafb321e 100644
--- a/libs/sensor/include/sensor/Sensor.h
+++ b/libs/sensor/include/sensor/Sensor.h
@@ -125,6 +125,7 @@ private:
uint32_t mFifoMaxEventCount;
String8 mStringType;
String8 mRequiredPermission;
+ String8 mFakeRequiredPermission;
bool mRequiredPermissionRuntime = false;
int32_t mRequiredAppOp;
int32_t mMaxDelay;
--
2.34.1

View File

@@ -0,0 +1,301 @@
From 4eca6bb36b071de20f2defe141ff7a880596114c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 27 Dec 2021 18:00:43 -0500
Subject: [PATCH 06/10] powermanager: Add support Samsung miscpower HAL
Several various configurations need to be supported:
- Android Pie vendors have a android.hardware.power HIDL default + "miscpower"
- Android Q vendors have default HIDL android.hardware.power +
ISehMiscPower
- Android R vendors have default AIDL android.hardware.power +
ISehMiscPower
ISehMiscPower is always in addition to android.hardware.power, not as a
substituion
Only tested configuration ATM is the latest one
Change-Id: I182a91ccb0a89f9d0d7d41f36eccab218b553bbc
---
include/powermanager/PowerHalLoader.h | 5 ++
include/powermanager/PowerHalWrapper.h | 36 +++++++++-
services/powermanager/Android.bp | 1 +
services/powermanager/PowerHalController.cpp | 7 +-
services/powermanager/PowerHalLoader.cpp | 17 ++++-
services/powermanager/PowerHalWrapper.cpp | 70 ++++++++++++++++++++
6 files changed, 133 insertions(+), 3 deletions(-)
diff --git a/include/powermanager/PowerHalLoader.h b/include/powermanager/PowerHalLoader.h
index ed6f6f35f5..cf1d76e3d1 100644
--- a/include/powermanager/PowerHalLoader.h
+++ b/include/powermanager/PowerHalLoader.h
@@ -20,6 +20,8 @@
#include <android-base/thread_annotations.h>
#include <android/hardware/power/1.1/IPower.h>
#include <android/hardware/power/IPower.h>
+#include <vendor/samsung/hardware/miscpower/2.0/ISehMiscPower.h>
+
namespace android {
@@ -32,12 +34,15 @@ public:
static sp<hardware::power::IPower> loadAidl();
static sp<hardware::power::V1_0::IPower> loadHidlV1_0();
static sp<hardware::power::V1_1::IPower> loadHidlV1_1();
+ static sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> loadHidlSeh();
private:
static std::mutex gHalMutex;
static sp<hardware::power::IPower> gHalAidl GUARDED_BY(gHalMutex);
static sp<hardware::power::V1_0::IPower> gHalHidlV1_0 GUARDED_BY(gHalMutex);
static sp<hardware::power::V1_1::IPower> gHalHidlV1_1 GUARDED_BY(gHalMutex);
+ static sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> gHalHidlSeh GUARDED_BY(gHalMutex);
+
static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked()
EXCLUSIVE_LOCKS_REQUIRED(gHalMutex);
diff --git a/include/powermanager/PowerHalWrapper.h b/include/powermanager/PowerHalWrapper.h
index dfb0ff59a0..9ad805dfcd 100644
--- a/include/powermanager/PowerHalWrapper.h
+++ b/include/powermanager/PowerHalWrapper.h
@@ -23,6 +23,8 @@
#include <android/hardware/power/IPower.h>
#include <android/hardware/power/IPowerHintSession.h>
#include <android/hardware/power/Mode.h>
+#include <vendor/samsung/hardware/miscpower/2.0/ISehMiscPower.h>
+
namespace android {
@@ -181,7 +183,10 @@ private:
// Wrapper for the AIDL Power HAL.
class AidlHalWrapper : public HalWrapper {
public:
- explicit AidlHalWrapper(sp<hardware::power::IPower> handle) : mHandle(std::move(handle)) {}
+ explicit AidlHalWrapper(sp<hardware::power::IPower> handle,
+ sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> sehHandle)
+ : mHandle(std::move(handle)),
+ mHandleSeh(std::move(sehHandle)) {}
virtual ~AidlHalWrapper() = default;
virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override;
@@ -196,6 +201,7 @@ private:
std::mutex mBoostMutex;
std::mutex mModeMutex;
sp<hardware::power::IPower> mHandle;
+ sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> mHandleSeh;
// Android framework only sends boost upto DISPLAY_UPDATE_IMMINENT.
// Need to increase the array size if more boost supported.
std::array<std::atomic<HalSupport>,
@@ -206,6 +212,34 @@ private:
mModeSupportedArray GUARDED_BY(mModeMutex) = {HalSupport::UNKNOWN};
};
+class HidlHalWrapperSeh : public HalWrapper {
+public:
+ explicit HidlHalWrapperSeh(sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> hal1,
+ sp<android::hardware::power::V1_1::IPower> hal2,
+ sp<android::hardware::power::V1_0::IPower> hal3)
+ : mHandleSeh(std::move(hal1)),
+ mHandle11(std::move(hal2)),
+ mHandle10(std::move(hal3)) {}
+ virtual ~HidlHalWrapperSeh() = default;
+
+ virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override;
+ virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override;
+ virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession(
+ int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
+ int64_t durationNanos) override;
+ virtual HalResult<int64_t> getHintSessionPreferredRate() override;
+
+protected:
+ virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data);
+
+private:
+ sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> mHandleSeh;
+ sp<android::hardware::power::V1_1::IPower> mHandle11;
+ sp<android::hardware::power::V1_0::IPower> mHandle10;
+ HalResult<void> setInteractive(bool enabled);
+ HalResult<void> setFeature(hardware::power::V1_0::Feature feature, bool enabled);
+};
+
}; // namespace power
}; // namespace android
diff --git a/services/powermanager/Android.bp b/services/powermanager/Android.bp
index 6fbba3f568..08280dd20f 100644
--- a/services/powermanager/Android.bp
+++ b/services/powermanager/Android.bp
@@ -39,6 +39,7 @@ cc_library_shared {
"android.hardware.power@1.0",
"android.hardware.power@1.1",
"android.hardware.power-V3-cpp",
+ "vendor.samsung.hardware.miscpower@2.0",
],
cflags: [
diff --git a/services/powermanager/PowerHalController.cpp b/services/powermanager/PowerHalController.cpp
index 8c225d5d02..f67fbae08b 100644
--- a/services/powermanager/PowerHalController.cpp
+++ b/services/powermanager/PowerHalController.cpp
@@ -20,6 +20,7 @@
#include <android/hardware/power/IPower.h>
#include <android/hardware/power/IPowerHintSession.h>
#include <android/hardware/power/Mode.h>
+#include <vendor/samsung/hardware/miscpower/2.0/ISehMiscPower.h>
#include <powermanager/PowerHalController.h>
#include <powermanager/PowerHalLoader.h>
#include <utils/Log.h>
@@ -34,11 +35,15 @@ namespace power {
std::unique_ptr<HalWrapper> HalConnector::connect() {
sp<IPower> halAidl = PowerHalLoader::loadAidl();
+ sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> halHidlSeh = PowerHalLoader::loadHidlSeh();
if (halAidl) {
- return std::make_unique<AidlHalWrapper>(halAidl);
+ return std::make_unique<AidlHalWrapper>(halAidl, halHidlSeh);
}
sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0();
sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1();
+ if (halHidlSeh) {
+ return std::make_unique<HidlHalWrapperSeh>(halHidlSeh, halHidlV1_1, halHidlV1_0);
+ }
if (halHidlV1_1) {
return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_0, halHidlV1_1);
}
diff --git a/services/powermanager/PowerHalLoader.cpp b/services/powermanager/PowerHalLoader.cpp
index 1f1b43a607..9b20e67f7a 100644
--- a/services/powermanager/PowerHalLoader.cpp
+++ b/services/powermanager/PowerHalLoader.cpp
@@ -18,6 +18,7 @@
#include <android/hardware/power/1.1/IPower.h>
#include <android/hardware/power/IPower.h>
+#include <vendor/samsung/hardware/miscpower/2.0/ISehMiscPower.h>
#include <binder/IServiceManager.h>
#include <hardware/power.h>
#include <hardware_legacy/power.h>
@@ -55,6 +56,8 @@ std::mutex PowerHalLoader::gHalMutex;
sp<IPower> PowerHalLoader::gHalAidl = nullptr;
sp<V1_0::IPower> PowerHalLoader::gHalHidlV1_0 = nullptr;
sp<V1_1::IPower> PowerHalLoader::gHalHidlV1_1 = nullptr;
+sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> PowerHalLoader::gHalHidlSeh = nullptr;
+
void PowerHalLoader::unloadAll() {
std::lock_guard<std::mutex> lock(gHalMutex);
@@ -82,10 +85,22 @@ sp<V1_1::IPower> PowerHalLoader::loadHidlV1_1() {
return loadHal<V1_1::IPower>(gHalExists, gHalHidlV1_1, loadFn, "HIDL v1.1");
}
+sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> PowerHalLoader::loadHidlSeh() {
+ std::lock_guard<std::mutex> lock(gHalMutex);
+ static bool gHalExists = true;
+ static auto loadFn = []() { return vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower::getService(); };
+ return loadHal<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower>(gHalExists, gHalHidlSeh, loadFn, "HIDL SEH v1.1");
+}
+
sp<V1_0::IPower> PowerHalLoader::loadHidlV1_0Locked() {
static bool gHalExists = true;
+ static auto loadFnSec = []() { return V1_0::IPower::getService("power"); };
+ auto hal = loadHal<V1_0::IPower>(gHalExists, gHalHidlV1_0, loadFnSec, "HIDL v1.0");
+
static auto loadFn = []() { return V1_0::IPower::getService(); };
- return loadHal<V1_0::IPower>(gHalExists, gHalHidlV1_0, loadFn, "HIDL v1.0");
+ if(hal == nullptr)
+ hal = loadHal<V1_0::IPower>(gHalExists, gHalHidlV1_0, loadFn, "HIDL v1.0");
+ return hal;
}
// -------------------------------------------------------------------------------------------------
diff --git a/services/powermanager/PowerHalWrapper.cpp b/services/powermanager/PowerHalWrapper.cpp
index d74bd23a8d..a83990f2a4 100644
--- a/services/powermanager/PowerHalWrapper.cpp
+++ b/services/powermanager/PowerHalWrapper.cpp
@@ -209,6 +209,10 @@ HalResult<void> AidlHalWrapper::setMode(Mode mode, bool enabled) {
std::unique_lock<std::mutex> lock(mModeMutex);
size_t idx = static_cast<size_t>(mode);
+ if (mHandleSeh != nullptr && mode == Mode::INTERACTIVE) {
+ mHandleSeh->setInteractiveAsync(enabled, false);
+ }
+
// Quick return if mode is not supported by HAL
if (idx >= mModeSupportedArray.size() || mModeSupportedArray[idx] == HalSupport::OFF) {
ALOGV("Skipped setMode %s because Power HAL doesn't support it", toString(mode).c_str());
@@ -248,6 +252,72 @@ HalResult<int64_t> AidlHalWrapper::getHintSessionPreferredRate() {
return HalResult<int64_t>::fromStatus(result, rate);
}
+HalResult<void> HidlHalWrapperSeh::setBoost(Boost boost, int32_t durationMs) {
+ if (boost == Boost::INTERACTION) {
+ return sendPowerHint(V1_0::PowerHint::INTERACTION, durationMs);
+ } else {
+ ALOGV("Skipped setBoost %s because Power HAL AIDL not available", toString(boost).c_str());
+ return HalResult<void>::unsupported();
+ }
+}
+
+HalResult<void> HidlHalWrapperSeh::setMode(Mode mode, bool enabled) {
+ uint32_t data = enabled ? 1 : 0;
+ switch (mode) {
+ case Mode::LAUNCH:
+ return sendPowerHint(V1_0::PowerHint::LAUNCH, data);
+ case Mode::LOW_POWER:
+ return sendPowerHint(V1_0::PowerHint::LOW_POWER, data);
+ case Mode::SUSTAINED_PERFORMANCE:
+ return sendPowerHint(V1_0::PowerHint::SUSTAINED_PERFORMANCE, data);
+ case Mode::VR:
+ return sendPowerHint(V1_0::PowerHint::VR_MODE, data);
+ case Mode::INTERACTIVE:
+ return setInteractive(enabled);
+ case Mode::DOUBLE_TAP_TO_WAKE:
+ return setFeature(V1_0::Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE, enabled);
+ default:
+ ALOGV("Skipped setMode %s because Power HAL AIDL not available",
+ toString(mode).c_str());
+ return HalResult<void>::unsupported();
+ }
+}
+
+HalResult<void> HidlHalWrapperSeh::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) {
+ if(mHandle11 != nullptr) {
+ auto ret = mHandle11->powerHintAsync(hintId, data);
+ return HalResult<void>::fromReturn(ret);
+ } else {
+ auto ret = mHandle10->powerHint(hintId, data);
+ return HalResult<void>::fromReturn(ret);
+ }
+}
+
+HalResult<void> HidlHalWrapperSeh::setInteractive(bool enabled) {
+ if(mHandleSeh != nullptr) {
+ mHandleSeh->setInteractiveAsync(enabled, false);
+ }
+ auto ret = mHandle10->setInteractive(enabled);
+ return HalResult<void>::fromReturn(ret);
+}
+
+HalResult<void> HidlHalWrapperSeh::setFeature(V1_0::Feature feature, bool enabled) {
+ auto ret = mHandle10->setFeature(feature, enabled);
+ return HalResult<void>::fromReturn(ret);
+}
+
+HalResult<sp<Aidl::IPowerHintSession>> HidlHalWrapperSeh::createHintSession(
+ int32_t, int32_t, const std::vector<int32_t>& threadIds, int64_t) {
+ ALOGV("Skipped createHintSession(task num=%zu) because Power HAL not available",
+ threadIds.size());
+ return HalResult<sp<Aidl::IPowerHintSession>>::unsupported();
+}
+
+HalResult<int64_t> HidlHalWrapperSeh::getHintSessionPreferredRate() {
+ ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available");
+ return HalResult<int64_t>::unsupported();
+}
+
// -------------------------------------------------------------------------------------------------
} // namespace power
--
2.34.1

View File

@@ -0,0 +1,31 @@
From 430e53f071a6cbb8d1b2d700b081f5fbedf543ff Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 12 Jan 2022 04:07:34 -0500
Subject: [PATCH 07/10] Fix loading power hidl v1.0
Change-Id: Ife20a98d2a11c79c7b42f359f30c28e2dede1f25
---
services/powermanager/PowerHalLoader.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/services/powermanager/PowerHalLoader.cpp b/services/powermanager/PowerHalLoader.cpp
index 9b20e67f7a..cd7f2312e2 100644
--- a/services/powermanager/PowerHalLoader.cpp
+++ b/services/powermanager/PowerHalLoader.cpp
@@ -93,10 +93,11 @@ sp<vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower> PowerHalLoader::lo
}
sp<V1_0::IPower> PowerHalLoader::loadHidlV1_0Locked() {
- static bool gHalExists = true;
+ static bool gSecHalExists = true;
static auto loadFnSec = []() { return V1_0::IPower::getService("power"); };
- auto hal = loadHal<V1_0::IPower>(gHalExists, gHalHidlV1_0, loadFnSec, "HIDL v1.0");
+ auto hal = loadHal<V1_0::IPower>(gSecHalExists, gHalHidlV1_0, loadFnSec, "HIDL v1.0");
+ static bool gHalExists = true;
static auto loadFn = []() { return V1_0::IPower::getService(); };
if(hal == nullptr)
hal = loadHal<V1_0::IPower>(gHalExists, gHalHidlV1_0, loadFn, "HIDL v1.0");
--
2.34.1

View File

@@ -0,0 +1,30 @@
From b6a029560d93ce3e5535ab97e3cfbc7d1ca0f02c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Fri, 25 Mar 2022 05:37:56 -0400
Subject: [PATCH 08/10] MIUI13 devices hide their vibrator HAL behind
non-default name: "vibratorfeature"
---
services/vibratorservice/VibratorHalController.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/services/vibratorservice/VibratorHalController.cpp b/services/vibratorservice/VibratorHalController.cpp
index c1795f5c32..345016efd6 100644
--- a/services/vibratorservice/VibratorHalController.cpp
+++ b/services/vibratorservice/VibratorHalController.cpp
@@ -59,6 +59,12 @@ std::shared_ptr<HalWrapper> connectHal(std::shared_ptr<CallbackScheduler> schedu
return std::make_shared<AidlHalWrapper>(std::move(scheduler), aidlHal);
}
+ aidlHal = waitForVintfService<Aidl::IVibrator>(String16("vibratorfeature"));
+ if (aidlHal) {
+ ALOGV("Successfully connected to Xiaomi Vibrator HAL AIDL service.");
+ return std::make_shared<AidlHalWrapper>(std::move(scheduler), aidlHal);
+ }
+
sp<V1_0::IVibrator> halV1_0 = V1_0::IVibrator::getService();
if (halV1_0 == nullptr) {
ALOGV("Vibrator HAL service not available.");
--
2.34.1

View File

@@ -0,0 +1,282 @@
From 1093dcac13fc8c18e24e8b6394dc2beee6b5d309 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 18 Dec 2022 18:17:30 -0500
Subject: [PATCH 09/10] FOD support for Samsung and Asus
---
libs/gui/BLASTBufferQueue.cpp | 20 ++++++++++++++--
libs/ui/Gralloc2.cpp | 1 -
libs/ui/Gralloc3.cpp | 1 -
libs/ui/Gralloc4.cpp | 1 -
services/surfaceflinger/BufferQueueLayer.cpp | 1 +
.../CompositionEngine/src/OutputLayer.cpp | 24 +++++++++++++++++++
.../DisplayHardware/AidlComposerHal.cpp | 7 ++++++
.../DisplayHardware/AidlComposerHal.h | 2 ++
.../DisplayHardware/ComposerHal.h | 3 +++
.../surfaceflinger/DisplayHardware/HWC2.cpp | 8 +++++++
.../surfaceflinger/DisplayHardware/HWC2.h | 5 ++++
.../DisplayHardware/HidlComposerHal.cpp | 7 ++++++
.../DisplayHardware/HidlComposerHal.h | 2 ++
13 files changed, 77 insertions(+), 5 deletions(-)
diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp
index b8ea0808ab..f6b6752b01 100644
--- a/libs/gui/BLASTBufferQueue.cpp
+++ b/libs/gui/BLASTBufferQueue.cpp
@@ -33,11 +33,20 @@
#include <utils/Trace.h>
#include <private/gui/ComposerService.h>
+#include <cutils/properties.h>
#include <chrono>
using namespace std::chrono_literals;
+static bool sCheckedProps = false;
+static bool sSamsungFod = false;
+static void init_fod_props() {
+ if(sCheckedProps) return;
+ sCheckedProps = true;
+ sSamsungFod = property_get_bool("persist.sys.phh.fod.samsung", false);
+}
+
namespace {
inline const char* boolToString(bool b) {
return b ? "true" : "false";
@@ -147,9 +156,16 @@ BLASTBufferQueue::BLASTBufferQueue(const std::string& name, bool updateDestinati
// safe default, most producers are expected to override this
mProducer->setMaxDequeuedBufferCount(2);
+ uint64_t usage = GraphicBuffer::USAGE_HW_COMPOSER |
+ GraphicBuffer::USAGE_HW_TEXTURE;
+
+ init_fod_props();
+ if(sSamsungFod && name.find("SurfaceView[UdfpsControllerOverlay]") != std::string::npos) {
+ usage |= 0x400000000LL;
+ }
+
mBufferItemConsumer = new BLASTBufferItemConsumer(mConsumer,
- GraphicBuffer::USAGE_HW_COMPOSER |
- GraphicBuffer::USAGE_HW_TEXTURE,
+ usage,
1, false, this);
static int32_t id = 0;
mName = name + "#" + std::to_string(id);
diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp
index 4e7fd7ca29..a358f78528 100644
--- a/libs/ui/Gralloc2.cpp
+++ b/libs/ui/Gralloc2.cpp
@@ -115,7 +115,6 @@ status_t Gralloc2Mapper::validateBufferDescriptorInfo(
if (descriptorInfo->usage & ~validUsageBits) {
ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64,
descriptorInfo->usage & ~validUsageBits);
- return BAD_VALUE;
}
// Gralloc2 implementations never understand non-BLOB with GPU_DATA_BUFFER
diff --git a/libs/ui/Gralloc3.cpp b/libs/ui/Gralloc3.cpp
index 194cbdf161..661ecc62a2 100644
--- a/libs/ui/Gralloc3.cpp
+++ b/libs/ui/Gralloc3.cpp
@@ -106,7 +106,6 @@ status_t Gralloc3Mapper::validateBufferDescriptorInfo(
if (descriptorInfo->usage & ~validUsageBits) {
ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64,
descriptorInfo->usage & ~validUsageBits);
- return BAD_VALUE;
}
// Gralloc3 implementations never understand non-BLOB with GPU_DATA_BUFFER
diff --git a/libs/ui/Gralloc4.cpp b/libs/ui/Gralloc4.cpp
index 63f7d31b05..562e383919 100644
--- a/libs/ui/Gralloc4.cpp
+++ b/libs/ui/Gralloc4.cpp
@@ -127,7 +127,6 @@ static status_t validateBufferDescriptorInfo(IMapper::BufferDescriptorInfo* desc
if (descriptorInfo->usage & ~validUsageBits) {
ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64,
descriptorInfo->usage & ~validUsageBits);
- return BAD_VALUE;
}
// Combinations that are only allowed with gralloc 4.1.
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp
index bee4de32a6..4992b8374d 100644
--- a/services/surfaceflinger/BufferQueueLayer.cpp
+++ b/services/surfaceflinger/BufferQueueLayer.cpp
@@ -472,6 +472,7 @@ status_t BufferQueueLayer::setDefaultBufferProperties(uint32_t w, uint32_t h, Pi
setDefaultBufferSize(w, h);
mConsumer->setDefaultBufferFormat(format);
mConsumer->setConsumerUsageBits(getEffectiveUsage(0));
+ ALOGE("bufferqueuelayer -- name %s", mName.c_str());
return NO_ERROR;
}
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 1bb9d0eb63..3960808d49 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -27,6 +27,7 @@
#include "system/graphics-base-v1.0.h"
#include <ui/DataspaceUtils.h>
+#include <cutils/properties.h>
// TODO(b/129481165): remove the #pragma below and fix conversion issues
#pragma clang diagnostic push
@@ -37,6 +38,9 @@
// TODO(b/129481165): remove the #pragma below and fix conversion issues
#pragma clang diagnostic pop // ignored "-Wconversion"
+static bool sCheckedProps = false;
+static bool sAsusFod = false;
+
using aidl::android::hardware::graphics::composer3::Composition;
namespace android::compositionengine {
@@ -425,6 +429,26 @@ void OutputLayer::writeOutputDependentGeometryStateToHWC(HWC2::Layer* hwcLayer,
->getHeight()));
}
+ if(!sCheckedProps) {
+ sCheckedProps = true;
+ sAsusFod = property_get_bool("persist.sys.phh.fod.asus", false);
+ }
+
+ if (strstr(getLayerFE().getDebugName(), "UdfpsControllerOverlay#") != nullptr) {
+ if (sAsusFod) {
+ if (auto error = hwcLayer->setLayerClass(5); error != hal::Error::NONE) {
+ ALOGE("Failed setting Asus layer class");
+ }
+ }
+ }
+ if (strstr(getLayerFE().getDebugName(), "SurfaceView[UdfpsControllerOverlay](BLAST)#") != nullptr) {
+ if (sAsusFod) {
+ if (auto error = hwcLayer->setLayerClass(4); error != hal::Error::NONE) {
+ ALOGE("Failed setting Asus layer class");
+ }
+ }
+ }
+
ALOGV("Writing display frame [%d, %d, %d, %d]", displayFrame.left, displayFrame.top,
displayFrame.right, displayFrame.bottom);
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
index 79dcd159d3..922bd8c364 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.cpp
@@ -1126,5 +1126,12 @@ Error AidlComposer::getPhysicalDisplayOrientation(Display displayId,
return Error::NONE;
}
+Error AidlComposer::setLayerClass(Display display, Layer layer, uint32_t layerClass) {
+ (void) display;
+ (void) layer;
+ (void) layerClass;
+ return Error::NONE;
+}
+
} // namespace Hwc2
} // namespace android
diff --git a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
index 18d2242c7e..8ebca826a4 100644
--- a/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/AidlComposerHal.h
@@ -227,6 +227,8 @@ public:
Error getPhysicalDisplayOrientation(Display displayId,
AidlTransform* outDisplayOrientation) override;
+ // Proprietary extensions
+ Error setLayerClass(Display display, Layer layer, uint32_t layerClass) override;
private:
// Many public functions above simply write a command into the command
// queue to batch the calls. validateDisplay and presentDisplay will call
diff --git a/services/surfaceflinger/DisplayHardware/ComposerHal.h b/services/surfaceflinger/DisplayHardware/ComposerHal.h
index d266d942fb..b81d01e6d8 100644
--- a/services/surfaceflinger/DisplayHardware/ComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/ComposerHal.h
@@ -281,6 +281,9 @@ public:
virtual Error setIdleTimerEnabled(Display displayId, std::chrono::milliseconds timeout) = 0;
virtual Error getPhysicalDisplayOrientation(Display displayId,
AidlTransform* outDisplayOrientation) = 0;
+
+ // Proprietary extensions
+ virtual Error setLayerClass(Display display, Layer layer, uint32_t layerClass) = 0;
};
} // namespace Hwc2
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp
index c52e96d146..82f60516ae 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp
@@ -988,6 +988,14 @@ Error Layer::setBlockingRegion(const Region& region) {
return static_cast<Error>(intError);
}
+Error Layer::setLayerClass(uint32_t layerClass) {
+ if (CC_UNLIKELY(!mDisplay)) {
+ return Error::BAD_DISPLAY;
+ }
+ auto intError = mComposer.setLayerClass(mDisplay->getId(), mId, layerClass);
+ return static_cast<Error>(intError);
+}
+
} // namespace impl
} // namespace HWC2
} // namespace android
diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h
index 24aef9b73c..138d14456c 100644
--- a/services/surfaceflinger/DisplayHardware/HWC2.h
+++ b/services/surfaceflinger/DisplayHardware/HWC2.h
@@ -333,6 +333,9 @@ public:
// AIDL HAL
[[nodiscard]] virtual hal::Error setBrightness(float brightness) = 0;
[[nodiscard]] virtual hal::Error setBlockingRegion(const android::Region& region) = 0;
+
+ // Proprietary HAL
+ [[nodiscard]] virtual hal::Error setLayerClass(uint32_t layerClass) = 0;
};
namespace impl {
@@ -382,6 +385,8 @@ public:
hal::Error setBrightness(float brightness) override;
hal::Error setBlockingRegion(const android::Region& region) override;
+ // Proprietary HAL
+ hal::Error setLayerClass(uint32_t layerClass) override;
private:
// These are references to data owned by HWC2::Device, which will outlive
// this HWC2::Layer, so these references are guaranteed to be valid for
diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
index 2597ae6091..12b36f321e 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.cpp
@@ -1345,6 +1345,13 @@ Error HidlComposer::getPhysicalDisplayOrientation(Display, AidlTransform*) {
"OptionalFeature::PhysicalDisplayOrientation is not supported on HIDL");
}
+Error HidlComposer::setLayerClass(Display display, Layer layer, uint32_t layerClass) {
+ mWriter.selectDisplay(display);
+ mWriter.selectLayer(layer);
+ mWriter.vendor800_1(layerClass);
+ return Error::NONE;
+}
+
void HidlComposer::registerCallback(ComposerCallback& callback) {
const bool vsyncSwitchingSupported =
isSupported(Hwc2::Composer::OptionalFeature::RefreshRateSwitching);
diff --git a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
index d0d3c2e6d7..c40986fae9 100644
--- a/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
+++ b/services/surfaceflinger/DisplayHardware/HidlComposerHal.h
@@ -338,6 +338,8 @@ public:
Error getPhysicalDisplayOrientation(Display displayId,
AidlTransform* outDisplayOrientation) override;
+ // Proprietary extensions
+ Error setLayerClass(Display display, Layer layer, uint32_t layerClass) override;
private:
class CommandWriter : public CommandWriterBase {
public:
--
2.34.1

View File

@@ -0,0 +1,36 @@
From 85eaba4f3b4e0c85411158807b677f135fd4331f Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Tue, 18 Apr 2023 23:48:15 +0000
Subject: [PATCH 10/10] Fix light sensor crash on Xiaomi 13
SensorService expects a scalar, but Xiaomi HAL returns a pose6DOF vector encapsulation
Thanks @phhusson for the analysis
Change-Id: Ie358321d5328d01541f455d6af86944ff413c9c9
---
services/sensorservice/AidlSensorHalWrapper.cpp | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/services/sensorservice/AidlSensorHalWrapper.cpp b/services/sensorservice/AidlSensorHalWrapper.cpp
index f67c610550..32fd9240b3 100644
--- a/services/sensorservice/AidlSensorHalWrapper.cpp
+++ b/services/sensorservice/AidlSensorHalWrapper.cpp
@@ -171,7 +171,14 @@ void convertToSensorEvent(const Event &src, sensors_event_t *dst) {
case SensorType::MOTION_DETECT:
case SensorType::HEART_BEAT:
case SensorType::LOW_LATENCY_OFFBODY_DETECT: {
- dst->data[0] = src.payload.get<Event::EventPayload::scalar>();
+ if (src.payload.getTag() == Event::EventPayload::pose6DOF) {
+ auto d = src.payload.get<Event::EventPayload::pose6DOF>();
+ auto dstr = ::android::internal::ToString(d);
+ // ALOGE("Received 6DOF for expected scalar %s", dstr.c_str());
+ dst->data[0] = d.values[0];
+ } else {
+ dst->data[0] = src.payload.get<Event::EventPayload::scalar>();
+ }
break;
}
--
2.34.1

View File

@@ -0,0 +1,34 @@
From 0e3acc4e47d5197132ca6a84c07d690a08536a16 Mon Sep 17 00:00:00 2001
From: Artem Borisov <dedsa2002@gmail.com>
Date: Sat, 10 Nov 2018 17:19:17 +0000
Subject: [PATCH 2/7] Telephony: Don not call onUssdRelease for Huawei RIL
Huawei RIL doesn't seem to work properly with USSD_MODE_NW_RELEASE,
always releasing USSD when it should be finished instead.
Let's explicitly call onUssdFinished in this case.
Change-Id: I69faed1c51d4582834879975d6ab13daf7f48ad4
---
src/java/com/android/internal/telephony/GsmCdmaPhone.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index 76a8d57246..6094483229 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -2834,7 +2834,11 @@ public class GsmCdmaPhone extends Phone {
if (found != null) {
// Complete pending USSD
if (isUssdRelease) {
- found.onUssdRelease();
+ if (SystemProperties.getBoolean("persist.sys.radio.huawei", false)) {
+ found.onUssdFinished(ussdMessage, isUssdRequest);
+ } else {
+ found.onUssdRelease();
+ }
} else if (isUssdError) {
found.onUssdFinishedError();
} else {
--
2.34.1

View File

@@ -0,0 +1,29 @@
From c45687629af2c00ae3ddc18dbcfdab461c328af5 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 21 Dec 2020 19:36:54 +0100
Subject: [PATCH] Let vendor have priority over NFC config file, rather than
GSI
Thanks @mikalovtch
Change-Id: Iaee468f3b8e5c8ec90ca7e856a6526d1cbcaa33e
---
src/adaptation/nfc_config.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/adaptation/nfc_config.cc b/src/adaptation/nfc_config.cc
index 264968e4..92606979 100644
--- a/src/adaptation/nfc_config.cc
+++ b/src/adaptation/nfc_config.cc
@@ -30,7 +30,7 @@ using namespace ::android::base;
namespace {
std::string searchConfigPath(std::string file_name) {
const std::vector<std::string> search_path = {
- "/product/etc/", "/odm/etc/", "/vendor/etc/", "/system_ext/etc/", "/etc/",
+ "/odm/etc/", "/vendor/etc/", "/product/etc/", "/system_ext/etc/", "/etc/",
};
for (std::string path : search_path) {
path.append(file_name);
--
2.25.1

View File

@@ -0,0 +1,38 @@
From 11766af32aece696f0390e41a5c574b4ca3de265 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 7 Mar 2020 14:49:09 +0100
Subject: [PATCH 2/5] Failing to create facedata shouldn't be fatal
Some Pie vendors create it on their own, so SELinux would deny that
Also not all devices have face unlock anyway
See https://github.com/phhusson/treble_experimentations/issues/1119
---
vold_prepare_subdirs.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/vold_prepare_subdirs.cpp b/vold_prepare_subdirs.cpp
index 94d7f15..671ae6f 100644
--- a/vold_prepare_subdirs.cpp
+++ b/vold_prepare_subdirs.cpp
@@ -198,7 +198,7 @@ static bool prepare_subdirs(const std::string& volume_uuid, int user_id, int fla
}
auto facedata_path = vendor_de_path + "/facedata";
if (!prepare_dir(sehandle, 0700, AID_SYSTEM, AID_SYSTEM, facedata_path)) {
- return false;
+ LOG(ERROR) << "Failed preparing folder for de facedata";
}
}
}
@@ -247,7 +247,7 @@ static bool prepare_subdirs(const std::string& volume_uuid, int user_id, int fla
auto vendor_ce_path = android::vold::BuildDataVendorCePath(user_id);
auto facedata_path = vendor_ce_path + "/facedata";
if (!prepare_dir(sehandle, 0700, AID_SYSTEM, AID_SYSTEM, facedata_path)) {
- return false;
+ LOG(ERROR) << "Failed preparing folder for de facedata";
}
}
}
--
2.25.1