readded the original files, builds break without it
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user