Compare commits

..

No commits in common. "lineage-17.1" and "lineage-21-light" have entirely different histories.

280 changed files with 17692 additions and 11352 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/patches_treble_personal/vendor_hardware_overlay

View File

@ -1,37 +0,0 @@
From 3e18df7a3462d3b81ac4cbc23b1e8721f2f3722c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 3 Jan 2019 17:50:03 +0100
Subject: [PATCH 1/2] Read SDK version override from property
Change-Id: I88ca5d0bde15ee4f2b2bd1255e98f9592973dbf9
---
linker/linker.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 6941fde20..c4730ec20 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -4296,7 +4296,9 @@ std::vector<android_namespace_t*> init_default_namespaces(const char* executable
}
uint32_t target_sdk = config->target_sdk_version();
-#ifdef SDK_VERSION_OVERRIDES
+
+ std::string sdkVersionOverrides = android::base::GetProperty("persist.sys.phh.sdk_override", "");
+ static const char *SDK_VERSION_OVERRIDES = sdkVersionOverrides.c_str();
for (const auto& entry : android::base::Split(SDK_VERSION_OVERRIDES, " ")) {
auto splitted = android::base::Split(entry, "=");
if (splitted.size() == 2 && splitted[0] == executable_path) {
@@ -4305,7 +4307,7 @@ std::vector<android_namespace_t*> init_default_namespaces(const char* executable
}
}
DEBUG("Target SDK for %s = %d", executable_path, target_sdk);
-#endif
+
set_application_target_sdk_version(target_sdk);
std::vector<android_namespace_t*> created_namespaces;
--
2.25.1

View File

@ -1,36 +0,0 @@
From 1823be14501a6c116f6d5e87570dea1af2c68413 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 12 Sep 2019 12:54:23 +0200
Subject: [PATCH 2/2] Use vndk_lite ld.config only on same-version vendor
When running Q over P lite, there is currently absolutely no chance the
device boots, because it will be using Q vndk.
Thus using ld.config.28.txt when running Q over P lite gives a little more
chance for the device to boot, than when using vndk_lite ld.config.
Also, once this patch is applied, the required effort to boot
Q over P lite is exclusively in vndk, which is manageable.
Change-Id: I55257cd7c738b1d20582e198e1d5621e1c87a03e
---
linker/linker.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/linker/linker.cpp b/linker/linker.cpp
index c4730ec20..337811951 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -4147,7 +4147,10 @@ static std::string get_ld_config_file_apex_path(const char* executable_path) {
}
static std::string get_ld_config_file_vndk_path() {
- if (android::base::GetBoolProperty("ro.vndk.lite", false)) {
+ bool same_version_system_vendor = false;
+ if(std::to_string(__ANDROID_API__) == Config::get_vndk_version_string('.'))
+ same_version_system_vendor = true;
+ if (android::base::GetBoolProperty("ro.vndk.lite", false) && same_version_system_vendor) {
return kLdConfigVndkLiteFilePath;
}
--
2.25.1

View File

@ -1,26 +0,0 @@
From a1b739f4631bfaa8a15cdc70081819b1d9360332 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 12 Sep 2019 20:31:07 +0200
Subject: [PATCH] Don't reboot if we couldn't get bootctrl
Change-Id: Id1793660bd1c97ab369607f58a772ca3512ec1af
---
update_verifier/update_verifier.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/update_verifier/update_verifier.cpp b/update_verifier/update_verifier.cpp
index d04c455d..27e9f616 100644
--- a/update_verifier/update_verifier.cpp
+++ b/update_verifier/update_verifier.cpp
@@ -310,7 +310,7 @@ int update_verifier(int argc, char** argv) {
sp<IBootControl> module = IBootControl::getService();
if (module == nullptr) {
LOG(ERROR) << "Error getting bootctrl module.";
- return reboot_device();
+ return 0;
}
uint32_t current_slot = module->getCurrentSlot();
--
2.25.1

View File

@ -1,25 +0,0 @@
From 5b235ab7e686c58433d623fe5355125d9c9fdd35 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Fri, 6 Sep 2019 15:10:28 +0200
Subject: [PATCH] Whitelist radio HALs (needed because they need to e in
framework because of weird jarjar issue)
Change-Id: If1ccbedde92955bb86f4c6db6d68502784de1d8d
---
core/tasks/check_boot_jars/package_whitelist.txt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/core/tasks/check_boot_jars/package_whitelist.txt b/core/tasks/check_boot_jars/package_whitelist.txt
index a2ebd491d..3545bbd88 100644
--- a/core/tasks/check_boot_jars/package_whitelist.txt
+++ b/core/tasks/check_boot_jars/package_whitelist.txt
@@ -264,3 +264,6 @@ org\.ifaa\.android\.manager.*
com\.nvidia\.*
com\.nvidia\.profilemanager\.*
com\.nvidia\.NvCPLSvc\.*
+
+vendor\.samsung\.hardware\.radio\.V1_2
+vendor\.mediatek\.hardware\.radio\.V2_0
--
2.25.1

View File

@ -1,49 +0,0 @@
From 8387b818fb3d921f718d7088a78db0842f8e5d41 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 14 Sep 2019 21:25:07 +0200
Subject: [PATCH 2/3] Add BOARD_SYSTEMIMAGE_AS_SYSTEM parameter to build SaS
GSI
Change-Id: I764f0ef4e3be9a338fbe93944445cedc29d2bb81
---
core/Makefile | 1 +
tools/releasetools/build_image.py | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/core/Makefile b/core/Makefile
index a5eef489f..1d0c63e23 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -1378,6 +1378,7 @@ endif # PRODUCT_USE_DYNAMIC_PARTITIONS
# $(3): additional "key=value" pairs to append to the dictionary file.
define generate-image-prop-dictionary
$(if $(filter $(2),system),\
+ $(if $(BOARD_SYSTEMIMAGE_AS_SYSTEM),$(hide) echo "system_as_system=$(BOARD_SYSTEMIMAGE_AS_SYSTEM)" >> $(1))
$(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1))
$(if $(INTERNAL_SYSTEM_OTHER_PARTITION_SIZE),$(hide) echo "system_other_size=$(INTERNAL_SYSTEM_OTHER_PARTITION_SIZE)" >> $(1))
$(if $(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "system_fs_type=$(BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py
index 641a6e19f..7d4f1c328 100755
--- a/tools/releasetools/build_image.py
+++ b/tools/releasetools/build_image.py
@@ -157,6 +157,8 @@ def SetUpInDirAndFsConfig(origin_in, prop_dict):
if prop_dict["mount_point"] != "system":
return origin_in, fs_config
+ if "system_as_system" in prop_dict:
+ return origin_in, fs_config
if "first_pass" in prop_dict:
prop_dict["mount_point"] = "/"
@@ -564,6 +566,8 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
if not copy_prop("system_extfs_rsv_pct", "extfs_rsv_pct"):
d["extfs_rsv_pct"] = "0"
copy_prop("system_reserved_size", "partition_reserved_size")
+
+ copy_prop("system_as_system", "system_as_system")
elif mount_point == "system_other":
# We inherit the selinux policies of /system since we contain some of its
# files.
--
2.25.1

View File

@ -1,21 +0,0 @@
From 9434797f88d439d3dff8c7af733dcea2cdfed7ab Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 22 Mar 2020 18:09:04 +0100
Subject: [PATCH 3/3] Skip mounting /oem, because if it exists, it includes
framework-level stuff we dont want
---
target/product/gsi/skip_mount.cfg | 1 +
1 file changed, 1 insertion(+)
diff --git a/target/product/gsi/skip_mount.cfg b/target/product/gsi/skip_mount.cfg
index 549767edf..327676384 100644
--- a/target/product/gsi/skip_mount.cfg
+++ b/target/product/gsi/skip_mount.cfg
@@ -1,2 +1,3 @@
/product
/product_services
+/oem
--
2.25.1

View File

@ -1,27 +0,0 @@
From 0fcb4cf13bf9b59218267fa54f4334c397da96f4 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Fri, 2 Mar 2018 22:49:55 +0100
Subject: [PATCH 1/8] Enable multipl_decls by default. This is needed because
8.0 init doesn't add -m
Change-Id: I43dc661d519f7b8576d72a828d8cbd444592bf5e
---
secilc/secilc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/secilc/secilc.c b/secilc/secilc.c
index ad6862ba..8799e99a 100644
--- a/secilc/secilc.c
+++ b/secilc/secilc.c
@@ -90,7 +90,7 @@ int main(int argc, char *argv[])
int target = SEPOL_TARGET_SELINUX;
int mls = -1;
int disable_dontaudit = 0;
- int multiple_decls = 0;
+ int multiple_decls = 1;
int disable_neverallow = 0;
int preserve_tunables = 0;
int handle_unknown = -1;
--
2.25.1

View File

@ -1,26 +0,0 @@
From 59e09675460e91cb989bc04886edb9aed738c63a Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 9 Apr 2018 00:19:49 +0200
Subject: [PATCH 2/8] Increase default log_level to get actual selinux error in
kmsg
---
secilc/secilc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/secilc/secilc.c b/secilc/secilc.c
index 8799e99a..631b4b0a 100644
--- a/secilc/secilc.c
+++ b/secilc/secilc.c
@@ -101,7 +101,7 @@ int main(int argc, char *argv[])
int opt_index = 0;
char *fc_buf = NULL;
size_t fc_size;
- enum cil_log_level log_level = CIL_ERR;
+ enum cil_log_level log_level = CIL_WARN;
static struct option long_opts[] = {
{"help", no_argument, 0, 'h'},
{"verbose", no_argument, 0, 'v'},
--
2.25.1

View File

@ -1,40 +0,0 @@
From bb0fa90347c9acd0a4b215b9f2244d2761667bdc Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 3 Dec 2018 20:54:54 +0100
Subject: [PATCH 3/8] Kirin:: Workaround some conflicting Kirin tether SELinux
context
Some Kirin devices declared some android.hardware.tetheroffload HALs,
but they didn't use AOSP contexts.
This leads to libselinux aborting when loading hwservice_contexts.
Workaround it the ugly way, by making them match.
This most likely kills tetheroffload for those devices.
---
libselinux/src/label_backends_android.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/libselinux/src/label_backends_android.c b/libselinux/src/label_backends_android.c
index eaca5947..ab92985b 100644
--- a/libselinux/src/label_backends_android.c
+++ b/libselinux/src/label_backends_android.c
@@ -62,6 +62,16 @@ static int nodups_specs(struct saved_data *data)
curr_spec->property_key)) {
if (strcmp(spec_arr[jj].lr.ctx_raw,
curr_spec->lr.ctx_raw)) {
+ if(strcmp(spec_arr[jj].lr.ctx_raw, "u:object_r:hal_ipacm_hwservice:s0") == 0) {
+ free(spec_arr[jj].lr.ctx_raw);
+ spec_arr[jj].lr.ctx_raw = strdup("u:object_r:hal_tetheroffload_hwservice:s0");
+ continue;
+ }
+ if(strcmp(curr_spec->lr.ctx_raw, "u:object_r:hal_ipacm_hwservice:s0") == 0) {
+ free(curr_spec->lr.ctx_raw);
+ curr_spec->lr.ctx_raw = strdup("u:object_r:hal_tetheroffload_hwservice:s0");
+ continue;
+ }
rc = -1;
errno = EINVAL;
selinux_log
--
2.25.1

View File

@ -1,43 +0,0 @@
From 8d23d9c14cc95edd2f3fc31433357e6249af1a11 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Fri, 6 Sep 2019 15:07:25 +0200
Subject: [PATCH 4/8] Allow /devices/virtual/block/ genfscon conflict (seen on
Xiaomi Mi 9)
Change-Id: I06e4e9d5b82d61a8aeab595b47e2589249675895
---
libsepol/cil/src/cil_post.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/libsepol/cil/src/cil_post.c b/libsepol/cil/src/cil_post.c
index 0b09cecc..255c9e12 100644
--- a/libsepol/cil/src/cil_post.c
+++ b/libsepol/cil/src/cil_post.c
@@ -477,7 +477,23 @@ int cil_post_genfscon_context_compare(const void *a, const void *b)
{
struct cil_genfscon *a_genfscon = *(struct cil_genfscon**)a;
struct cil_genfscon *b_genfscon = *(struct cil_genfscon**)b;
- return context_compare(a_genfscon->context, b_genfscon->context);
+ int rc = context_compare(a_genfscon->context, b_genfscon->context);
+ if(rc) {
+ fprintf(stderr, "hello %s\n", a_genfscon->fs_str);
+ int bypass = 0;
+ /*
+ * This conflict has been seen on Xiaomi Mi 9:
+ * - AOSP Q says (genfscon sysfs /devices/virtual/block/ (u object_r sysfs_devices_block ((s0) (s0))))
+ * - stock rom says (genfscon sysfs /devices/virtual/block/ (u object_r sysfs_ufs_target ((s0) (s0))))
+ */
+ if(strcmp(a_genfscon->path_str, "/devices/virtual/block/") == 0)
+ bypass = 1;
+ if(bypass == 1) {
+ fprintf(stderr, "Received conflicting %s vs %s but ignore\n", a_genfscon->path_str, b_genfscon->path_str);
+ return 0;
+ }
+ }
+ return rc;
}
int cil_post_netifcon_context_compare(const void *a, const void *b)
--
2.25.1

View File

@ -1,44 +0,0 @@
From 2613e4dd6fe7b351581799e11980104b25e443f1 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 12 Sep 2019 20:34:28 +0200
Subject: [PATCH 5/8] Most horrific: Remove ramdisk's zygote init scripts
This is needed because:
- only secilc is run soon enough in /system to
remove it
- placing an init.zygote in system won't have init replace it, it's the
first that appears that wins
Change-Id: I8be31ceb9ef2124d04994d9fb08fc8012a2f819e
---
secilc/secilc.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/secilc/secilc.c b/secilc/secilc.c
index 631b4b0a..3dd6e7ce 100644
--- a/secilc/secilc.c
+++ b/secilc/secilc.c
@@ -34,6 +34,8 @@
#include <getopt.h>
#include <sys/stat.h>
+#include <unistd.h>
+
#ifdef ANDROID
#include <cil/cil.h>
#else
@@ -121,6 +123,11 @@ int main(int argc, char *argv[])
};
int i;
+ unlink("/init.zygote32.rc");
+ unlink("/init.zygote64_32.rc");
+ unlink("/init.zygote64.rc");
+ unlink("/init.zygote32_64.rc");
+
while (1) {
opt_char = getopt_long(argc, argv, "o:f:U:hvt:M:PDmNc:GX:", long_opts, &opt_index);
if (opt_char == -1) {
--
2.25.1

View File

@ -1,44 +0,0 @@
From 0646089ab1c663e04dd7ba364c6e06db3fb67695 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 12 Sep 2019 20:37:04 +0200
Subject: [PATCH 6/8] if service is "rcs", accept conflict. Seen on Moto E5
Change-Id: I0cc2d0fad83f403f2b5d7458039b1564ce5ed9dd
---
libselinux/src/label_backends_android.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/libselinux/src/label_backends_android.c b/libselinux/src/label_backends_android.c
index ab92985b..ca16327c 100644
--- a/libselinux/src/label_backends_android.c
+++ b/libselinux/src/label_backends_android.c
@@ -72,14 +72,24 @@ static int nodups_specs(struct saved_data *data)
curr_spec->lr.ctx_raw = strdup("u:object_r:hal_tetheroffload_hwservice:s0");
continue;
}
- rc = -1;
- errno = EINVAL;
selinux_log
(SELINUX_ERROR,
"Multiple different specifications for %s (%s and %s).\n",
curr_spec->property_key,
spec_arr[jj].lr.ctx_raw,
curr_spec->lr.ctx_raw);
+ int ignore = 0;
+ /*
+ * This issue has been found on Moto E5
+ * E SELinux : Multiple different specifications for rcs (u:object_r:radio_service:s0 and u:object_r:mot_rcs_service:s0).
+ */
+ if(!strcmp(curr_spec->property_key, "rcs"))
+ ignore = 1;
+
+ if(!ignore) {
+ rc = -1;
+ errno = EINVAL;
+ }
} else {
selinux_log
(SELINUX_WARNING,
--
2.25.1

View File

@ -1,84 +0,0 @@
From 619185d4d8d3af1b86a2aba200659ad6ae09b44a Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Fri, 25 Oct 2019 13:29:20 +0200
Subject: [PATCH 7/8] Fix boot on Moto devices using unknown class
vendor sepolicy never contains new class or classorder, and are not
allowed to.
Though this is not tested, and it turns out Moto did it anyway.
This raises an issue, because class need to be ordered, and thus the cil
contains the ordering. This ordering needs to be merged.
Android 10 added new classes, so the ordering can no longer be merged,
and secilc fails on those devices, preventing boot.
Considering vendor are not supposed to declare new class (and thus
declare classorder), this fix ignores class-es/classorder in vendor
SELinux policy.
Since the vendor selinux policy has allows rules based on this context,
those allows will fail since the class doesn't exist.
Workaround this by ignoring rules with the problematic class
( keystore_moto_key )
Lucky us, this new class `keystore_moto_key` is used by Moto for
framework to framework (more accurately priv app to keymaster), since
our own framework doesn't use this class, simply ignoring it fixes the
issue.
Change-Id: I66339857634ebfdba359f12a99dfd0bff709d80b
---
libsepol/cil/src/cil_build_ast.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
index b90b0f60..6f391940 100644
--- a/libsepol/cil/src/cil_build_ast.c
+++ b/libsepol/cil/src/cil_build_ast.c
@@ -386,6 +386,14 @@ int cil_gen_class(struct cil_db *db, struct cil_tree_node *parse_current, struct
struct cil_tree_node *perms = NULL;
int rc = SEPOL_ERR;
+ {
+ const char* path = cil_tree_get_cil_path(parse_current);
+ if(strstr(path, "vendor")) {
+ cil_clear_node(ast_node);
+ return SEPOL_OK;
+ }
+ }
+
rc = __cil_verify_syntax(parse_current, syntax, syntax_len);
if (rc != SEPOL_OK) {
goto exit;
@@ -452,6 +460,14 @@ int cil_gen_classorder(struct cil_db *db, struct cil_tree_node *parse_current, s
struct cil_list_item *head = NULL;
int rc = SEPOL_ERR;
+ {
+ const char* path = cil_tree_get_cil_path(parse_current);
+ if(strstr(path, "vendor")) {
+ cil_clear_node(ast_node);
+ return SEPOL_OK;
+ }
+ }
+
if (db == NULL || parse_current == NULL || ast_node == NULL) {
goto exit;
}
@@ -2050,6 +2066,14 @@ int cil_gen_avrule(struct cil_tree_node *parse_current, struct cil_tree_node *as
rule->src_str = parse_current->next->data;
rule->tgt_str = parse_current->next->next->data;
+ {
+ const char *classname = parse_current->next->next->next->cl_head->data;
+ if(strcmp(classname, "keystore_moto_key") == 0) {
+ cil_clear_node(ast_node);
+ return SEPOL_OK;
+ }
+ }
+
rc = cil_fill_classperms_list(parse_current->next->next->next, &rule->perms.classperms);
if (rc != SEPOL_OK) {
goto exit;
--
2.25.1

View File

@ -1,27 +0,0 @@
From 6e9400a75c7193ba7e4d5050e3a0e71627d38ce8 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 24 May 2020 17:22:22 +0200
Subject: [PATCH 8/8] Allow mismatches of exfat genfscon
---
libsepol/cil/src/cil_post.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/libsepol/cil/src/cil_post.c b/libsepol/cil/src/cil_post.c
index 255c9e12..f97c65c1 100644
--- a/libsepol/cil/src/cil_post.c
+++ b/libsepol/cil/src/cil_post.c
@@ -488,6 +488,10 @@ int cil_post_genfscon_context_compare(const void *a, const void *b)
*/
if(strcmp(a_genfscon->path_str, "/devices/virtual/block/") == 0)
bypass = 1;
+ if(strcmp(a_genfscon->fs_str, "exfat") == 0 || strcmp(a_genfscon->fs_str, "esdfs") == 0) {
+ if(strcmp(a_genfscon->path_str, "/") == 0)
+ bypass = 1;
+ }
if(bypass == 1) {
fprintf(stderr, "Received conflicting %s vs %s but ignore\n", a_genfscon->path_str, b_genfscon->path_str);
return 0;
--
2.25.1

View File

@ -1,59 +0,0 @@
From fd42c051ba56676ce593d5313ae2d72d85133a6a Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Tue, 22 Oct 2019 20:54:25 +0800
Subject: [PATCH] GrGLCaps: allow ignoring vendor-supplied texture swizzle flag
* This is broken on MTK 8.1 vendor
Change-Id: I1ccae06f643f01e4ea6539e1d4e3c7df8d6e30ae
---
Android.bp | 1 +
src/gpu/gl/GrGLCaps.h | 11 +++++++++++
2 files changed, 12 insertions(+)
diff --git a/Android.bp b/Android.bp
index 3d2ab6d370..099cd6ba0b 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3,6 +3,7 @@
cc_library_static {
name: "libskia",
host_supported: true,
+ shared_libs: [ "libbase" ],
cflags: [
"-U_FORTIFY_SOURCE",
"-DATRACE_TAG=ATRACE_TAG_VIEW",
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index 4a97e84cf8..aee7a5509e 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -17,6 +17,11 @@
#include "SkTHash.h"
#include "SkTArray.h"
+#if defined(SK_BUILD_FOR_ANDROID)
+#include "android-base/properties.h"
+using android::base::GetBoolProperty;
+#endif
+
class GrGLContextInfo;
class GrGLRenderTarget;
@@ -330,8 +335,14 @@ public:
/// Are textures with GL_TEXTURE_RECTANGLE type supported.
bool rectangleTextureSupport() const { return fRectangleTextureSupport; }
+#if !defined(SK_BUILD_FOR_ANDROID)
/// GL_ARB_texture_swizzle
bool textureSwizzleSupport() const { return fTextureSwizzleSupport; }
+#else
+ bool textureSwizzleSupport() const {
+ return !GetBoolProperty("ro.skia.ignore_swizzle", false) && fTextureSwizzleSupport;
+ }
+#endif
bool mipMapLevelAndLodControlSupport() const { return fMipMapLevelAndLodControlSupport; }
--
2.25.1

View File

@ -1,81 +0,0 @@
From 9873f460d3a40ca739e4c069068b32990dc2fff8 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 24 Apr 2018 00:14:28 +0200
Subject: [PATCH 01/17] FIH devices: Fix "Earpiece" audio output
On some FIH devices (confirmed on Razer, and probably on Aquos SS2),
Earpiece is not listed in attachedDevices, and devicePort's profile
mentions it is AUDIO_CHANNEL_IN_MONO, instead of AUDIO_CHANNEL_OUT_MONO.
Detect such cases (output device, but got only AUDIO_CHANNEL_IN_MONO),
and fix both channelMasks and attachedDevices
Change-Id: I4a88ba6d34d0fcd346eeea2ca903772f0271040a
---
.../managerdefinitions/src/Serializer.cpp | 27 ++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 5f820c214..0b561320b 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -395,14 +395,22 @@ Return<AudioGainTraits::Element> AudioGainTraits::deserialize(const xmlNode *cur
}
Return<AudioProfileTraits::Element> AudioProfileTraits::deserialize(const xmlNode *cur,
- PtrSerializingCtx /*serializingContext*/)
+ PtrSerializingCtx serializingContext)
{
+ bool isOutput = serializingContext != nullptr;
std::string samplingRates = getXmlAttribute(cur, Attributes::samplingRates);
std::string format = getXmlAttribute(cur, Attributes::format);
std::string channels = getXmlAttribute(cur, Attributes::channelMasks);
+ ChannelTraits::Collection channelsMask = channelMasksFromString(channels, ",");
+
+ //Some Foxconn devices have wrong earpiece channel mask, leading to no channel mask
+ if(channelsMask.size() == 1 && channelsMask[0] == AUDIO_CHANNEL_IN_MONO && isOutput) {
+ fixedEarpieceChannels = true;
+ channelsMask = channelMasksFromString("AUDIO_CHANNEL_OUT_MONO", ",");
+ }
Element profile = new AudioProfile(formatFromString(format, gDynamicFormat),
- channelMasksFromString(channels, ","),
+ channelsMask,
samplingRatesFromString(samplingRates, ","));
profile->setDynamicFormat(profile->getFormat() == gDynamicFormat);
@@ -517,10 +525,15 @@ Return<DevicePortTraits::Element> DevicePortTraits::deserialize(const xmlNode *c
}
AudioProfileTraits::Collection profiles;
- status_t status = deserializeCollection<AudioProfileTraits>(cur, &profiles, NULL);
+ status_t status;
+ if(audio_is_output_devices(type))
+ status = deserializeCollection<AudioProfileTraits>(doc, root, profiles, (PtrSerializingCtx)1);
+ else
+ status = deserializeCollection<AudioProfileTraits>(cur, &profiles, NULL);
if (status != NO_ERROR) {
return Status::fromStatusT(status);
}
+
if (profiles.isEmpty()) {
profiles.add(AudioProfile::createFullDynamic());
}
@@ -672,6 +685,14 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
}
}
}
+
+ if(fixedEarpieceChannels) {
+ sp<DeviceDescriptor> device =
+ module->getDeclaredDevices().getDeviceFromTagName(String8("Earpiece"));
+ if(device != 0)
+ ctx->addAvailableDevice(device);
+ fixedEarpieceChannels = false;
+ }
return module;
}
--
2.25.1

View File

@ -1,31 +0,0 @@
From 09e90d056e41e8ef6d0527e7e34a54053c607b3a Mon Sep 17 00:00:00 2001
From: Alexander Pohl <pohl199885@gmail.com>
Date: Fri, 15 Jun 2018 19:58:07 +0200
Subject: [PATCH 02/17] Fix WiFi-Display on Huawei devices (EMUI 8.0)
Huaweis media stack doesn't handle intra-refresh-mode, so skip the error instead.
Thanks to Chris Vandomelen for pointing that out.
---
media/libstagefright/ACodec.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 55e8130e4..e8b493183 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -4366,9 +4366,8 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) {
if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) {
err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode);
if (err != OK) {
- ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x",
- err, intraRefreshMode);
- return err;
+ ALOGE("setupAVCEncoderParameters(): set intra-refresh-mode failed, ignoring..");
+ //return err;
}
}
--
2.25.1

View File

@ -1,34 +0,0 @@
From 90390678c846d34aae136aa1557643619c524830 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 19 Aug 2018 22:59:06 +0200
Subject: [PATCH 03/17] Kirin:: Remove lock to prevent self-lock
With Huawei Camera HAL, we get the following call order:
cameraserver CameraService::enumerateProviders (*)
=> HAL ICameraProvider::getVendorTags
=> HAL ICameraProviderCallback::cameraDeviceStatusChange
=> cameraserver CameraService::addState
=> cameraserver CameraService::updateCameraNumAndIds (*)
The two functions marked with (*) take mServiceLock
Hence the safe-lock
---
services/camera/libcameraservice/CameraService.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 95e4e6eb7..077e3b238 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -271,7 +271,7 @@ bool CameraService::isPublicallyHiddenSecureCamera(const String8& cameraId) {
}
void CameraService::updateCameraNumAndIds() {
- Mutex::Autolock l(mServiceLock);
+ //Mutex::Autolock l(mServiceLock);
mNumberOfCameras = mCameraProviderManager->getCameraCount();
mNormalDeviceIds =
mCameraProviderManager->getAPI1CompatibleCameraDeviceIds();
--
2.25.1

View File

@ -1,27 +0,0 @@
From 1fe92753746f4410f5ac97abcef083276940cfee Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 19 Aug 2018 23:05:26 +0200
Subject: [PATCH 04/17] We might not have a mFlashlight at this state, but
that's ok
Change-Id: I0ae65c0be4931b4e3cbda2d0cc64acc4f5018a73
---
services/camera/libcameraservice/CameraService.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 077e3b238..bbfd90a28 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -299,7 +299,7 @@ void CameraService::addStates(const String8 id) {
isPublicallyHiddenSecureCamera));
}
- if (mFlashlight->hasFlashUnit(id)) {
+ if (mFlashlight != nullptr && mFlashlight->hasFlashUnit(id)) {
Mutex::Autolock al(mTorchStatusMutex);
mTorchStatusMap.add(id, TorchModeStatus::AVAILABLE_OFF);
--
2.25.1

View File

@ -1,62 +0,0 @@
From 669ad001302e6e6d749ae0f66026c8ce00d259fe Mon Sep 17 00:00:00 2001
From: Artem Borisov <dedsa2002@gmail.com>
Date: Tue, 25 Sep 2018 12:39:22 +0300
Subject: [PATCH 05/17] CameraService: Support calling addStates in
enumerateProviders
Some pre-P camera HALs trigger onDeviceStatusChange callback during HAL init.
This is horribly wrong and causes a race condition between enumerateProviders
and onDeviceStatusChange. While it wasn't really harmful in O, in P call sequence
was changed and now this race condition leads to two problems: null pointer dereference
in addStates because mFlashlight is not initialized at a proper timing; mServiceLock
deadlock because updateCameraNumAndIds and enumerateProviders are called at the same time.
Moving addStates back to enumerateProviders makes the sequence more similar to O, and doesn't
let these two issues to happen.
Enable TARGET_CAMERA_NEEDS_ADD_STATES_IN_ENUMERATE when it is necessary.
@Dil3mm4 edit: Instead of TARGET_CAMERA_NEEDS_ADD_STATES_IN_ENUMERATE let's use a system property to make it more generic and suitable for GSI use.
Change-Id: Ife25b9753fdb679ab0c77f385e1b8527551a4711
---
.../camera/libcameraservice/CameraService.cpp | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index bbfd90a28..7046384b3 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -212,6 +212,20 @@ status_t CameraService::enumerateProviders() {
for (auto& cameraId : deviceIds) {
String8 id8 = String8(cameraId.c_str());
+ if (property_get_bool("persist.sys.camera.huawei", false)) {
+ bool cameraFound = false;
+ {
+ Mutex::Autolock lock(mCameraStatesLock);
+ auto iter = mCameraStates.find(id8);
+ if (iter != mCameraStates.end()) {
+ cameraFound = true;
+ }
+ }
+ if (!cameraFound) {
+ addStates(id8);
+ }
+ }
+
if (getCameraState(id8) == nullptr) {
onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
}
@@ -337,8 +351,10 @@ void CameraService::onDeviceStatusChanged(const String8& id,
ALOGI("%s: Unknown camera ID %s, a new camera is added",
__FUNCTION__, id.string());
+ if (!property_get_bool("persist.sys.camera.huawei", false)) {
// First add as absent to make sure clients are notified below
addStates(id);
+ }
updateStatus(newStatus, id);
} else {
--
2.25.1

View File

@ -1,25 +0,0 @@
From 8ad118d1fcfba6e9911aa099f354594787ad264b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 9 Dec 2018 15:56:59 +0100
Subject: [PATCH 06/17] Revert "Set rlimit rtprio for cameraserver"
This reverts commit 4ae244cab4fe715fc2729e906b7dda3075fbbac3.
We need to revert this because some init/systems (Moto E5, G6) doesn't
like this instruction at all (read: this prevents boot)
---
camera/cameraserver/cameraserver.rc | 1 -
1 file changed, 1 deletion(-)
diff --git a/camera/cameraserver/cameraserver.rc b/camera/cameraserver/cameraserver.rc
index a9aae0b15..fea5a1d5c 100644
--- a/camera/cameraserver/cameraserver.rc
+++ b/camera/cameraserver/cameraserver.rc
@@ -4,4 +4,3 @@ service cameraserver /system/bin/cameraserver
group audio camera input drmrpc
ioprio rt 4
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
- rlimit rtprio 10 10
--
2.25.1

View File

@ -1,33 +0,0 @@
From 293b2fb176c081a4e3db518009864c1a4c4053fd Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 4 Sep 2019 22:28:56 +0200
Subject: [PATCH 07/17] fixup! FIH devices: Fix "Earpiece" audio output
---
.../audiopolicy/common/managerdefinitions/src/Serializer.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 0b561320b..c8cb54b5f 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -394,6 +394,7 @@ Return<AudioGainTraits::Element> AudioGainTraits::deserialize(const xmlNode *cur
}
}
+static bool fixedEarpieceChannels = false;
Return<AudioProfileTraits::Element> AudioProfileTraits::deserialize(const xmlNode *cur,
PtrSerializingCtx serializingContext)
{
@@ -527,7 +528,7 @@ Return<DevicePortTraits::Element> DevicePortTraits::deserialize(const xmlNode *c
AudioProfileTraits::Collection profiles;
status_t status;
if(audio_is_output_devices(type))
- status = deserializeCollection<AudioProfileTraits>(doc, root, profiles, (PtrSerializingCtx)1);
+ status = deserializeCollection<AudioProfileTraits>(cur, &profiles, (PtrSerializingCtx)1);
else
status = deserializeCollection<AudioProfileTraits>(cur, &profiles, NULL);
if (status != NO_ERROR) {
--
2.25.1

View File

@ -1,26 +0,0 @@
From 6f4e7e032ca73db15cb01737c24de543780718da Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 5 Aug 2019 17:27:47 +0200
Subject: [PATCH 08/17] Fix use-after-free (object on stack)
Change-Id: I9ae666b10873eac4e7a55032071e7b15b0de058a
---
.../audiopolicy/common/managerdefinitions/src/Serializer.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index c8cb54b5f..9f2bdc4b3 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -517,7 +517,7 @@ Return<DevicePortTraits::Element> DevicePortTraits::deserialize(const xmlNode *c
if (!encodedFormatsLiteral.empty()) {
encodedFormats = formatsFromString(encodedFormatsLiteral, " ");
}
- Element deviceDesc = new DeviceDescriptor(type, encodedFormats, String8(name.c_str()));
+ Element deviceDesc = new DeviceDescriptor(type, encodedFormats, String8(strdup(name.c_str())));
std::string address = getXmlAttribute(cur, Attributes::address);
if (!address.empty()) {
--
2.25.1

View File

@ -1,129 +0,0 @@
From f303633bdac9176d45ca8a9073f2f9850406ebf8 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 5 Aug 2019 18:09:50 +0200
Subject: [PATCH 09/17] Fix BT in-call on CAF devices
See https://github.com/phhusson/treble_experimentations/issues/374
In Qualcomm's BSP audio_policy_configuration.xml, one route is missing,
from primary output and telephony to BT SCO.
Add it if we detect telephony and bt sco, but no such route.
Change-Id: Ifea0f88276ec9a0811f3cb1973c4b06f2c82077b
---
.../managerdefinitions/src/Serializer.cpp | 91 +++++++++++++++++++
1 file changed, 91 insertions(+)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 9f2bdc4b3..9c7e5c49d 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -607,6 +607,96 @@ Return<RouteTraits::Element> RouteTraits::deserialize(const xmlNode *cur, PtrSer
return route;
}
+static void fixupQualcommBtScoRoute(RouteTraits::Collection& routes, DevicePortTraits::Collection& devicePorts, HwModule* ctx) {
+ // On many Qualcomm devices, there is a BT SCO Headset Mic => primary input mix
+ // But Telephony Rx => BT SCO Headset route is missing
+ // When we detect such case, add the missing route
+
+ // If we have:
+ // <route type="mix" sink="Telephony Tx" sources="voice_tx"/>
+ // <route type="mix" sink="primary input" sources="Built-In Mic,Built-In Back Mic,Wired Headset Mic,BT SCO Headset Mic"/>
+ // <devicePort tagName="BT SCO Headset" type="AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET" role="sink" />
+ // And no <route type="mix" sink="BT SCO Headset" />
+
+ // Add:
+ // <route type="mix" sink="BT SCO Headset" sources="primary output,deep_buffer,compressed_offload,Telephony Rx"/>
+ bool foundBtScoHeadsetDevice = false;
+ for(const auto& device: devicePorts) {
+ if(device->getTagName() == String8("BT SCO Headset")) {
+ foundBtScoHeadsetDevice = true;
+ break;
+ }
+ }
+ if(!foundBtScoHeadsetDevice) {
+ ALOGE("No BT SCO Headset device found, don't patch policy");
+ return;
+ }
+
+ bool foundTelephony = false;
+ bool foundBtScoInput = false;
+ bool foundScoHeadsetRoute = false;
+ for(const auto& route: routes) {
+ ALOGE("Looking at route %d\n", route->getType());
+ if(route->getType() != AUDIO_ROUTE_MIX)
+ continue;
+ auto sink = route->getSink();
+ ALOGE("... With sink %s\n", sink->getTagName().c_str());
+ if(sink->getTagName() == String8("Telephony Tx")) {
+ foundTelephony = true;
+ continue;
+ }
+ if(sink->getTagName() == String8("BT SCO Headset")) {
+ foundScoHeadsetRoute = true;
+ break;
+ }
+ for(const auto& source: route->getSources()) {
+ ALOGE("... With source %s\n", source->getTagName().c_str());
+ if(source->getTagName() == String8("BT SCO Headset Mic")) {
+ foundBtScoInput = true;
+ break;
+ }
+ }
+ }
+ //The route we want to add is already there
+ ALOGE("Done looking for existing routes");
+ if(foundScoHeadsetRoute)
+ return;
+
+ ALOGE("No existing route found... %d %d", foundTelephony ? 1 : 0, foundBtScoInput ? 1 : 0);
+ //We couldn't find the routes we assume are required for the function we want to add
+ if(!foundTelephony || !foundBtScoInput)
+ return;
+ ALOGE("Adding our own.");
+
+ // Add:
+ // <route type="mix" sink="BT SCO Headset" sources="primary output,deep_buffer,compressed_offload,Telephony Rx"/>
+ AudioRoute *newRoute = new AudioRoute(AUDIO_ROUTE_MIX);
+
+ auto sink = ctx->findPortByTagName(String8("BT SCO Headset"));
+ ALOGE("Got sink %p\n", sink.get());
+ newRoute->setSink(sink);
+
+ AudioPortVector sources;
+ for(const auto& sourceName: {
+ "primary output",
+ "deep_buffer",
+ "compressed_offload",
+ "Telephony Rx"
+ }) {
+ auto source = ctx->findPortByTagName(String8(sourceName));
+ ALOGE("Got source %p\n", source.get());
+ sources.add(source);
+ source->addRoute(newRoute);
+ }
+
+ newRoute->setSources(sources);
+
+ sink->addRoute(newRoute);
+
+ auto ret = routes.add(newRoute);
+ ALOGE("route add returned %zd", ret);
+}
+
Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrSerializingCtx ctx)
{
std::string name = getXmlAttribute(cur, Attributes::name);
@@ -646,6 +736,7 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
if (status != NO_ERROR) {
return Status::fromStatusT(status);
}
+ fixupQualcommBtScoRoute(routes, devicePorts, module.get());
module->setRoutes(routes);
for (const xmlNode *children = cur->xmlChildrenNode; children != NULL;
--
2.25.1

View File

@ -1,31 +0,0 @@
From 7125c20e64937da5ee8134baae39e2136629b307 Mon Sep 17 00:00:00 2001
From: Vincent Vidal <vincent.vidal@onera.fr>
Date: Thu, 12 Sep 2019 14:17:14 +0200
Subject: [PATCH 10/17] Fix null pointer for unknown audio sources in "Fix BT
in-call on CAF devices"
Some audio sources may not exist on some devices (e.g. Axon 7), leading to a segmentation fault.
---
.../common/managerdefinitions/src/Serializer.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 9c7e5c49d..8bfdb5b0a 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -685,8 +685,10 @@ static void fixupQualcommBtScoRoute(RouteTraits::Collection& routes, DevicePortT
}) {
auto source = ctx->findPortByTagName(String8(sourceName));
ALOGE("Got source %p\n", source.get());
- sources.add(source);
- source->addRoute(newRoute);
+ if (source.get() != nullptr) {
+ sources.add(source);
+ source->addRoute(newRoute);
+ }
}
newRoute->setSources(sources);
--
2.25.1

View File

@ -1,94 +0,0 @@
From 53e025a518a6a662f533e2e08b50ebaed223957c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 1 Oct 2019 13:35:49 +0200
Subject: [PATCH 11/17] Add (partial, cam id is hardcoded) support for Asus ZF6
motor camera
Change-Id: Iea6e1370780a1d16f728748d1d948d092532d8fe
---
.../camera/libcameraservice/CameraService.cpp | 26 +++++++++++++++++++
.../camera/libcameraservice/CameraService.h | 3 +++
2 files changed, 29 insertions(+)
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 7046384b3..100db9e3c 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -25,6 +25,7 @@
#include <ctime>
#include <string>
#include <sys/types.h>
+#include <sys/wait.h>
#include <inttypes.h>
#include <pthread.h>
@@ -133,6 +134,7 @@ Mutex CameraService::sProxyMutex;
sp<hardware::ICameraServiceProxy> CameraService::sCameraServiceProxy;
CameraService::CameraService() :
+ mPhysicalFrontCamStatus(false),
mEventLog(DEFAULT_EVENT_LOG_LENGTH),
mNumberOfCameras(0),
mSoundRef(0), mInitialized(false) {
@@ -1579,6 +1581,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
mServiceLock.lock();
} else {
// Otherwise, add client to active clients list
+ physicalFrontCam(cameraId == "1");
finishConnectLocked(client, partial);
sp<ICameraMotor> cameraMotor = ICameraMotor::getService();
@@ -1594,6 +1597,27 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
return ret;
}
+void CameraService::physicalFrontCam(bool on) {
+ if(on == mPhysicalFrontCamStatus) return;
+ mPhysicalFrontCamStatus = on;
+
+ if(access("/dev/asusMotoDrv", F_OK) == 0) {
+ int pid = fork();
+ if(pid == 0) {
+ const char* cmd[] = {
+ "/system/bin/asus-motor",
+ "0",
+ NULL
+ };
+ cmd[1] = on ? "0" : "1";
+ execve("/system/bin/asus-motor", (char**)cmd, environ);
+ _exit(1);
+ } else {
+ waitpid(pid, NULL, 0);
+ }
+ }
+}
+
Status CameraService::setTorchMode(const String16& cameraId, bool enabled,
const sp<IBinder>& clientBinder) {
Mutex::Autolock lock(mServiceLock);
@@ -2466,6 +2490,8 @@ binder::Status CameraService::BasicClient::disconnect() {
cameraMotor->onDisconnect(mCameraIdStr.string());
}
+ sCameraService->physicalFrontCam(false);
+
sCameraService->removeByClient(this);
sCameraService->logDisconnected(mCameraIdStr, mClientPid, String8(mClientPackageName));
sCameraService->mCameraProviderManager->removeRef(CameraProviderManager::DeviceMode::CAMERA,
diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h
index bcaca9ffc..2607bc257 100644
--- a/services/camera/libcameraservice/CameraService.h
+++ b/services/camera/libcameraservice/CameraService.h
@@ -182,6 +182,9 @@ public:
// Monitored UIDs availability notification
void notifyMonitoredUids();
+ bool mPhysicalFrontCamStatus;
+ void physicalFrontCam(bool on);
+
/////////////////////////////////////////////////////////////////////
// Client functionality
--
2.25.1

View File

@ -1,38 +0,0 @@
From 922e144d1ceba361f0a92372e3fda5161249fc74 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 3 Dec 2019 14:04:17 +0100
Subject: [PATCH 12/17] Fix for some Huawei camera (that's not ideal because it
is a revert, it needs to be further investigated and cleaned)
---
services/camera/libcameraservice/CameraService.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 100db9e3c..6a68a40b9 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "CameraService"
#define ATRACE_TAG ATRACE_TAG_CAMERA
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 0
#include <algorithm>
#include <climits>
@@ -228,9 +228,9 @@ status_t CameraService::enumerateProviders() {
}
}
- if (getCameraState(id8) == nullptr) {
+ //if (getCameraState(id8) == nullptr) {
onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
- }
+ //}
}
return OK;
--
2.25.1

View File

@ -1,57 +0,0 @@
From 00a797e23bf88d6cd28f32155a02c40b4f9b91cb Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Thu, 23 Jan 2020 11:13:43 +0800
Subject: [PATCH 13/17] audiopolicy: try again with trimmed audio port name if
not found
* In Spreadtrum BSP, some audio routes may contain ports with extra
spaces at the beginning and the end, causing audiopolicy to refuse to
load and leading to broken audio.
* Fix this by retrying with trimmed port name when not found. Do not
use trimmed name all the time because a white space is a valid
character in port name, and we cannot be sure nobody is using it for
legitimite purposes.
---
.../managerdefinitions/src/Serializer.cpp | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 8bfdb5b0a..4bdb082ba 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -550,6 +550,17 @@ Return<DevicePortTraits::Element> DevicePortTraits::deserialize(const xmlNode *c
return deviceDesc;
}
+char* trim(char * s) {
+ int l = strlen(s);
+
+ if (l > 0) {
+ while (isspace(s[l - 1])) --l;
+ while (*s && isspace(*s)) ++s, --l;
+ }
+
+ return strndup(s, l);
+}
+
Return<RouteTraits::Element> RouteTraits::deserialize(const xmlNode *cur, PtrSerializingCtx ctx)
{
std::string type = getXmlAttribute(cur, Attributes::type);
@@ -590,8 +601,11 @@ Return<RouteTraits::Element> RouteTraits::deserialize(const xmlNode *cur, PtrSer
if (strlen(devTag) != 0) {
sp<AudioPort> source = ctx->findPortByTagName(String8(devTag));
if (source == NULL) {
- ALOGE("%s: no source found with name=%s", __func__, devTag);
- return Status::fromStatusT(BAD_VALUE);
+ source = ctx->findPortByTagName(String8(trim(devTag)));
+ if (source == NULL) {
+ ALOGE("%s: no source found with name=%s", __func__, devTag);
+ return Status::fromStatusT(BAD_VALUE);
+ }
}
sources.add(source);
}
--
2.25.1

View File

@ -1,45 +0,0 @@
From e17862fc2b519ccddf7d578968a89f35ceaacfb1 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 13 Apr 2020 21:01:16 +0200
Subject: [PATCH 14/17] There are three SCO devices. Fallback from one to the
others if needed
---
.../managerdefinitions/src/HwModule.cpp | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/services/audiopolicy/common/managerdefinitions/src/HwModule.cpp b/services/audiopolicy/common/managerdefinitions/src/HwModule.cpp
index 1f9b725a2..ecba6023d 100644
--- a/services/audiopolicy/common/managerdefinitions/src/HwModule.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/HwModule.cpp
@@ -294,6 +294,27 @@ sp <HwModule> HwModuleCollection::getModuleForDeviceTypes(audio_devices_t type,
}
}
}
+ //We didn't find one? Ok but all SCOs are equivalent surely?
+ if(type == AUDIO_DEVICE_OUT_BLUETOOTH_SCO ||
+ type == AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET ||
+ type == AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) {
+ ALOGE("Fallback SCO");
+ if(type != AUDIO_DEVICE_OUT_BLUETOOTH_SCO) {
+ auto ret = getModuleForDeviceTypes(AUDIO_DEVICE_OUT_BLUETOOTH_SCO, encodedFormat);
+ ALOGE("Fallback SCO simple? %s", (ret != nullptr) ? "yes" : "no");
+ if(ret != nullptr) return ret;
+ }
+ if(type != AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
+ auto ret = getModuleForDeviceTypes(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, encodedFormat);
+ ALOGE("Fallback SCO headset? %s", (ret != nullptr) ? "yes" : "no");
+ if(ret != nullptr) return ret;
+ }
+ if(type != AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) {
+ auto ret = getModuleForDeviceTypes(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, encodedFormat);
+ ALOGE("Fallback SCO carkit? %s", (ret != nullptr) ? "yes" : "no");
+ if(ret != nullptr) return ret;
+ }
+ }
return nullptr;
}
--
2.25.1

View File

@ -1,71 +0,0 @@
From 9fef86bc540a7fa95432d5bc8da3fc18b07ae843 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 15/17] Add persist.sys.phh.samsung.camera_ids property to
access hidden Samsung cameras
---
services/camera/libcameraservice/Android.bp | 1 +
.../common/CameraProviderManager.cpp | 13 +++++++++++--
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index c4bc0f1a9..d6a4d6132 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -108,6 +108,7 @@ cc_library_shared {
"android.hardware.camera.device@3.4",
"android.hardware.camera.device@3.5",
"vendor.lineage.camera.motor@1.0",
+ "vendor.samsung.hardware.camera.provider@3.0",
],
export_shared_lib_headers: [
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index fdb565750..9c1c70c84 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -21,6 +21,7 @@
#include "CameraProviderManager.h"
#include <android/hardware/camera/device/3.5/ICameraDevice.h>
+#include <vendor/samsung/hardware/camera/provider/3.0/ISehCameraProvider.h>
#include <algorithm>
#include <chrono>
@@ -1225,6 +1226,9 @@ status_t CameraProviderManager::ProviderInfo::initialize(
mMinorVersion = 4;
}
+ 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;
+
// cameraDeviceStatusChange callbacks may be called (and causing new devices added)
// before setCallback returns
hardware::Return<Status> status = interface->setCallback(this);
@@ -1269,7 +1273,7 @@ status_t CameraProviderManager::ProviderInfo::initialize(
// 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;
@@ -1286,7 +1290,12 @@ status_t CameraProviderManager::ProviderInfo::initialize(
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.25.1

View File

@ -1,45 +0,0 @@
From b629b586c808f6e8e3415b578f10fe02b63b1631 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 19 May 2020 14:01:14 +0200
Subject: [PATCH 16/17] Add a property to force camera timestamp source
Some devices wrongly report their timesource
Camera's timesource can either be CLOCK_MONOTONIC, or CLOCK_BOOTTIME
The former doesn't increment in sleep, while the later does.
There is a camera HAL property for that, though some devices don't
report it properly.
This issue happens on Xiaomi Redmi 7A, it needs to force the value to 1
Add a property persist.sys.phh.camera.force_timestampsource to force
timestamp source.
---
.../libcameraservice/device3/Camera3Device.cpp | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 93e18cfee..9cc44f1ec 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -299,8 +299,16 @@ status_t Camera3Device::initializeCommonLocked() {
// Measure the clock domain offset between camera and video/hw_composer
camera_metadata_entry timestampSource =
mDeviceInfo.find(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE);
- if (timestampSource.count > 0 && timestampSource.data.u8[0] ==
- ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME) {
+ int timestampSourceValue = 0;
+ if ((timestampSource.count > 0 && timestampSource.data.u8[0] ==
+ ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME)) {
+ timestampSourceValue = 1;
+ }
+ int forceTimestampSource = property_get_int32("persist.sys.phh.camera.force_timestampsource", -1);
+ //Don't override if it's -1, default value
+ if(forceTimestampSource == 0) timestampSourceValue = 0;
+ if(forceTimestampSource == 1) timestampSourceValue = 1;
+ if (timestampSourceValue == 1) {
mTimestampOffset = getMonoToBoottimeOffset();
}
--
2.25.1

View File

@ -1,325 +0,0 @@
From 95e61a23a96f0274d222e4ef84ee8583fc36baab Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 25 May 2020 21:26:54 +0200
Subject: [PATCH 17/17] Add persist.sys.phh.disable_a2dp_offload property to
force a2dp offload
---
media/libstagefright/ACodec.cpp | 20 +-
.../managerdefinitions/src/Serializer.cpp | 180 +++++++++++++++++-
.../managerdefault/AudioPolicyManager.cpp | 3 +
3 files changed, 197 insertions(+), 6 deletions(-)
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index e8b493183..310740ab5 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -1166,6 +1166,9 @@ status_t ACodec::configureOutputBuffersFromNativeWindow(
return err;
}
+ ALOGE("Window undequeued buffers is %d\n", *minUndequeuedBuffers);
+ ALOGE("Consumerrequested %d\n", def.nBufferCountMin);
+
// FIXME: assume that surface is controlled by app (native window
// returns the number for the case when surface is not controlled by app)
// FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported
@@ -1178,22 +1181,29 @@ status_t ACodec::configureOutputBuffersFromNativeWindow(
// 2. try to allocate two (2) additional buffers to reduce starvation from
// the consumer
// plus an extra buffer to account for incorrect minUndequeuedBufs
- for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) {
- OMX_U32 newBufferCount =
- def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers;
+ for (int extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) {
+ int a = def.nBufferCountMin;
+ int b = *minUndequeuedBuffers;
+ int c = extraBuffers;
+ int newBufferCount = a+b+c;
def.nBufferCountActual = newBufferCount;
err = mOMXNode->setParameter(
OMX_IndexParamPortDefinition, &def, sizeof(def));
if (err == OK) {
- *minUndequeuedBuffers += extraBuffers;
+ ALOGE("Managed to allocate %d buffers (%d extra)\n", newBufferCount, extraBuffers);
+ if(extraBuffers > 0) {
+ *minUndequeuedBuffers += extraBuffers;
+ } else {
+ *minUndequeuedBuffers -= -extraBuffers;
+ }
break;
}
ALOGW("[%s] setting nBufferCountActual to %u failed: %d",
mComponentName.c_str(), newBufferCount, err);
/* exit condition */
- if (extraBuffers == 0) {
+ if (extraBuffers == -2 || newBufferCount == 1) {
return err;
}
}
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 4bdb082ba..d144f8991 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -29,6 +29,7 @@
#include <utils/StrongPointer.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
+#include <cutils/properties.h>
#include "Serializer.h"
#include "TypeConverter.h"
@@ -36,6 +37,8 @@ namespace android {
namespace {
+static bool forceDisableA2dpOffload = false;
+
// TODO(mnaganov): Consider finding an alternative for using HIDL code.
using hardware::Return;
using hardware::Status;
@@ -316,7 +319,7 @@ status_t deserializeCollection(const xmlNode *cur,
return status;
}
} else {
- return BAD_VALUE;
+ ALOGE("Ignoring...");
}
}
}
@@ -732,12 +735,34 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
Element module = new HwModule(name.c_str(), versionMajor, versionMinor);
+ bool isA2dpModule = strcmp(name.c_str(), "a2dp") == 0;
+ bool isPrimaryModule = strcmp(name.c_str(), "primary") == 0;
+
// Deserialize childrens: Audio Mix Port, Audio Device Ports (Source/Sink), Audio Routes
MixPortTraits::Collection mixPorts;
status_t status = deserializeCollection<MixPortTraits>(cur, &mixPorts, NULL);
if (status != NO_ERROR) {
return Status::fromStatusT(status);
}
+ if(forceDisableA2dpOffload && isA2dpModule) {
+ for(const auto& mixPort: mixPorts) {
+ ALOGE("Disable a2dp offload...? %s", mixPort->getTagName().c_str());
+ //"a2dp" sw module already has a2dp out
+ if(mixPort->getTagName() == String8("a2dp output")) {
+ forceDisableA2dpOffload = false;
+ break;
+ }
+ }
+ }
+ if(forceDisableA2dpOffload && isA2dpModule) {
+ //Add
+ //<mixPort name="a2dp output" role="source"/>
+ auto mixPort = new IOProfile(String8("a2dp output"), AUDIO_PORT_ROLE_SOURCE);
+ AudioProfileTraits::Collection profiles;
+ profiles.add(AudioProfile::createFullDynamic());
+ mixPort->setAudioProfiles(profiles);
+ mixPorts.push_back(mixPort);
+ }
module->setProfiles(mixPorts);
DevicePortTraits::Collection devicePorts;
@@ -745,6 +770,89 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
if (status != NO_ERROR) {
return Status::fromStatusT(status);
}
+ Vector<String8> a2dpOuts;
+ a2dpOuts.push_back(String8("BT A2DP Out"));
+ a2dpOuts.push_back(String8("BT A2DP Headphones"));
+ a2dpOuts.push_back(String8("BT A2DP Speaker"));
+ if(forceDisableA2dpOffload) {
+ if(isA2dpModule) {
+ //<devicePort tagName="BT A2DP Out" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP" role="sink" address="lhdc_a2dp">
+ // <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+ // samplingRates="44100,48000,96000"
+ // channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+ //</devicePort>
+ if(true) {
+ FormatVector formats;
+ auto devicePortOut = new DeviceDescriptor(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, formats, String8(strdup("BT A2DP Out")));
+ AudioProfileTraits::Collection profiles;
+ ChannelsVector channels;
+ SampleRateVector sampleRates;
+ channels.add(AUDIO_CHANNEL_OUT_STEREO);
+ sampleRates.add(44100);
+ sampleRates.add(48000);
+ sampleRates.add(96000);
+ auto profile = new AudioProfile(AUDIO_FORMAT_PCM_16_BIT, channels, sampleRates);
+ profiles.add(profile);
+ devicePortOut->setAudioProfiles(profiles);
+ devicePortOut->setAddress(String8("lhdc_a2dp"));
+ devicePorts.add(devicePortOut);
+ }
+ //<devicePort tagName="BT A2DP Headphones" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES" role="sink" address="lhdc_a2dp">
+ // <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+ // samplingRates="44100,48000,96000"
+ // channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+ //</devicePort>
+ if(true) {
+ FormatVector formats;
+ auto devicePortOut = new DeviceDescriptor(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, formats, String8(strdup("BT A2DP Headphones")));
+ AudioProfileTraits::Collection profiles;
+ ChannelsVector channels;
+ SampleRateVector sampleRates;
+ channels.add(AUDIO_CHANNEL_OUT_STEREO);
+ sampleRates.add(44100);
+ sampleRates.add(48000);
+ sampleRates.add(96000);
+ auto profile = new AudioProfile(AUDIO_FORMAT_PCM_16_BIT, channels, sampleRates);
+ profiles.add(profile);
+ devicePortOut->setAudioProfiles(profiles);
+ devicePortOut->setAddress(String8("lhdc_a2dp"));
+ devicePorts.add(devicePortOut);
+ }
+ //<devicePort tagName="BT A2DP Speaker" type="AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER" role="sink" address="lhdc_a2dp">
+ // <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
+ // samplingRates="44100,48000,96000"
+ // channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
+ //</devicePort>
+ if(true) {
+ FormatVector formats;
+ auto devicePortOut = new DeviceDescriptor(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, formats, String8(strdup("BT A2DP Speaker")));
+ AudioProfileTraits::Collection profiles;
+ ChannelsVector channels;
+ SampleRateVector sampleRates;
+ channels.add(AUDIO_CHANNEL_OUT_STEREO);
+ sampleRates.add(44100);
+ sampleRates.add(48000);
+ sampleRates.add(96000);
+ auto profile = new AudioProfile(AUDIO_FORMAT_PCM_16_BIT, channels, sampleRates);
+ profiles.add(profile);
+ devicePortOut->setAudioProfiles(profiles);
+ devicePortOut->setAddress(String8("lhdc_a2dp"));
+ devicePorts.add(devicePortOut);
+
+ }
+ } else if(isPrimaryModule) {
+ for(const auto& out: a2dpOuts) {
+ auto iterA = std::find_if(devicePorts.begin(), devicePorts.end(), [out](const auto port) {
+ if(port->getTagName() == out) return true;
+ return false;
+ });
+ if(iterA != devicePorts.end()) {
+ ALOGE("Erasing device port %s", (*iterA)->getTagName().c_str());
+ devicePorts.erase(iterA);
+ }
+ }
+ }
+ }
module->setDeclaredDevices(devicePorts);
RouteTraits::Collection routes;
@@ -752,7 +860,76 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
if (status != NO_ERROR) {
return Status::fromStatusT(status);
}
+ if(forceDisableA2dpOffload) {
+ if(strcmp(name.c_str(), "primary") == 0) {
+ for(const auto& out: a2dpOuts) {
+ auto iterA = std::find_if(routes.begin(), routes.end(), [out](const auto route) {
+ if(route->getType() != AUDIO_ROUTE_MIX)
+ return false;
+ auto sink = route->getSink();
+ if(sink->getTagName() == out) {
+ return true;
+ }
+ return false;
+ });
+ if(iterA != routes.end()) {
+ auto sink = (*iterA)->getSink()->getTagName();
+ ALOGE("Erasing route %s", sink.c_str());
+ routes.erase(iterA);
+ }
+ }
+ } else if(isA2dpModule) {
+ //<route type="mix" sink="BT A2DP Out"
+ // sources="a2dp output"/>
+ if(true) {
+ auto newRoute = new AudioRoute(AUDIO_ROUTE_MIX);
+ auto sink = module->findPortByTagName(String8("BT A2DP Out"));
+ auto source = module->findPortByTagName(String8("a2dp output"));
+ newRoute->setSink(sink);
+ AudioPortVector sources;
+ sources.add(source);
+
+ sink->addRoute(newRoute);
+ source->addRoute(newRoute);
+ newRoute->setSources(sources);
+
+ routes.add(newRoute);
+ }
+ //<route type="mix" sink="BT A2DP Headphones"
+ // sources="a2dp output"/>
+ if(true) {
+ auto newRoute = new AudioRoute(AUDIO_ROUTE_MIX);
+ auto sink = module->findPortByTagName(String8("BT A2DP Headphones"));
+ auto source = module->findPortByTagName(String8("a2dp output"));
+ newRoute->setSink(sink);
+ AudioPortVector sources;
+ sources.add(source);
+
+ sink->addRoute(newRoute);
+ source->addRoute(newRoute);
+ newRoute->setSources(sources);
+ routes.add(newRoute);
+ }
+ //<route type="mix" sink="BT A2DP Speaker"
+ // sources="a2dp output"/>
+ if(true) {
+ auto newRoute = new AudioRoute(AUDIO_ROUTE_MIX);
+ auto sink = module->findPortByTagName(String8("BT A2DP Speaker"));
+ auto source = module->findPortByTagName(String8("a2dp output"));
+ newRoute->setSink(sink);
+ AudioPortVector sources;
+ sources.add(source);
+
+ sink->addRoute(newRoute);
+ source->addRoute(newRoute);
+ newRoute->setSources(sources);
+ routes.add(newRoute);
+ }
+ }
+ }
+ ALOGE("Good morning");
fixupQualcommBtScoRoute(routes, devicePorts, module.get());
+ ALOGE("Good morning2");
module->setRoutes(routes);
for (const xmlNode *children = cur->xmlChildrenNode; children != NULL;
@@ -922,6 +1099,7 @@ status_t PolicySerializer::deserialize(const char *configFile, AudioPolicyConfig
status_t deserializeAudioPolicyFile(const char *fileName, AudioPolicyConfig *config)
{
PolicySerializer serializer;
+ forceDisableA2dpOffload = property_get_bool("persist.sys.phh.disable_a2dp_offload", false);
return serializer.deserialize(fileName, config);
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 642559089..c5fad0d6c 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -76,6 +76,8 @@ static const std::vector<audio_channel_mask_t> surroundChannelMasksOrder = {{
AUDIO_CHANNEL_OUT_2POINT1POINT2, AUDIO_CHANNEL_OUT_2POINT0POINT2,
AUDIO_CHANNEL_OUT_5POINT1, AUDIO_CHANNEL_OUT_STEREO }};
+static bool forceDisableA2dpOffload = false;
+
// ----------------------------------------------------------------------------
// AudioPolicyInterface implementation
// ----------------------------------------------------------------------------
@@ -4256,6 +4258,7 @@ static status_t deserializeAudioPolicyXmlConfig(AudioPolicyConfig &config) {
} else if (property_get_bool("persist.bluetooth.bluetooth_audio_hal.disabled", false)) {
fileNames.push_back(AUDIO_POLICY_BLUETOOTH_LEGACY_HAL_XML_CONFIG_FILE_NAME);
}
+ forceDisableA2dpOffload = property_get_bool("persist.sys.phh.disable_a2dp_offload", false);
fileNames.push_back(AUDIO_POLICY_XML_CONFIG_FILE_NAME);
for (const char* fileName : fileNames) {
--
2.25.1

View File

@ -1,56 +0,0 @@
From 005da321c7023c10bb9eb637b9bde2c9bff065d1 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 01/58] Fix backlight control on Galaxy S9(+)
Change-Id: I1fbbb47939c377597ef8ad6b88b2acea5f4acaa6
---
.../android/server/lights/LightsService.java | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 0a308846181..347543584e4 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -22,6 +22,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.PowerManager;
+import android.os.SystemProperties;
import android.os.Trace;
import android.provider.Settings;
import android.util.Slog;
@@ -72,6 +73,7 @@ public class LightsService extends SystemService {
": brightness=0x" + Integer.toHexString(brightness));
return;
}
+
// Ideally, we'd like to set the brightness mode through the SF/HWC as well, but
// right now we just fall back to the old path through Lights brightessMode is
// anything but USER or the device shouldBeInLowPersistenceMode().
@@ -88,11 +90,18 @@ public class LightsService extends SystemService {
}
SurfaceControl.setDisplayBrightness(mDisplayToken,
(float) brightness / mSurfaceControlMaximumBrightness);
- } else {
- int color = brightness & 0x000000ff;
- color = 0xff000000 | (color << 16) | (color << 8) | color;
- setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+ return;
}
+
+ String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
+ if(fp.contains("starlte") || fp.contains("star2lte")) {
+ setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
+
+ int color = brightness & 0x000000ff;
+ color = 0xff000000 | (color << 16) | (color << 8) | color;
+ setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
}
}
--
2.25.1

View File

@ -1,31 +0,0 @@
From 318cda922fc2b2ed25519fc92bb58da4dc349db6 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 28 Nov 2017 18:28:04 +0100
Subject: [PATCH 02/58] Relax requirement for visible flag to sdcards
The vast majority of sdcard readers are stable enough to be declared by
the API. (I see no counter-example)
FBE broke adoptable storage with SDCard, hence this need.
Change-Id: Ia616671c03562d1eadaff5531a5c708a62d7ad3a
---
.../core/java/com/android/server/StorageManagerService.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 263efacb097..39a60e1778f 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -1283,7 +1283,8 @@ class StorageManagerService extends IStorageManager.Stub
// Adoptable public disks are visible to apps, since they meet
// public API requirement of being in a stable location.
- if (vol.disk.isAdoptable()) {
+ // Assume all SDs match this as well
+ if (vol.disk.isAdoptable() || vol.disk.isSd()) {
vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE;
} else if (vol.disk.isSd()) {
vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE;
--
2.25.1

View File

@ -1,52 +0,0 @@
From cc8745759acea40bb31f384b4fb70d33c4dd6a00 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 1 May 2018 17:47:36 +0200
Subject: [PATCH 03/58] Also scan /system/overlay
Change-Id: Ib0223560606b80cdaaa986b159b34b4db0154589
---
core/jni/android_util_AssetManager.cpp | 6 +++++-
core/jni/fd_utils.cpp | 3 ++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 2b471fec9c8..4518c7e66a5 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -163,7 +163,7 @@ static void NativeVerifySystemIdmaps(JNIEnv* /*env*/, jclass /*clazz*/) {
}
// Generic idmap parameters
- const char* argv[10];
+ const char* argv[11];
int argc = 0;
struct stat st;
@@ -207,6 +207,10 @@ static void NativeVerifySystemIdmaps(JNIEnv* /*env*/, jclass /*clazz*/) {
argv[argc++] = AssetManager::OEM_OVERLAY_DIR;
}
+ if(stat("/system/overlay", &st) == 0) {
+ argv[argc++] = "/system/overlay";
+ }
+
// Finally, invoke idmap (if any overlay directory exists)
if (argc > 5) {
execv(AssetManager::IDMAP_BIN, (char* const*)argv);
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index 8ba2559ec2e..45b3c6a909d 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -119,7 +119,8 @@ bool FileDescriptorWhitelist::IsAllowed(const std::string& path) const {
|| android::base::StartsWith(path, kSystemOdmOverlayDir)
|| android::base::StartsWith(path, kOdmOverlayDir)
|| android::base::StartsWith(path, kSystemOemOverlayDir)
- || android::base::StartsWith(path, kOemOverlayDir))
+ || android::base::StartsWith(path, kOemOverlayDir)
+ || android::base::StartsWith(path, "/system/overlay"))
&& android::base::EndsWith(path, kApkSuffix)
&& path.find("/../") == std::string::npos) {
return true;
--
2.25.1

View File

@ -1,28 +0,0 @@
From cd2464e7cfe3b9effe431e66a06fd1a8f42fe04d Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 30 May 2018 14:05:30 +0200
Subject: [PATCH 04/58] Fix(?) #62
---
.../src/com/android/keyguard/KeyguardUpdateMonitor.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 98323908c8d..5b69c434f46 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -1214,7 +1214,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
- handleFingerprintError(errMsgId, errString.toString());
+ if(errString != null)
+ handleFingerprintError(errMsgId, errString.toString());
+ else
+ handleFingerprintError(errMsgId, "unknown error");
}
@Override
--
2.25.1

View File

@ -1,36 +0,0 @@
From 21dbb7af9d7f40b7f28a763a7498326e18d1f6d1 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <pierre-hugues.husson@softathome.com>
Date: Thu, 7 Jun 2018 13:36:51 +0200
Subject: [PATCH 05/58] S9 brightness override only for screen
Change-Id: Ie16a46336fa64850014b962429f7a20ff569222f
---
.../com/android/server/lights/LightsService.java | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 347543584e4..bc424682a86 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -93,11 +93,13 @@ public class LightsService extends SystemService {
return;
}
- String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
- if(fp.contains("starlte") || fp.contains("star2lte")) {
- setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
- return;
- }
+ if(mId == 0) {
+ String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
+ if(fp.contains("starlte") || fp.contains("star2lte")) {
+ setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
+ }
int color = brightness & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
--
2.25.1

View File

@ -1,35 +0,0 @@
From 464f2398bb33b5d9e3e9ea0ec150e8c180e2a808 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <pierre-hugues.husson@softathome.com>
Date: Thu, 7 Jun 2018 13:42:02 +0200
Subject: [PATCH 06/58] Fix OP6 brightness
---
.../com/android/server/lights/LightsService.java | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index bc424682a86..c33a9c6cb1b 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -99,6 +99,18 @@ public class LightsService extends SystemService {
setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
return;
}
+
+ boolean qcomExtendBrightness = SystemProperties.getBoolean("persist.extend.brightness", false);
+ int scale = SystemProperties.getInt("persist.display.max_brightness", 1023);
+ if(fp.contains("OnePlus6")) {
+ qcomExtendBrightness = true;
+ scale = 1023;
+ }
+
+ if(qcomExtendBrightness) {
+ setLightLocked(brightness * scale / 255, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+ return;
+ }
}
int color = brightness & 0x000000ff;
--
2.25.1

View File

@ -1,31 +0,0 @@
From f61186905bf0425fe8a56c966fb87adbefea61f4 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 10 Jun 2018 22:54:55 +0200
Subject: [PATCH 07/58] Try to make brightness more generic using property set
by rw-system
---
.../core/java/com/android/server/lights/LightsService.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index c33a9c6cb1b..b2f444f00e1 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -102,9 +102,11 @@ public class LightsService extends SystemService {
boolean qcomExtendBrightness = SystemProperties.getBoolean("persist.extend.brightness", false);
int scale = SystemProperties.getInt("persist.display.max_brightness", 1023);
- if(fp.contains("OnePlus6")) {
+ //This is set by vndk-detect
+ int qcomScale = SystemProperties.getInt("persist.sys.qcom-brightness", -1);
+ if(qcomScale != -1) {
qcomExtendBrightness = true;
- scale = 1023;
+ scale = qcomScale;
}
if(qcomExtendBrightness) {
--
2.25.1

View File

@ -1,35 +0,0 @@
From 397240e75f8a5e80280f9f0cd8fb0133a509ef94 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 12 Jun 2018 22:55:32 +0200
Subject: [PATCH 08/58] property-matching RROs: allow to prefix the value with
+ to do glob match instead of exact match
---
cmds/idmap/scan.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
index d69dd79555a..2be6d23ac78 100644
--- a/cmds/idmap/scan.cpp
+++ b/cmds/idmap/scan.cpp
@@ -1,5 +1,6 @@
#include <dirent.h>
#include <inttypes.h>
+#include <fnmatch.h>
#include <sys/file.h>
#include <sys/stat.h>
@@ -92,6 +93,10 @@ namespace {
property_get(prop, propBuf, NULL);
val = strndup16to8(value.string(), value.size());
+ if(val[0]=='+') {
+ return fnmatch(val+1, propBuf, 0) != 0;
+ }
+
return (strcmp(propBuf, val) == 0);
}
--
2.25.1

View File

@ -1,25 +0,0 @@
From 2d5671a1241bcb8cdee11180de11a04c4f184a2d Mon Sep 17 00:00:00 2001
From: Song Fuchang <song.fc@gmail.com>
Date: Sun, 17 Jun 2018 22:39:37 +0800
Subject: [PATCH 09/58] Fix typo on fnmatch return value check
---
cmds/idmap/scan.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
index 2be6d23ac78..0acff23d031 100644
--- a/cmds/idmap/scan.cpp
+++ b/cmds/idmap/scan.cpp
@@ -94,7 +94,7 @@ namespace {
val = strndup16to8(value.string(), value.size());
if(val[0]=='+') {
- return fnmatch(val+1, propBuf, 0) != 0;
+ return fnmatch(val+1, propBuf, 0) == 0;
}
return (strcmp(propBuf, val) == 0);
--
2.25.1

View File

@ -1,27 +0,0 @@
From 506721861c7d8844885e03d0115272d643eb148d Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 25 Jun 2018 22:43:32 +0200
Subject: [PATCH 10/58] Add Qualcomm starlte
---
.../core/java/com/android/server/lights/LightsService.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index b2f444f00e1..939437f82a4 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -95,7 +95,9 @@ public class LightsService extends SystemService {
if(mId == 0) {
String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
- if(fp.contains("starlte") || fp.contains("star2lte")) {
+ if(
+ fp.contains("starlte") || fp.contains("star2lte") ||
+ fp.contains("starqlte") || fp.contains("star2qlte")) {
setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
return;
}
--
2.25.1

View File

@ -1,33 +0,0 @@
From df349c13c31ac523ac0e054338f9270049a428bd Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 2 Jul 2018 23:36:39 +0200
Subject: [PATCH 11/58] "remaining" of HAL onEnroll is actually a percent of
progress
Change-Id: I8a586163eca93ae3c5bd968d1e7ddbf994ddcc91
---
.../server/biometrics/fingerprint/FingerprintService.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index 320e1022873..9789c49f069 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -590,7 +590,13 @@ public class FingerprintService extends BiometricServiceBase {
final Fingerprint fingerprint =
new Fingerprint(getBiometricUtils().getUniqueName(getContext(), groupId),
groupId, fingerId, deviceId);
- FingerprintService.super.handleEnrollResult(fingerprint, remaining);
+
+ int remaining2 = remaining;
+ String fp = android.os.SystemProperties.get("ro.vendor.build.fingerprint");
+ if(fp != null && (fp.contains("starlte") || fp.contains("star2lte") || fp.contains("starqlte") || fp.contains("star2qlte")))
+ remaining2 = 100 - remaining2;
+
+ FingerprintService.super.handleEnrollResult(fingerprint, remaining2);
});
}
--
2.25.1

View File

@ -1,25 +0,0 @@
From 5727db8ca1ca71a847443b2d37a2ab4ed45b01ed 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 12/58] 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 e209a42c4ba..7f19121d78c 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -3333,7 +3333,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL, false);
sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
sDefaults.putBoolean(KEY_PREFER_2G_BOOL, true);
- 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.25.1

View File

@ -1,26 +0,0 @@
From 8ad9065fbaa02e368be5ba5576fe98ff1f4be856 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 19 Aug 2018 10:51:06 +0200
Subject: [PATCH 13/58] idmap: Don't silently ignore RROs with same priority
Change-Id: I64a6899f1b30e0cd9e9a872b7ca83d831f038cbe
---
cmds/idmap/scan.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp
index 0acff23d031..d1dde52732f 100644
--- a/cmds/idmap/scan.cpp
+++ b/cmds/idmap/scan.cpp
@@ -29,6 +29,8 @@ namespace {
bool operator<(Overlay const& rhs) const
{
+ if(rhs.priority == priority)
+ return rhs.apk_path > apk_path;
return rhs.priority > priority;
}
--
2.25.1

View File

@ -1,44 +0,0 @@
From 238fc8c9b0297df0205b988a4fcccc4dc8b620bc Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 21 Aug 2018 22:24:02 +0200
Subject: [PATCH 14/58] Don't wake IR HAL to the infinity and beyond
---
.../core/java/com/android/server/ConsumerIrService.java | 7 -------
services/core/jni/com_android_server_ConsumerIrService.cpp | 2 +-
2 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/services/core/java/com/android/server/ConsumerIrService.java b/services/core/java/com/android/server/ConsumerIrService.java
index 2ed6c77baa0..82ec033bc30 100644
--- a/services/core/java/com/android/server/ConsumerIrService.java
+++ b/services/core/java/com/android/server/ConsumerIrService.java
@@ -46,13 +46,6 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
mWakeLock.setReferenceCounted(true);
mHasNativeHal = halOpen();
- if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) {
- if (!mHasNativeHal) {
- throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
- }
- } else if (mHasNativeHal) {
- throw new RuntimeException("IR HAL present, but FEATURE_CONSUMER_IR is not set!");
- }
}
@Override
diff --git a/services/core/jni/com_android_server_ConsumerIrService.cpp b/services/core/jni/com_android_server_ConsumerIrService.cpp
index 2ca348b3ae4..148fba9a688 100644
--- a/services/core/jni/com_android_server_ConsumerIrService.cpp
+++ b/services/core/jni/com_android_server_ConsumerIrService.cpp
@@ -36,7 +36,7 @@ static sp<IConsumerIr> mHal;
static jboolean halOpen(JNIEnv* /* env */, jobject /* obj */) {
// TODO(b/31632518)
- mHal = IConsumerIr::getService();
+ mHal = IConsumerIr::tryGetService();
return mHal != nullptr;
}
--
2.25.1

View File

@ -1,28 +0,0 @@
From eb32a6fa5aebe2e021ba998ddf3970275b4da9a9 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 23 Aug 2018 23:39:16 +0200
Subject: [PATCH 15/58] Switch samsung light fingerprint match to regexp, to
include Note9
---
.../core/java/com/android/server/lights/LightsService.java | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 939437f82a4..f7c07044d66 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -95,9 +95,7 @@ public class LightsService extends SystemService {
if(mId == 0) {
String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
- if(
- fp.contains("starlte") || fp.contains("star2lte") ||
- fp.contains("starqlte") || fp.contains("star2qlte")) {
+ if(fp.matches(".*(crown|star)[q2]*lte.*")) {
setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
return;
}
--
2.25.1

View File

@ -1,30 +0,0 @@
From 2b4b81841941cad4f0b0a3cccbf023a9c819b30e Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 27 Aug 2018 00:47:13 +0200
Subject: [PATCH 16/58] Add a property toggle to enable high brightness range
on samsung device
---
.../core/java/com/android/server/lights/LightsService.java | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index f7c07044d66..f1a22ee2dc4 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -96,7 +96,11 @@ public class LightsService extends SystemService {
if(mId == 0) {
String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
if(fp.matches(".*(crown|star)[q2]*lte.*")) {
- setLightLocked(brightness*100, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ int newBrightness = brightness * 100;
+ if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
+ newBrightness = (int) (brightness * 40960.0 / 255.0);
+ }
+ setLightLocked(newBrightness, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
return;
}
--
2.25.1

View File

@ -1,39 +0,0 @@
From d4633552f1162cdacd769291a1ee08493a3b8816 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 29 Aug 2018 11:05:54 +0200
Subject: [PATCH 17/58] Add a property to override pre-o max aspect ratio
Change-Id: Id001a19fab7680feda841202b6e91c490d0d5ffa
---
.../core/java/com/android/server/wm/ActivityRecord.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 55e8e19fd27..7107bba3292 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -2835,6 +2835,12 @@ final class ActivityRecord extends ConfigurationContainer {
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
private void updateOverrideConfiguration() {
final Configuration overrideConfig = mTmpConfig;
+ if(info.applicationInfo.targetSdkVersion < O) {
+ try {
+ maxAspectRatio = Float.parseFloat(SystemProperties.get("persist.sys.max_aspect_ratio.pre_o", ""));
+ } catch (Throwable t) {}
+ Log.d("PHH", "Overrode aspect ratio because pre-o to " + maxAspectRatio);
+ }
if (shouldUseSizeCompatMode()) {
if (mCompatDisplayInsets != null) {
// The override configuration is set only once in size compatibility mode.
@@ -3068,7 +3074,7 @@ final class ActivityRecord extends ConfigurationContainer {
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
private void computeBounds(Rect outBounds, Rect containingAppBounds) {
outBounds.setEmpty();
- final float maxAspectRatio = info.maxAspectRatio;
+ float maxAspectRatio = info.maxAspectRatio;
final ActivityStack stack = getActivityStack();
final float minAspectRatio = info.minAspectRatio;
--
2.25.1

View File

@ -1,26 +0,0 @@
From 7cf02f6a837cbba31bc214a8716be7e0d1055762 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 28 Aug 2018 20:39:26 +0200
Subject: [PATCH 18/58] Add japanese S9
---
.../core/java/com/android/server/lights/LightsService.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index f1a22ee2dc4..15ab8cecfb5 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -95,7 +95,8 @@ public class LightsService extends SystemService {
if(mId == 0) {
String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
- if(fp.matches(".*(crown|star)[q2]*lte.*")) {
+ if(fp.matches(".*(crown|star)[q2]*lte.*") ||
+ fp.matches(".*(SC-0[23]K|SCV3[89]).*")) {
int newBrightness = brightness * 100;
if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
newBrightness = (int) (brightness * 40960.0 / 255.0);
--
2.25.1

View File

@ -1,36 +0,0 @@
From d2029feef32f7e15327013c7c58db5616ed8235c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 8 Nov 2018 23:04:03 +0100
Subject: [PATCH 19/58] Re-order services so that it works even without qtaguid
---
.../com/android/server/net/NetworkPolicyManagerService.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 11c1632b00f..3c8bee02ca1 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -734,6 +734,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "systemReady");
final int oldPriority = Process.getThreadPriority(Process.myTid());
try {
+ mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
+ mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class);
+
// Boost thread's priority during system server init
Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
if (!isBandwidthControlEnabled()) {
@@ -741,9 +744,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return;
}
- mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
- mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class);
-
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
updatePowerSaveWhitelistUL();
--
2.25.1

View File

@ -1,33 +0,0 @@
From e29eb86fe7f515b84816c824fc9e342e03f67df8 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 10 Mar 2019 19:35:06 +0100
Subject: [PATCH 20/58] Different value for astarqlte. Probably more devices to
add later
---
.../java/com/android/server/lights/LightsService.java | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 15ab8cecfb5..31033d57616 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -95,6 +95,15 @@ public class LightsService extends SystemService {
if(mId == 0) {
String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
+ if(fp.matches(".*astarqlte.*")) {
+ int newBrightness = brightness;
+ if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
+ newBrightness = (int) (brightness * 365.0 / 255.0);
+ }
+ setLightLocked(newBrightness, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
+ }
+
if(fp.matches(".*(crown|star)[q2]*lte.*") ||
fp.matches(".*(SC-0[23]K|SCV3[89]).*")) {
int newBrightness = brightness * 100;
--
2.25.1

View File

@ -1,70 +0,0 @@
From 587b2c2d290643b0280f139141e9dd774c8edbca 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 21/58] Support new samsung light hal
Change-Id: I88ca834894320129737b4e31fa8f7e5ee918889a
---
services/core/jni/Android.bp | 1 +
...om_android_server_lights_LightsService.cpp | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index fdcefd42316..d8645012e24 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -135,6 +135,7 @@ cc_defaults {
"android.system.suspend@1.0",
"suspend_control_aidl_interface-cpp",
"vendor.lineage.power@1.0",
+ "vendor.samsung.hardware.light@2.0",
],
static_libs: [
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index 35d8219651d..2f77726d5bd 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -23,6 +23,8 @@
#include <android/hardware/light/2.0/ILight.h>
#include <android/hardware/light/2.0/types.h>
+#include <vendor/samsung/hardware/light/2.0/ISecLight.h>
+#include <vendor/samsung/hardware/light/2.0/types.h>
#include <android-base/chrono_utils.h>
#include <utils/misc.h>
#include <utils/Log.h>
@@ -40,6 +42,8 @@ using Type = ::android::hardware::light::V2_0::Type;
template<typename T>
using Return = ::android::hardware::Return<T>;
+using ISecLight = ::vendor::samsung::hardware::light::V2_0::ISecLight;
+using SecType = ::vendor::samsung::hardware::light::V2_0::SecType;
static bool sLightSupported = true;
static bool validate(jint light, jint flash, jint brightness) {
@@ -152,6 +156,21 @@ static void setLight_native(
colorARGB = (colorAlpha << 24) + (colorARGB & 0x00FFFFFF);
}
+ sp<ISecLight> secHal = ISecLight::getService();
+
+ if(secHal != nullptr) {
+ SecType type = static_cast<SecType>(light);
+ LightState state = constructState(
+ colorARGB, flashMode, onMS, offMS, brightnessMode);
+
+ {
+ android::base::Timer t;
+ Return<Status> ret = secHal->setLightSec(type, state);
+ processReturn(ret, static_cast<Type>(light), state);
+ if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
+ }
+ }
+
Type type = static_cast<Type>(light);
LightState state = constructState(
colorARGB, flashMode, onMS, offMS, brightnessMode);
--
2.25.1

View File

@ -1,28 +0,0 @@
From f7297b9796d2d01dabf58256af529999977e74f5 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 24 Apr 2019 20:09:53 +0200
Subject: [PATCH 22/58] Fix backlight on S10*. Add an additional property to
check, so testers can try it more easily
---
.../core/java/com/android/server/lights/LightsService.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 31033d57616..feba6bf8205 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -104,7 +104,9 @@ public class LightsService extends SystemService {
return;
}
- if(fp.matches(".*(crown|star)[q2]*lte.*") ||
+ if(SystemProperties.getInt("persist.sys.phh.samsung_backlight", 0) == 1 ||
+ fp.matches(".*beyond.*lte.*") ||
+ fp.matches(".*(crown|star)[q2]*lte.*") ||
fp.matches(".*(SC-0[23]K|SCV3[89]).*")) {
int newBrightness = brightness * 100;
if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
--
2.25.1

View File

@ -1,48 +0,0 @@
From 63685ef6795e3b47f227ae5770c063969072644b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 2 Jul 2019 21:15:07 +0200
Subject: [PATCH 23/58] Make samsung light HAL more overridable
---
.../android/server/lights/LightsService.java | 24 ++++++++++++-------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index feba6bf8205..f9ac8db09ea 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -104,16 +104,22 @@ public class LightsService extends SystemService {
return;
}
- if(SystemProperties.getInt("persist.sys.phh.samsung_backlight", 0) == 1 ||
- fp.matches(".*beyond.*lte.*") ||
- fp.matches(".*(crown|star)[q2]*lte.*") ||
- fp.matches(".*(SC-0[23]K|SCV3[89]).*")) {
- int newBrightness = brightness * 100;
- if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
- newBrightness = (int) (brightness * 40960.0 / 255.0);
+ 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 = brightness * ratio;
+ if(SystemProperties.getBoolean("persist.sys.samsung.full_brightness", false)) {
+ newBrightness = (int) (brightness * 40960.0 / 255.0);
+ }
+ setLightLocked(newBrightness, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
+ return;
}
- setLightLocked(newBrightness, LIGHT_FLASH_HARDWARE, 0, 0, brightnessMode);
- return;
}
boolean qcomExtendBrightness = SystemProperties.getBoolean("persist.extend.brightness", false);
--
2.25.1

View File

@ -1,29 +0,0 @@
From 350739eec1738cebf50a64d4ae19fb61c3db769c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 2 Jul 2019 21:19:29 +0200
Subject: [PATCH 24/58] Make Samsung fingerprint broken HAL overridable
Change-Id: I8be38daa7c80fdb61e9209f12215e6daea171d03
---
.../server/biometrics/fingerprint/FingerprintService.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index 9789c49f069..f6e0742aa67 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -592,8 +592,10 @@ public class FingerprintService extends BiometricServiceBase {
groupId, fingerId, deviceId);
int remaining2 = remaining;
+ int overrideSamsung = android.os.SystemProperties.getInt("persist.sys.phh.samsung_fingerprint", -1);
+
String fp = android.os.SystemProperties.get("ro.vendor.build.fingerprint");
- if(fp != null && (fp.contains("starlte") || fp.contains("star2lte") || fp.contains("starqlte") || fp.contains("star2qlte")))
+ if(overrideSamsung == 1 || (overrideSamsung != 0 && fp != null && fp.startsWith("samsung/")))
remaining2 = 100 - remaining2;
FingerprintService.super.handleEnrollResult(fingerprint, remaining2);
--
2.25.1

View File

@ -1,37 +0,0 @@
From 376f6e380451b51ded4e34403016a528ed62157b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 11 Aug 2019 10:30:37 +0200
Subject: [PATCH 25/58] Add property to use linear brightness slider
---
.../com/android/settingslib/display/BrightnessUtils.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
index 55723f9d8ed..da8ce4a67e9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
+++ b/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
@@ -50,7 +50,12 @@ public class BrightnessUtils {
* @param max The maximum acceptable value for the setting.
* @return The corresponding setting value.
*/
+ private static final boolean useLinearBrightness = android.os.SystemProperties.getBoolean("persist.sys.phh.linear_brightness", false);
public static final int convertGammaToLinear(int val, int min, int max) {
+ if(useLinearBrightness) {
+ if(val < 4) return 1;
+ return val/4;
+ }
final float normalizedVal = MathUtils.norm(0, GAMMA_SPACE_MAX, val);
final float ret;
if (normalizedVal <= R) {
@@ -87,6 +92,7 @@ public class BrightnessUtils {
* @return The corresponding slider value
*/
public static final int convertLinearToGamma(int val, int min, int max) {
+ if(useLinearBrightness) return val*4;
// For some reason, HLG normalizes to the range [0, 12] rather than [0, 1]
final float normalizedVal = MathUtils.norm(min, max, val) * 12;
final float ret;
--
2.25.1

View File

@ -1,45 +0,0 @@
From 4d1a24a3ea96184572bc741647b5cd43d4eae032 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 26/58] Add support for samsung touch proximity sensor as
fallback to real proximity sensor
---
.../server/display/DisplayPowerController.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index e546534eb4c..6ac1589aab0 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -522,6 +522,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) {
mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ if(mProximitySensor == null) {
+ 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);
@@ -1936,6 +1943,13 @@ 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;
+ }
final float distance = event.values[0];
boolean positive = distance >= 0.0f && distance < mProximityThreshold;
handleProximitySensorEvent(time, positive);
--
2.25.1

View File

@ -1,30 +0,0 @@
From 231fd535554b81a5ef85aca4783da05bdbd330ec Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 14 Aug 2019 08:50:47 +0200
Subject: [PATCH 27/58] Use Samsung power HAL
Samsung likes to have two android.hardware.power@1.0 implementation
side-by-side, one that works, one that doesn't.
Pick the one that works.
---
.../core/jni/com_android_server_power_PowerManagerService.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index 523f802141e..211ea50ddc9 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -98,7 +98,9 @@ static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa
// The caller must be holding gPowerHalMutex.
static void connectPowerHalLocked() {
if (gPowerHalExists && gPowerHalV1_0_ == nullptr) {
- gPowerHalV1_0_ = IPowerV1_0::getService();
+ gPowerHalV1_0_ = IPowerV1_0::getService("miscpower");
+ if(gPowerHalV1_0_ == nullptr)
+ gPowerHalV1_0_ = IPowerV1_0::getService();
if (gPowerHalV1_0_ != nullptr) {
ALOGI("Loaded power HAL 1.0 service");
// Try cast to powerHAL V1_1
--
2.25.1

View File

@ -1,31 +0,0 @@
From 792cdc6603531eca7a91e3111ca3fd11b3711994 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 14 Aug 2019 23:36:45 +0200
Subject: [PATCH 28/58] Also add com.samsung.sensor.physical_proximity (if
available, it is more a true proximity sensor than touch proximity sensor)
---
.../com/android/server/display/DisplayPowerController.java | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 6ac1589aab0..84f16c4af23 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -522,6 +522,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (!DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT) {
mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
+ if(mProximitySensor == null) {
+ 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) {
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for(Sensor sensor: sensors) {
--
2.25.1

View File

@ -1,411 +0,0 @@
From 67d493c638ff4c901a5ca76f91141b8b6b6a7b57 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 24 Mar 2019 22:48:39 +0100
Subject: [PATCH 29/58] wip
Change-Id: I50fa9a7a670cef5b93fc4a3a027f1587b1214831
---
Android.bp | 2 +
services/core/Android.bp | 1 +
.../biometrics/fingerprint/FacolaView.java | 210 ++++++++++++++++++
.../fingerprint/FingerprintService.java | 26 ++-
.../testharness/TestHarnessModeService.java | 7 +-
.../com/android/server/wm/ActivityRecord.java | 6 -
...om_android_server_lights_LightsService.cpp | 13 +-
7 files changed, 254 insertions(+), 11 deletions(-)
create mode 100644 services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
diff --git a/Android.bp b/Android.bp
index bdd88034655..5e79350ac5c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -779,6 +779,8 @@ java_defaults {
"android.hardware.vibrator-V1.2-java",
"android.hardware.vibrator-V1.3-java",
"android.hardware.wifi-V1.0-java-constants",
+ "vendor.mediatek.hardware.radio-V2.0-java",
+ "vendor.samsung.hardware.radio-V1.2-java",
"devicepolicyprotosnano",
],
diff --git a/services/core/Android.bp b/services/core/Android.bp
index ee26710cf7b..2e7118da1c0 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -55,6 +55,7 @@ java_library_static {
"dnsresolver_aidl_interface-V2-java",
"netd_aidl_interface-V2-java",
"netd_event_listener_interface-java",
+ "vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
new file mode 100644
index 00000000000..8829bcb7e48
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -0,0 +1,210 @@
+/**
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.biometrics.fingerprint;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.content.Context;
+import android.view.View.OnTouchListener;
+import android.view.View;
+import android.widget.ImageView;
+import android.view.MotionEvent;
+import android.util.Slog;
+
+import android.view.WindowManager;
+import android.graphics.PixelFormat;
+import android.view.Gravity;
+
+import java.io.PrintWriter;
+
+import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.ServiceManager;
+
+public class FacolaView extends ImageView implements OnTouchListener {
+ private final int mX, mY, mW, mH;
+ private final Paint mPaintFingerprint = new Paint();
+ private final Paint mPaintShow = new Paint();
+ private IXiaomiFingerprint mXiaomiFingerprint = null;
+ private boolean mInsideCircle = false;
+ private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+
+ private final static float UNTOUCHED_DIM = .1f;
+ private final static float TOUCHED_DIM = .9f;
+
+ private final HandlerThread mHandlerThread;
+ private final Handler mHandler;
+
+ private final WindowManager mWM;
+ FacolaView(Context context) {
+ super(context);
+
+ mHandlerThread = new HandlerThread("FacolaThread");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+
+ String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
+ String[] size = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height", "").split(",");
+ Slog.d("PHH-Enroll", "FacolaView hello");
+ if(size.length == 2 && location.length == 2) {
+ Slog.d("PHH-Enroll", "Got real values");
+ mX = Integer.parseInt(location[0]);
+ mY = Integer.parseInt(location[1]);
+ mW = Integer.parseInt(size[0]);
+ mH = Integer.parseInt(size[1]);
+ } else {
+ mX = -1;
+ mY = -1;
+ mW = -1;
+ mH = -1;
+ }
+
+ mPaintFingerprint.setAntiAlias(true);
+ mPaintFingerprint.setColor(Color.GREEN);
+
+ mPaintShow.setAntiAlias(true);
+ mPaintShow.setColor(Color.argb(0x18, 0x00, 0xff, 0x00));
+ setOnTouchListener(this);
+ mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+ Slog.d("PHH-Enroll", "Created facola...");
+ try {
+ if(mW != -1)
+ mXiaomiFingerprint = IXiaomiFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting xiaomi fingerprint service", e);
+ }
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ Slog.d("PHH-Enroll", "Drawing at " + mX + ", " + mY + ", " + mW + ", " + mH);
+ //TODO w!=h?
+ if(mInsideCircle) {
+ try {
+ int nitValue = 3;
+ if(mXiaomiFingerprint != null)
+ mXiaomiFingerprint.extCmd(0xa, nitValue);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
+ }
+
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintFingerprint);
+ } else {
+ try {
+ if(mXiaomiFingerprint != null)
+ mXiaomiFingerprint.extCmd(0xa, 0);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
+ }
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
+ }
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ float x = event.getAxisValue(MotionEvent.AXIS_X);
+ float y = event.getAxisValue(MotionEvent.AXIS_Y);
+
+ boolean newInside = (x > 0 && x < mW) && (y > 0 && y < mW);
+ if(event.getAction() == MotionEvent.ACTION_UP)
+ newInside = false;
+
+ Slog.d("PHH-Enroll", "Got action " + event.getAction() + ", x = " + x + ", y = " + y + ", inside = " + mInsideCircle + "/" + newInside);
+ if(newInside == mInsideCircle) return mInsideCircle;
+ mInsideCircle = newInside;
+
+ invalidate();
+
+ if(!mInsideCircle) {
+ mParams.screenBrightness = .0f;
+ mParams.dimAmount = UNTOUCHED_DIM;
+ mWM.updateViewLayout(this, mParams);
+ return false;
+ }
+
+ mParams.dimAmount = TOUCHED_DIM;
+ mParams.screenBrightness = 1.0f;
+ mWM.updateViewLayout(this, mParams);
+
+ return true;
+ }
+
+ public void show() {
+ Slog.d("PHH-Enroll", "Show", new Exception());
+ if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
+
+ try {
+ PrintWriter writer = new PrintWriter("/sys/devices/virtual/touch/tp_dev/fod_status", "UTF-8");
+ writer.println("1");
+ writer.close();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting fod status for touchscreen");
+ }
+
+ mParams.x = mX;
+ mParams.y = mY;
+
+ mParams.height = mW;
+ mParams.width = mH;
+ mParams.format = PixelFormat.TRANSLUCENT;
+
+ mParams.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
+ mParams.setTitle("Fingerprint on display");
+ mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+ WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
+ WindowManager.LayoutParams.FLAG_DIM_BEHIND |
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+ mParams.dimAmount = UNTOUCHED_DIM;
+
+ mParams.packageName = "android";
+
+ mParams.gravity = Gravity.TOP | Gravity.LEFT;
+ mHandler.post( () -> {
+ mWM.addView(this, mParams);
+ });
+
+ }
+
+ public void hide() {
+ Slog.d("PHH-Enroll", "Hide", new Exception());
+ if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
+
+ try {
+ if(mXiaomiFingerprint != null)
+ mXiaomiFingerprint.extCmd(0xa, 0);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
+ }
+ try {
+ PrintWriter writer = new PrintWriter("/sys/devices/virtual/touch/tp_dev/fod_status", "UTF-8");
+ writer.println("0");
+ writer.close();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting fod status for touchscreen");
+ }
+
+ Slog.d("PHH-Enroll", "Removed facola");
+ mHandler.post( () -> {
+ mWM.removeView(this);
+ });
+ }
+}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index f6e0742aa67..92c0cc5dc85 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -120,8 +120,10 @@ public class FingerprintService extends BiometricServiceBase {
}
}
}
+ private FacolaView mFacola;
private final class FingerprintAuthClient extends AuthenticationClientImpl {
+
@Override
protected boolean isFingerprint() {
return true;
@@ -170,6 +172,26 @@ public class FingerprintService extends BiometricServiceBase {
return super.handleFailedAttempt();
}
+
+ @Override
+ public boolean onAcquired(int acquiredInfo, int vendorCode) {
+ boolean result = super.onAcquired(acquiredInfo, vendorCode);
+ android.util.Log.d("PHH-Enroll", "acquired ret " + result);
+ if(result) mFacola.hide();
+ return result;
+ }
+
+ @Override
+ public int start() {
+ mFacola.show();
+ return super.start();
+ }
+
+ @Override
+ public int stop(boolean initiatedByClient) {
+ mFacola.hide();
+ return super.stop(initiatedByClient);
+ }
}
/**
@@ -181,7 +203,6 @@ public class FingerprintService extends BiometricServiceBase {
/**
* The following methods contain common code which is shared in biometrics/common.
*/
-
@Override // Binder call
public long preEnroll(IBinder token) {
checkPermission(MANAGE_FINGERPRINT);
@@ -727,6 +748,7 @@ public class FingerprintService extends BiometricServiceBase {
mAlarmManager = context.getSystemService(AlarmManager.class);
context.registerReceiver(mLockoutReceiver, new IntentFilter(getLockoutResetIntent()),
getLockoutBroadcastPermission(), null /* handler */);
+ mFacola = new FacolaView(context);
}
@Override
@@ -954,6 +976,7 @@ public class FingerprintService extends BiometricServiceBase {
Slog.w(TAG, "startPreEnroll: no fingerprint HAL!");
return 0;
}
+ mFacola.show();
try {
return daemon.preEnroll();
} catch (RemoteException e) {
@@ -968,6 +991,7 @@ public class FingerprintService extends BiometricServiceBase {
Slog.w(TAG, "startPostEnroll: no fingerprint HAL!");
return 0;
}
+ mFacola.hide();
try {
return daemon.postEnroll();
} catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/testharness/TestHarnessModeService.java b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
index fcf87ee2a4b..0aa948417c1 100644
--- a/services/core/java/com/android/server/testharness/TestHarnessModeService.java
+++ b/services/core/java/com/android/server/testharness/TestHarnessModeService.java
@@ -150,7 +150,12 @@ public class TestHarnessModeService extends SystemService {
+ "PersistentDataBlockManagerInternal was bound!");
return null;
}
- byte[] testHarnessModeData = blockManager.getTestHarnessModeData();
+ byte[] testHarnessModeData = null;
+ try {
+ testHarnessModeData = blockManager.getTestHarnessModeData();
+ } catch(Exception e) {
+ Slog.e(TAG, "Failed to read block for test harness", e);
+ }
if (testHarnessModeData == null || testHarnessModeData.length == 0) {
// There's no data to apply, so leave it as-is.
return null;
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 7107bba3292..8d2badb825a 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -2835,12 +2835,6 @@ final class ActivityRecord extends ConfigurationContainer {
// TODO(b/36505427): Consider moving this method and similar ones to ConfigurationContainer.
private void updateOverrideConfiguration() {
final Configuration overrideConfig = mTmpConfig;
- if(info.applicationInfo.targetSdkVersion < O) {
- try {
- maxAspectRatio = Float.parseFloat(SystemProperties.get("persist.sys.max_aspect_ratio.pre_o", ""));
- } catch (Throwable t) {}
- Log.d("PHH", "Overrode aspect ratio because pre-o to " + maxAspectRatio);
- }
if (shouldUseSizeCompatMode()) {
if (mCompatDisplayInsets != null) {
// The override configuration is set only once in size compatibility mode.
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index 2f77726d5bd..2b50d04233e 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -46,6 +46,9 @@ using ISecLight = ::vendor::samsung::hardware::light::V2_0::ISecLight;
using SecType = ::vendor::samsung::hardware::light::V2_0::SecType;
static bool sLightSupported = true;
+static sp<ISecLight> sSecHal;
+static bool sSecTried = false;
+
static bool validate(jint light, jint flash, jint brightness) {
bool valid = true;
@@ -156,19 +159,23 @@ static void setLight_native(
colorARGB = (colorAlpha << 24) + (colorARGB & 0x00FFFFFF);
}
- sp<ISecLight> secHal = ISecLight::getService();
+ if(!sSecTried) {
+ sSecHal = ISecLight::getService();
+ sSecTried = true;
+ }
- if(secHal != nullptr) {
+ if(sSecHal != nullptr) {
SecType type = static_cast<SecType>(light);
LightState state = constructState(
colorARGB, flashMode, onMS, offMS, brightnessMode);
{
android::base::Timer t;
- Return<Status> ret = secHal->setLightSec(type, state);
+ Return<Status> ret = sSecHal->setLightSec(type, state);
processReturn(ret, static_cast<Type>(light), state);
if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
}
+ return;
}
Type type = static_cast<Type>(light);
--
2.25.1

View File

@ -1,65 +0,0 @@
From 12eee8e8f124d017db9265d587d3eabdcfe50803 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 12 Aug 2019 23:10:21 +0200
Subject: [PATCH 30/58] User statsd/incidentd arent known to init 8.0. disable
those services
Change-Id: I074654e194f764ffbc6961ff0ae304e36a9b5d1e
---
cmds/incidentd/incidentd.rc | 10 +++++-----
cmds/statsd/statsd.rc | 18 +++++++++---------
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/cmds/incidentd/incidentd.rc b/cmds/incidentd/incidentd.rc
index 9c16a1c52e8..cc20c936fda 100644
--- a/cmds/incidentd/incidentd.rc
+++ b/cmds/incidentd/incidentd.rc
@@ -12,11 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-service incidentd /system/bin/incidentd
- class main
- user incidentd
- group incidentd log readproc
- capabilities KILL SYS_PTRACE
+#service incidentd /system/bin/incidentd
+# class main
+# user incidentd
+# group incidentd log readproc
+# capabilities KILL SYS_PTRACE
on post-fs-data
# Create directory for incidentd
diff --git a/cmds/statsd/statsd.rc b/cmds/statsd/statsd.rc
index a98ecd586b4..564cf98d0a9 100644
--- a/cmds/statsd/statsd.rc
+++ b/cmds/statsd/statsd.rc
@@ -12,15 +12,15 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-service statsd /system/bin/statsd
- class main
- socket statsdw dgram+passcred 0222 statsd statsd
- user statsd
- group statsd log
- writepid /dev/cpuset/system-background/tasks
-
-on property:ro.statsd.enable=false
- stop statsd
+#service statsd /system/bin/statsd
+# class main
+# socket statsdw dgram+passcred 0222 statsd statsd
+# user statsd
+# group statsd log
+# writepid /dev/cpuset/system-background/tasks
+#
+#on property:ro.statsd.enable=false
+# stop statsd
on post-fs-data
# Create directory for statsd
--
2.25.1

View File

@ -1,31 +0,0 @@
From 3c029d1d6858aaa232e9706f847c390addf0fd96 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 12 Sep 2019 20:38:08 +0200
Subject: [PATCH 31/58] Check for samsung light service everytime
This is needed because it is possible sec light service isn't ready at
that time.
TODO: check that the services exists at all, so that this is done only
on Samsung devices
Change-Id: I30f049f3b06f83c455301b589b3558ff384ec300
---
services/core/jni/com_android_server_lights_LightsService.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index 2b50d04233e..a21c6e2c8ef 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -161,7 +161,7 @@ static void setLight_native(
if(!sSecTried) {
sSecHal = ISecLight::getService();
- sSecTried = true;
+ //sSecTried = true;
}
if(sSecHal != nullptr) {
--
2.25.1

View File

@ -1,121 +0,0 @@
From 6f450d9a22c3155a1732dbc1bcbcaed2a5a8d052 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 12 Sep 2019 20:39:50 +0200
Subject: [PATCH 32/58] Forawrdport Samsung "fod" support for ultrasound fp
Change-Id: I9f787a01dab922cd94f9e552a6f3f53a00ca8448
---
.../biometrics/fingerprint/FacolaView.java | 61 ++++++++++++++++++-
1 file changed, 58 insertions(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 8829bcb7e48..f61582990cf 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -30,6 +30,9 @@ import android.view.WindowManager;
import android.graphics.PixelFormat;
import android.view.Gravity;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
import java.io.PrintWriter;
import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
@@ -53,9 +56,12 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final Handler mHandler;
private final WindowManager mWM;
+ private final boolean samsungFod = samsungHasCmd("fod_enable");
FacolaView(Context context) {
super(context);
+ android.util.Log.d("PHH", "Samsung FOD " + samsungFod);
+
mHandlerThread = new HandlerThread("FacolaThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
@@ -64,7 +70,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
String[] size = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height", "").split(",");
Slog.d("PHH-Enroll", "FacolaView hello");
if(size.length == 2 && location.length == 2) {
- Slog.d("PHH-Enroll", "Got real values");
+ Slog.d("PHH-Enroll", "Got real values");
mX = Integer.parseInt(location[0]);
mY = Integer.parseInt(location[1]);
mW = Integer.parseInt(size[0]);
@@ -149,7 +155,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
public void show() {
- Slog.d("PHH-Enroll", "Show", new Exception());
+ Slog.d("PHH-Enroll", "Show", new Exception());
+ if(samsungFod) {
+ samsungCmd("fod_enable,1,1");
+ }
if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
try {
@@ -185,7 +194,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
public void hide() {
- Slog.d("PHH-Enroll", "Hide", new Exception());
+ Slog.d("PHH-Enroll", "Hide", new Exception());
+ if(samsungFod) {
+ samsungCmd("fod_enable,0");
+ }
if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
try {
@@ -207,4 +219,47 @@ public class FacolaView extends ImageView implements OnTouchListener {
mWM.removeView(this);
});
}
+
+ private static boolean samsungHasCmd(String cmd) {
+ try {
+ File f = new File("/sys/devices/virtual/sec/tsp/cmd_list");
+ if(!f.exists()) return false;
+
+ BufferedReader b = new BufferedReader(new FileReader(f));
+ String line = null;
+ while( (line = b.readLine()) != null) {
+ if(line.equals(cmd)) return true;
+ }
+ return false;
+ } catch(Exception e) {
+ return false;
+ }
+ }
+
+ 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;
+ }
+ }
+
+ private static void samsungCmd(String cmd) {
+ try {
+ PrintWriter writer = new PrintWriter("/sys/devices/virtual/sec/tsp/cmd", "UTF-8");
+ writer.println(cmd);
+ writer.close();
+
+ 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);
+ }
+ }
+
}
--
2.25.1

View File

@ -1,166 +0,0 @@
From c37bc2054b6e8e8d7e5d469e082e423f56d092fc Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 14 Oct 2019 23:50:46 +0200
Subject: [PATCH 33/58] Scan /system/overlay and fix support for properties in
idmap2
Change-Id: Ic04b5b1cc7b5d8cee67b1e2fdaa8aa793546b6d6
---
cmds/idmap2/idmap2/Scan.cpp | 6 ++++-
cmds/idmap2/include/idmap2/ResourceUtils.h | 3 +++
cmds/idmap2/libidmap2/ResourceUtils.cpp | 26 +++++++++++++++++++
.../android/content/pm/PackageParser.java | 9 ++++++-
core/jni/android_util_AssetManager.cpp | 3 +++
.../server/pm/PackageManagerService.java | 6 +++++
6 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/cmds/idmap2/idmap2/Scan.cpp b/cmds/idmap2/idmap2/Scan.cpp
index cfac5f31e2e..adac1ef88cf 100644
--- a/cmds/idmap2/idmap2/Scan.cpp
+++ b/cmds/idmap2/idmap2/Scan.cpp
@@ -159,13 +159,17 @@ Result<Unit> Scan(const std::vector<std::string>& args) {
Result<OverlayManifestInfo> overlay_info =
ExtractOverlayManifestInfo(path, /* assert_overlay */ false);
if (!overlay_info) {
- return overlay_info.GetError();
+ continue;
}
if (!overlay_info->is_static) {
continue;
}
+ if (!overlay_info->property_match) {
+ continue;
+ }
+
if (overlay_info->target_package.empty() ||
overlay_info->target_package != target_package_name) {
continue;
diff --git a/cmds/idmap2/include/idmap2/ResourceUtils.h b/cmds/idmap2/include/idmap2/ResourceUtils.h
index 8797a788dd1..0f98f4d1a2d 100644
--- a/cmds/idmap2/include/idmap2/ResourceUtils.h
+++ b/cmds/idmap2/include/idmap2/ResourceUtils.h
@@ -30,6 +30,9 @@ namespace android::idmap2::utils {
struct OverlayManifestInfo {
std::string target_package; // NOLINT(misc-non-private-member-variables-in-classes)
std::string target_name; // NOLINT(misc-non-private-member-variables-in-classes)
+ std::string property_name; // NOLINT(misc-non-private-member-variables-in-classes)
+ std::string property_value; // NOLINT(misc-non-private-member-variables-in-classes)
+ bool property_match; // NOLINT(misc-non-private-member-variables-in-classes)
bool is_static; // NOLINT(misc-non-private-member-variables-in-classes)
int priority = -1; // NOLINT(misc-non-private-member-variables-in-classes)
};
diff --git a/cmds/idmap2/libidmap2/ResourceUtils.cpp b/cmds/idmap2/libidmap2/ResourceUtils.cpp
index 71ba3f0f1ac..7fda402b80f 100644
--- a/cmds/idmap2/libidmap2/ResourceUtils.cpp
+++ b/cmds/idmap2/libidmap2/ResourceUtils.cpp
@@ -18,7 +18,9 @@
#include <memory>
#include <string>
+#include <fnmatch.h>
+#include "android-base/properties.h"
#include "androidfw/StringPiece.h"
#include "androidfw/Util.h"
#include "idmap2/Result.h"
@@ -93,6 +95,30 @@ Result<OverlayManifestInfo> ExtractOverlayManifestInfo(const std::string& path,
info.target_name = iter->second;
}
+ iter = tag->find("requiredSystemPropertyName");
+ if (iter != tag->end()) {
+ info.property_name = iter->second;
+ }
+
+ iter = tag->find("requiredSystemPropertyValue");
+ if (iter != tag->end()) {
+ info.property_value = iter->second;
+ }
+
+ info.property_match = false;
+ if(!info.property_name.empty() && !info.property_value.empty()) {
+ std::string prop = android::base::GetProperty(info.property_name, "");
+ if(info.property_value == prop) {
+ info.property_match = true;
+ }
+ if(info.property_value[0] == '+') {
+ info.property_match =
+ fnmatch(info.property_value.c_str()+1, prop.c_str(), 0) == 0;
+ }
+ } else {
+ info.property_match = true;
+ }
+
iter = tag->find("isStatic");
if (iter != tag->end()) {
info.is_static = std::stoul(iter->second) != 0U;
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 535a8bc9db7..a164cb186a9 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1355,6 +1355,7 @@ public class PackageParser {
} catch (PackageParserException e) {
throw e;
} catch (Exception e) {
+ android.util.Log.d("PHH", "failed reading manifest because of", e);
throw new PackageParserException(INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION,
"Failed to read manifest from " + apkPath, e);
} finally {
@@ -1394,6 +1395,7 @@ public class PackageParser {
} catch (PackageParserException e) {
throw e;
} catch (Exception e) {
+ android.util.Log.d("PHH", "failed reading manifest because of", e);
throw new PackageParserException(INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION,
"Failed to read manifest from " + apkPath, e);
} finally {
@@ -2574,7 +2576,12 @@ public class PackageParser {
// check property value - make sure it is both set and equal to expected value
final String currValue = SystemProperties.get(propName);
- return (currValue != null && currValue.equals(propValue));
+ if(propValue.charAt(0) == '+') {
+ String valRegexp = propValue.replace("*", ".*").substring(1);
+ return currValue != null && currValue.matches(valRegexp);
+ } else {
+ return (currValue != null && currValue.equals(propValue));
+ }
}
/**
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 4518c7e66a5..9e1b6db9ad9 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -233,6 +233,9 @@ static jobjectArray NativeCreateIdmapsForStaticOverlaysTargetingAndroid(JNIEnv*
// --input-directory can be given multiple times, but idmap2 expects the directory to exist
std::vector<std::string> input_dirs;
struct stat st;
+ if (stat("/system/overlay", &st) == 0) {
+ input_dirs.push_back("/system/overlay");
+ }
if (stat(AssetManager::VENDOR_OVERLAY_DIR, &st) == 0) {
input_dirs.push_back(AssetManager::VENDOR_OVERLAY_DIR);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 179abe958b1..264e85d8eca 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2668,6 +2668,12 @@ public class PackageManagerService extends IPackageManager.Stub
// any apps.)
// For security and version matching reason, only consider overlay packages if they
// reside in the right directory.
+ scanDirTracedLI(new File("/system/overlay"),
+ mDefParseFlags
+ | PackageParser.PARSE_IS_SYSTEM_DIR,
+ scanFlags
+ | SCAN_AS_SYSTEM,
+ 0);
scanDirTracedLI(new File(VENDOR_OVERLAY_DIR),
mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM_DIR,
--
2.25.1

View File

@ -1,97 +0,0 @@
From a950589b497f0e635205591b358aaa18e45e74c3 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 22 Oct 2019 00:33:23 +0200
Subject: [PATCH 34/58] Improve FacolaView life cycle, though it is still
missing few cases. It might require to change BiometricServiceBase for actual
fix
Change-Id: Ida96f8aca360c23cd5535f0ee92fd77dada2ebec
---
.../server/biometrics/fingerprint/FacolaView.java | 9 ++++++++-
.../biometrics/fingerprint/FingerprintService.java | 14 ++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index f61582990cf..4ff373a108d 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -57,6 +57,8 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final WindowManager mWM;
private final boolean samsungFod = samsungHasCmd("fod_enable");
+
+ private boolean mHidden = true;
FacolaView(Context context) {
super(context);
@@ -106,7 +108,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
//TODO w!=h?
if(mInsideCircle) {
try {
- int nitValue = 3;
+ int nitValue = 2;
if(mXiaomiFingerprint != null)
mXiaomiFingerprint.extCmd(0xa, nitValue);
} catch(Exception e) {
@@ -156,6 +158,8 @@ public class FacolaView extends ImageView implements OnTouchListener {
public void show() {
Slog.d("PHH-Enroll", "Show", new Exception());
+ if(!mHidden) return;
+ mHidden = false;
if(samsungFod) {
samsungCmd("fod_enable,1,1");
}
@@ -194,7 +198,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
public void hide() {
+ mInsideCircle = false;
Slog.d("PHH-Enroll", "Hide", new Exception());
+ if(mHidden) return;
+ mHidden = true;
if(samsungFod) {
samsungCmd("fod_enable,0");
}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index 92c0cc5dc85..1323c5ec0dd 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -181,6 +181,16 @@ public class FingerprintService extends BiometricServiceBase {
return result;
}
+ @Override
+ public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier,
+ boolean authenticated, ArrayList<Byte> token) {
+ boolean result = super.onAuthenticated(identifier, authenticated, token);
+ android.util.Log.d("PHH-Enroll", "auth-ed ret " + result);
+ if(result) mFacola.hide();
+ return result;
+ }
+
+
@Override
public int start() {
mFacola.show();
@@ -220,6 +230,7 @@ public class FingerprintService extends BiometricServiceBase {
final IFingerprintServiceReceiver receiver, final int flags,
final String opPackageName) {
checkPermission(MANAGE_FINGERPRINT);
+ mFacola.show();
final boolean restricted = isRestricted();
final int groupId = userId; // default group for fingerprint enrollment
@@ -643,6 +654,9 @@ public class FingerprintService extends BiometricServiceBase {
public void onError(final long deviceId, final int error, final int vendorCode) {
mHandler.post(() -> {
FingerprintService.super.handleError(deviceId, error, vendorCode);
+ if ( error == BiometricConstants.BIOMETRIC_ERROR_CANCELED) {
+ mFacola.hide();
+ }
// TODO: this chunk of code should be common to all biometric services
if (error == BiometricConstants.BIOMETRIC_ERROR_HW_UNAVAILABLE) {
// If we get HW_UNAVAILABLE, try to connect again later...
--
2.25.1

View File

@ -1,26 +0,0 @@
From 9cd57490c483e5a5b94d32d8fda5cc095734734d Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 22 Oct 2019 15:31:54 +0200
Subject: [PATCH 35/58] Link hwui with libbase, because of updated skia
dependency
Change-Id: I201df2cd8f66674948b56fb6d5be5e8c3cb48bd1
---
libs/hwui/Android.bp | 1 +
1 file changed, 1 insertion(+)
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index ebba4cb79df..b9808751130 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -70,6 +70,7 @@ cc_defaults {
"libandroidfw",
"libcrypto",
"libsync",
+ "libbase",
],
static_libs: [
"libEGL_blobCache",
--
2.25.1

View File

@ -1,35 +0,0 @@
From 6806da584a014aa51429e4779f999f83a0e826be Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 27 Oct 2019 16:27:55 +0100
Subject: [PATCH 36/58] Fix crash on some devices by checking for null client
Some device get the following system_server crash:
*** FATAL EXCEPTION IN SYSTEM PROCESS: main
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.android.server.biometrics.ClientMonitor.onEnumerationResult(android.hardware.biometrics.BiometricAuthenticator$Identifier, int)' on a null object reference
at com.android.server.biometrics.BiometricServiceBase.handleEnumerate(BiometricServiceBase.java:777)
at com.android.server.biometrics.fingerprint.FingerprintService.access$6901(FingerprintService.java:93)
at com.android.server.biometrics.fingerprint.FingerprintService$1.lambda$onEnumerate$5$FingerprintService$1(FingerprintService.java:686)
at com.android.server.biometrics.fingerprint.-$$Lambda$FingerprintService$1$3I9ge5BoesXZUovbayCOCR754fc.run(Unknown Source:10)
Fix it by checking for `null` client before acting on it
Change-Id: If39d8c1b26c8c0a44b3d9292b646cb71ff258a95
---
.../java/com/android/server/biometrics/BiometricServiceBase.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
index 37a08de62fc..292798721c6 100644
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
@@ -792,6 +792,7 @@ public abstract class BiometricServiceBase extends SystemService
protected void handleEnumerate(BiometricAuthenticator.Identifier identifier, int remaining) {
ClientMonitor client = getCurrentClient();
+ if(client == null) return;
client.onEnumerationResult(identifier, remaining);
// All templates in the HAL for this user were enumerated
--
2.25.1

View File

@ -1,475 +0,0 @@
From ca4db4fe51356d20bf26142c188b6a691075c123 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 15 Dec 2019 16:38:44 +0100
Subject: [PATCH 37/58] Support Samsung Q Light HAL
Change-Id: Ic5745eb115a14de348391e69ed6bf3c2a24b157e
---
services/core/jni/Android.bp | 1 +
services/core/jni/Android.bp.orig | 165 ++++++++++++++
...om_android_server_lights_LightsService.cpp | 26 +++
...droid_server_lights_LightsService.cpp.orig | 207 ++++++++++++++++++
4 files changed, 399 insertions(+)
create mode 100644 services/core/jni/Android.bp.orig
create mode 100644 services/core/jni/com_android_server_lights_LightsService.cpp.orig
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index d8645012e24..3ffa7561028 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -136,6 +136,7 @@ cc_defaults {
"suspend_control_aidl_interface-cpp",
"vendor.lineage.power@1.0",
"vendor.samsung.hardware.light@2.0",
+ "vendor.samsung.hardware.light@3.0",
],
static_libs: [
diff --git a/services/core/jni/Android.bp.orig b/services/core/jni/Android.bp.orig
new file mode 100644
index 00000000000..d8645012e24
--- /dev/null
+++ b/services/core/jni/Android.bp.orig
@@ -0,0 +1,165 @@
+cc_library_static {
+ name: "libservices.core",
+ defaults: ["libservices.core-libs"],
+
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wno-unused-parameter",
+ "-Wthread-safety",
+
+ "-DEGL_EGLEXT_PROTOTYPES",
+ "-DGL_GLEXT_PROTOTYPES",
+ ],
+
+ srcs: [
+ "BroadcastRadio/JavaRef.cpp",
+ "BroadcastRadio/NativeCallbackThread.cpp",
+ "BroadcastRadio/BroadcastRadioService.cpp",
+ "BroadcastRadio/Tuner.cpp",
+ "BroadcastRadio/TunerCallback.cpp",
+ "BroadcastRadio/convert.cpp",
+ "BroadcastRadio/regions.cpp",
+ "com_android_server_AlarmManagerService.cpp",
+ "com_android_server_am_BatteryStatsService.cpp",
+ "com_android_server_connectivity_Vpn.cpp",
+ "com_android_server_connectivity_tethering_OffloadHardwareInterface.cpp",
+ "com_android_server_ConsumerIrService.cpp",
+ "com_android_server_devicepolicy_CryptoTestHelper.cpp",
+ "com_android_server_HardwarePropertiesManagerService.cpp",
+ "com_android_server_hdmi_HdmiCecController.cpp",
+ "com_android_server_input_InputManagerService.cpp",
+ "com_android_server_lights_LightsService.cpp",
+ "com_android_server_location_GnssLocationProvider.cpp",
+ "com_android_server_locksettings_SyntheticPasswordManager.cpp",
+ "com_android_server_net_NetworkStatsService.cpp",
+ "com_android_server_power_PowerManagerService.cpp",
+ "com_android_server_security_VerityUtils.cpp",
+ "com_android_server_SerialService.cpp",
+ "com_android_server_storage_AppFuseBridge.cpp",
+ "com_android_server_SystemServer.cpp",
+ "com_android_server_TestNetworkService.cpp",
+ "com_android_server_tv_TvUinputBridge.cpp",
+ "com_android_server_tv_TvInputHal.cpp",
+ "com_android_server_vr_VrManagerService.cpp",
+ "com_android_server_UsbAlsaJackDetector.cpp",
+ "com_android_server_UsbDeviceManager.cpp",
+ "com_android_server_UsbDescriptorParser.cpp",
+ "com_android_server_UsbMidiDevice.cpp",
+ "com_android_server_UsbHostManager.cpp",
+ "com_android_server_VibratorService.cpp",
+ "com_android_server_PersistentDataBlockService.cpp",
+ "com_android_server_GraphicsStatsService.cpp",
+ "com_android_server_am_AppCompactor.cpp",
+ "com_android_server_am_LowMemDetector.cpp",
+ "onload.cpp",
+ ":lib_networkStatsFactory_native",
+ ],
+
+ include_dirs: [
+ "bionic/libc/private",
+ "frameworks/base/libs",
+ "frameworks/native/services",
+ "system/gatekeeper/include",
+ ],
+}
+
+cc_defaults {
+ name: "libservices.core-libs",
+ shared_libs: [
+ "libandroid_runtime",
+ "libandroidfw",
+ "libaudioclient",
+ "libbase",
+ "libappfuse",
+ "libbinder",
+ "libcutils",
+ "libcrypto",
+ "liblog",
+ "libhardware",
+ "libhardware_legacy",
+ "libhidlbase",
+ "libkeystore_binder",
+ "libmtp",
+ "libnativehelper",
+ "libutils",
+ "libui",
+ "libinput",
+ "libinputflinger",
+ "libinputflinger_base",
+ "libinputservice",
+ "libschedulerservicehidl",
+ "libsensorservice",
+ "libsensorservicehidl",
+ "libgui",
+ "libusbhost",
+ "libtinyalsa",
+ "libEGL",
+ "libGLESv2",
+ "libnetutils",
+ "libhidlbase",
+ "libhidltransport",
+ "libhwbinder",
+ "libutils",
+ "libhwui",
+ "libbpf_android",
+ "libnetdbpf",
+ "libnetdutils",
+ "libpsi",
+ "android.hardware.audio.common@2.0",
+ "android.hardware.broadcastradio@1.0",
+ "android.hardware.broadcastradio@1.1",
+ "android.hardware.contexthub@1.0",
+ "android.hardware.gnss@1.0",
+ "android.hardware.gnss@1.1",
+ "android.hardware.gnss@2.0",
+ "android.hardware.gnss.measurement_corrections@1.0",
+ "android.hardware.gnss.visibility_control@1.0",
+ "android.hardware.input.classifier@1.0",
+ "android.hardware.ir@1.0",
+ "android.hardware.light@2.0",
+ "android.hardware.power@1.0",
+ "android.hardware.power@1.1",
+ "android.hardware.power.stats@1.0",
+ "android.hardware.tetheroffload.config@1.0",
+ "android.hardware.thermal@1.0",
+ "android.hardware.tv.cec@1.0",
+ "android.hardware.tv.input@1.0",
+ "android.hardware.vibrator@1.0",
+ "android.hardware.vibrator@1.1",
+ "android.hardware.vibrator@1.2",
+ "android.hardware.vibrator@1.3",
+ "android.hardware.vr@1.0",
+ "android.frameworks.schedulerservice@1.0",
+ "android.frameworks.sensorservice@1.0",
+ "android.system.suspend@1.0",
+ "suspend_control_aidl_interface-cpp",
+ "vendor.lineage.power@1.0",
+ "vendor.samsung.hardware.light@2.0",
+ ],
+
+ static_libs: [
+ "android.hardware.broadcastradio@common-utils-1x-lib",
+ ],
+
+ product_variables: {
+ arc: {
+ shared_libs: [
+ "libarcbridge",
+ "libarcbridgeservice",
+ "libarctimer",
+ "libbase",
+ "libcap",
+ "libchrome",
+ "libmojo",
+ ],
+ }
+ }
+}
+
+filegroup {
+ name: "lib_networkStatsFactory_native",
+ srcs: [
+ "com_android_server_net_NetworkStatsFactory.cpp",
+ ],
+}
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index a21c6e2c8ef..dedc7734131 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -25,6 +25,8 @@
#include <android/hardware/light/2.0/types.h>
#include <vendor/samsung/hardware/light/2.0/ISecLight.h>
#include <vendor/samsung/hardware/light/2.0/types.h>
+#include <vendor/samsung/hardware/light/3.0/ISehLight.h>
+#include <vendor/samsung/hardware/light/3.0/types.h>
#include <android-base/chrono_utils.h>
#include <utils/misc.h>
#include <utils/Log.h>
@@ -44,9 +46,13 @@ using Return = ::android::hardware::Return<T>;
using ISecLight = ::vendor::samsung::hardware::light::V2_0::ISecLight;
using SecType = ::vendor::samsung::hardware::light::V2_0::SecType;
+using ISehLight = ::vendor::samsung::hardware::light::V3_0::ISehLight;
+using SehType = ::vendor::samsung::hardware::light::V3_0::SehType;
+using SehLightState = ::vendor::samsung::hardware::light::V3_0::SehLightState;
static bool sLightSupported = true;
static sp<ISecLight> sSecHal;
+static sp<ISehLight> sSehHal;
static bool sSecTried = false;
static bool validate(jint light, jint flash, jint brightness) {
@@ -161,6 +167,7 @@ static void setLight_native(
if(!sSecTried) {
sSecHal = ISecLight::getService();
+ sSehHal = ISehLight::getService();
//sSecTried = true;
}
@@ -178,6 +185,25 @@ static void setLight_native(
return;
}
+ if(sSehHal != nullptr && light == 0 && flashMode == static_cast<jint>(Flash::HARDWARE)) {
+ SehType type = static_cast<SehType>(light);
+ SehLightState state {};
+ state.flashMode = Flash::NONE;
+ Brightness brightness = static_cast<Brightness>(brightnessMode);
+ state.brightnessMode = brightness;
+ state.extendedBrightness = colorARGB;
+
+ {
+ android::base::Timer t;
+ Return<Status> ret = sSehHal->sehSetLight(type, state);
+ if(!ret.isOk()) {
+ ALOGE("Failed to issue set light command.");
+ }
+ if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
+ }
+ return;
+ }
+
Type type = static_cast<Type>(light);
LightState state = constructState(
colorARGB, flashMode, onMS, offMS, brightnessMode);
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp.orig b/services/core/jni/com_android_server_lights_LightsService.cpp.orig
new file mode 100644
index 00000000000..a21c6e2c8ef
--- /dev/null
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp.orig
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ * Copyright (C) 2015 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "LightsService"
+
+#include "jni.h"
+#include <nativehelper/JNIHelp.h>
+#include "android_runtime/AndroidRuntime.h"
+
+#include <android/hardware/light/2.0/ILight.h>
+#include <android/hardware/light/2.0/types.h>
+#include <vendor/samsung/hardware/light/2.0/ISecLight.h>
+#include <vendor/samsung/hardware/light/2.0/types.h>
+#include <android-base/chrono_utils.h>
+#include <utils/misc.h>
+#include <utils/Log.h>
+#include <map>
+#include <stdio.h>
+
+namespace android {
+
+using Brightness = ::android::hardware::light::V2_0::Brightness;
+using Flash = ::android::hardware::light::V2_0::Flash;
+using ILight = ::android::hardware::light::V2_0::ILight;
+using LightState = ::android::hardware::light::V2_0::LightState;
+using Status = ::android::hardware::light::V2_0::Status;
+using Type = ::android::hardware::light::V2_0::Type;
+template<typename T>
+using Return = ::android::hardware::Return<T>;
+
+using ISecLight = ::vendor::samsung::hardware::light::V2_0::ISecLight;
+using SecType = ::vendor::samsung::hardware::light::V2_0::SecType;
+static bool sLightSupported = true;
+
+static sp<ISecLight> sSecHal;
+static bool sSecTried = false;
+
+static bool validate(jint light, jint flash, jint brightness) {
+ bool valid = true;
+
+ if (light < 0 || light >= static_cast<jint>(Type::COUNT)) {
+ ALOGE("Invalid light parameter %d.", light);
+ valid = false;
+ }
+
+ if (flash != static_cast<jint>(Flash::NONE) &&
+ flash != static_cast<jint>(Flash::TIMED) &&
+ flash != static_cast<jint>(Flash::HARDWARE)) {
+ ALOGE("Invalid flash parameter %d.", flash);
+ valid = false;
+ }
+
+ if (brightness != static_cast<jint>(Brightness::USER) &&
+ brightness != static_cast<jint>(Brightness::SENSOR) &&
+ brightness != static_cast<jint>(Brightness::LOW_PERSISTENCE)) {
+ ALOGE("Invalid brightness parameter %d.", brightness);
+ valid = false;
+ }
+
+ if (brightness == static_cast<jint>(Brightness::LOW_PERSISTENCE) &&
+ light != static_cast<jint>(Type::BACKLIGHT)) {
+ ALOGE("Cannot set low-persistence mode for non-backlight device.");
+ valid = false;
+ }
+
+ return valid;
+}
+
+static LightState constructState(
+ jint colorARGB,
+ jint flashMode,
+ jint onMS,
+ jint offMS,
+ jint brightnessMode){
+ Flash flash = static_cast<Flash>(flashMode);
+ Brightness brightness = static_cast<Brightness>(brightnessMode);
+
+ LightState state{};
+
+ if (brightness == Brightness::LOW_PERSISTENCE) {
+ state.flashMode = Flash::NONE;
+ } else {
+ // Only set non-brightness settings when not in low-persistence mode
+ state.flashMode = flash;
+ state.flashOnMs = onMS;
+ state.flashOffMs = offMS;
+ }
+
+ state.color = colorARGB;
+ state.brightnessMode = brightness;
+
+ return state;
+}
+
+static void processReturn(
+ const Return<Status> &ret,
+ Type type,
+ const LightState &state) {
+ if (!ret.isOk()) {
+ ALOGE("Failed to issue set light command.");
+ return;
+ }
+
+ switch (static_cast<Status>(ret)) {
+ case Status::SUCCESS:
+ break;
+ case Status::LIGHT_NOT_SUPPORTED:
+ ALOGE("Light requested not available on this device. %d", type);
+ break;
+ case Status::BRIGHTNESS_NOT_SUPPORTED:
+ ALOGE("Brightness parameter not supported on this device: %d",
+ state.brightnessMode);
+ break;
+ case Status::UNKNOWN:
+ default:
+ ALOGE("Unknown error setting light.");
+ }
+}
+
+static void setLight_native(
+ JNIEnv* /* env */,
+ jobject /* clazz */,
+ jint light,
+ jint colorARGB,
+ jint flashMode,
+ jint onMS,
+ jint offMS,
+ jint brightnessMode,
+ jint brightnessLevel) {
+
+ if (!sLightSupported) {
+ return;
+ }
+
+ if (!validate(light, flashMode, brightnessMode)) {
+ return;
+ }
+
+ if (brightnessLevel > 0 && brightnessLevel <= 0xFF) {
+ int colorAlpha = (colorARGB & 0xFF000000) >> 24;
+ if (colorAlpha == 0x00) {
+ colorAlpha = 0xFF;
+ }
+ colorAlpha = (colorAlpha * brightnessLevel) / 0xFF;
+ colorARGB = (colorAlpha << 24) + (colorARGB & 0x00FFFFFF);
+ }
+
+ if(!sSecTried) {
+ sSecHal = ISecLight::getService();
+ //sSecTried = true;
+ }
+
+ if(sSecHal != nullptr) {
+ SecType type = static_cast<SecType>(light);
+ LightState state = constructState(
+ colorARGB, flashMode, onMS, offMS, brightnessMode);
+
+ {
+ android::base::Timer t;
+ Return<Status> ret = sSecHal->setLightSec(type, state);
+ processReturn(ret, static_cast<Type>(light), state);
+ if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
+ }
+ return;
+ }
+
+ Type type = static_cast<Type>(light);
+ LightState state = constructState(
+ colorARGB, flashMode, onMS, offMS, brightnessMode);
+
+ {
+ android::base::Timer t;
+ sp<ILight> hal = ILight::getService();
+ if (hal == nullptr) {
+ sLightSupported = false;
+ return;
+ }
+ Return<Status> ret = hal->setLight(type, state);
+ processReturn(ret, type, state);
+ if (t.duration() > 50ms) ALOGD("Excessive delay setting light");
+ }
+}
+
+static const JNINativeMethod method_table[] = {
+ { "setLight_native", "(IIIIIII)V", (void*)setLight_native },
+};
+
+int register_android_server_LightsService(JNIEnv *env) {
+ return jniRegisterNativeMethods(env, "com/android/server/lights/LightsService",
+ method_table, NELEM(method_table));
+}
+
+};
--
2.25.1

View File

@ -1,46 +0,0 @@
From 47c5660af8f54286d6c525e211077c05f9689ca8 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 15 Dec 2019 16:58:38 +0100
Subject: [PATCH 38/58] Add a nodim property for FacolaView
Set persist.sys.phh.nodim to true to remove diming/full brightness
---
.../android/server/biometrics/fingerprint/FacolaView.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 4ff373a108d..08436019bc9 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -57,6 +57,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final WindowManager mWM;
private final boolean samsungFod = samsungHasCmd("fod_enable");
+ private final boolean noDim;
private boolean mHidden = true;
FacolaView(Context context) {
@@ -68,6 +69,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
+ noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false);
String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
String[] size = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height", "").split(",");
Slog.d("PHH-Enroll", "FacolaView hello");
@@ -149,8 +151,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
return false;
}
- mParams.dimAmount = TOUCHED_DIM;
- mParams.screenBrightness = 1.0f;
+ if(!noDim) {
+ mParams.dimAmount = TOUCHED_DIM;
+ mParams.screenBrightness = 1.0f;
+ }
mWM.updateViewLayout(this, mParams);
return true;
--
2.25.1

View File

@ -1,90 +0,0 @@
From fffb6c1f4bf48d2bdc1a1b3c24b97d32bdaa4cca Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 15 Dec 2019 22:14:12 +0100
Subject: [PATCH 39/58] Add Samsung's Q power HAL to fix suspend
Change-Id: I1edd4de9932ab089b7051f1329f60c15b9d99aaa
---
services/core/jni/Android.bp | 1 +
...ndroid_server_power_PowerManagerService.cpp | 18 ++++++++++++++++++
2 files changed, 19 insertions(+)
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 3ffa7561028..8f44be480c9 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -135,6 +135,7 @@ cc_defaults {
"android.system.suspend@1.0",
"suspend_control_aidl_interface-cpp",
"vendor.lineage.power@1.0",
+ "vendor.samsung.hardware.miscpower@2.0",
"vendor.samsung.hardware.light@2.0",
"vendor.samsung.hardware.light@3.0",
],
diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
index 211ea50ddc9..bf0599fe18a 100644
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
@@ -21,6 +21,7 @@
#include <android/hardware/power/1.1/IPower.h>
#include <android/system/suspend/1.0/ISystemSuspend.h>
#include <android/system/suspend/ISuspendControlService.h>
+#include <vendor/samsung/hardware/miscpower/2.0/ISehMiscPower.h>
#include <nativehelper/JNIHelp.h>
#include <vendor/lineage/power/1.0/ILineagePower.h>
#include "jni.h"
@@ -58,6 +59,7 @@ using IPowerV1_1 = android::hardware::power::V1_1::IPower;
using IPowerV1_0 = android::hardware::power::V1_0::IPower;
using ILineagePowerV1_0 = vendor::lineage::power::V1_0::ILineagePower;
using vendor::lineage::power::V1_0::LineageFeature;
+using ISehMiscPower = vendor::samsung::hardware::miscpower::V2_0::ISehMiscPower;
namespace android {
@@ -74,6 +76,7 @@ static jobject gPowerManagerServiceObj;
static sp<IPowerV1_0> gPowerHalV1_0_ = nullptr;
static sp<IPowerV1_1> gPowerHalV1_1_ = nullptr;
static sp<ILineagePowerV1_0> gLineagePowerHalV1_0_ = nullptr;
+static sp<ISehMiscPower> gSehMiscPower = nullptr;
static bool gPowerHalExists = true;
static bool gLineagePowerHalExists = true;
static std::mutex gPowerHalMutex;
@@ -98,6 +101,7 @@ static bool checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa
// The caller must be holding gPowerHalMutex.
static void connectPowerHalLocked() {
if (gPowerHalExists && gPowerHalV1_0_ == nullptr) {
+ gSehMiscPower = ISehMiscPower::getService();
gPowerHalV1_0_ = IPowerV1_0::getService("miscpower");
if(gPowerHalV1_0_ == nullptr)
gPowerHalV1_0_ = IPowerV1_0::getService();
@@ -130,6 +134,12 @@ void connectLineagePowerHalLocked() {
}
}
+sp<ISehMiscPower> getSehMiscPower() {
+ std::lock_guard<std::mutex> lock(gPowerHalMutex);
+ connectPowerHalLocked();
+ return gSehMiscPower;
+}
+
// Retrieve a copy of PowerHAL V1_0
sp<IPowerV1_0> getPowerHalV1_0() {
std::lock_guard<std::mutex> lock(gPowerHalMutex);
@@ -314,6 +324,14 @@ static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean
enable ? "true" : "false", enable ? "on" : "off");
}
}
+ sp<ISehMiscPower> sehMiscPower = getSehMiscPower();
+ if(sehMiscPower != nullptr) {
+ android::base::Timer t;
+ Return<void> ret = sehMiscPower->setInteractiveAsync(enable, 0);
+ if(!ret.isOk()) {
+ ALOGE("set interactive async() failed: seh misc setInteractiveAsync");
+ }
+ }
}
static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) {
--
2.25.1

View File

@ -1,117 +0,0 @@
From 2edb7c4d383365654a4e650041e0d85fd8fa2f9c Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 15 Dec 2019 23:19:32 +0100
Subject: [PATCH 40/58] FacolaView: Support goodix ext and fix wrong forced
brightness
---
services/core/Android.bp | 1 +
.../biometrics/fingerprint/FacolaView.java | 30 ++++++++++++++-----
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 2e7118da1c0..ccf1ca99b54 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -55,6 +55,7 @@ java_library_static {
"dnsresolver_aidl_interface-V2-java",
"netd_aidl_interface-V2-java",
"netd_event_listener_interface-java",
+ "vendor.goodix.extend.service-V2.0-java",
"vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 08436019bc9..651cc97be39 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -36,6 +36,7 @@ import java.io.FileReader;
import java.io.PrintWriter;
import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
+import vendor.goodix.extend.service.V2_0.IGoodixFPExtendService;
import android.os.Handler;
import android.os.HandlerThread;
@@ -46,6 +47,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final Paint mPaintFingerprint = new Paint();
private final Paint mPaintShow = new Paint();
private IXiaomiFingerprint mXiaomiFingerprint = null;
+ private IGoodixFPExtendService mGoodixFingerprint = null;
private boolean mInsideCircle = false;
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
@@ -94,11 +96,17 @@ public class FacolaView extends ImageView implements OnTouchListener {
setOnTouchListener(this);
mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Slog.d("PHH-Enroll", "Created facola...");
- try {
- if(mW != -1)
+ if(mW != -1) {
+ try {
mXiaomiFingerprint = IXiaomiFingerprint.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting xiaomi fingerprint service", e);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting xiaomi fingerprint service", e);
+ }
+ try {
+ mGoodixFingerprint = IGoodixFPExtendService.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting goodix fingerprint service", e);
+ }
}
}
@@ -113,6 +121,8 @@ public class FacolaView extends ImageView implements OnTouchListener {
int nitValue = 2;
if(mXiaomiFingerprint != null)
mXiaomiFingerprint.extCmd(0xa, nitValue);
+ if(mGoodixFingerprint != null)
+ mXiaomiFingerprint.extCmd(10, 1);
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
}
@@ -122,6 +132,8 @@ public class FacolaView extends ImageView implements OnTouchListener {
try {
if(mXiaomiFingerprint != null)
mXiaomiFingerprint.extCmd(0xa, 0);
+ if(mGoodixFingerprint != null)
+ mXiaomiFingerprint.extCmd(10, 0);
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
}
@@ -151,10 +163,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
return false;
}
- if(!noDim) {
- mParams.dimAmount = TOUCHED_DIM;
- mParams.screenBrightness = 1.0f;
- }
+ if(!noDim) {
+ mParams.dimAmount = TOUCHED_DIM;
+ mParams.screenBrightness = 1.0f;
+ }
mWM.updateViewLayout(this, mParams);
return true;
@@ -164,6 +176,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
Slog.d("PHH-Enroll", "Show", new Exception());
if(!mHidden) return;
mHidden = false;
+ mInsideCircle = false;
if(samsungFod) {
samsungCmd("fod_enable,1,1");
}
@@ -191,6 +204,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
WindowManager.LayoutParams.FLAG_DIM_BEHIND |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
mParams.dimAmount = UNTOUCHED_DIM;
+ mParams.screenBrightness = .0f;
mParams.packageName = "android";
--
2.25.1

View File

@ -1,59 +0,0 @@
From 6963785c01498fcb54b697bb2530ecd7a8297f56 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 16 Dec 2019 19:31:12 +0100
Subject: [PATCH 41/58] Fix (big) goodix integration mistakes
---
.../biometrics/fingerprint/FacolaView.java | 19 ++++++++++++-------
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 651cc97be39..b8ca25a48d2 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -119,10 +119,11 @@ public class FacolaView extends ImageView implements OnTouchListener {
if(mInsideCircle) {
try {
int nitValue = 2;
- if(mXiaomiFingerprint != null)
+ if(mXiaomiFingerprint != null) {
mXiaomiFingerprint.extCmd(0xa, nitValue);
- if(mGoodixFingerprint != null)
- mXiaomiFingerprint.extCmd(10, 1);
+ } else if(mGoodixFingerprint != null) {
+ mGoodixFingerprint.goodixExtendCommand(10, 1);
+ }
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
}
@@ -130,10 +131,11 @@ public class FacolaView extends ImageView implements OnTouchListener {
canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintFingerprint);
} else {
try {
- if(mXiaomiFingerprint != null)
+ if(mXiaomiFingerprint != null) {
mXiaomiFingerprint.extCmd(0xa, 0);
- if(mGoodixFingerprint != null)
- mXiaomiFingerprint.extCmd(10, 0);
+ } else if(mGoodixFingerprint != null) {
+ mGoodixFingerprint.goodixExtendCommand(10, 0);
+ }
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
}
@@ -226,8 +228,11 @@ public class FacolaView extends ImageView implements OnTouchListener {
if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
try {
- if(mXiaomiFingerprint != null)
+ if(mXiaomiFingerprint != null) {
mXiaomiFingerprint.extCmd(0xa, 0);
+ } else if(mGoodixFingerprint != null) {
+ mXiaomiFingerprint.extCmd(10, 0);
+ }
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
}
--
2.25.1

View File

@ -1,56 +0,0 @@
From 7117854a66e39ec6db3deb5caa02bb7008ed3650 Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Thu, 2 Jan 2020 10:16:49 +0800
Subject: [PATCH 42/58] fix crashing on devices with higher aspect ratio down
to sw288dp
* This is what the Qin 2 (Pro) is.
Change-Id: I2289a23b706b512a99a541221576960407c098e7
---
.../SystemUI/res/values-sw288dp/dimens.xml | 33 +++++++++++++++++++
1 file changed, 33 insertions(+)
create mode 100644 packages/SystemUI/res/values-sw288dp/dimens.xml
diff --git a/packages/SystemUI/res/values-sw288dp/dimens.xml b/packages/SystemUI/res/values-sw288dp/dimens.xml
new file mode 100644
index 00000000000..40adc2e6879
--- /dev/null
+++ b/packages/SystemUI/res/values-sw288dp/dimens.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2019 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+ <!-- Global actions grid -->
+ <dimen name="global_actions_grid_vertical_padding">3dp</dimen>
+ <dimen name="global_actions_grid_horizontal_padding">3dp</dimen>
+
+ <dimen name="global_actions_grid_item_side_margin">5dp</dimen>
+ <dimen name="global_actions_grid_item_vertical_margin">4dp</dimen>
+ <dimen name="global_actions_grid_item_width">64dp</dimen>
+ <dimen name="global_actions_grid_item_height">64dp</dimen>
+
+ <dimen name="global_actions_grid_item_icon_width">20dp</dimen>
+ <dimen name="global_actions_grid_item_icon_height">20dp</dimen>
+ <dimen name="global_actions_grid_item_icon_top_margin">12dp</dimen>
+ <dimen name="global_actions_grid_item_icon_side_margin">22dp</dimen>
+ <dimen name="global_actions_grid_item_icon_bottom_margin">4dp</dimen>
+
+</resources>
--
2.25.1

View File

@ -1,29 +0,0 @@
From 1269ddf783c8d092c5eb51324ea9bb53230789af Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 22 Feb 2020 23:25:51 +0100
Subject: [PATCH 43/58] FacolaView] Allow system-side properties (vendor-side
works only with proper selinux)
---
.../com/android/server/biometrics/fingerprint/FacolaView.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index b8ca25a48d2..f77e8282689 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -73,7 +73,11 @@ public class FacolaView extends ImageView implements OnTouchListener {
noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false);
String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
+ if(location.length == 0)
+ location = android.os.SystemProperties.get("persist.sys.fp.fod.location.X_Y", "").split(",");
String[] size = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height", "").split(",");
+ if(size.length == 0)
+ size = android.os.SystemProperties.get("persist.sys.fp.fod.size.width_height", "").split(",");
Slog.d("PHH-Enroll", "FacolaView hello");
if(size.length == 2 && location.length == 2) {
Slog.d("PHH-Enroll", "Got real values");
--
2.25.1

View File

@ -1,49 +0,0 @@
From d829818f8aaf25aaa6ae99f8220a73a2717342a5 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 22 Feb 2020 23:45:54 +0100
Subject: [PATCH 44/58] report press events to oppo fingerprint sensor
---
.../biometrics/fingerprint/FacolaView.java | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index f77e8282689..0fb4254eb60 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -114,6 +114,20 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
}
+ private final File oppoFod = new File("/sys/kernel/oppo_display/notify_fppress");
+ private void oppoPress(boolean pressed) {
+ if(!oppoFod.exists()) return;
+ try {
+ String v = "0";
+ if(pressed) v = "1";
+ PrintWriter writer = new PrintWriter(oppoFod, "UTF-8");
+ writer.println(v);
+ writer.close();
+ } catch(Exception e) {
+ Slog.d("PHH", "Failed to notify oppo fp press", e);
+ }
+ }
+
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
@@ -131,9 +145,11 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
}
+ oppoPress(true);
canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintFingerprint);
} else {
+ oppoPress(false);
try {
if(mXiaomiFingerprint != null) {
mXiaomiFingerprint.extCmd(0xa, 0);
--
2.25.1

View File

@ -1,86 +0,0 @@
From 89f7440821343b3a55e75be79e4a58305f0bd660 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 2 Mar 2020 21:13:36 +0100
Subject: [PATCH 45/58] Add support for samsung optical under-display
fingerprint
---
services/core/Android.bp | 1 +
.../biometrics/fingerprint/FacolaView.java | 17 +++++++++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index ccf1ca99b54..ba6c5fcf7ee 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -56,6 +56,7 @@ java_library_static {
"netd_aidl_interface-V2-java",
"netd_event_listener_interface-java",
"vendor.goodix.extend.service-V2.0-java",
+ "vendor.samsung.hardware.biometrics.fingerprint-V2.1-java",
"vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 0fb4254eb60..edd13988e49 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -37,6 +37,7 @@ import java.io.PrintWriter;
import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
import vendor.goodix.extend.service.V2_0.IGoodixFPExtendService;
+import vendor.samsung.hardware.biometrics.fingerprint.V2_1.ISecBiometricsFingerprint;
import android.os.Handler;
import android.os.HandlerThread;
@@ -48,6 +49,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final Paint mPaintShow = new Paint();
private IXiaomiFingerprint mXiaomiFingerprint = null;
private IGoodixFPExtendService mGoodixFingerprint = null;
+ private ISecBiometricsFingerprint mSamsungFingerprint = null;
private boolean mInsideCircle = false;
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
@@ -111,6 +113,11 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed getting goodix fingerprint service", e);
}
+ try {
+ mSamsungFingerprint = ISecBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e);
+ }
}
}
@@ -141,9 +148,12 @@ public class FacolaView extends ImageView implements OnTouchListener {
mXiaomiFingerprint.extCmd(0xa, nitValue);
} else if(mGoodixFingerprint != null) {
mGoodixFingerprint.goodixExtendCommand(10, 1);
+ } else if(mSamsungFingerprint != null) {
+ mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 2 /* pressed */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
}
} catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
+ Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
oppoPress(true);
@@ -155,9 +165,12 @@ public class FacolaView extends ImageView implements OnTouchListener {
mXiaomiFingerprint.extCmd(0xa, 0);
} else if(mGoodixFingerprint != null) {
mGoodixFingerprint.goodixExtendCommand(10, 0);
+ } else if(mSamsungFingerprint != null) {
+ mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 1 /* released */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
}
} catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
+ Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
}
--
2.25.1

View File

@ -1,29 +0,0 @@
From 5c0dc33ebcbb06c0a1408f651c408afca1b606cc Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 2 Mar 2020 21:13:47 +0100
Subject: [PATCH 46/58] Fix persist.sys.fp.fod override
---
.../com/android/server/biometrics/fingerprint/FacolaView.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index edd13988e49..2c1ba76f529 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -75,10 +75,10 @@ public class FacolaView extends ImageView implements OnTouchListener {
noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false);
String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
- if(location.length == 0)
+ if(location.length != 2)
location = android.os.SystemProperties.get("persist.sys.fp.fod.location.X_Y", "").split(",");
String[] size = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.size.width_height", "").split(",");
- if(size.length == 0)
+ if(size.length != 2)
size = android.os.SystemProperties.get("persist.sys.fp.fod.size.width_height", "").split(",");
Slog.d("PHH-Enroll", "FacolaView hello");
if(size.length == 2 && location.length == 2) {
--
2.25.1

View File

@ -1,40 +0,0 @@
From c9cc25cbfb382cbfad7f0694118e1791719c8f87 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 10 Mar 2020 23:30:17 +0100
Subject: [PATCH 47/58] Allow disabling of fingerprint cleanups, needed on some
Realme devices that cant enumerate
---
.../android/server/biometrics/BiometricServiceBase.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
index 292798721c6..aa94e2e2d40 100644
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
@@ -326,6 +326,7 @@ public abstract class BiometricServiceBase extends SystemService
private List<? extends BiometricAuthenticator.Identifier> mEnrolledList;
// List of templates to remove from the HAL
private List<BiometricAuthenticator.Identifier> mUnknownHALTemplates = new ArrayList<>();
+ final boolean mNocleanup = android.os.SystemProperties.getBoolean("persist.sys.phh.fingerprint.nocleanup", false);
InternalEnumerateClient(Context context,
DaemonWrapper daemon, long halDeviceId, IBinder token,
@@ -370,9 +371,11 @@ public abstract class BiometricServiceBase extends SystemService
BiometricAuthenticator.Identifier identifier = mEnrolledList.get(i);
Slog.e(getTag(), "doTemplateCleanup(): Removing dangling template from framework: "
+ identifier.getBiometricId() + " "
- + identifier.getName());
- mUtils.removeBiometricForUser(getContext(),
- getTargetUserId(), identifier.getBiometricId());
+ + identifier.getName() + " /// " + mNocleanup);
+ if(!mNocleanup) {
+ mUtils.removeBiometricForUser(getContext(),
+ getTargetUserId(), identifier.getBiometricId());
+ }
StatsLog.write(StatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
statsModality(),
BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_FRAMEWORK);
--
2.25.1

View File

@ -1,293 +0,0 @@
From 8bec1b57d67df8b2d14b41f91ab909246e655ad0 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 10 Mar 2020 23:32:00 +0100
Subject: [PATCH 48/58] Support Realme FOD
List of changes:
- Enable dimlayer_hbm. This dims the framebuffer, while putting screen
into HBM. From user's POV, brightness didn't change, but this enables
HBM facola.
- Have two separate FOD layers
This is needed because hwcomposer is expecting two FOD layers to tell
fingerprint HAL that UI is ready.
Also, using the second magical layer makes this second layer OVER the
dim, so it is running at full brightness.
- All devices are now moved to two layers.
- Sending events to other HALs have been delayed by 200ms, to account
for slow brightness change
---
services/core/Android.bp | 1 +
.../biometrics/fingerprint/FacolaView.java | 146 ++++++++++++++++--
2 files changed, 132 insertions(+), 15 deletions(-)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index ba6c5fcf7ee..334d0d04067 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -57,6 +57,7 @@ java_library_static {
"netd_event_listener_interface-java",
"vendor.goodix.extend.service-V2.0-java",
"vendor.samsung.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.oppo.hardware.biometrics.fingerprint-V2.1-java",
"vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
}
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 2c1ba76f529..42f21d63430 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -19,6 +19,7 @@ package com.android.server.biometrics.fingerprint;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.Point;
import android.content.Context;
import android.view.View.OnTouchListener;
import android.view.View;
@@ -39,19 +40,23 @@ import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
import vendor.goodix.extend.service.V2_0.IGoodixFPExtendService;
import vendor.samsung.hardware.biometrics.fingerprint.V2_1.ISecBiometricsFingerprint;
+import android.hardware.display.DisplayManager;
+
import android.os.Handler;
import android.os.HandlerThread;
import android.os.ServiceManager;
public class FacolaView extends ImageView implements OnTouchListener {
- private final int mX, mY, mW, mH;
+ private int mX, mY, mW, mH;
private final Paint mPaintFingerprint = new Paint();
private final Paint mPaintShow = new Paint();
private IXiaomiFingerprint mXiaomiFingerprint = null;
private IGoodixFPExtendService mGoodixFingerprint = null;
private ISecBiometricsFingerprint mSamsungFingerprint = null;
+ private vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint mOppoFingerprint = null;
private boolean mInsideCircle = false;
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
+ private final WindowManager.LayoutParams mParamsTouched = new WindowManager.LayoutParams();
private final static float UNTOUCHED_DIM = .1f;
private final static float TOUCHED_DIM = .9f;
@@ -60,20 +65,34 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final Handler mHandler;
private final WindowManager mWM;
+ private final DisplayManager mDM;
private final boolean samsungFod = samsungHasCmd("fod_enable");
- private final boolean noDim;
+ private boolean noDim;
+ private boolean mFullGreenDisplayed = false;
+ private final View mFullGreen;
private boolean mHidden = true;
FacolaView(Context context) {
super(context);
+ mFullGreen = new ImageView(context) {
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), mPaintFingerprint);
+ };
+ };
+
+ mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
+ mDM = (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
+
android.util.Log.d("PHH", "Samsung FOD " + samsungFod);
mHandlerThread = new HandlerThread("FacolaThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false);
+ noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", true);
String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
if(location.length != 2)
location = android.os.SystemProperties.get("persist.sys.fp.fod.location.X_Y", "").split(",");
@@ -94,13 +113,29 @@ public class FacolaView extends ImageView implements OnTouchListener {
mH = -1;
}
+ int oppoSize = android.os.SystemProperties.getInt("persist.vendor.fingerprint.optical.iconsize", 0);
+ if(oppoSize > 0) {
+ mW = oppoSize;
+ mH = oppoSize;
+ }
+ int oppoLocation = android.os.SystemProperties.getInt("persist.vendor.fingerprint.optical.iconlocation", 0);
+ if(oppoLocation > 0) {
+ Slog.d("PHH-Enroll", "Got Oppo icon location " + oppoLocation);
+ Point p = new Point();
+ mDM.getDisplay(0).getRealSize(p);
+ Slog.d("PHH-Enroll", "\tscreen size " + p.x + ", " + p.y);
+ mX = p.x/2 - mW/2;
+ mY = p.y - mH/2 - oppoLocation;
+ Slog.d("PHH-Enroll", "\tfacola at " + mX + ", " + mY);
+ noDim = true;
+ }
+
mPaintFingerprint.setAntiAlias(true);
mPaintFingerprint.setColor(Color.GREEN);
mPaintShow.setAntiAlias(true);
mPaintShow.setColor(Color.argb(0x18, 0x00, 0xff, 0x00));
setOnTouchListener(this);
- mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Slog.d("PHH-Enroll", "Created facola...");
if(mW != -1) {
try {
@@ -118,6 +153,17 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e);
}
+ try {
+ mOppoFingerprint = vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting oppo fingerprint service", e);
+ }
+ }
+
+ if(mX != -1) {
+ android.os.SystemProperties.set("persist.sys.phh.has_fod", "true");
+ } else {
+ android.os.SystemProperties.set("persist.sys.phh.has_fod", "false");
}
}
@@ -143,21 +189,53 @@ public class FacolaView extends ImageView implements OnTouchListener {
//TODO w!=h?
if(mInsideCircle) {
try {
- int nitValue = 2;
- if(mXiaomiFingerprint != null) {
- mXiaomiFingerprint.extCmd(0xa, nitValue);
- } else if(mGoodixFingerprint != null) {
- mGoodixFingerprint.goodixExtendCommand(10, 1);
- } else if(mSamsungFingerprint != null) {
- mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 2 /* pressed */, new java.util.ArrayList<Byte>(),
- (int retval, java.util.ArrayList<Byte> out) -> {} );
+ mParamsTouched.x = mX;
+ mParamsTouched.y = mY;
+
+ mParamsTouched.height = mW;
+ mParamsTouched.width = mH;
+ mParamsTouched.format = PixelFormat.TRANSLUCENT;
+
+ mParamsTouched.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
+ mParamsTouched.setTitle("Fingerprint on display.touched");
+ mParamsTouched.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
+ mParamsTouched.dimAmount = UNTOUCHED_DIM;
+ if(!noDim) {
+ mParamsTouched.dimAmount = TOUCHED_DIM;
+ mParamsTouched.screenBrightness = 1.0f;
}
+
+ mParamsTouched.packageName = "android";
+
+ mParamsTouched.gravity = Gravity.TOP | Gravity.LEFT;
+ if(!mFullGreenDisplayed && !mHidden) {
+ mHandler.post( () -> {
+ Slog.d("PHH-Enroll", "Adding full green because of finger pressed");
+ mFullGreenDisplayed = true;
+ mWM.addView(mFullGreen, mParamsTouched);
+ });
+ }
+
+ int nitValue = 2;
+ mHandler.postDelayed( () -> {
+ try {
+ if(mXiaomiFingerprint != null) {
+ mXiaomiFingerprint.extCmd(0xa, nitValue);
+ } else if(mGoodixFingerprint != null) {
+ mGoodixFingerprint.goodixExtendCommand(10, 1);
+ } else if(mSamsungFingerprint != null) {
+ mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 2 /* pressed */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling late fp extcmd", e);
+ }
+ }, 200);
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
oppoPress(true);
-
- canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintFingerprint);
} else {
oppoPress(false);
try {
@@ -172,8 +250,15 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
- canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
+ if(mFullGreenDisplayed) {
+ mHandler.post( () -> {
+ Slog.d("PHH-Enroll", "Removing full green because of finger released");
+ mFullGreenDisplayed = false;
+ mWM.removeView(mFullGreen);
+ });
+ }
}
+ canvas.drawCircle(mW/2, mH/2, (float) (mW/2.0f), this.mPaintShow);
}
@Override
@@ -211,7 +296,15 @@ public class FacolaView extends ImageView implements OnTouchListener {
Slog.d("PHH-Enroll", "Show", new Exception());
if(!mHidden) return;
mHidden = false;
+ if(mOppoFingerprint != null) {
+ try {
+ mOppoFingerprint.setScreenState(vendor.oppo.hardware.biometrics.fingerprint.V2_1.FingerprintScreenState.FINGERPRINT_SCREEN_ON);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting oppo screen state", e);
+ }
+ }
mInsideCircle = false;
+ writeFile("/sys/kernel/oppo_display/dimlayer_hbm", "1");
if(samsungFod) {
samsungCmd("fod_enable,1,1");
}
@@ -254,7 +347,20 @@ public class FacolaView extends ImageView implements OnTouchListener {
mInsideCircle = false;
Slog.d("PHH-Enroll", "Hide", new Exception());
if(mHidden) return;
+ if(mOppoFingerprint != null) {
+ try {
+ mOppoFingerprint.setScreenState(vendor.oppo.hardware.biometrics.fingerprint.V2_1.FingerprintScreenState.FINGERPRINT_SCREEN_ON);
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting oppo screen state", e);
+ }
+ }
+ writeFile("/sys/kernel/oppo_display/dimlayer_hbm", "0");
mHidden = true;
+ if(mFullGreenDisplayed) {
+ Slog.d("PHH-Enroll", "Removing full green because of hide");
+ mFullGreenDisplayed = false;
+ mWM.removeView(mFullGreen);
+ }
if(samsungFod) {
samsungCmd("fod_enable,0");
}
@@ -325,4 +431,14 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
}
+ 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);
+ }
+ }
+
}
--
2.25.1

View File

@ -1,88 +0,0 @@
From b071b7633f20b176aee53cbf8baed331a2483019 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Mon, 30 Mar 2020 10:07:00 +0000
Subject: [PATCH 49/58] Support Huawei light HAL
For https://github.com/phhusson/treble_experimentations/issues/1204
Change-Id: I719a13eb66a46703b7ff0e00113f9b98b3244996
---
services/core/jni/Android.bp | 1 +
...om_android_server_lights_LightsService.cpp | 30 +++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 8f44be480c9..2bc6a15129f 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -138,6 +138,7 @@ cc_defaults {
"vendor.samsung.hardware.miscpower@2.0",
"vendor.samsung.hardware.light@2.0",
"vendor.samsung.hardware.light@3.0",
+ "vendor.huawei.hardware.light@2.0",
],
static_libs: [
diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp
index dedc7734131..7c2a0b6203d 100644
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
@@ -27,6 +27,7 @@
#include <vendor/samsung/hardware/light/2.0/types.h>
#include <vendor/samsung/hardware/light/3.0/ISehLight.h>
#include <vendor/samsung/hardware/light/3.0/types.h>
+#include <vendor/huawei/hardware/light/2.0/ILight.h>
#include <android-base/chrono_utils.h>
#include <utils/misc.h>
#include <utils/Log.h>
@@ -49,11 +50,15 @@ using SecType = ::vendor::samsung::hardware::light::V2_0::SecType;
using ISehLight = ::vendor::samsung::hardware::light::V3_0::ISehLight;
using SehType = ::vendor::samsung::hardware::light::V3_0::SehType;
using SehLightState = ::vendor::samsung::hardware::light::V3_0::SehLightState;
+using ILightHw = ::vendor::huawei::hardware::light::V2_0::ILight;
+using LightStateHw = ::android::hardware::light::V2_0::LightState;
static bool sLightSupported = true;
static sp<ISecLight> sSecHal;
static sp<ISehLight> sSehHal;
static bool sSecTried = false;
+static sp<ILightHw> sHwHal;
+static bool sHwTried = false;
static bool validate(jint light, jint flash, jint brightness) {
bool valid = true;
@@ -204,6 +209,31 @@ static void setLight_native(
return;
}
+ if (!sHwTried) {
+ sHwHal = ILightHw::getService();
+ //sHwTried = true;
+ }
+
+ if (sHwHal != nullptr && light == 0) {
+ ALOGE("sHwHal triggered!");
+ int brightness = colorARGB & 0xff;
+ int hwBrightness = brightness << 4;
+ LightState state = constructState(hwBrightness, flashMode, onMS, offMS, brightnessMode);
+ bool got260 = false;
+ sHwHal->HWgetSupportedTypes([&](auto types) {
+ for (const auto& type: types) {
+ if (type == 260) {
+ ALOGE("sHwHal reports 260 as a supported type");
+ got260 = true;
+ }
+ }
+ });
+ if (got260) {
+ sHwHal->HWsetLight(260, state);
+ return;
+ }
+ }
+
Type type = static_cast<Type>(light);
LightState state = constructState(
colorARGB, flashMode, onMS, offMS, brightnessMode);
--
2.25.1

View File

@ -1,33 +0,0 @@
From fe62d8d4d08605687312ca28f722978191e4ac41 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 5 Apr 2020 16:32:46 +0200
Subject: [PATCH 50/58] Always allow overriding the number of work profiles
---
.../java/com/android/server/pm/UserManagerService.java | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 82bc41fcdcd..4a3da73cf42 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -4438,14 +4438,8 @@ public class UserManagerService extends IUserManager.Stub {
@VisibleForTesting
static int getMaxManagedProfiles() {
- // Allow overriding max managed profiles on debuggable builds for testing
- // of multiple profiles.
- if (!Build.IS_DEBUGGABLE) {
- return MAX_MANAGED_PROFILES;
- } else {
- return SystemProperties.getInt("persist.sys.max_profiles",
- MAX_MANAGED_PROFILES);
- }
+ return SystemProperties.getInt("persist.sys.max_profiles",
+ MAX_MANAGED_PROFILES);
}
@GuardedBy("mUsersLock")
--
2.25.1

View File

@ -1,25 +0,0 @@
From 7a5d752d18a11b7a64e13879cdf42235bcd54237 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 9 Apr 2020 22:57:47 +0200
Subject: [PATCH 51/58] Additional fod command for non-optical samsung devices
running Q vendor
---
.../com/android/server/biometrics/fingerprint/FacolaView.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 42f21d63430..a87f7e78af4 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -307,6 +307,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
writeFile("/sys/kernel/oppo_display/dimlayer_hbm", "1");
if(samsungFod) {
samsungCmd("fod_enable,1,1");
+ samsungCmd("fod_enable,1,1,0");
}
if(mX == -1 || mY == -1 || mW == -1 || mH == -1) return;
--
2.25.1

View File

@ -1,40 +0,0 @@
From d12f98cc2bde44b689cd4be62ba6e7d1b9fc8d9e Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 20 May 2020 17:28:26 +0200
Subject: [PATCH 52/58] Add a backlight listener, to be used by FOD to properly
set dim
---
.../core/java/com/android/server/lights/LightsService.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index f9ac8db09ea..6b0dbc336bb 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -31,10 +31,14 @@ import android.view.SurfaceControl;
import com.android.server.SystemService;
public class LightsService extends SystemService {
+ public interface OnBacklightChange {
+ void onBacklightChange(int newBacklight);
+ }
static final String TAG = "LightsService";
static final boolean DEBUG = false;
final LightImpl mLights[] = new LightImpl[LightsManager.LIGHT_ID_COUNT];
+ public static OnBacklightChange backlightChangeListener;
private final class LightImpl extends Light {
@@ -92,6 +96,7 @@ public class LightsService extends SystemService {
(float) brightness / mSurfaceControlMaximumBrightness);
return;
}
+ if(mId == 0 && backlightChangeListener != null) backlightChangeListener.onBacklightChange(brightness);
if(mId == 0) {
String fp = SystemProperties.get("ro.vendor.build.fingerprint", "hello");
--
2.25.1

View File

@ -1,48 +0,0 @@
From 84c844aca01d2a838ae19be6b7961811852fa31f Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 20 May 2020 17:39:50 +0200
Subject: [PATCH 53/58] Don't show facola on preenroll, wait for enroll
---
.../server/biometrics/fingerprint/FingerprintService.java | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
index 1323c5ec0dd..c53607786df 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
@@ -176,7 +176,6 @@ public class FingerprintService extends BiometricServiceBase {
@Override
public boolean onAcquired(int acquiredInfo, int vendorCode) {
boolean result = super.onAcquired(acquiredInfo, vendorCode);
- android.util.Log.d("PHH-Enroll", "acquired ret " + result);
if(result) mFacola.hide();
return result;
}
@@ -185,7 +184,6 @@ public class FingerprintService extends BiometricServiceBase {
public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier,
boolean authenticated, ArrayList<Byte> token) {
boolean result = super.onAuthenticated(identifier, authenticated, token);
- android.util.Log.d("PHH-Enroll", "auth-ed ret " + result);
if(result) mFacola.hide();
return result;
}
@@ -744,6 +742,7 @@ public class FingerprintService extends BiometricServiceBase {
Slog.w(TAG, "enroll(): no fingerprint HAL!");
return ERROR_ESRCH;
}
+ mFacola.show();
return daemon.enroll(cryptoToken, groupId, timeout);
}
@@ -990,7 +989,6 @@ public class FingerprintService extends BiometricServiceBase {
Slog.w(TAG, "startPreEnroll: no fingerprint HAL!");
return 0;
}
- mFacola.show();
try {
return daemon.preEnroll();
} catch (RemoteException e) {
--
2.25.1

View File

@ -1,531 +0,0 @@
From 5528cf273e0e2e4b33ad5202a494ebc4018216ae Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 20 May 2020 21:17:58 +0200
Subject: [PATCH 54/58] Add support for new Goodix, Samsung, Xiaomi FODs
- Xiaomi on MIUI12 has new magical Z to trigger HBM, and trigger feedback. Dim layer is done by kernel, but we need to set alpha
- Samsung has usageBits to trigger HBM and trigger feedback
- Goodix has nothing specific just send events
---
services/core/Android.bp | 2 +
.../biometrics/fingerprint/FacolaView.java | 323 +++++++++++++++---
2 files changed, 285 insertions(+), 40 deletions(-)
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 334d0d04067..8dcb4396953 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -56,7 +56,9 @@ java_library_static {
"netd_aidl_interface-V2-java",
"netd_event_listener_interface-java",
"vendor.goodix.extend.service-V2.0-java",
+ "vendor.goodix.hardware.biometrics.fingerprint-V2.1-java",
"vendor.samsung.hardware.biometrics.fingerprint-V2.1-java",
+ "vendor.samsung.hardware.biometrics.fingerprint-V3.0-java",
"vendor.oppo.hardware.biometrics.fingerprint-V2.1-java",
"vendor.xiaomi.hardware.fingerprintextension-V1.0-java",
],
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index a87f7e78af4..d3d58aff6c0 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -35,30 +35,38 @@ import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
+import java.util.Arrays;
import vendor.xiaomi.hardware.fingerprintextension.V1_0.IXiaomiFingerprint;
import vendor.goodix.extend.service.V2_0.IGoodixFPExtendService;
import vendor.samsung.hardware.biometrics.fingerprint.V2_1.ISecBiometricsFingerprint;
+import vendor.samsung.hardware.biometrics.fingerprint.V3_0.ISehBiometricsFingerprint;
import android.hardware.display.DisplayManager;
+import android.os.Build;
+import android.os.FileObserver;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.ServiceManager;
+import android.util.DisplayMetrics;
+
public class FacolaView extends ImageView implements OnTouchListener {
private int mX, mY, mW, mH;
private final Paint mPaintFingerprint = new Paint();
private final Paint mPaintShow = new Paint();
private IXiaomiFingerprint mXiaomiFingerprint = null;
private IGoodixFPExtendService mGoodixFingerprint = null;
+ private vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon mGoodixFingerprintV2_1 = null;
private ISecBiometricsFingerprint mSamsungFingerprint = null;
+ private ISehBiometricsFingerprint mSamsungFingerprint3_0 = null;
private vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint mOppoFingerprint = null;
private boolean mInsideCircle = false;
private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
private final WindowManager.LayoutParams mParamsTouched = new WindowManager.LayoutParams();
- private final static float UNTOUCHED_DIM = .1f;
+ private final static float UNTOUCHED_DIM = .0f;
private final static float TOUCHED_DIM = .9f;
private final HandlerThread mHandlerThread;
@@ -68,10 +76,17 @@ public class FacolaView extends ImageView implements OnTouchListener {
private final DisplayManager mDM;
private final boolean samsungFod = samsungHasCmd("fod_enable");
private boolean noDim;
+ private boolean bypassedBrightness;
+ private boolean isDown = false;
+
+ private java.util.ArrayList<Object> objectsToKeep = new java.util.ArrayList();
+
+ private static boolean doneCalibrationOnce = true;
private boolean mFullGreenDisplayed = false;
private final View mFullGreen;
private boolean mHidden = true;
+ private boolean xiaomiAsynchronous = false;
FacolaView(Context context) {
super(context);
@@ -86,13 +101,18 @@ public class FacolaView extends ImageView implements OnTouchListener {
mWM = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
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);
+
android.util.Log.d("PHH", "Samsung FOD " + samsungFod);
mHandlerThread = new HandlerThread("FacolaThread");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", true);
+ noDim = android.os.SystemProperties.getBoolean("persist.sys.phh.nodim", false);
String[] location = android.os.SystemProperties.get("persist.vendor.sys.fp.fod.location.X_Y", "").split(",");
if(location.length != 2)
location = android.os.SystemProperties.get("persist.sys.fp.fod.location.X_Y", "").split(",");
@@ -107,12 +127,25 @@ public class FacolaView extends ImageView implements OnTouchListener {
mW = Integer.parseInt(size[0]);
mH = Integer.parseInt(size[1]);
} else {
+ //a50
+ //mX = -1;//443;// - 190/2;
+ //mY = -1;// 1972;// - 190 / 2;
+ //mW = -1;//190;
+ //mH = -1;//190;
+
+ //x2 pro
+ //mX = 445;// - 190/2;
+ //mY = 1988;// - 190/2;
+ //mW = 190;
+ //mH = 190;
mX = -1;
mY = -1;
mW = -1;
mH = -1;
}
+ mParamsTouched.dimAmount = 0;
+
int oppoSize = android.os.SystemProperties.getInt("persist.vendor.fingerprint.optical.iconsize", 0);
if(oppoSize > 0) {
mW = oppoSize;
@@ -121,15 +154,16 @@ public class FacolaView extends ImageView implements OnTouchListener {
int oppoLocation = android.os.SystemProperties.getInt("persist.vendor.fingerprint.optical.iconlocation", 0);
if(oppoLocation > 0) {
Slog.d("PHH-Enroll", "Got Oppo icon location " + oppoLocation);
- Point p = new Point();
- mDM.getDisplay(0).getRealSize(p);
- Slog.d("PHH-Enroll", "\tscreen size " + p.x + ", " + p.y);
- mX = p.x/2 - mW/2;
- mY = p.y - mH/2 - oppoLocation;
+ Slog.d("PHH-Enroll", "\tscreen size " + displayRealSize.x + ", " + displayRealSize.y);
+ mX = displayRealSize.x/2 - mW/2;
+ mY = displayRealSize.y - mH/2 - oppoLocation;
Slog.d("PHH-Enroll", "\tfacola at " + mX + ", " + mY);
noDim = true;
}
+ String gammaStr = android.os.SystemProperties.get("persist.sys.phh.fod.gamma", "2.2");
+ float gamma = Float.parseFloat(gammaStr);
+
mPaintFingerprint.setAntiAlias(true);
mPaintFingerprint.setColor(Color.GREEN);
@@ -148,11 +182,21 @@ public class FacolaView extends ImageView implements OnTouchListener {
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed getting goodix fingerprint service", e);
}
+ try {
+ mGoodixFingerprintV2_1 = vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting goodix2 fingerprint service", e);
+ }
try {
mSamsungFingerprint = ISecBiometricsFingerprint.getService();
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e);
}
+ try {
+ mSamsungFingerprint3_0 = ISehBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting samsung 3.0 fingerprint service", e);
+ }
try {
mOppoFingerprint = vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint.getService();
} catch(Exception e) {
@@ -160,13 +204,154 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
}
+ if(mSamsungFingerprint3_0 != null || mSamsungFingerprint != null) {
+ noDim = true;
+ bypassedBrightness = true;
+
+ String fodPositionString = readFile("/sys/class/fingerprint/fingerprint/position");
+ final String brightnessFile;
+ if("qcom".equals(Build.HARDWARE))
+ brightnessFile = "/sys/class/backlight/panel0-backlight/brightness";
+ else
+ brightnessFile = "/sys/class/lcd/panel/device/backlight/panel/brightness";
+
+ String maskBrightnessStr = readFile("/sys/class/lcd/panel/mask_brightness");
+ String actualMaskBrightnessPath = "/sys/class/lcd/panel/actual_mask_brightness";
+
+ if(fodPositionString != null && maskBrightnessStr != null) {
+ double maskBrightness = Double.parseDouble(maskBrightnessStr);
+ String[] fodPositionArray = readFile("/sys/class/fingerprint/fingerprint/position").split(",");
+ float bottomMM = Float.parseFloat(fodPositionArray[0]);
+ float areaSizeMM = Float.parseFloat(fodPositionArray[5]);
+
+ float bottomInch = bottomMM * 0.0393700787f;
+ float areaSizeInch = areaSizeMM * 0.0393700787f;
+
+ int bottomPx = (int)(bottomInch * displayMetrics.ydpi);
+ int areaSizePx = (int)(areaSizeInch * displayMetrics.ydpi);
+ mW = areaSizePx;
+ mH = areaSizePx;
+ mX = displayRealSize.x/2 - mW/2;
+ mY = displayRealSize.y - bottomPx - mH;
+ Slog.d("PHH-Enroll", "Samsung computed " + mX + "," + mY + "; " + mW + "x" + mH);
+
+ String cmd = String.format("fod_rect,%d,%d,%d,%d", mX, mY, mX+mW, mY+mH);
+ samsungCmd(cmd);
+
+ Slog.d("PHH-Enroll", "Reading brightness file gives " + readFile(brightnessFile));
+ FileObserver samsungCallback = new FileObserver(brightnessFile, FileObserver.MODIFY) {
+ //Don't use LightsService' observer, because Samsung's brightness file is in nits, which makes for much more accurate computation
+ @Override
+ public void onEvent(int event, String path) {
+ String currentBrightnessStr = readFile(brightnessFile);
+ Slog.d("PHH-Enroll", "New brightness is " + currentBrightnessStr);
+ int currentBrightness = Integer.parseInt(currentBrightnessStr);
+
+ mHandler.post( () -> {
+ double dim = 1.0d - Math.pow( (currentBrightness / maskBrightness), 1/gamma);
+ Slog.d("PHH-Enroll", "Setting dim to " + dim);
+ mParamsTouched.dimAmount = (float)dim;
+ if(!mHidden) {
+ Slog.d("PHH-Enroll", "++Setting dim to " + dim);
+ if(mFullGreenDisplayed && !mHidden) {
+ mWM.updateViewLayout(mFullGreen, mParamsTouched);
+ }
+ }
+ });
+ }
+ };
+ samsungCallback.startWatching();
+ objectsToKeep.add(samsungCallback);
+
+ Slog.d("PHH-Enroll", "Reading actual brightness file gives " + readFile(actualMaskBrightnessPath));
+ FileObserver actualMaskObserver = new FileObserver(actualMaskBrightnessPath, FileObserver.MODIFY) {
+ @Override
+ public void onEvent(int event, String path) {
+ String actualMask = readFile(actualMaskBrightnessPath);
+ 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.request(22 /* SEM_FINGER_STATE */, 0, eventReq, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ } else if(mSamsungFingerprint3_0 != null) {
+ mSamsungFingerprint3_0.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);
+ }
+ }
+ };
+ actualMaskObserver.startWatching();
+ objectsToKeep.add(actualMaskObserver);
+
+ }
+ }
+
+ String xiaomiFodReadyPath = "/sys/class/drm/card0-DSI-1/fod_ui_ready";
+ if(new File(xiaomiFodReadyPath).exists()) {
+ xiaomiAsynchronous = true;
+ FileObserver xiaomiUiReadyCb = new FileObserver(xiaomiFodReadyPath, FileObserver.MODIFY) {
+ @Override
+ public void onEvent(int event, String path) {
+ String currentUiReady = readFile(xiaomiFodReadyPath);
+ Slog.d("PHH-Enroll", "New fod ready is " + currentUiReady);
+
+ mHandler.post( () -> {
+ try {
+ if("0".equals(currentUiReady)) {
+ mXiaomiFingerprint.extCmd(0xa, 0);
+ } else if("1".equals(currentUiReady)) {
+ mXiaomiFingerprint.extCmd(0xa, 1);
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed Xiaomi async extcmd", e);
+ }
+ });
+ }
+ };
+ xiaomiUiReadyCb.startWatching();
+ objectsToKeep.add(xiaomiUiReadyCb);
+ }
+
if(mX != -1) {
android.os.SystemProperties.set("persist.sys.phh.has_fod", "true");
} else {
android.os.SystemProperties.set("persist.sys.phh.has_fod", "false");
}
+ com.android.server.lights.LightsService.backlightChangeListener = new com.android.server.lights.LightsService.OnBacklightChange() {
+ public void onBacklightChange(int brightness) {
+ //Simple (but wrong) math assuming 255 is max brightness with 2.2 screen gamma and linear backlight
+ double dim = (1.0 - Math.pow(brightness/255.0, 1/gamma));
+
+ int alpha = (int)(255.0*dim);
+ Slog.d("PHH-Enroll", "Setting Xiaomi dim alpha to " + alpha + ", from " + brightness);
+ writeFile("/sys/class/drm/card0-DSI-1/dim_alpha", Integer.toString(alpha));
+
+ mHandler.post( () -> {
+ if(!noDim) {
+ Slog.d("PHH-Enroll", "Setting dim to " + dim);
+ mParams.dimAmount = (float)dim;
+ if(!mHidden) {
+ Slog.d("PHH-Enroll", "++Setting dim to " + dim);
+ mWM.updateViewLayout(FacolaView.this, mParams);
+ }
+ }
+ });
+ }
+ };
+
+ bypassedBrightness = hbmCtrl1.exists() || noDim;
}
+ private final File hbmCtrl1 = new File("/proc/leds/hbm_mode");
+
private final File oppoFod = new File("/sys/kernel/oppo_display/notify_fppress");
private void oppoPress(boolean pressed) {
if(!oppoFod.exists()) return;
@@ -199,11 +384,14 @@ public class FacolaView extends ImageView implements OnTouchListener {
mParamsTouched.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
mParamsTouched.setTitle("Fingerprint on display.touched");
mParamsTouched.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
- WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
- mParamsTouched.dimAmount = UNTOUCHED_DIM;
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
+ WindowManager.LayoutParams.FLAG_DIM_BEHIND;
+ writeFile(hbmCtrl1, "1");
if(!noDim) {
- mParamsTouched.dimAmount = TOUCHED_DIM;
mParamsTouched.screenBrightness = 1.0f;
+ if(!bypassedBrightness) {
+ mParamsTouched.screenBrightness = 1.0f;
+ }
}
mParamsTouched.packageName = "android";
@@ -216,39 +404,52 @@ public class FacolaView extends ImageView implements OnTouchListener {
mWM.addView(mFullGreen, mParamsTouched);
});
}
-
- int nitValue = 2;
- mHandler.postDelayed( () -> {
- try {
- if(mXiaomiFingerprint != null) {
+ if(!isDown) {
+ isDown = true;
+ int nitValue = 2;
+ mHandler.postDelayed( () -> {
+ try {
+ if(mXiaomiFingerprint != null && !xiaomiAsynchronous) {
mXiaomiFingerprint.extCmd(0xa, nitValue);
- } else if(mGoodixFingerprint != null) {
+ } else if(mGoodixFingerprint != null) {
mGoodixFingerprint.goodixExtendCommand(10, 1);
- } else if(mSamsungFingerprint != null) {
- mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 2 /* pressed */, new java.util.ArrayList<Byte>(),
+ } else if(mGoodixFingerprintV2_1 != null) {
+ mGoodixFingerprintV2_1.sendCommand(0x600, new java.util.ArrayList<Byte>(),
(int retval, java.util.ArrayList<Byte> out) -> {} );
- }
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed calling late fp extcmd", e);
- }
- }, 200);
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling late fp extcmd", e);
+ }
+ }, 200);
+ }
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
oppoPress(true);
} else {
+ writeFile(hbmCtrl1, "1");
oppoPress(false);
- try {
- if(mXiaomiFingerprint != null) {
- mXiaomiFingerprint.extCmd(0xa, 0);
- } else if(mGoodixFingerprint != null) {
- mGoodixFingerprint.goodixExtendCommand(10, 0);
- } else if(mSamsungFingerprint != null) {
- mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 1 /* released */, new java.util.ArrayList<Byte>(),
- (int retval, java.util.ArrayList<Byte> out) -> {} );
+ if(isDown) {
+ isDown = false;
+ try {
+ if(mXiaomiFingerprint != null && !xiaomiAsynchronous) {
+ mXiaomiFingerprint.extCmd(0xa, 0);
+ } else if(mGoodixFingerprint != null) {
+ mGoodixFingerprint.goodixExtendCommand(10, 0);
+ } else if(mGoodixFingerprintV2_1 != null) {
+ mGoodixFingerprintV2_1.sendCommand(0x601, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {});
+ } else if(mSamsungFingerprint != null) {
+ mSamsungFingerprint.request(22 /* SEM_FINGER_STATE */, 0, 1 /* released */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ } else if(mSamsungFingerprint3_0 != null) {
+ mSamsungFingerprint3_0.sehRequest(22 /* SEM_FINGER_STATE */, 1 /* released */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ }
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
}
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed calling fp extcmd", e);
+
}
if(mFullGreenDisplayed) {
mHandler.post( () -> {
@@ -278,7 +479,9 @@ public class FacolaView extends ImageView implements OnTouchListener {
if(!mInsideCircle) {
mParams.screenBrightness = .0f;
- mParams.dimAmount = UNTOUCHED_DIM;
+ if(!noDim) {
+ mParams.dimAmount = UNTOUCHED_DIM;
+ }
mWM.updateViewLayout(this, mParams);
return false;
}
@@ -296,6 +499,34 @@ public class FacolaView extends ImageView implements OnTouchListener {
Slog.d("PHH-Enroll", "Show", new Exception());
if(!mHidden) return;
mHidden = false;
+ try {
+ mSamsungFingerprint = ISecBiometricsFingerprint.getService();
+ mSamsungFingerprint.request(20 /* SEM_FINGER_STATE */, 0, 0 /* released */, new java.util.ArrayList<Byte>(),
+ (int retval, java.util.ArrayList<Byte> out) -> {} );
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed setting fast fingerprint recognition");
+ }
+ try {
+ mSamsungFingerprint3_0 = ISehBiometricsFingerprint.getService();
+ Slog.d("PHH-Enroll", "Samsung ask for sensor status");
+ mSamsungFingerprint3_0.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");
+ mSamsungFingerprint3_0.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);
+ }
+
if(mOppoFingerprint != null) {
try {
mOppoFingerprint.setScreenState(vendor.oppo.hardware.biometrics.fingerprint.V2_1.FingerprintScreenState.FINGERPRINT_SCREEN_ON);
@@ -327,13 +558,17 @@ public class FacolaView extends ImageView implements OnTouchListener {
mParams.format = PixelFormat.TRANSLUCENT;
mParams.type = WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
- mParams.setTitle("Fingerprint on display");
+ mParams.setTitle("Fingerprint on display.untouched");
mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_DIM_BEHIND |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
- mParams.dimAmount = UNTOUCHED_DIM;
- mParams.screenBrightness = .0f;
+ if(!noDim) {
+ mParams.dimAmount = UNTOUCHED_DIM;
+ mParams.screenBrightness = .0f;
+ } else {
+ mParams.dimAmount = 0;
+ }
mParams.packageName = "android";
@@ -370,8 +605,6 @@ public class FacolaView extends ImageView implements OnTouchListener {
try {
if(mXiaomiFingerprint != null) {
mXiaomiFingerprint.extCmd(0xa, 0);
- } else if(mGoodixFingerprint != null) {
- mXiaomiFingerprint.extCmd(10, 0);
}
} catch(Exception e) {
Slog.d("PHH-Enroll", "Failed calling xiaomi fp extcmd");
@@ -417,7 +650,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
}
- private static void samsungCmd(String cmd) {
+ public static void samsungCmd(String cmd) {
try {
PrintWriter writer = new PrintWriter("/sys/devices/virtual/sec/tsp/cmd", "UTF-8");
writer.println(cmd);
@@ -442,4 +675,14 @@ public class FacolaView extends ImageView implements OnTouchListener {
}
}
+ 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);
+ }
+ }
+
}
--
2.25.1

View File

@ -1,33 +0,0 @@
From 5bc5806b8570dcd25aae6bcb27926037a48855de Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 21 May 2020 16:12:42 +0200
Subject: [PATCH 55/58] On MIUI12 vendor, we don't want our own diming
---
.../com/android/server/biometrics/fingerprint/FacolaView.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index d3d58aff6c0..8afbbc0dce0 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -81,8 +81,6 @@ public class FacolaView extends ImageView implements OnTouchListener {
private java.util.ArrayList<Object> objectsToKeep = new java.util.ArrayList();
- private static boolean doneCalibrationOnce = true;
-
private boolean mFullGreenDisplayed = false;
private final View mFullGreen;
private boolean mHidden = true;
@@ -297,6 +295,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
String xiaomiFodReadyPath = "/sys/class/drm/card0-DSI-1/fod_ui_ready";
if(new File(xiaomiFodReadyPath).exists()) {
xiaomiAsynchronous = true;
+ noDim = true;
FileObserver xiaomiUiReadyCb = new FileObserver(xiaomiFodReadyPath, FileObserver.MODIFY) {
@Override
public void onEvent(int event, String path) {
--
2.25.1

View File

@ -1,59 +0,0 @@
From 2f5a9ff1301647e242dc37d25387dff5ed652207 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 21 May 2020 18:41:57 +0200
Subject: [PATCH 56/58] Add mUiHidden which is guarded by Handler. This is
needed because backlight listener might intervene at the wrong time
---
.../android/server/biometrics/fingerprint/FacolaView.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index 8afbbc0dce0..aeb81f5b7c9 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -84,6 +84,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
private boolean mFullGreenDisplayed = false;
private final View mFullGreen;
private boolean mHidden = true;
+ private boolean mUiHidden = true;
private boolean xiaomiAsynchronous = false;
FacolaView(Context context) {
super(context);
@@ -216,6 +217,8 @@ public class FacolaView extends ImageView implements OnTouchListener {
String maskBrightnessStr = readFile("/sys/class/lcd/panel/mask_brightness");
String actualMaskBrightnessPath = "/sys/class/lcd/panel/actual_mask_brightness";
+ Slog.d("PHH-Enroll", "Got fod position, mask brightness " + fodPositionString + ", " + maskBrightnessStr);
+
if(fodPositionString != null && maskBrightnessStr != null) {
double maskBrightness = Double.parseDouble(maskBrightnessStr);
String[] fodPositionArray = readFile("/sys/class/fingerprint/fingerprint/position").split(",");
@@ -337,7 +340,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
if(!noDim) {
Slog.d("PHH-Enroll", "Setting dim to " + dim);
mParams.dimAmount = (float)dim;
- if(!mHidden) {
+ if(!mUiHidden) {
Slog.d("PHH-Enroll", "++Setting dim to " + dim);
mWM.updateViewLayout(FacolaView.this, mParams);
}
@@ -573,6 +576,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
mParams.gravity = Gravity.TOP | Gravity.LEFT;
mHandler.post( () -> {
+ mUiHidden = false;
mWM.addView(this, mParams);
});
@@ -618,6 +622,7 @@ public class FacolaView extends ImageView implements OnTouchListener {
Slog.d("PHH-Enroll", "Removed facola");
mHandler.post( () -> {
+ mUiHidden = true;
mWM.removeView(this);
});
}
--
2.25.1

View File

@ -1,84 +0,0 @@
From ce6a18178130952fd1238d2fa66aceef1c114ed1 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 21 May 2020 18:42:20 +0200
Subject: [PATCH 57/58] Always try to get FOD HALs, because we check samsung
HAL later to compute width
---
.../biometrics/fingerprint/FacolaView.java | 60 +++++++++----------
1 file changed, 29 insertions(+), 31 deletions(-)
diff --git a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
index aeb81f5b7c9..3536093a4ee 100644
--- a/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FacolaView.java
@@ -170,37 +170,35 @@ public class FacolaView extends ImageView implements OnTouchListener {
mPaintShow.setColor(Color.argb(0x18, 0x00, 0xff, 0x00));
setOnTouchListener(this);
Slog.d("PHH-Enroll", "Created facola...");
- if(mW != -1) {
- try {
- mXiaomiFingerprint = IXiaomiFingerprint.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting xiaomi fingerprint service", e);
- }
- try {
- mGoodixFingerprint = IGoodixFPExtendService.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting goodix fingerprint service", e);
- }
- try {
- mGoodixFingerprintV2_1 = vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting goodix2 fingerprint service", e);
- }
- try {
- mSamsungFingerprint = ISecBiometricsFingerprint.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e);
- }
- try {
- mSamsungFingerprint3_0 = ISehBiometricsFingerprint.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting samsung 3.0 fingerprint service", e);
- }
- try {
- mOppoFingerprint = vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint.getService();
- } catch(Exception e) {
- Slog.d("PHH-Enroll", "Failed getting oppo fingerprint service", e);
- }
+ try {
+ mXiaomiFingerprint = IXiaomiFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting xiaomi fingerprint service", e);
+ }
+ try {
+ mGoodixFingerprint = IGoodixFPExtendService.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting goodix fingerprint service", e);
+ }
+ try {
+ mGoodixFingerprintV2_1 = vendor.goodix.hardware.biometrics.fingerprint.V2_1.IGoodixFingerprintDaemon.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting goodix2 fingerprint service", e);
+ }
+ try {
+ mSamsungFingerprint = ISecBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting samsung fingerprint service", e);
+ }
+ try {
+ mSamsungFingerprint3_0 = ISehBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting samsung 3.0 fingerprint service", e);
+ }
+ try {
+ mOppoFingerprint = vendor.oppo.hardware.biometrics.fingerprint.V2_1.IBiometricsFingerprint.getService();
+ } catch(Exception e) {
+ Slog.d("PHH-Enroll", "Failed getting oppo fingerprint service", e);
}
if(mSamsungFingerprint3_0 != null || mSamsungFingerprint != null) {
--
2.25.1

View File

@ -1,25 +0,0 @@
From cb07b8475b5b0c9da86012d4c260a404a2e5c640 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 6 Jun 2020 18:21:56 +0200
Subject: [PATCH 58/58] HOME deserves to wake-up devices just as well as back
and menu
---
core/java/android/view/KeyEvent.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index fee2503ccad..7bdeaa6e83e 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -1935,6 +1935,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
+ case KeyEvent.KEYCODE_HOME:
case KeyEvent.KEYCODE_WAKEUP:
case KeyEvent.KEYCODE_PAIRING:
case KeyEvent.KEYCODE_STEM_1:
--
2.25.1

View File

@ -1,27 +0,0 @@
From 0b98498b3b9768fabd4b9a45e6ce23c6bcbc93a1 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 14 Aug 2018 21:01:35 +0200
Subject: [PATCH 1/8] AOSP 8.0/8.1 didn't use presentOrValidate, so it's
broken. Don't use it
Change-Id: If86793dba3738680280f9dc0f7e7c802c0836690
---
services/surfaceflinger/DisplayHardware/HWComposer.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 1099041b4..2021c26b0 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -424,7 +424,7 @@ status_t HWComposer::prepare(DisplayId displayId, const compositionengine::Outpu
// The check below is incorrect. We actually rely on HWC here to fall
// back to validate when there is any client layer.
displayData.validateWasSkipped = false;
- if (!displayData.hasClientComposition) {
+ if ((false)) {
sp<Fence> outPresentFence;
uint32_t state = UINT32_MAX;
error = hwcDisplay->presentOrValidate(&numTypes, &numRequests, &outPresentFence , &state);
--
2.25.1

View File

@ -1,28 +0,0 @@
From f4a49874650b6192a821a6e755f600745b34210a Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 19 Aug 2018 23:07:24 +0200
Subject: [PATCH 2/8] Ignore usage bits verification
This didn't ignore as of 8.1, so we're ""safe""
Change-Id: I40c1d588c1fa104d844322b469f76e52bee1495a
---
libs/ui/Gralloc2.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp
index 2dd11b141..3ebf9808d 100644
--- a/libs/ui/Gralloc2.cpp
+++ b/libs/ui/Gralloc2.cpp
@@ -115,7 +115,7 @@ status_t Gralloc2Mapper::validateBufferDescriptorInfo(
if (descriptorInfo->usage & ~validUsageBits) {
ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64,
descriptorInfo->usage & ~validUsageBits);
- return BAD_VALUE;
+ //return BAD_VALUE;
}
return NO_ERROR;
}
--
2.25.1

View File

@ -1,43 +0,0 @@
From 66d21d061b9c9f745c5cb199c29268f519425d71 Mon Sep 17 00:00:00 2001
From: phh <phh@phh.me>
Date: Wed, 22 Aug 2018 08:57:52 +0000
Subject: [PATCH 3/8] Enable fallback to old ro.sf.hwrotation property
Change-Id: I46b75a15b85fc5bda31357a4beeb7dab77bd6fe1
---
services/surfaceflinger/SurfaceFlinger.cpp | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e2ba4de6d..d66c8a8f5 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -339,7 +339,25 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI
SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientationDefault;
break;
}
+
ALOGV("Primary Display Orientation is set to %2d.", SurfaceFlinger::primaryDisplayOrientation);
+ if(tmpPrimaryDisplayOrientation == SurfaceFlingerProperties::primary_display_orientation_values::ORIENTATION_0) {
+ int sfRotation = property_get_int32("ro.sf.hwrotation", -1);
+ switch(sfRotation) {
+ case 0:
+ SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientationDefault;
+ break;
+ case 90:
+ SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientation90;
+ break;
+ case 180:
+ SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientation180;
+ break;
+ case 270:
+ SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientation270;
+ break;
+ }
+ }
mInternalDisplayPrimaries = sysprop::getDisplayNativePrimaries();
--
2.25.1

View File

@ -1,32 +0,0 @@
From 1a0eb93d4e59e5857cd0afd3560647258955c6ed Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Mon, 12 Aug 2019 23:48:37 +0200
Subject: [PATCH 4/8] Some Samsung devices requires lying colorspace
Change-Id: I4153b8e7abc10c519565e4e4386c6388621477b2
---
opengl/libs/EGL/egl_platform_entries.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/opengl/libs/EGL/egl_platform_entries.cpp b/opengl/libs/EGL/egl_platform_entries.cpp
index a3bb6debe..bfa4a9bb2 100644
--- a/opengl/libs/EGL/egl_platform_entries.cpp
+++ b/opengl/libs/EGL/egl_platform_entries.cpp
@@ -459,8 +459,14 @@ EGLBoolean eglGetConfigAttribImpl(EGLDisplay dpy, EGLConfig config,
// ----------------------------------------------------------------------------
// Translates EGL color spaces to Android data spaces.
+static int samsungColorspace = -1;
static android_dataspace dataSpaceFromEGLColorSpace(EGLint colorspace) {
+ if(samsungColorspace == -1) {
+ samsungColorspace = property_get_bool("persist.sys.phh.samsung_colorspace", false);
+ }
if (colorspace == EGL_GL_COLORSPACE_LINEAR_KHR) {
+ if(samsungColorspace)
+ return HAL_DATASPACE_UNKNOWN;
return HAL_DATASPACE_UNKNOWN;
} else if (colorspace == EGL_GL_COLORSPACE_SRGB_KHR) {
return HAL_DATASPACE_V0_SRGB;
--
2.25.1

View File

@ -1,37 +0,0 @@
From c1f0158346aace39261b787854e10d58e9d905fe 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 5/8] On Samsung, we need to send a hack-message to HAL to get
all Sensors
Change-Id: Id6a1fa48340de61c418493668e9abd22c2599376
---
services/sensorservice/SensorDevice.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
index 717f31769..45d6c679b 100644
--- a/services/sensorservice/SensorDevice.cpp
+++ b/services/sensorservice/SensorDevice.cpp
@@ -30,7 +30,9 @@
#include <cinttypes>
#include <thread>
+#include <android-base/properties.h>
using namespace android::hardware::sensors;
+
using namespace android::hardware::sensors::V1_0;
using namespace android::hardware::sensors::V1_0::implementation;
using android::hardware::sensors::V2_0::ISensorsCallback;
@@ -115,6 +117,8 @@ SensorDevice::SensorDevice()
void SensorDevice::initializeSensorList() {
float minPowerMa = 0.001; // 1 microAmp
+ if(::android::base::GetBoolProperty("persist.sys.phh.samsung_sensors", false))
+ setMode(5555);
checkReturn(mSensors->getSensorsList(
[&](const auto &list) {
const size_t count = list.size();
--
2.25.1

View File

@ -1,91 +0,0 @@
From a92fa788759b5b4550bf4d2778077af78dbc3af7 Mon Sep 17 00:00:00 2001
From: Pierre Couillaud <pierre.couillaud@broadcom.com>
Date: Tue, 27 Aug 2019 13:43:22 -0700
Subject: [PATCH 6/8] SurfaceFlinger: retain the sideband layer information for
composition
when present, the sideband layer stream information is not saved into
the BufferQueueLayer::mSidebandStream, during "latchSidebandStream".
this subsequently leads to such layer being marked as non visible in the
composition stack and to be drop from advertisement to hardware composer
even though a sideband layer is defined in the rest of the framework.
this seems to be a regression introduced during android 9 to android 10
revamp of the SurfaceFlinger for buffer latching. latching a sideband layer is actually harmless since there is no buffer associated with it that need to be waited on from the gpu side.
the fix proposed here allows to maintain the knowledge of the sideband
layer and make it visible in the composition stack for hardware composer to handle adequately.
for illustration purposes, the relevant snippet of the layer composition
stack are posted here from "dumpsys SurfaceFlinger", highlighting the
issue with ">>>".
[before]:
* compositionengine::Layer 0xa959b34c (SurfaceView - <truncated>)
frontend:
isSecure=false geomUsesSourceCrop=false geomBufferUsesDisplayInverseTransform=false
geomLayerTransform 0x00000000 (ROT_0 ) 0x00 (IDENTITY )
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
geomBufferSize=[0 0 -1 -1] geomContentCrop=[0 0 -1 -1] geomCrop=[0 0 -1 -1] geomBufferTransform=0
Region geomActiveTransparentRegion (this=0xa959b3f8, count=1)
[ 0, 0, 0, 0]
geomLayerBounds=[0.000000 0.000000 0.000000 0.000000]
blend=INVALID (0) alpha=1.000000
>>> type=0 appId=0 composition type=INVALID (0)
buffer: buffer=0x0 slot=-1
>>> sideband stream=0x9b509900
color=[0 0 0]
dataspace=UNKNOWN (0) hdr metadata types=0 colorTransform=<truncated>
[after]:
* compositionengine::Layer 0xa9a5034c (SurfaceView - <truncated>)
frontend:
isSecure=false geomUsesSourceCrop=true geomBufferUsesDisplayInverseTransform=false
geomLayerTransform 0x00000000 (ROT_0 ) 0x00 (IDENTITY )
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000
geomBufferSize=[0 0 -1 -1] geomContentCrop=[0 0 -1 -1] geomCrop=[0 0 1920 1080] geomBufferTransform=0
Region geomActiveTransparentRegion (this=0xa9a503f8, count=1)
[ 0, 0, 0, 0]
geomLayerBounds=[0.000000 0.000000 1920.000000 1080.000000]
blend=NONE (1) alpha=1.000000
>>> type=1 appId=10064 composition type=SIDEBAND (5)
buffer: buffer=0x0 slot=-1
>>> sideband stream=0x9a1472b0
color=[0 0 0]
dataspace=UNKNOWN (0) hdr metadata types=0 colorTransform=<truncated>
Bug: 140128098
refs #SWANDROID-6178
Signed-off-by: Pierre Couillaud <pierre.couillaud@broadcom.com>
---
services/surfaceflinger/BufferQueueLayer.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp
index eb1bf66cd..af5fe6246 100644
--- a/services/surfaceflinger/BufferQueueLayer.cpp
+++ b/services/surfaceflinger/BufferQueueLayer.cpp
@@ -243,8 +243,9 @@ bool BufferQueueLayer::latchSidebandStream(bool& recomputeVisibleRegions) {
bool sidebandStreamChanged = true;
if (mSidebandStreamChanged.compare_exchange_strong(sidebandStreamChanged, false)) {
// mSidebandStreamChanged was changed to false
+ mSidebandStream = mConsumer->getSidebandStream();
auto& layerCompositionState = getCompositionLayer()->editState().frontEnd;
- layerCompositionState.sidebandStream = mConsumer->getSidebandStream();
+ layerCompositionState.sidebandStream = mSidebandStream;
if (layerCompositionState.sidebandStream != nullptr) {
setTransactionFlags(eTransactionNeeded);
mFlinger->setTransactionFlags(eTraversalNeeded);
--
2.25.1

View File

@ -1,40 +0,0 @@
From 46a9476a66d10d574724ee37aa87c80cf90d1cdc Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 10 Mar 2020 23:26:55 +0100
Subject: [PATCH 7/8] Use BKK's hwcomposer hacks to properly display FOD layers
Insecure hack: Set FOD layers to magical Z values to trigger
OPPO/Realme/Oneplus' whole blitter behaviours:
- reports touch event to fingerprint driver
- removes dim on touched layer
---
.../CompositionEngine/src/OutputLayer.cpp | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 5ce72b087..23b29d6fd 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -335,7 +335,18 @@ void OutputLayer::writeStateToHWC(bool includeGeometry) const {
static_cast<int32_t>(error));
}
- if (auto error = hwcLayer->setZOrder(mState.z); error != HWC2::Error::None) {
+ int z = mState.z;
+ if(strstr(mLayerFE->getDebugName(), "Fingerprint on display") != nullptr) {
+ ALOGE("Found fingerprint on display!");
+ z = 0x41000031;
+ }
+
+ if(strstr(mLayerFE->getDebugName(), "Fingerprint on display.touched") != nullptr) {
+ ALOGE("Found fingerprint on display touched!");
+ z = 0x41000033;
+ }
+
+ if (auto error = hwcLayer->setZOrder(z); error != HWC2::Error::None) {
ALOGE("[%s] Failed to set Z %u: %s (%d)", mLayerFE->getDebugName(), mState.z,
to_string(error).c_str(), static_cast<int32_t>(error));
}
--
2.25.1

View File

@ -1,125 +0,0 @@
From 3da16d65f8c84a4d4d29ad2ea351d9cb48fe3110 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Wed, 20 May 2020 21:16:56 +0200
Subject: [PATCH 8/8] Samsung + Xiaomi new FOD HBM controls
---
services/surfaceflinger/BufferQueueLayer.cpp | 22 ++++++++++++++++--
.../CompositionEngine/src/OutputLayer.cpp | 23 +++++++++++++++++--
2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp
index af5fe6246..13c32fb72 100644
--- a/services/surfaceflinger/BufferQueueLayer.cpp
+++ b/services/surfaceflinger/BufferQueueLayer.cpp
@@ -24,6 +24,7 @@
#include <compositionengine/impl/OutputLayerCompositionState.h>
#include <gui/BufferQueueConsumer.h>
#include <system/window.h>
+#include <cutils/properties.h>
#include "BufferQueueLayer.h"
#include "LayerRejecter.h"
@@ -31,6 +32,14 @@
#include "TimeStats/TimeStats.h"
+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 android {
BufferQueueLayer::BufferQueueLayer(const LayerCreationArgs& args) : BufferLayer(args) {}
@@ -538,7 +547,10 @@ void BufferQueueLayer::onFirstRef() {
mConsumer =
new BufferLayerConsumer(consumer, mFlinger->getRenderEngine(), mTextureName, this);
}
- mConsumer->setConsumerUsageBits(getEffectiveUsage(0));
+ init_fod_props();
+
+ uint64_t usageBits = getEffectiveUsage(0);
+ mConsumer->setConsumerUsageBits(usageBits);
mConsumer->setContentsChangedListener(this);
mConsumer->setName(mName);
@@ -564,10 +576,16 @@ status_t BufferQueueLayer::setDefaultBufferProperties(uint32_t w, uint32_t h, Pi
}
mFormat = format;
+ init_fod_props();
setDefaultBufferSize(w, h);
mConsumer->setDefaultBufferFormat(format);
- mConsumer->setConsumerUsageBits(getEffectiveUsage(0));
+ uint64_t usageBits = getEffectiveUsage(0);
+ if(sSamsungFod && strstr(mName.c_str(), "Fingerprint on display.touched") != nullptr) {
+ ALOGE("Found on touched layer!");
+ usageBits |= 0x400000000LL;
+ }
+ mConsumer->setConsumerUsageBits(usageBits);
return NO_ERROR;
}
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 23b29d6fd..0d7c9897a 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -23,9 +23,14 @@
#include <compositionengine/impl/OutputCompositionState.h>
#include <compositionengine/impl/OutputLayer.h>
#include <compositionengine/impl/OutputLayerCompositionState.h>
+#include <cutils/properties.h>
#include "DisplayHardware/HWComposer.h"
+static bool sCheckedProps = false;
+static bool sBBKFod = false;
+static bool sXiaomiFod = false;
+
namespace android::compositionengine {
OutputLayer::~OutputLayer() = default;
@@ -316,6 +321,12 @@ void OutputLayer::writeStateToHWC(bool includeGeometry) const {
return;
}
+ if(!sCheckedProps) {
+ sCheckedProps = true;
+ sBBKFod = property_get_bool("persist.sys.phh.fod.bbk", false);
+ sXiaomiFod = property_get_bool("persist.sys.phh.fod.xiaomi", false);
+ }
+
if (includeGeometry) {
// Output dependent state
@@ -338,12 +349,20 @@ void OutputLayer::writeStateToHWC(bool includeGeometry) const {
int z = mState.z;
if(strstr(mLayerFE->getDebugName(), "Fingerprint on display") != nullptr) {
ALOGE("Found fingerprint on display!");
- z = 0x41000031;
+ if(sBBKFod) {
+ z = 0x41000031;
+ } else if(sXiaomiFod) {
+ z |= 0x1000000;
+ }
}
if(strstr(mLayerFE->getDebugName(), "Fingerprint on display.touched") != nullptr) {
ALOGE("Found fingerprint on display touched!");
- z = 0x41000033;
+ if(sBBKFod) {
+ z = 0x41000033;
+ } else if(sXiaomiFod) {
+ z |= 0x2000000;
+ }
}
if (auto error = hwcLayer->setZOrder(z); error != HWC2::Error::None) {
--
2.25.1

View File

@ -1,130 +0,0 @@
From dd8b2df79e6974c043adbd1ae734e4911fd3f314 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 14 Aug 2018 16:59:12 +0200
Subject: [PATCH 1/4] Revert "SupplicantManager: Remove
|ensure_config_file_exists|"
This reverts commit f61dc8cd7dadda5741d6e4a1bb6b576ba89cc24b.
---
libwifi_system/supplicant_manager.cpp | 97 +++++++++++++++++++++++++++
1 file changed, 97 insertions(+)
diff --git a/libwifi_system/supplicant_manager.cpp b/libwifi_system/supplicant_manager.cpp
index 60720d40f..f22eea92e 100644
--- a/libwifi_system/supplicant_manager.cpp
+++ b/libwifi_system/supplicant_manager.cpp
@@ -33,7 +33,89 @@ namespace wifi_system {
namespace {
const char kSupplicantInitProperty[] = "init.svc.wpa_supplicant";
+const char kSupplicantConfigTemplatePath[] =
+ "/etc/wifi/wpa_supplicant.conf";
+const char kSupplicantConfigFile[] = "/data/misc/wifi/wpa_supplicant.conf";
+const char kP2pConfigFile[] = "/data/misc/wifi/p2p_supplicant.conf";
const char kSupplicantServiceName[] = "wpa_supplicant";
+constexpr mode_t kConfigFileMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
+
+int ensure_config_file_exists(const char* config_file) {
+ char buf[2048];
+ int srcfd, destfd;
+ int nread;
+ int ret;
+ std::string templatePath;
+
+ ret = access(config_file, R_OK | W_OK);
+ if ((ret == 0) || (errno == EACCES)) {
+ if ((ret != 0) && (chmod(config_file, kConfigFileMode) != 0)) {
+ LOG(ERROR) << "Cannot set RW to \"" << config_file << "\": "
+ << strerror(errno);
+ return false;
+ }
+ return true;
+ } else if (errno != ENOENT) {
+ LOG(ERROR) << "Cannot access \"" << config_file << "\": "
+ << strerror(errno);
+ return false;
+ }
+
+ std::string configPathSystem =
+ std::string("/system") + std::string(kSupplicantConfigTemplatePath);
+ std::string configPathVendor =
+ std::string("/vendor") + std::string(kSupplicantConfigTemplatePath);
+ srcfd = TEMP_FAILURE_RETRY(open(configPathSystem.c_str(), O_RDONLY));
+ templatePath = configPathSystem;
+ if (srcfd < 0) {
+ int errnoSystem = errno;
+ srcfd = TEMP_FAILURE_RETRY(open(configPathVendor.c_str(), O_RDONLY));
+ templatePath = configPathVendor;
+ if (srcfd < 0) {
+ int errnoVendor = errno;
+ LOG(ERROR) << "Cannot open \"" << configPathSystem << "\": "
+ << strerror(errnoSystem);
+ LOG(ERROR) << "Cannot open \"" << configPathVendor << "\": "
+ << strerror(errnoVendor);
+ return false;
+ }
+ }
+
+ destfd = TEMP_FAILURE_RETRY(open(config_file,
+ O_CREAT | O_RDWR,
+ kConfigFileMode));
+ if (destfd < 0) {
+ close(srcfd);
+ LOG(ERROR) << "Cannot create \"" << config_file << "\": "
+ << strerror(errno);
+ return false;
+ }
+
+ while ((nread = TEMP_FAILURE_RETRY(read(srcfd, buf, sizeof(buf)))) != 0) {
+ if (nread < 0) {
+ LOG(ERROR) << "Error reading \"" << templatePath
+ << "\": " << strerror(errno);
+ close(srcfd);
+ close(destfd);
+ unlink(config_file);
+ return false;
+ }
+ TEMP_FAILURE_RETRY(write(destfd, buf, nread));
+ }
+
+ close(destfd);
+ close(srcfd);
+
+ /* chmod is needed because open() didn't set permisions properly */
+ if (chmod(config_file, kConfigFileMode) < 0) {
+ LOG(ERROR) << "Error changing permissions of " << config_file
+ << " to 0660: " << strerror(errno);
+ unlink(config_file);
+ return false;
+ }
+
+ return true;
+}
} // namespace
@@ -49,6 +131,21 @@ bool SupplicantManager::StartSupplicant() {
return true;
}
+ /* Before starting the daemon, make sure its config file exists */
+ if (ensure_config_file_exists(kSupplicantConfigFile) < 0) {
+ LOG(ERROR) << "Wi-Fi will not be enabled";
+ return false;
+ }
+
+ /*
+ * Some devices have another configuration file for the p2p interface.
+ * However, not all devices have this, and we'll let it slide if it
+ * is missing. For devices that do expect this file to exist,
+ * supplicant will refuse to start and emit a good error message.
+ * No need to check for it here.
+ */
+ (void)ensure_config_file_exists(kP2pConfigFile);
+
/*
* Get a reference to the status property, so we can distinguish
* the case where it goes stopped => running => stopped (i.e.,
--
2.25.1

Some files were not shown because too many files have changed in this diff Show More