Initial commit for Android 11, syncing up to v300.f
This commit is contained in:
commit
1bc6933877
@ -0,0 +1,36 @@
|
||||
From e3c7e720c893a6ecef90b4b950787ed820792581 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 1/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 f24167722..a82d7c430 100644
|
||||
--- a/linker/linker.cpp
|
||||
+++ b/linker/linker.cpp
|
||||
@@ -3372,7 +3372,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.17.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From a1336cadfe7ff1afa46e87ba11849ebef622183e 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 a042f900..ea3645af 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.17.1
|
||||
|
@ -0,0 +1,27 @@
|
||||
From ddbe45ddd09f30beab8980d14c506f48ca1f8399 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 01/10] 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 186c5a73..b422175e 100644
|
||||
--- a/secilc/secilc.c
|
||||
+++ b/secilc/secilc.c
|
||||
@@ -91,7 +91,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.17.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From ff296de7912209e6fa20e1b28db93c395cc0bb75 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 02/10] 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 b422175e..1e550ab4 100644
|
||||
--- a/secilc/secilc.c
|
||||
+++ b/secilc/secilc.c
|
||||
@@ -103,7 +103,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.17.1
|
||||
|
@ -0,0 +1,40 @@
|
||||
From ecb4746fb8ba4e97cc53e6290dfa7a75495d19a8 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 03/10] ::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.17.1
|
||||
|
@ -0,0 +1,43 @@
|
||||
From f014cf6460159f820fc0d72c6d0bece2851f9873 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 04/10] 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 a0cadfde..68c0318e 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.17.1
|
||||
|
@ -0,0 +1,44 @@
|
||||
From 37d5e860031c84803c2533d940847dc214cb2597 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 05/10] 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 1e550ab4..375320e6 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
|
||||
@@ -124,6 +126,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:PDmNOc:GX:n", long_opts, &opt_index);
|
||||
if (opt_char == -1) {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,44 @@
|
||||
From 04fdf9096557accdea52b8b66665717f6c8a454a 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 06/10] 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.17.1
|
||||
|
@ -0,0 +1,84 @@
|
||||
From ef94ddbd76328611893ace7870c0d3137fd26cdd 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 07/10] 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 307b1ee3..02cdcc65 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.17.1
|
||||
|
@ -0,0 +1,27 @@
|
||||
From 3d356da4654b5ae9eb2207f824555f0219687763 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 08/10] 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 68c0318e..75e5128c 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.17.1
|
||||
|
@ -0,0 +1,45 @@
|
||||
From f3d5e2eb212ebd4189428d6adb915880573962f9 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Wed, 9 Sep 2020 22:36:42 +0200
|
||||
Subject: [PATCH 09/10] Revert "libsepol: Make an unknown permission an error
|
||||
in CIL"
|
||||
|
||||
This reverts commit dc4e54126bf25dea4d51820922ccd1959be68fbc.
|
||||
|
||||
This is required because some targets calls undefined permissions:
|
||||
- Realme X2 Pro calls sigcont
|
||||
- Honor 7X calls perf_event
|
||||
---
|
||||
libsepol/cil/src/cil_resolve_ast.c | 12 ++++++++----
|
||||
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libsepol/cil/src/cil_resolve_ast.c b/libsepol/cil/src/cil_resolve_ast.c
|
||||
index 87575860..e72abdeb 100644
|
||||
--- a/libsepol/cil/src/cil_resolve_ast.c
|
||||
+++ b/libsepol/cil/src/cil_resolve_ast.c
|
||||
@@ -131,14 +131,18 @@ static int __cil_resolve_perms(symtab_t *class_symtab, symtab_t *common_symtab,
|
||||
}
|
||||
}
|
||||
if (rc != SEPOL_OK) {
|
||||
+ struct cil_list *empty_list;
|
||||
if (class_flavor == CIL_MAP_CLASS) {
|
||||
cil_log(CIL_ERR, "Failed to resolve permission %s for map class\n", (char*)curr->data);
|
||||
- } else {
|
||||
- cil_log(CIL_ERR, "Failed to resolve permission %s\n", (char*)curr->data);
|
||||
+ goto exit;
|
||||
}
|
||||
- goto exit;
|
||||
+ cil_log(CIL_WARN, "Failed to resolve permission %s\n", (char*)curr->data);
|
||||
+ /* Use an empty list to represent unknown perm */
|
||||
+ cil_list_init(&empty_list, perm_strs->flavor);
|
||||
+ cil_list_append(*perm_datums, CIL_LIST, empty_list);
|
||||
+ } else {
|
||||
+ cil_list_append(*perm_datums, CIL_DATUM, perm_datum);
|
||||
}
|
||||
- cil_list_append(*perm_datums, CIL_DATUM, perm_datum);
|
||||
} else {
|
||||
cil_list_append(*perm_datums, curr->flavor, curr->data);
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,83 @@
|
||||
From 00f7989d79ad8e219dae29de8e8f20e4dbab008a Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sun, 27 Sep 2020 20:20:35 +0200
|
||||
Subject: [PATCH 10/10] [HACK] For System-as-System devices, init won't call us
|
||||
with /system_ext sepolicy
|
||||
|
||||
So add system_ext sepolicy ourselves
|
||||
---
|
||||
secilc/secilc.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 44 insertions(+)
|
||||
|
||||
diff --git a/secilc/secilc.c b/secilc/secilc.c
|
||||
index 375320e6..162b87fb 100644
|
||||
--- a/secilc/secilc.c
|
||||
+++ b/secilc/secilc.c
|
||||
@@ -233,6 +233,7 @@ int main(int argc, char *argv[])
|
||||
usage(argv[0]);
|
||||
}
|
||||
}
|
||||
+
|
||||
if (optind >= argc) {
|
||||
fprintf(stderr, "No cil files specified\n");
|
||||
usage(argv[0]);
|
||||
@@ -240,6 +241,11 @@ int main(int argc, char *argv[])
|
||||
|
||||
cil_set_log_level(log_level);
|
||||
|
||||
+ int needSystemExt = 1;
|
||||
+ for (i = optind; i < argc; i++) {
|
||||
+ if(strstr(argv[i], "system_ext")) needSystemExt = 0;
|
||||
+ }
|
||||
+
|
||||
cil_db_init(&db);
|
||||
cil_set_disable_dontaudit(db, disable_dontaudit);
|
||||
cil_set_multiple_decls(db, multiple_decls);
|
||||
@@ -261,6 +267,44 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
for (i = optind; i < argc; i++) {
|
||||
+ fprintf(stderr, "Hello, parsing %s\n", argv[i]);
|
||||
+ if(needSystemExt && strstr(argv[i], "/etc/selinux/")) {
|
||||
+ fprintf(stderr, "Hello, I'm adding system_ext to the mix!\n");
|
||||
+ char *path = "/system/system_ext/etc/selinux/system_ext_sepolicy.cil";
|
||||
+ file = fopen(path, "r");
|
||||
+ if (!file) {
|
||||
+ fprintf(stderr, "Could not open file: %s\n", path);
|
||||
+ rc = SEPOL_ERR;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+ rc = stat(path, &filedata);
|
||||
+ if (rc == -1) {
|
||||
+ fprintf(stderr, "Could not stat file: %s\n", path);
|
||||
+ rc = SEPOL_ERR;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+ file_size = filedata.st_size;
|
||||
+
|
||||
+ buffer = malloc(file_size);
|
||||
+ rc = fread(buffer, file_size, 1, file);
|
||||
+ if (rc != 1) {
|
||||
+ fprintf(stderr, "Failure reading file: %s\n", path);
|
||||
+ rc = SEPOL_ERR;
|
||||
+ goto exit;
|
||||
+ }
|
||||
+ fclose(file);
|
||||
+ file = NULL;
|
||||
+
|
||||
+ rc = cil_add_file(db, path, buffer, file_size);
|
||||
+ if (rc != SEPOL_OK) {
|
||||
+ fprintf(stderr, "Failure adding %s\n", path);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ free(buffer);
|
||||
+ buffer = NULL;
|
||||
+
|
||||
+ }
|
||||
file = fopen(argv[i], "r");
|
||||
if (!file) {
|
||||
fprintf(stderr, "Could not open file: %s\n", argv[i]);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,54 @@
|
||||
From 163f3f2b4a89df73d3ffede558d26bb0df966bbe Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Tue, 22 Sep 2020 10:38:04 +0200
|
||||
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.cpp | 8 ++++++++
|
||||
2 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 122324c6ef..5ec949966a 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.cpp b/src/gpu/gl/GrGLCaps.cpp
|
||||
index 6a1bf56474..df007ba70c 100644
|
||||
--- a/src/gpu/gl/GrGLCaps.cpp
|
||||
+++ b/src/gpu/gl/GrGLCaps.cpp
|
||||
@@ -22,6 +22,11 @@
|
||||
#include "src/gpu/gl/GrGLTexture.h"
|
||||
#include "src/utils/SkJSONWriter.h"
|
||||
|
||||
+#if defined(SK_BUILD_FOR_ANDROID)
|
||||
+#include "android-base/properties.h"
|
||||
+using android::base::GetBoolProperty;
|
||||
+#endif
|
||||
+
|
||||
GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions,
|
||||
const GrGLContextInfo& ctxInfo,
|
||||
const GrGLInterface* glInterface) : INHERITED(contextOptions) {
|
||||
@@ -273,6 +278,9 @@ void GrGLCaps::init(const GrContextOptions& contextOptions,
|
||||
this->fShaderCaps->fTextureSwizzleAppliedInShader = false;
|
||||
}
|
||||
} // no WebGL support
|
||||
+ if(GetBoolProperty("ro.skia.ignore_swizzle", false)) {
|
||||
+ this->fShaderCaps->fTextureSwizzleAppliedInShader = true;
|
||||
+ }
|
||||
|
||||
if (GR_IS_GR_GL(standard)) {
|
||||
fMipMapLevelAndLodControlSupport = true;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From f85268cf7b0e928d741d316b59b3b31773fae7c8 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Pohl <pohl199885@gmail.com>
|
||||
Date: Fri, 15 Jun 2018 19:58:07 +0200
|
||||
Subject: [PATCH 01/14] 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 63ab6548b4..e25f8f6558 100644
|
||||
--- a/media/libstagefright/ACodec.cpp
|
||||
+++ b/media/libstagefright/ACodec.cpp
|
||||
@@ -4432,9 +4432,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.17.1
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 4ab15a33857452d990581a3d0073e35215e1c542 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 02/14] ::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
|
||||
|
||||
Change-Id: I464255b5a3af8d75d72b1772ab55aa655f395a60
|
||||
---
|
||||
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 af1e01d8e1..05252d6308 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.cpp
|
||||
+++ b/services/camera/libcameraservice/CameraService.cpp
|
||||
@@ -301,7 +301,7 @@ status_t CameraService::getSystemCameraKind(const String8& cameraId, SystemCamer
|
||||
}
|
||||
|
||||
void CameraService::updateCameraNumAndIds() {
|
||||
- Mutex::Autolock l(mServiceLock);
|
||||
+ //Mutex::Autolock l(mServiceLock);
|
||||
std::pair<int, int> systemAndNonSystemCameras = mCameraProviderManager->getCameraCount();
|
||||
// Excludes hidden secure cameras
|
||||
mNumberOfCameras =
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 1083cc0b59ed11aa69af22103ebaf74ae11f272c 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 03/14] We might not have a mFlashlight at this state, but
|
||||
that's ok
|
||||
|
||||
---
|
||||
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 05252d6308..e1d23073f4 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.cpp
|
||||
+++ b/services/camera/libcameraservice/CameraService.cpp
|
||||
@@ -337,7 +337,7 @@ void CameraService::addStates(const String8 id) {
|
||||
conflicting, deviceKind));
|
||||
}
|
||||
|
||||
- if (mFlashlight->hasFlashUnit(id)) {
|
||||
+ if (mFlashlight != nullptr && mFlashlight->hasFlashUnit(id)) {
|
||||
Mutex::Autolock al(mTorchStatusMutex);
|
||||
mTorchStatusMap.add(id, TorchModeStatus::AVAILABLE_OFF);
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,62 @@
|
||||
From 1c0e912c7bdef868de97dc07dd5227d298cd66a9 Mon Sep 17 00:00:00 2001
|
||||
From: Artem Borisov <dedsa2002@gmail.com>
|
||||
Date: Tue, 25 Sep 2018 12:39:22 +0300
|
||||
Subject: [PATCH 04/14] 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 e1d23073f4..83dea10f3a 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.cpp
|
||||
+++ b/services/camera/libcameraservice/CameraService.cpp
|
||||
@@ -221,6 +221,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);
|
||||
}
|
||||
@@ -375,8 +389,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.17.1
|
||||
|
@ -0,0 +1,131 @@
|
||||
From 3afbad626827104662f61ab04ba3fbe6af32f73f 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 05/14] 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 | 93 +++++++++++++++++++
|
||||
1 file changed, 93 insertions(+)
|
||||
|
||||
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
index 883e713326..d85dbdf113 100644
|
||||
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
@@ -596,6 +596,98 @@ 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() == "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() == "Telephony Tx") {
|
||||
+ foundTelephony = true;
|
||||
+ continue;
|
||||
+ }
|
||||
+ if(sink->getTagName() == "BT SCO Headset") {
|
||||
+ foundScoHeadsetRoute = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ for(const auto& source: route->getSources()) {
|
||||
+ ALOGE("... With source %s\n", source->getTagName().c_str());
|
||||
+ if(source->getTagName() == "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("BT SCO Headset");
|
||||
+ ALOGE("Got sink %p\n", sink.get());
|
||||
+ newRoute->setSink(sink);
|
||||
+
|
||||
+ Vector<sp<PolicyAudioPort>> sources;
|
||||
+ for(const auto& sourceName: {
|
||||
+ "primary output",
|
||||
+ "deep_buffer",
|
||||
+ "compressed_offload",
|
||||
+ "Telephony Rx"
|
||||
+ }) {
|
||||
+ auto source = ctx->findPortByTagName(sourceName);
|
||||
+ ALOGE("Got source %p\n", source.get());
|
||||
+ if (source.get() != nullptr) {
|
||||
+ 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);
|
||||
@@ -635,6 +727,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.17.1
|
||||
|
@ -0,0 +1,94 @@
|
||||
From 4f7930e14f979ec5be530bd630ca9bb664050420 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 06/14] 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 83dea10f3a..37ea512bdd 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>
|
||||
|
||||
@@ -139,6 +140,7 @@ Mutex CameraService::sProxyMutex;
|
||||
sp<hardware::ICameraServiceProxy> CameraService::sCameraServiceProxy;
|
||||
|
||||
CameraService::CameraService() :
|
||||
+ mPhysicalFrontCamStatus(false),
|
||||
mEventLog(DEFAULT_EVENT_LOG_LENGTH),
|
||||
mNumberOfCameras(0),
|
||||
mNumberOfCamerasWithoutSystemCamera(0),
|
||||
@@ -1785,6 +1787,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);
|
||||
}
|
||||
} // lock is destroyed, allow further connect calls
|
||||
@@ -1866,6 +1869,27 @@ status_t CameraService::addOfflineClient(String8 cameraId, sp<BasicClient> offli
|
||||
return OK;
|
||||
}
|
||||
|
||||
+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);
|
||||
@@ -2840,6 +2864,8 @@ binder::Status CameraService::BasicClient::disconnect() {
|
||||
}
|
||||
mDisconnected = true;
|
||||
|
||||
+ 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 4321201100..85b1706996 100644
|
||||
--- a/services/camera/libcameraservice/CameraService.h
|
||||
+++ b/services/camera/libcameraservice/CameraService.h
|
||||
@@ -202,6 +202,9 @@ public:
|
||||
// Register an offline client for a given active camera id
|
||||
status_t addOfflineClient(String8 cameraId, sp<BasicClient> offlineClient);
|
||||
|
||||
+ bool mPhysicalFrontCamStatus;
|
||||
+ void physicalFrontCam(bool on);
|
||||
+
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Client functionality
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,59 @@
|
||||
From 93d21e226a4cac72ebc73f8fcec3001160d8570f Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Thu, 23 Jan 2020 11:13:43 +0800
|
||||
Subject: [PATCH 07/14] 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.
|
||||
|
||||
Change-Id: I993708b28e8404bc8c483d71a850ac69382231bd
|
||||
---
|
||||
.../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 d85dbdf113..e25dda07c7 100644
|
||||
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
@@ -539,6 +539,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);
|
||||
@@ -579,8 +590,11 @@ Return<RouteTraits::Element> RouteTraits::deserialize(const xmlNode *cur, PtrSer
|
||||
if (strlen(devTag) != 0) {
|
||||
sp<PolicyAudioPort> source = ctx->findPortByTagName(devTag);
|
||||
if (source == NULL) {
|
||||
- ALOGE("%s: no source found with name=%s", __func__, devTag);
|
||||
- return Status::fromStatusT(BAD_VALUE);
|
||||
+ source = ctx->findPortByTagName(trim(devTag));
|
||||
+ if (source == NULL) {
|
||||
+ ALOGE("%s: no source found with name=%s", __func__, devTag);
|
||||
+ return Status::fromStatusT(BAD_VALUE);
|
||||
+ }
|
||||
}
|
||||
sources.add(source);
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,46 @@
|
||||
From 2c80a9c1453230a62f538fc128f286005d91b802 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 08/14] There are three SCO devices. Fallback from one to the
|
||||
others if needed
|
||||
|
||||
Change-Id: I414dcb6b154855c00cb8520b23dc1069827864b2
|
||||
---
|
||||
.../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 d31e4437e1..b2ca5e85de 100644
|
||||
--- a/services/audiopolicy/common/managerdefinitions/src/HwModule.cpp
|
||||
+++ b/services/audiopolicy/common/managerdefinitions/src/HwModule.cpp
|
||||
@@ -292,6 +292,27 @@ sp <HwModule> HwModuleCollection::getModuleForDeviceType(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 = getModuleForDeviceType(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 = getModuleForDeviceType(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 = getModuleForDeviceType(AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, encodedFormat);
|
||||
+ ALOGE("Fallback SCO carkit? %s", (ret != nullptr) ? "yes" : "no");
|
||||
+ if(ret != nullptr) return ret;
|
||||
+ }
|
||||
+ }
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,82 @@
|
||||
From 9ac09c1e3d8408ce08a6e99e6403fb75cccf20ba 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 10/14] Add persist.sys.phh.samsung.camera_ids property to
|
||||
access hidden Samsung cameras
|
||||
|
||||
Change-Id: I2c7bf535272acc28ed2277e96c78ddd28a0b4593
|
||||
---
|
||||
services/camera/libcameraservice/Android.bp | 3 ++-
|
||||
.../common/CameraProviderManager.cpp | 14 ++++++++++++--
|
||||
2 files changed, 14 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
|
||||
index 501d92226f..be275e9346 100644
|
||||
--- a/services/camera/libcameraservice/Android.bp
|
||||
+++ b/services/camera/libcameraservice/Android.bp
|
||||
@@ -127,7 +127,8 @@ cc_library_shared {
|
||||
"android.hardware.camera.device@3.3",
|
||||
"android.hardware.camera.device@3.4",
|
||||
"android.hardware.camera.device@3.5",
|
||||
- "android.hardware.camera.device@3.6"
|
||||
+ "android.hardware.camera.device@3.6",
|
||||
+ "vendor.samsung.hardware.camera.provider@3.0",
|
||||
],
|
||||
|
||||
static_libs: [
|
||||
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
|
||||
index 32d118d6b0..eb27e055ac 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>
|
||||
@@ -1330,6 +1331,7 @@ status_t CameraProviderManager::ProviderInfo::initialize(
|
||||
mMinorVersion = 6;
|
||||
}
|
||||
}
|
||||
+
|
||||
// We need to check again since cast2_6.isOk() succeeds even if the provider
|
||||
// version isn't actually 2.6.
|
||||
if (interface2_6 == nullptr){
|
||||
@@ -1344,6 +1346,9 @@ status_t CameraProviderManager::ProviderInfo::initialize(
|
||||
}
|
||||
}
|
||||
|
||||
+ auto samsungCast = vendor::samsung::hardware::camera::provider::V3_0::ISehCameraProvider::castFrom(interface);
|
||||
+ auto samsungProvider = samsungCast.isOk() ? static_cast<sp<vendor::samsung::hardware::camera::provider::V3_0::ISehCameraProvider>>(samsungCast) : nullptr;
|
||||
+
|
||||
hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
|
||||
if (!linked.isOk()) {
|
||||
ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
|
||||
@@ -1375,7 +1380,7 @@ status_t CameraProviderManager::ProviderInfo::initialize(
|
||||
Status status;
|
||||
// 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;
|
||||
@@ -1392,7 +1397,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.17.1
|
||||
|
@ -0,0 +1,45 @@
|
||||
From 6dff7fa42818b525faa0a80d161ad54055ebc38e 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 11/14] 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 4a509aa745..cdf9fc783e 100644
|
||||
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
|
||||
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
|
||||
@@ -316,8 +316,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.17.1
|
||||
|
@ -0,0 +1,79 @@
|
||||
From 7f14fcbf4bcf6d8f8c4b89f6ac4b91bc4961ed6f 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 12/14] 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 e25dda07c7..a8eb142c81 100644
|
||||
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
|
||||
@@ -396,15 +396,24 @@ Return<AudioGainTraits::Element> AudioGainTraits::deserialize(const xmlNode *cur
|
||||
}
|
||||
}
|
||||
|
||||
+static bool fixedEarpieceChannels = false;
|
||||
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.begin() == 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,7 +526,11 @@ Return<DevicePortTraits::Element> DevicePortTraits::deserialize(const xmlNode *c
|
||||
Element deviceDesc = new DeviceDescriptor(type, name, address, encodedFormats);
|
||||
|
||||
AudioProfileTraits::Collection profiles;
|
||||
- status_t status = deserializeCollection<AudioProfileTraits>(cur, &profiles, NULL);
|
||||
+ status_t status;
|
||||
+ if(audio_is_output_devices(type))
|
||||
+ status = deserializeCollection<AudioProfileTraits>(cur, &profiles, (PtrSerializingCtx)1);
|
||||
+ else
|
||||
+ status = deserializeCollection<AudioProfileTraits>(cur, &profiles, NULL);
|
||||
if (status != NO_ERROR) {
|
||||
return Status::fromStatusT(status);
|
||||
}
|
||||
@@ -782,6 +795,14 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if(fixedEarpieceChannels) {
|
||||
+ sp<DeviceDescriptor> device =
|
||||
+ module->getDeclaredDevices().getDeviceFromTagName("Earpiece");
|
||||
+ if(device != 0)
|
||||
+ ctx->addDevice(device);
|
||||
+ fixedEarpieceChannels = false;
|
||||
+ }
|
||||
return module;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,32 @@
|
||||
From 4b6dc11462996df5987ac339bf2fb750f500a067 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sat, 12 Sep 2020 12:32:50 +0200
|
||||
Subject: [PATCH 13/14] [audiopolicy] No longer make re-assigning legacy audio
|
||||
groups fatal. Mi9 declares AUDIO_STREAM_PATCH and AUDIO_STREAM_REROUTING
|
||||
which is defined by framework too
|
||||
|
||||
Change-Id: I794fe22d63a8af705be4f5f09b9879ecaab3eae5
|
||||
---
|
||||
services/audiopolicy/engine/common/src/EngineBase.cpp | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/services/audiopolicy/engine/common/src/EngineBase.cpp b/services/audiopolicy/engine/common/src/EngineBase.cpp
|
||||
index 1bc7fe3dcc..fe18d0d794 100644
|
||||
--- a/services/audiopolicy/engine/common/src/EngineBase.cpp
|
||||
+++ b/services/audiopolicy/engine/common/src/EngineBase.cpp
|
||||
@@ -206,9 +206,9 @@ engineConfig::ParsingResult EngineBase::loadAudioPolicyEngineConfig()
|
||||
}
|
||||
if (group.stream != AUDIO_STREAM_DEFAULT) {
|
||||
// A legacy stream can be assigned once to a volume group
|
||||
- LOG_ALWAYS_FATAL_IF(checkStreamForGroups(group.stream, mVolumeGroups),
|
||||
- "stream %s already assigned to a volume group, "
|
||||
- "review the configuration", toString(group.stream).c_str());
|
||||
+ if(checkStreamForGroups(group.stream, mVolumeGroups)) {
|
||||
+ ALOGE("stream %s already assigned to a volume group, review the configuration", toString(group.stream).c_str());
|
||||
+ }
|
||||
volumeGroup->addSupportedStream(group.stream);
|
||||
}
|
||||
addSupportedAttributesToGroup(group, volumeGroup, strategy);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,341 @@
|
||||
From d24b9bfa7113578d6a9e7a98a01e0ef6dfb970ea 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 14/14] Add persist.sys.phh.disable_a2dp_offload property to
|
||||
force a2dp offload
|
||||
|
||||
Change-Id: Id474540c33c594cc4010a1a398d82bff8aadaeea
|
||||
---
|
||||
media/libstagefright/ACodec.cpp | 20 +-
|
||||
.../managerdefinitions/src/Serializer.cpp | 181 +++++++++++++++++-
|
||||
.../audiopolicy/enginedefault/src/Engine.cpp | 2 +-
|
||||
.../managerdefault/AudioPolicyManager.cpp | 3 +
|
||||
4 files changed, 199 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
|
||||
index e25f8f6558..7ff3c8f61b 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 a8eb142c81..73e4a3e096 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;
|
||||
@@ -318,7 +321,7 @@ status_t deserializeCollection(const xmlNode *cur,
|
||||
return status;
|
||||
}
|
||||
} else {
|
||||
- return BAD_VALUE;
|
||||
+ ALOGE("Ignoring...");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -734,12 +737,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() == "a2dp output") {
|
||||
+ forceDisableA2dpOffload = false;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if(forceDisableA2dpOffload && isA2dpModule) {
|
||||
+ //Add
|
||||
+ //<mixPort name="a2dp output" role="source"/>
|
||||
+ auto mixPort = new IOProfile("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;
|
||||
@@ -747,6 +772,90 @@ Return<ModuleTraits::Element> ModuleTraits::deserialize(const xmlNode *cur, PtrS
|
||||
if (status != NO_ERROR) {
|
||||
return Status::fromStatusT(status);
|
||||
}
|
||||
+ Vector<std::string> a2dpOuts;
|
||||
+ a2dpOuts.push_back("BT A2DP Out");
|
||||
+ a2dpOuts.push_back("BT A2DP Headphones");
|
||||
+ a2dpOuts.push_back("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, "BT A2DP Out");
|
||||
+ auto devicePortOut = new DeviceDescriptor(AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, "BT A2DP Out");
|
||||
+ AudioProfileTraits::Collection profiles;
|
||||
+ ChannelTraits::Collection channels;
|
||||
+ channels.insert(AUDIO_CHANNEL_OUT_STEREO);
|
||||
+ SampleRateSet sampleRates;
|
||||
+ sampleRates.insert(44100);
|
||||
+ sampleRates.insert(48000);
|
||||
+ sampleRates.insert(96000);
|
||||
+ auto profile = new AudioProfile(AUDIO_FORMAT_PCM_16_BIT, channels, sampleRates);
|
||||
+ profiles.add(profile);
|
||||
+ devicePortOut->setAudioProfiles(profiles);
|
||||
+ devicePortOut->setAddress("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, "BT A2DP Headphones");
|
||||
+ AudioProfileTraits::Collection profiles;
|
||||
+ ChannelTraits::Collection channels;
|
||||
+ channels.insert(AUDIO_CHANNEL_OUT_STEREO);
|
||||
+ SampleRateSet sampleRates;
|
||||
+ sampleRates.insert(44100);
|
||||
+ sampleRates.insert(48000);
|
||||
+ sampleRates.insert(96000);
|
||||
+ auto profile = new AudioProfile(AUDIO_FORMAT_PCM_16_BIT, channels, sampleRates);
|
||||
+ profiles.add(profile);
|
||||
+ devicePortOut->setAudioProfiles(profiles);
|
||||
+ devicePortOut->setAddress("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, "BT A2DP Speaker");
|
||||
+ AudioProfileTraits::Collection profiles;
|
||||
+ ChannelTraits::Collection channels;
|
||||
+ channels.insert(AUDIO_CHANNEL_OUT_STEREO);
|
||||
+ SampleRateSet sampleRates;
|
||||
+ sampleRates.insert(44100);
|
||||
+ sampleRates.insert(48000);
|
||||
+ sampleRates.insert(96000);
|
||||
+ auto profile = new AudioProfile(AUDIO_FORMAT_PCM_16_BIT, channels, sampleRates);
|
||||
+ profiles.add(profile);
|
||||
+ devicePortOut->setAudioProfiles(profiles);
|
||||
+ devicePortOut->setAddress("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;
|
||||
@@ -754,7 +863,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("BT A2DP Out");
|
||||
+ auto source = module->findPortByTagName("a2dp output");
|
||||
+ newRoute->setSink(sink);
|
||||
+ Vector<sp<PolicyAudioPort>> 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("BT A2DP Headphones");
|
||||
+ auto source = module->findPortByTagName("a2dp output");
|
||||
+ newRoute->setSink(sink);
|
||||
+ Vector<sp<PolicyAudioPort>> 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("BT A2DP Speaker");
|
||||
+ auto source = module->findPortByTagName("a2dp output");
|
||||
+ newRoute->setSink(sink);
|
||||
+ Vector<sp<PolicyAudioPort>> 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;
|
||||
@@ -932,6 +1110,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/enginedefault/src/Engine.cpp b/services/audiopolicy/enginedefault/src/Engine.cpp
|
||||
index b14d2bbb0b..16a7a4bbac 100755
|
||||
--- a/services/audiopolicy/enginedefault/src/Engine.cpp
|
||||
+++ b/services/audiopolicy/enginedefault/src/Engine.cpp
|
||||
@@ -52,7 +52,7 @@ static const std::vector<legacy_strategy_map>& getLegacyStrategy() {
|
||||
{ "STRATEGY_ENFORCED_AUDIBLE", STRATEGY_ENFORCED_AUDIBLE },
|
||||
{ "STRATEGY_TRANSMITTED_THROUGH_SPEAKER", STRATEGY_TRANSMITTED_THROUGH_SPEAKER },
|
||||
{ "STRATEGY_ACCESSIBILITY", STRATEGY_ACCESSIBILITY },
|
||||
- { "STRATEGY_REROUTING", STRATEGY_REROUTING },
|
||||
+ //{ "STRATEGY_REROUTING", STRATEGY_REROUTING },
|
||||
{ "STRATEGY_PATCH", STRATEGY_REROUTING }, // boiler to manage stream patch volume
|
||||
{ "STRATEGY_CALL_ASSISTANT", STRATEGY_CALL_ASSISTANT },
|
||||
};
|
||||
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
|
||||
index c5c13e9a5a..1c5ed86b86 100644
|
||||
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
|
||||
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
|
||||
@@ -93,6 +93,8 @@ bool operator!= (const SortedVector<T> &left, const SortedVector<T> &right)
|
||||
return !(left == right);
|
||||
}
|
||||
|
||||
+static bool forceDisableA2dpOffload = false;
|
||||
+
|
||||
// ----------------------------------------------------------------------------
|
||||
// AudioPolicyInterface implementation
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -4458,6 +4460,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.17.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From 494741f30b1c6a1ce223e6331d6ade70e9bc0b52 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] 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 498c52a5aa6..dd7f4560000 100644
|
||||
--- a/services/core/java/com/android/server/StorageManagerService.java
|
||||
+++ b/services/core/java/com/android/server/StorageManagerService.java
|
||||
@@ -1525,7 +1525,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
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,43 @@
|
||||
From b236ed36a97c09a15fa18d3387ff20dadd5be965 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/25] Also scan /system/overlay
|
||||
|
||||
Change-Id: Ib0223560606b80cdaaa986b159b34b4db0154589
|
||||
---
|
||||
core/jni/android_util_AssetManager.cpp | 4 ++++
|
||||
core/jni/fd_utils.cpp | 3 ++-
|
||||
2 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
|
||||
index 12abc256a20..3133f2f3023 100644
|
||||
--- a/core/jni/android_util_AssetManager.cpp
|
||||
+++ b/core/jni/android_util_AssetManager.cpp
|
||||
@@ -140,6 +140,10 @@ static jobjectArray NativeCreateIdmapsForStaticOverlaysTargetingAndroid(JNIEnv*
|
||||
input_dirs.push_back(AssetManager::OEM_OVERLAY_DIR);
|
||||
}
|
||||
|
||||
+ if (stat("/system/overlay", &st) == 0) {
|
||||
+ input_dirs.push_back("/system/overlay");
|
||||
+ }
|
||||
+
|
||||
if (input_dirs.empty()) {
|
||||
LOG(WARNING) << "no directories for idmap2 to scan";
|
||||
return env->NewObjectArray(0, g_stringClass, nullptr);
|
||||
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
|
||||
index c72668f84fb..d4307ae6579 100644
|
||||
--- a/core/jni/fd_utils.cpp
|
||||
+++ b/core/jni/fd_utils.cpp
|
||||
@@ -135,7 +135,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.17.1
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 2436b6da10c438a3b71ca3a2a5aa9705e7c00813 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Thu, 17 May 2018 20:28:35 +0200
|
||||
Subject: [PATCH 04/25] Don't crash if there is IR HAL is not declared
|
||||
|
||||
---
|
||||
services/core/java/com/android/server/ConsumerIrService.java | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/ConsumerIrService.java b/services/core/java/com/android/server/ConsumerIrService.java
|
||||
index 2ed6c77baa0..c574a03c9a3 100644
|
||||
--- a/services/core/java/com/android/server/ConsumerIrService.java
|
||||
+++ b/services/core/java/com/android/server/ConsumerIrService.java
|
||||
@@ -50,8 +50,6 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
|
||||
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!");
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
28
patches/platform_frameworks_base/0005-Fix-62.patch
Normal file
28
patches/platform_frameworks_base/0005-Fix-62.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 25b2ec68fe9ce8a2e3b35fc91ff47ae65ba95be4 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 05/25] 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 3acbfb87c3f..358053343f2 100644
|
||||
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
|
||||
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
|
||||
@@ -1270,7 +1270,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab
|
||||
|
||||
@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.17.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From f3d0a467c4c1f9df19c3c4819b4c6cb4b26fe2a3 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Fri, 11 Sep 2020 23:42:37 +0200
|
||||
Subject: [PATCH] property-matching RROs: allow to prefix the value with + to
|
||||
do glob match instead of exact match
|
||||
|
||||
Change-Id: I1f5b7c907523eb6e48d41f5163984564d3db9506
|
||||
---
|
||||
cmds/idmap2/idmap2/Scan.cpp | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/cmds/idmap2/idmap2/Scan.cpp b/cmds/idmap2/idmap2/Scan.cpp
|
||||
index 36250450cc7..6a5162dd0d9 100644
|
||||
--- a/cmds/idmap2/idmap2/Scan.cpp
|
||||
+++ b/cmds/idmap2/idmap2/Scan.cpp
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <dirent.h>
|
||||
+#include <fnmatch.h>
|
||||
|
||||
#include <fstream>
|
||||
#include <memory>
|
||||
@@ -187,7 +188,10 @@ Result<Unit> Scan(const std::vector<std::string>& args) {
|
||||
// if property set & equal to value, then include overlay - otherwise skip
|
||||
if (android::base::GetProperty(overlay_info->requiredSystemPropertyName, "") !=
|
||||
overlay_info->requiredSystemPropertyValue) {
|
||||
- continue;
|
||||
+ auto osValue = android::base::GetProperty(overlay_info->requiredSystemPropertyName, "");
|
||||
+ if(fnmatch(overlay_info->requiredSystemPropertyValue.c_str()+1, osValue.c_str(), 0) != 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From 649f6bd7789acae16c1e3fa8c57919bd4ae0d1e3 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 07/25] [Galaxy S9] "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 6b7ba6a56d8..c247731be13 100644
|
||||
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
|
||||
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
|
||||
@@ -588,7 +588,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.17.1
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 4ee7b7947513a5481b0b69a3c59e0c7cf6509153 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 08/25] 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 3d455d51dd7..d351598a55e 100755
|
||||
--- a/telephony/java/android/telephony/CarrierConfigManager.java
|
||||
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
|
||||
@@ -3898,7 +3898,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.17.1
|
||||
|
@ -0,0 +1,45 @@
|
||||
From c53ddf67401c177fe29d0c2eca146e1548ed4ecb 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] Don't wait IR HAL to the infinity and beyond
|
||||
|
||||
Change-Id: I3afded27441bbee8244d5fda544b3e6d1238dc1b
|
||||
---
|
||||
.../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
|
||||
|
@ -0,0 +1,39 @@
|
||||
From 6befde035c29a499fd4320753909c98a2c239410 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 10/25] Re-order services so that it works even without qtaguid
|
||||
|
||||
Change-Id: I0c0f527b3ae151d45c68f7ac6c205da3f34e74df
|
||||
---
|
||||
.../android/server/net/NetworkPolicyManagerService.java | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
|
||||
index d6557f6410e..e65edcdc12c 100644
|
||||
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
|
||||
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
|
||||
@@ -731,6 +731,10 @@ 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);
|
||||
+ mAppStandby = LocalServices.getService(AppStandbyInternal.class);
|
||||
+ mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class);
|
||||
+
|
||||
// Boost thread's priority during system server init
|
||||
Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
|
||||
if (!isBandwidthControlEnabled()) {
|
||||
@@ -738,10 +742,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
|
||||
return;
|
||||
}
|
||||
|
||||
- mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
|
||||
- mAppStandby = LocalServices.getService(AppStandbyInternal.class);
|
||||
- mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class);
|
||||
-
|
||||
synchronized (mUidRulesFirstLock) {
|
||||
synchronized (mNetworkPoliciesSecondLock) {
|
||||
updatePowerSaveWhitelistUL();
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,175 @@
|
||||
From 04ada322124eca94d2e354f10c45d80d1ad522e3 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] Support new samsung Pie and Q light hal and Samsung Power
|
||||
HALs
|
||||
|
||||
---
|
||||
services/core/jni/Android.bp | 3 ++
|
||||
...om_android_server_lights_LightsService.cpp | 51 +++++++++++++++++++
|
||||
...droid_server_power_PowerManagerService.cpp | 22 ++++++++
|
||||
3 files changed, 76 insertions(+)
|
||||
|
||||
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
|
||||
index eaa3c66fe0d..74f5b8667c4 100644
|
||||
--- a/services/core/jni/Android.bp
|
||||
+++ b/services/core/jni/Android.bp
|
||||
@@ -167,6 +167,9 @@ cc_defaults {
|
||||
"service.incremental",
|
||||
"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",
|
||||
],
|
||||
|
||||
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..b45b2137d0e 100644
|
||||
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
|
||||
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
|
||||
@@ -23,6 +23,10 @@
|
||||
|
||||
#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 <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>
|
||||
@@ -40,8 +44,17 @@ 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;
|
||||
+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) {
|
||||
bool valid = true;
|
||||
|
||||
@@ -152,6 +165,44 @@ static void setLight_native(
|
||||
colorARGB = (colorAlpha << 24) + (colorARGB & 0x00FFFFFF);
|
||||
}
|
||||
|
||||
+ if(!sSecTried) {
|
||||
+ sSecHal = ISecLight::getService();
|
||||
+ sSehHal = ISehLight::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");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ 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_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp
|
||||
index 33b3bad2b33..47fdcc9a87b 100644
|
||||
--- a/services/core/jni/com_android_server_power_PowerManagerService.cpp
|
||||
+++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <android/hardware/power/Mode.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"
|
||||
@@ -64,6 +65,7 @@ using IPowerV1_0 = android::hardware::power::V1_0::IPower;
|
||||
using IPowerAidl = android::hardware::power::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 {
|
||||
|
||||
@@ -80,6 +82,8 @@ static sp<IPowerV1_0> gPowerHalHidlV1_0_ = nullptr;
|
||||
static sp<IPowerV1_1> gPowerHalHidlV1_1_ = nullptr;
|
||||
static sp<IPowerAidl> gPowerHalAidl_ = nullptr;
|
||||
static sp<ILineagePowerV1_0> gLineagePowerHalV1_0_ = nullptr;
|
||||
+static sp<ISehMiscPower> gSehMiscPower = nullptr;
|
||||
+static bool gPowerHalExists = true;
|
||||
static std::mutex gPowerHalMutex;
|
||||
|
||||
enum class HalVersion {
|
||||
@@ -125,6 +129,10 @@ static HalVersion connectPowerHalLocked() {
|
||||
gPowerHalAidlExists = false;
|
||||
}
|
||||
}
|
||||
+ if (gPowerHalExists && gPowerHalHidlV1_0_ == nullptr) {
|
||||
+ gSehMiscPower = ISehMiscPower::getService();
|
||||
+ gPowerHalHidlV1_0_ = IPowerV1_0::getService("miscpower");
|
||||
+ }
|
||||
if (gPowerHalHidlExists && gPowerHalHidlV1_0_ == nullptr) {
|
||||
gPowerHalHidlV1_0_ = IPowerV1_0::getService();
|
||||
if (gPowerHalHidlV1_0_) {
|
||||
@@ -163,6 +171,12 @@ void connectLineagePowerHalLocked() {
|
||||
}
|
||||
}
|
||||
|
||||
+sp<ISehMiscPower> getSehMiscPower() {
|
||||
+ std::lock_guard<std::mutex> lock(gPowerHalMutex);
|
||||
+ connectPowerHalLocked();
|
||||
+ return gSehMiscPower;
|
||||
+}
|
||||
+
|
||||
// Retrieve a copy of PowerHAL HIDL V1_0
|
||||
sp<IPowerV1_0> getPowerHalHidlV1_0() {
|
||||
std::lock_guard<std::mutex> lock(gPowerHalMutex);
|
||||
@@ -498,6 +512,14 @@ static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean
|
||||
return;
|
||||
}
|
||||
}
|
||||
+ 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
|
||||
|
@ -0,0 +1,29 @@
|
||||
From ea68a77524fc2cbfa571d7afa01442460b3ea284 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 12/25] 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 c247731be13..5552086c17f 100644
|
||||
--- a/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
|
||||
+++ b/services/core/java/com/android/server/biometrics/fingerprint/FingerprintService.java
|
||||
@@ -590,8 +590,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.17.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From e9848dbafb20526eed8e5d8dfbd2df01b240cab8 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 13/25] Add property to use linear brightness slider
|
||||
|
||||
Change-Id: I1af7eb923779fa60c7a735904ba8fc82d0622c1d
|
||||
---
|
||||
.../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 4f86afaa995..f1fe73a6a1d 100644
|
||||
--- a/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
|
||||
+++ b/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java
|
||||
@@ -51,7 +51,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(GAMMA_SPACE_MIN, GAMMA_SPACE_MAX, val);
|
||||
final float ret;
|
||||
if (normalizedVal <= R) {
|
||||
@@ -127,6 +132,7 @@ public class BrightnessUtils {
|
||||
* @return The corresponding slider value
|
||||
*/
|
||||
public static final int convertLinearToGammaFloat(float val, float min, float max) {
|
||||
+ if(useLinearBrightness) return (int)(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.17.1
|
||||
|
@ -0,0 +1,45 @@
|
||||
From 33ba0d099de0181f34b3795ad5b2ee25d8c252a4 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 14/25] 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 9411c562945..774e5a38777 100644
|
||||
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
@@ -527,6 +527,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);
|
||||
@@ -1970,6 +1977,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.17.1
|
||||
|
@ -0,0 +1,31 @@
|
||||
From 298c7cd14541920c09b4bbcfb3255ec1ddcaad67 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 15/25] 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 774e5a38777..4c12ebbd94f 100644
|
||||
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
@@ -527,6 +527,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.17.1
|
||||
|
@ -0,0 +1,56 @@
|
||||
From d2cdf9ba6dc99f28c94e093078c1307dd4414a56 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Thu, 2 Jan 2020 10:16:49 +0800
|
||||
Subject: [PATCH] fix crashing on devices with higher aspect ratio down to
|
||||
sw288dp
|
||||
|
||||
* This is what the Qin 2 (Pro) is.
|
||||
|
||||
Change-Id: Ia39682b327fcf947f06219ce2dab996f53dcb01d
|
||||
---
|
||||
.../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
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 76cbbb0d09a80eaad75c64281d635e58976bd5be Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sun, 1 Mar 2020 18:14:40 +0100
|
||||
Subject: [PATCH 17/25] Remove orientation 4 from sensor earlier in the process
|
||||
chain
|
||||
|
||||
Change-Id: Id8e2e860a73d417fc70db6cf5fc5fa5ef187aa50
|
||||
---
|
||||
.../com/android/server/policy/WindowOrientationListener.java | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java
|
||||
index 0157706866c..732417b88f4 100644
|
||||
--- a/services/core/java/com/android/server/policy/WindowOrientationListener.java
|
||||
+++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java
|
||||
@@ -1055,6 +1055,9 @@ public abstract class WindowOrientationListener {
|
||||
|
||||
synchronized (mLock) {
|
||||
mDesiredRotation = reportedRotation;
|
||||
+ if(mDesiredRotation >= 4 || mDesiredRotation < 0) {
|
||||
+ mDesiredRotation = 0;
|
||||
+ }
|
||||
newRotation = evaluateRotationChangeLocked();
|
||||
}
|
||||
if (newRotation >=0) {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,39 @@
|
||||
From 0dc5a490d8aac60ce2ed3efafc9f6bcb6ced71f4 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 18/25] Allow disabling of fingerprint cleanups, needed on some
|
||||
Realme devices that cant enumerate
|
||||
|
||||
Change-Id: I8a486e707712b81711fb1a691faec029499fa897
|
||||
---
|
||||
.../android/server/biometrics/BiometricServiceBase.java | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
|
||||
index 75452ea5fb6..fd77ada1109 100644
|
||||
--- a/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
|
||||
+++ b/services/core/java/com/android/server/biometrics/BiometricServiceBase.java
|
||||
@@ -344,6 +344,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,
|
||||
@@ -389,8 +390,10 @@ public abstract class BiometricServiceBase extends SystemService
|
||||
Slog.e(getTag(), "doTemplateCleanup(): Removing dangling template from framework: "
|
||||
+ identifier.getBiometricId() + " "
|
||||
+ identifier.getName());
|
||||
- mUtils.removeBiometricForUser(getContext(),
|
||||
- getTargetUserId(), identifier.getBiometricId());
|
||||
+ if(!mNocleanup) {
|
||||
+ mUtils.removeBiometricForUser(getContext(),
|
||||
+ getTargetUserId(), identifier.getBiometricId());
|
||||
+ }
|
||||
FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
|
||||
statsModality(),
|
||||
BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_FRAMEWORK);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,88 @@
|
||||
From 858d6a97037b0f9eb751038a41d28564e7221222 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 19/25] 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 24a3c68cae2..472c925f76f 100644
|
||||
--- a/services/core/jni/Android.bp
|
||||
+++ b/services/core/jni/Android.bp
|
||||
@@ -170,6 +170,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 268b59a5801..5e535e3dcbf 100644
|
||||
--- a/services/core/jni/com_android_server_lights_LightsService.cpp
|
||||
+++ b/services/core/jni/com_android_server_lights_LightsService.cpp
|
||||
@@ -26,6 +26,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>
|
||||
@@ -48,11 +49,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;
|
||||
@@ -192,6 +197,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.17.1
|
||||
|
@ -0,0 +1,32 @@
|
||||
From dc92080dc096ff77e5d751026d24decc1e424ca9 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 20/25] Always allow overriding the number of work profiles
|
||||
|
||||
Change-Id: I6eb09aa71663c6fbe7563e3038bffcabdba0ff6a
|
||||
---
|
||||
.../java/com/android/server/pm/UserManagerService.java | 8 ++------
|
||||
1 file changed, 2 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
|
||||
index 27924a68ff4..4d687679f59 100644
|
||||
--- a/services/core/java/com/android/server/pm/UserManagerService.java
|
||||
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
|
||||
@@ -5282,12 +5282,8 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
*/
|
||||
private static int getMaxUsersOfTypePerParent(UserTypeDetails userTypeDetails) {
|
||||
final int defaultMax = userTypeDetails.getMaxAllowedPerParent();
|
||||
- if (!Build.IS_DEBUGGABLE) {
|
||||
- return defaultMax;
|
||||
- } else {
|
||||
- if (userTypeDetails.isManagedProfile()) {
|
||||
- return SystemProperties.getInt("persist.sys.max_profiles", defaultMax);
|
||||
- }
|
||||
+ if (userTypeDetails.isManagedProfile()) {
|
||||
+ return SystemProperties.getInt("persist.sys.max_profiles", defaultMax);
|
||||
}
|
||||
return defaultMax;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 3be1d7309cb7c496963c5d391b53ad3932563282 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] HOME deserves to wake-up devices just as well as back and
|
||||
menu
|
||||
|
||||
Change-Id: Ia562bafd8c620d00c17e8eb338e4701c6c4a3c3a
|
||||
---
|
||||
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 144dd8b3c36..9a704296bbf 100644
|
||||
--- a/core/java/android/view/KeyEvent.java
|
||||
+++ b/core/java/android/view/KeyEvent.java
|
||||
@@ -1977,6 +1977,7 @@ public class KeyEvent extends InputEvent implements Parcelable {
|
||||
case KeyEvent.KEYCODE_CAMERA:
|
||||
case KeyEvent.KEYCODE_FOCUS:
|
||||
case KeyEvent.KEYCODE_MENU:
|
||||
+ case KeyEvent.KEYCODE_HOME:
|
||||
case KeyEvent.KEYCODE_PAIRING:
|
||||
case KeyEvent.KEYCODE_STEM_1:
|
||||
case KeyEvent.KEYCODE_STEM_2:
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From b8adbf5e35d5d1e40077b3226ad3f842fc9be6dc Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 21 Sep 2020 10:30:18 +0200
|
||||
Subject: [PATCH 23/25] On old inits (A-only devices), multi-sim basedband
|
||||
property too long, catch that and make it shorter
|
||||
|
||||
Change-Id: I2f52595409f0d43b148063d5fd90c80d1182ff8c
|
||||
---
|
||||
telephony/java/android/telephony/TelephonyManager.java | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
|
||||
index 8ae1ee99b06..4659c7909bc 100644
|
||||
--- a/telephony/java/android/telephony/TelephonyManager.java
|
||||
+++ b/telephony/java/android/telephony/TelephonyManager.java
|
||||
@@ -10104,7 +10104,13 @@ public class TelephonyManager {
|
||||
if (SubscriptionManager.isValidPhoneId(phoneId)) {
|
||||
List<String> newList = updateTelephonyProperty(
|
||||
TelephonyProperties.baseband_version(), phoneId, version);
|
||||
- TelephonyProperties.baseband_version(newList);
|
||||
+ try {
|
||||
+ TelephonyProperties.baseband_version(newList);
|
||||
+ } catch(java.lang.IllegalArgumentException e) {
|
||||
+ List<String> list = new ArrayList<>();
|
||||
+ list.add(newList.get(0));
|
||||
+ TelephonyProperties.baseband_version(list);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 11dae80179722994abd9e3501e6c14d4393c4c93 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Tue, 29 Sep 2020 22:39:47 +0200
|
||||
Subject: [PATCH 24/25] Some devices have proximity sensor reporting NaN as max
|
||||
range for some reason. Make them behave standard way by setting 5 cm
|
||||
|
||||
Change-Id: I3c39e3e914a05903c140235702e0480d2d58a612
|
||||
---
|
||||
.../com/android/server/display/DisplayPowerController.java | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
index 4c12ebbd94f..01f367e8a2f 100644
|
||||
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
|
||||
@@ -544,6 +544,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
|
||||
if (mProximitySensor != null) {
|
||||
mProximityThreshold = Math.min(mProximitySensor.getMaximumRange(),
|
||||
TYPICAL_PROXIMITY_THRESHOLD);
|
||||
+ if(Float.isNaN(mProximityThreshold)) {
|
||||
+ mProximityThreshold = 5.0f;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
mCurrentScreenBrightnessSetting = getScreenBrightnessSetting();
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,37 @@
|
||||
From c341fe6ac6366d2e78b8ec69d11729180ab5cb84 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Tue, 29 Sep 2020 22:40:10 +0200
|
||||
Subject: [PATCH 25/25] Fix brightness range not being complete on Samsung
|
||||
devices
|
||||
|
||||
On some devices, minimum brightness is 0, which totally messes with
|
||||
Brightness computations (minimum float brightness becomes -1.0 instead
|
||||
of 0.0...).
|
||||
Cheat and have them report 1 as minimum instead, which fixes the slope
|
||||
|
||||
Change-Id: I4d97cbc32490949e83272b81ec6320a5483310b1
|
||||
---
|
||||
.../java/com/android/server/power/PowerManagerService.java | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
|
||||
index 764ac969e18..40aeb32c40a 100644
|
||||
--- a/services/core/java/com/android/server/power/PowerManagerService.java
|
||||
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
|
||||
@@ -913,9 +913,11 @@ public final class PowerManagerService extends SystemService
|
||||
|
||||
if (min == INVALID_BRIGHTNESS_IN_CONFIG || max == INVALID_BRIGHTNESS_IN_CONFIG
|
||||
|| def == INVALID_BRIGHTNESS_IN_CONFIG) {
|
||||
+ int correctedMin = mContext.getResources().getInteger(com.android.internal.R.integer
|
||||
+ .config_screenBrightnessSettingMinimum);
|
||||
+ if(correctedMin == 0) correctedMin = 1;
|
||||
mScreenBrightnessMinimum = BrightnessSynchronizer.brightnessIntToFloat(
|
||||
- mContext.getResources().getInteger(com.android.internal.R.integer
|
||||
- .config_screenBrightnessSettingMinimum),
|
||||
+ correctedMin,
|
||||
PowerManager.BRIGHTNESS_OFF + 1, PowerManager.BRIGHTNESS_ON,
|
||||
PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX);
|
||||
mScreenBrightnessMaximum = BrightnessSynchronizer.brightnessIntToFloat(
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,32 @@
|
||||
From d8fbdb4092155a1c8f8e2b2ee77b4fcfb7102367 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 1/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 aa24e8ee6..1c6380f6f 100644
|
||||
--- a/opengl/libs/EGL/egl_platform_entries.cpp
|
||||
+++ b/opengl/libs/EGL/egl_platform_entries.cpp
|
||||
@@ -454,8 +454,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.17.1
|
||||
|
@ -0,0 +1,51 @@
|
||||
From 61f5f4b804e8e14f15b928630489f22a5e7df04e 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 2/8] On Samsung, we need to send a hack-message to HAL to get
|
||||
all Sensors
|
||||
|
||||
Change-Id: Id6a1fa48340de61c418493668e9abd22c2599376
|
||||
---
|
||||
opengl/libs/EGL/egl_platform_entries.cpp | 2 +-
|
||||
services/sensorservice/SensorDevice.cpp | 4 ++++
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/opengl/libs/EGL/egl_platform_entries.cpp b/opengl/libs/EGL/egl_platform_entries.cpp
|
||||
index 1c6380f6f..6e810e592 100644
|
||||
--- a/opengl/libs/EGL/egl_platform_entries.cpp
|
||||
+++ b/opengl/libs/EGL/egl_platform_entries.cpp
|
||||
@@ -457,7 +457,7 @@ EGLBoolean eglGetConfigAttribImpl(EGLDisplay dpy, EGLConfig config,
|
||||
static int samsungColorspace = -1;
|
||||
static android_dataspace dataSpaceFromEGLColorSpace(EGLint colorspace) {
|
||||
if(samsungColorspace == -1) {
|
||||
- samsungColorspace = property_get_bool("persist.sys.phh.samsung_colorspace", false);
|
||||
+ samsungColorspace = base::GetBoolProperty("persist.sys.phh.samsung_colorspace", false);
|
||||
}
|
||||
if (colorspace == EGL_GL_COLORSPACE_LINEAR_KHR) {
|
||||
if(samsungColorspace)
|
||||
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
|
||||
index 8a282e238..53b686870 100644
|
||||
--- a/services/sensorservice/SensorDevice.cpp
|
||||
+++ b/services/sensorservice/SensorDevice.cpp
|
||||
@@ -34,7 +34,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::EventQueueFlagBits;
|
||||
@@ -134,6 +136,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.17.1
|
||||
|
@ -0,0 +1,42 @@
|
||||
From 113f48e1e25d168e16e6a6717c7ea70fbef033e3 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 3/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
|
||||
|
||||
Change-Id: I1d924b1e5c2389c8df17174c079cee8ef2380112
|
||||
---
|
||||
.../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 1faf775ed..deb0b0923 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
|
||||
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
|
||||
@@ -370,7 +370,18 @@ void OutputLayer::writeOutputDependentGeometryStateToHWC(
|
||||
static_cast<int32_t>(error));
|
||||
}
|
||||
|
||||
- if (auto error = hwcLayer->setZOrder(outputDependentState.z); error != hal::Error::NONE) {
|
||||
+ uint32_t z = outputDependentState.z;
|
||||
+ if(strstr(getLayerFE().getDebugName(), "Fingerprint on display") != nullptr) {
|
||||
+ ALOGE("Found fingerprint on display!");
|
||||
+ z = 0x41000031;
|
||||
+ }
|
||||
+
|
||||
+ if(strstr(getLayerFE().getDebugName(), "Fingerprint on display.touched") != nullptr) {
|
||||
+ ALOGE("Found fingerprint on display touched!");
|
||||
+ z = 0x41000033;
|
||||
+ }
|
||||
+
|
||||
+ if (auto error = hwcLayer->setZOrder(z); error != hal::Error::NONE) {
|
||||
ALOGE("[%s] Failed to set Z %u: %s (%d)", getLayerFE().getDebugName(),
|
||||
outputDependentState.z, to_string(error).c_str(), static_cast<int32_t>(error));
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,122 @@
|
||||
From 0c7b289c3d724f32f4d64e8972736f3aa8e3261f 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 4/8] Samsung + Xiaomi new FOD HBM controls
|
||||
|
||||
Change-Id: I5ab27fa70882efa85f0c917bf31bb32adaa09bb1
|
||||
---
|
||||
services/surfaceflinger/BufferQueueLayer.cpp | 19 ++++++++++++++++-
|
||||
.../CompositionEngine/src/OutputLayer.cpp | 21 +++++++++++++++++++
|
||||
2 files changed, 39 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/surfaceflinger/BufferQueueLayer.cpp b/services/surfaceflinger/BufferQueueLayer.cpp
|
||||
index 07be7916e..472ceda4d 100644
|
||||
--- a/services/surfaceflinger/BufferQueueLayer.cpp
|
||||
+++ b/services/surfaceflinger/BufferQueueLayer.cpp
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <compositionengine/LayerFECompositionState.h>
|
||||
#include <gui/BufferQueueConsumer.h>
|
||||
#include <system/window.h>
|
||||
+#include <cutils/properties.h>
|
||||
|
||||
#include "LayerRejecter.h"
|
||||
#include "SurfaceInterceptor.h"
|
||||
@@ -34,6 +35,14 @@
|
||||
#include "Scheduler/LayerHistory.h"
|
||||
#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) {}
|
||||
@@ -486,6 +495,7 @@ void BufferQueueLayer::onFirstRef() {
|
||||
mConsumer =
|
||||
mFlinger->getFactory().createBufferLayerConsumer(consumer, mFlinger->getRenderEngine(),
|
||||
mTextureName, this);
|
||||
+ init_fod_props();
|
||||
mConsumer->setConsumerUsageBits(getEffectiveUsage(0));
|
||||
|
||||
mContentsChangedListener = new ContentsChangedListener(this);
|
||||
@@ -509,9 +519,16 @@ status_t BufferQueueLayer::setDefaultBufferProperties(uint32_t w, uint32_t h, Pi
|
||||
return BAD_VALUE;
|
||||
}
|
||||
|
||||
+ 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 deb0b0923..5f9620715 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
|
||||
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <compositionengine/impl/OutputCompositionState.h>
|
||||
#include <compositionengine/impl/OutputLayer.h>
|
||||
#include <compositionengine/impl/OutputLayerCompositionState.h>
|
||||
+#include <cutils/properties.h>
|
||||
|
||||
// TODO(b/129481165): remove the #pragma below and fix conversion issues
|
||||
#pragma clang diagnostic push
|
||||
@@ -32,6 +33,10 @@
|
||||
// TODO(b/129481165): remove the #pragma below and fix conversion issues
|
||||
#pragma clang diagnostic pop // ignored "-Wconversion"
|
||||
|
||||
+static bool sCheckedProps = false;
|
||||
+static bool sBBKFod = false;
|
||||
+static bool sXiaomiFod = false;
|
||||
+
|
||||
namespace android::compositionengine {
|
||||
|
||||
OutputLayer::~OutputLayer() = default;
|
||||
@@ -370,15 +375,31 @@ void OutputLayer::writeOutputDependentGeometryStateToHWC(
|
||||
static_cast<int32_t>(error));
|
||||
}
|
||||
|
||||
+ if(!sCheckedProps) {
|
||||
+ sCheckedProps = true;
|
||||
+ sBBKFod = property_get_bool("persist.sys.phh.fod.bbk", false);
|
||||
+ sXiaomiFod = property_get_bool("persist.sys.phh.fod.xiaomi", false);
|
||||
+ }
|
||||
+
|
||||
uint32_t z = outputDependentState.z;
|
||||
if(strstr(getLayerFE().getDebugName(), "Fingerprint on display") != nullptr) {
|
||||
ALOGE("Found fingerprint on display!");
|
||||
z = 0x41000031;
|
||||
+ if(sBBKFod) {
|
||||
+ z = 0x41000031;
|
||||
+ } else if(sXiaomiFod) {
|
||||
+ z |= 0x1000000;
|
||||
+ }
|
||||
}
|
||||
|
||||
if(strstr(getLayerFE().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 != hal::Error::NONE) {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,27 @@
|
||||
From 15125c6d89352f46742c0e575556e43720e1c03c Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Fri, 11 Sep 2020 21:33:05 +0200
|
||||
Subject: [PATCH 5/8] vr_hwc crashes because it registers a 2.3 hwc, while
|
||||
manifest says 2.1
|
||||
|
||||
Change-Id: Icfaea3e471209e5773f52f880ffbcf5de744737e
|
||||
---
|
||||
services/vr/hardware_composer/manifest_vr_hwc.xml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/vr/hardware_composer/manifest_vr_hwc.xml b/services/vr/hardware_composer/manifest_vr_hwc.xml
|
||||
index 1068cac33..6694ac086 100644
|
||||
--- a/services/vr/hardware_composer/manifest_vr_hwc.xml
|
||||
+++ b/services/vr/hardware_composer/manifest_vr_hwc.xml
|
||||
@@ -2,7 +2,7 @@
|
||||
<hal>
|
||||
<name>android.hardware.graphics.composer</name>
|
||||
<transport>hwbinder</transport>
|
||||
- <version>2.1</version>
|
||||
+ <version>2.3</version>
|
||||
<interface>
|
||||
<name>IComposer</name>
|
||||
<instance>vr</instance>
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,50 @@
|
||||
From 1003d0293dc372b8fc0bbefe160f7d6a770b184b Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Wed, 30 Sep 2020 22:41:39 +0200
|
||||
Subject: [PATCH 6/8] Add persist.sys.phh.no_present_or_validate property to
|
||||
disable presentOrValidate since on vndk 26/27 presentOrValidate can be broken
|
||||
|
||||
Change-Id: I5f0c6c5e129bc21348d6f279d3ba455a5a0f008b
|
||||
---
|
||||
.../surfaceflinger/DisplayHardware/HWComposer.cpp | 13 ++++++++++++-
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
|
||||
index 7a2f0f34e..1ea104521 100644
|
||||
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
|
||||
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <ui/GraphicBuffer.h>
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/Trace.h>
|
||||
+#include <android-base/properties.h>
|
||||
|
||||
#include "../Layer.h" // needed only for debugging
|
||||
#include "../Promise.h"
|
||||
@@ -500,12 +501,22 @@ status_t HWComposer::getDeviceCompositionChanges(
|
||||
|
||||
hal::Error error = hal::Error::NONE;
|
||||
|
||||
+ static int forceNoPresentOrValidate = -1;
|
||||
+ if(forceNoPresentOrValidate == -1) {
|
||||
+ bool res = android::base::GetBoolProperty("persist.sys.phh.no_present_or_validate", false);
|
||||
+ if(res) {
|
||||
+ forceNoPresentOrValidate = 1;
|
||||
+ } else {
|
||||
+ forceNoPresentOrValidate = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
// First try to skip validate altogether when there is no client
|
||||
// composition. When there is client composition, since we haven't
|
||||
// rendered to the client target yet, we should not attempt to skip
|
||||
// validate.
|
||||
displayData.validateWasSkipped = false;
|
||||
- if (!frameUsesClientComposition) {
|
||||
+ if (forceNoPresentOrValidate == 0 && !frameUsesClientComposition) {
|
||||
sp<Fence> outPresentFence;
|
||||
uint32_t state = UINT32_MAX;
|
||||
error = hwcDisplay->presentOrValidate(&numTypes, &numRequests, &outPresentFence , &state);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,41 @@
|
||||
From dc47d76a49d2a2d8dc2bd6bf68098cd910fcb364 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Wed, 30 Sep 2020 22:51:37 +0200
|
||||
Subject: [PATCH 7/8] Add persist.sys.phh.disable_sensor_direct_report property
|
||||
to disable Sensors direct report (it seems to break Qin 2 Pro sensors HAL)
|
||||
|
||||
Change-Id: I0763324a4bd6a3ba6716c396c4cb3f0772b85d62
|
||||
---
|
||||
services/sensorservice/SensorDevice.cpp | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
|
||||
index 53b686870..87899e2cd 100644
|
||||
--- a/services/sensorservice/SensorDevice.cpp
|
||||
+++ b/services/sensorservice/SensorDevice.cpp
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "convertV2_1.h"
|
||||
|
||||
#include <android-base/logging.h>
|
||||
+#include <android-base/properties.h>
|
||||
#include <android/util/ProtoOutputStream.h>
|
||||
#include <frameworks/base/core/proto/android/service/sensor_service.proto.h>
|
||||
#include <sensors/convert.h>
|
||||
@@ -129,8 +130,12 @@ SensorDevice::SensorDevice()
|
||||
|
||||
initializeSensorList();
|
||||
|
||||
- mIsDirectReportSupported =
|
||||
- (checkReturnAndGetStatus(mSensors->unregisterDirectChannel(-1)) != INVALID_OPERATION);
|
||||
+ if(::android::base::GetBoolProperty("persist.sys.phh.disable_sensor_direct_report", false)) {
|
||||
+ mIsDirectReportSupported = false;
|
||||
+ } else {
|
||||
+ mIsDirectReportSupported =
|
||||
+ (checkReturnAndGetStatus(mSensors->unregisterDirectChannel(-1)) != INVALID_OPERATION);
|
||||
+ }
|
||||
}
|
||||
|
||||
void SensorDevice::initializeSensorList() {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,52 @@
|
||||
From 251273e408c2090789f758c4f873df0cd044ee15 Mon Sep 17 00:00:00 2001
|
||||
From: Anthony Stange <stange@google.com>
|
||||
Date: Thu, 9 Jul 2020 09:35:29 -0400
|
||||
Subject: [PATCH 8/8] Don't quantize max range with a resolution of 0
|
||||
|
||||
Sensors without a default resolution can be left with a resolution of 0
|
||||
during initialization. Then, when the framework attempted to requantize
|
||||
the max range using the resolution value, it would perform a
|
||||
divide-by-zero operation. Encapsulate this logic with a check of the
|
||||
resolution value to ensure this case doesn't occur.
|
||||
|
||||
Bug: 160862405
|
||||
Test: Run on device and verify no crashes occur.
|
||||
Merged-In: I6ab02072a11078f05f65b61310d5637743e258ff
|
||||
Change-Id: I6ab02072a11078f05f65b61310d5637743e258ff
|
||||
(cherry picked from commit ec5b4b1eebd9919ec54ff2d03d17fbf387012d1d)
|
||||
---
|
||||
services/sensorservice/SensorDevice.cpp | 18 ++++++++++++------
|
||||
1 file changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
|
||||
index 87899e2cd..eb5bfe281 100644
|
||||
--- a/services/sensorservice/SensorDevice.cpp
|
||||
+++ b/services/sensorservice/SensorDevice.cpp
|
||||
@@ -162,12 +162,18 @@ void SensorDevice::initializeSensorList() {
|
||||
SensorDeviceUtils::defaultResolutionForType(sensor.type);
|
||||
}
|
||||
|
||||
- double promotedResolution = sensor.resolution;
|
||||
- double promotedMaxRange = sensor.maxRange;
|
||||
- if (fmod(promotedMaxRange, promotedResolution) != 0) {
|
||||
- ALOGW("%s's max range %f is not a multiple of the resolution %f",
|
||||
- sensor.name, sensor.maxRange, sensor.resolution);
|
||||
- SensorDeviceUtils::quantizeValue(&sensor.maxRange, promotedResolution);
|
||||
+ // Some sensors don't have a default resolution and will be left at 0.
|
||||
+ // Don't crash in this case since CTS will verify that devices don't go to
|
||||
+ // production with a resolution of 0.
|
||||
+ if (sensor.resolution != 0) {
|
||||
+ double promotedResolution = sensor.resolution;
|
||||
+ double promotedMaxRange = sensor.maxRange;
|
||||
+ if (fmod(promotedMaxRange, promotedResolution) != 0) {
|
||||
+ ALOGW("%s's max range %f is not a multiple of the resolution %f",
|
||||
+ sensor.name, sensor.maxRange, sensor.resolution);
|
||||
+ SensorDeviceUtils::quantizeValue(
|
||||
+ &sensor.maxRange, promotedResolution);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,105 @@
|
||||
From 3337759a488bf320bbebcb5b7d5da981555bb758 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Tue, 20 Feb 2018 23:04:50 +0100
|
||||
Subject: [PATCH 1/3] Make BTM_BYPASS_EXTRA_ACL_SETUP dynamic
|
||||
|
||||
Change-Id: Icb0868566b29b053ed7e83c9fd32e225af3f2e46
|
||||
---
|
||||
hci/include/bt_hci_bdroid.h | 3 +++
|
||||
internal_include/bt_target.h | 3 +++
|
||||
stack/btm/btm_acl.cc | 20 ++++++++++----------
|
||||
stack/btm/btm_sec.cc | 18 +++++++++---------
|
||||
4 files changed, 25 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/hci/include/bt_hci_bdroid.h b/hci/include/bt_hci_bdroid.h
|
||||
index 110354f05..b81185e2c 100644
|
||||
--- a/hci/include/bt_hci_bdroid.h
|
||||
+++ b/hci/include/bt_hci_bdroid.h
|
||||
@@ -32,6 +32,9 @@
|
||||
#ifdef HAS_BDROID_BUILDCFG
|
||||
#include "bdroid_buildcfg.h"
|
||||
#endif
|
||||
+#ifndef BTM_BYPASS_EXTRA_ACL_SETUP
|
||||
+#define BTM_BYPASS_EXTRA_ACL_SETUP TRUE
|
||||
+#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Constants & Macros
|
||||
diff --git a/internal_include/bt_target.h b/internal_include/bt_target.h
|
||||
index 4aca86822..57bd69e9f 100644
|
||||
--- a/internal_include/bt_target.h
|
||||
+++ b/internal_include/bt_target.h
|
||||
@@ -32,6 +32,9 @@
|
||||
#ifdef HAS_BDROID_BUILDCFG
|
||||
#include "bdroid_buildcfg.h"
|
||||
#endif
|
||||
+#ifndef BTM_BYPASS_EXTRA_ACL_SETUP
|
||||
+#define BTM_BYPASS_EXTRA_ACL_SETUP TRUE
|
||||
+#endif
|
||||
|
||||
#include "bt_types.h" /* This must be defined AFTER buildcfg.h */
|
||||
|
||||
diff --git a/stack/btm/btm_acl.cc b/stack/btm/btm_acl.cc
|
||||
index 3c8a6a69a..894459854 100644
|
||||
--- a/stack/btm/btm_acl.cc
|
||||
+++ b/stack/btm/btm_acl.cc
|
||||
@@ -1208,17 +1208,17 @@ void btm_read_remote_ext_features_failed(uint8_t status, uint16_t handle) {
|
||||
void btm_establish_continue(tACL_CONN* p_acl_cb) {
|
||||
tBTM_BL_EVENT_DATA evt_data;
|
||||
BTM_TRACE_DEBUG("btm_establish_continue");
|
||||
-#if (BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
|
||||
- if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR) {
|
||||
- /* For now there are a some devices that do not like sending */
|
||||
- /* commands events and data at the same time. */
|
||||
- /* Set the packet types to the default allowed by the device */
|
||||
- btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
|
||||
-
|
||||
- if (btm_cb.btm_def_link_policy)
|
||||
- BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
|
||||
+ if (!BTM_BYPASS_EXTRA_ACL_SETUP) {
|
||||
+ if (p_acl_cb->transport == BT_TRANSPORT_BR_EDR) {
|
||||
+ /* For now there are a some devices that do not like sending */
|
||||
+ /* commands events and data at the same time. */
|
||||
+ /* Set the packet types to the default allowed by the device */
|
||||
+ btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
|
||||
+
|
||||
+ if (btm_cb.btm_def_link_policy)
|
||||
+ BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
|
||||
+ }
|
||||
}
|
||||
-#endif
|
||||
if (p_acl_cb->link_up_issued) {
|
||||
BTM_TRACE_ERROR("%s: Already link is up ", __func__);
|
||||
return;
|
||||
diff --git a/stack/btm/btm_sec.cc b/stack/btm/btm_sec.cc
|
||||
index 63e4f6ce1..7dea81b44 100644
|
||||
--- a/stack/btm/btm_sec.cc
|
||||
+++ b/stack/btm/btm_sec.cc
|
||||
@@ -4168,15 +4168,15 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, uint8_t status,
|
||||
if (p_acl_cb) {
|
||||
/* whatever is in btm_establish_continue() without reporting the BTM_BL_CONN_EVT
|
||||
* event */
|
||||
-#if (BTM_BYPASS_EXTRA_ACL_SETUP == FALSE)
|
||||
- /* For now there are a some devices that do not like sending */
|
||||
- /* commands events and data at the same time. */
|
||||
- /* Set the packet types to the default allowed by the device */
|
||||
- btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
|
||||
-
|
||||
- if (btm_cb.btm_def_link_policy)
|
||||
- BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
|
||||
-#endif
|
||||
+ if(!BTM_BYPASS_EXTRA_ACL_SETUP) {
|
||||
+ /* For now there are a some devices that do not like sending */
|
||||
+ /* commands events and data at the same time. */
|
||||
+ /* Set the packet types to the default allowed by the device */
|
||||
+ btm_set_packet_types(p_acl_cb, btm_cb.btm_acl_pkt_types_supported);
|
||||
+
|
||||
+ if (btm_cb.btm_def_link_policy)
|
||||
+ BTM_SetLinkPolicy(p_acl_cb->remote_addr, &btm_cb.btm_def_link_policy);
|
||||
+ }
|
||||
}
|
||||
btm_acl_created(bda, p_dev_rec->dev_class, p_dev_rec->sec_bd_name, handle,
|
||||
HCI_ROLE_SLAVE, BT_TRANSPORT_BR_EDR);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,153 @@
|
||||
From a39b9abfe1e7e1bea9c409a1680cb6f18a6ec354 Mon Sep 17 00:00:00 2001
|
||||
From: penn5 <penn5@users.noreply.github.com>
|
||||
Date: Mon, 4 Mar 2019 22:21:07 +0000
|
||||
Subject: [PATCH 2/3] Add props to control supported features and states (#1)
|
||||
|
||||
* Add bitmask for supported fields
|
||||
Use persist.sys.bt.unsupport.states, defaults to 0, left-aligned.
|
||||
Huawei suggest to use 000000000000000000000011111
|
||||
|
||||
* Add bitmask to LOCAL_SUPPORTED_FEATURES
|
||||
For Huawei, suggest to use 00000001
|
||||
|
||||
Documentation:
|
||||
- persist.sys.bt.unsupport.features matches the values:
|
||||
HCI_3_SLOT_PACKETS..HCI_LMP_EXTENDED_SUPPORTED (max 8bits * 8 bytes =
|
||||
64 bits)
|
||||
- persist.sys.bt.unsupport.states matches the values:
|
||||
BTM_BLE_STATE_INVALID..BTM_BLE_STATE_SCAN_ADV (max = 0x3ff, 11 bits)
|
||||
- persist.sys.bt.unsupport.stdfeatures ( max: 16 bits)
|
||||
HCI_LE_ENCRYPTION..HCI_LE_PERIODIC_ADVERTISING
|
||||
---
|
||||
hci/src/hci_packet_parser.cc | 77 ++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 77 insertions(+)
|
||||
|
||||
diff --git a/hci/src/hci_packet_parser.cc b/hci/src/hci_packet_parser.cc
|
||||
index b1efd444d..88dc4c6cd 100644
|
||||
--- a/hci/src/hci_packet_parser.cc
|
||||
+++ b/hci/src/hci_packet_parser.cc
|
||||
@@ -27,6 +27,8 @@
|
||||
#include "hcimsgs.h"
|
||||
#include "osi/include/log.h"
|
||||
|
||||
+#include <cutils/properties.h>
|
||||
+
|
||||
static const command_opcode_t NO_OPCODE_CHECKING = 0;
|
||||
|
||||
static const allocator_t* buffer_allocator;
|
||||
@@ -108,6 +110,31 @@ static void parse_read_local_supported_commands_response(
|
||||
buffer_allocator->free(response);
|
||||
}
|
||||
|
||||
+static void setup_bitmask(uint8_t *v, const char* property) {
|
||||
+ char str[PROPERTY_VALUE_MAX];
|
||||
+ int len = property_get(property, str, "");
|
||||
+ memset(v, 255, 8);
|
||||
+ for(int i = 0; i<len; i++) {
|
||||
+ if(str[i] == '1') {
|
||||
+ v[i/8] &= ~(1 << (i%8));
|
||||
+ } else if(str[i] != '0') {
|
||||
+ LOG_ERROR(LOG_TAG, "invalid characters in bitmask; skipping %c", str[i]);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void filter_supported_feature(uint8_t *v) {
|
||||
+ static int setup = 0;
|
||||
+ static uint8_t unsupport_bitmask[8];
|
||||
+ if(!setup) {
|
||||
+ setup = 1;
|
||||
+ setup_bitmask(unsupport_bitmask, "persist.sys.bt.unsupport.features");
|
||||
+ }
|
||||
+
|
||||
+ for(unsigned i=0; i<sizeof(bt_device_features_t); i++)
|
||||
+ v[i] &= unsupport_bitmask[i];
|
||||
+}
|
||||
+
|
||||
static void parse_read_local_extended_features_response(
|
||||
BT_HDR* response, uint8_t* page_number_ptr, uint8_t* max_page_number_ptr,
|
||||
bt_device_features_t* feature_pages, size_t feature_pages_count) {
|
||||
@@ -123,6 +150,16 @@ static void parse_read_local_extended_features_response(
|
||||
STREAM_TO_ARRAY(feature_pages[*page_number_ptr].as_array, stream,
|
||||
(int)sizeof(bt_device_features_t));
|
||||
|
||||
+ for (int i = 0; i < ((int)sizeof(bt_device_features_t)); i++)
|
||||
+ LOG_DEBUG(LOG_TAG, "supported feature 0x%x is 0x%x", i, feature_pages[*page_number_ptr].as_array[i]);
|
||||
+
|
||||
+ filter_supported_feature(feature_pages[*page_number_ptr].as_array);
|
||||
+
|
||||
+ for (int i = 0; i < ((int)sizeof(bt_device_features_t)); i++)
|
||||
+ LOG_DEBUG(LOG_TAG, "post-filtering supported feature 0x%x is 0x%x", i, feature_pages[*page_number_ptr].as_array[i]);
|
||||
+
|
||||
+ LOG_DEBUG(LOG_TAG, "supported_features array done");
|
||||
+
|
||||
buffer_allocator->free(response);
|
||||
}
|
||||
|
||||
@@ -148,6 +185,19 @@ static void parse_ble_read_buffer_size_response(BT_HDR* response,
|
||||
buffer_allocator->free(response);
|
||||
}
|
||||
|
||||
+
|
||||
+static void filter_supported_states(uint8_t *v, int size) {
|
||||
+ static int setup = 0;
|
||||
+ static uint8_t unsupport_bitmask[8];
|
||||
+ if(!setup) {
|
||||
+ setup = 1;
|
||||
+ setup_bitmask(unsupport_bitmask, "persist.sys.bt.unsupport.states");
|
||||
+ }
|
||||
+
|
||||
+ for(int i=0; i<size && i<8; i++)
|
||||
+ v[i] &= unsupport_bitmask[i];
|
||||
+}
|
||||
+
|
||||
static void parse_ble_read_supported_states_response(
|
||||
BT_HDR* response, uint8_t* supported_states, size_t supported_states_size) {
|
||||
uint8_t* stream =
|
||||
@@ -156,9 +206,30 @@ static void parse_ble_read_supported_states_response(
|
||||
CHECK(stream != NULL);
|
||||
STREAM_TO_ARRAY(supported_states, stream, (int)supported_states_size);
|
||||
|
||||
+ for (int i = 0; i < ((int)supported_states_size); i++)
|
||||
+ LOG_DEBUG(LOG_TAG, "supported state 0x%x is 0x%x", i, supported_states[i]);
|
||||
+
|
||||
+ filter_supported_states(supported_states, supported_states_size);
|
||||
+
|
||||
+ for (int i = 0; i < ((int)supported_states_size); i++)
|
||||
+ LOG_DEBUG(LOG_TAG, "supported.2 state 0x%x is 0x%x", i, supported_states[i]);
|
||||
+
|
||||
+ LOG_DEBUG(LOG_TAG, "supported_states array done");
|
||||
buffer_allocator->free(response);
|
||||
}
|
||||
|
||||
+static void filter_supported_stdfeatures(uint8_t *v) {
|
||||
+ static int setup = 0;
|
||||
+ static uint8_t unsupport_bitmask[8];
|
||||
+ if(!setup) {
|
||||
+ setup = 1;
|
||||
+ setup_bitmask(unsupport_bitmask, "persist.sys.bt.unsupport.stdfeatures");
|
||||
+ }
|
||||
+
|
||||
+ for(unsigned i=0; i<sizeof(bt_device_features_t); i++)
|
||||
+ v[i] &= unsupport_bitmask[i];
|
||||
+}
|
||||
+
|
||||
static void parse_ble_read_local_supported_features_response(
|
||||
BT_HDR* response, bt_device_features_t* supported_features) {
|
||||
uint8_t* stream = read_command_complete_header(
|
||||
@@ -168,6 +239,12 @@ static void parse_ble_read_local_supported_features_response(
|
||||
STREAM_TO_ARRAY(supported_features->as_array, stream,
|
||||
(int)sizeof(bt_device_features_t));
|
||||
|
||||
+ for (int i = 0; i < ((int)sizeof(bt_device_features_t)); i++)
|
||||
+ LOG_DEBUG(LOG_TAG, "supported state 0x%x is 0x%x", i, supported_features->as_array[i]);
|
||||
+ filter_supported_stdfeatures(supported_features->as_array);
|
||||
+ for (int i = 0; i < ((int)sizeof(bt_device_features_t)); i++)
|
||||
+ LOG_DEBUG(LOG_TAG, "supported.2 state 0x%x is 0x%x", i, supported_features->as_array[i]);
|
||||
+
|
||||
buffer_allocator->free(response);
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,67 @@
|
||||
From eba7ce1a14f942bfdc6ac93eac14188b7b2b91ec Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 25 May 2020 21:25:12 +0200
|
||||
Subject: [PATCH 3/3] Add persist.sys.phh.disable_a2dp_offload property to
|
||||
force a2dp offload
|
||||
|
||||
---
|
||||
btif/src/btif_av.cc | 7 ++++++-
|
||||
stack/a2dp/a2dp_codec_config.cc | 9 +++++++--
|
||||
2 files changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/btif/src/btif_av.cc b/btif/src/btif_av.cc
|
||||
index 1003b0f82..b7832a478 100644
|
||||
--- a/btif/src/btif_av.cc
|
||||
+++ b/btif/src/btif_av.cc
|
||||
@@ -968,9 +968,14 @@ bt_status_t BtifAvSource::Init(
|
||||
osi_property_get("ro.bluetooth.a2dp_offload.supported", value_sup, "false");
|
||||
osi_property_get("persist.bluetooth.a2dp_offload.disabled", value_dis,
|
||||
"false");
|
||||
+ char value_phh[PROPERTY_VALUE_MAX] = {'\0'};
|
||||
+ osi_property_get("persist.sys.phh.disable_a2dp_offload", value_phh, "false");
|
||||
a2dp_offload_enabled_ =
|
||||
(strcmp(value_sup, "true") == 0) && (strcmp(value_dis, "false") == 0);
|
||||
- BTIF_TRACE_DEBUG("a2dp_offload.enable = %d", a2dp_offload_enabled_);
|
||||
+ if(strcmp(value_phh, "true") == 0)
|
||||
+ a2dp_offload_enabled_ = false;
|
||||
+
|
||||
+ LOG_ERROR(LOG_TAG, "a2dp_offload.enable = %s", a2dp_offload_enabled_ ? "on" : "off");
|
||||
|
||||
callbacks_ = callbacks;
|
||||
if (a2dp_offload_enabled_) {
|
||||
diff --git a/stack/a2dp/a2dp_codec_config.cc b/stack/a2dp/a2dp_codec_config.cc
|
||||
index edf7e0c46..795cbab9c 100644
|
||||
--- a/stack/a2dp/a2dp_codec_config.cc
|
||||
+++ b/stack/a2dp/a2dp_codec_config.cc
|
||||
@@ -560,13 +560,18 @@ bool A2dpCodecs::init() {
|
||||
char* tok = NULL;
|
||||
char* tmp_token = NULL;
|
||||
bool offload_codec_support[BTAV_A2DP_CODEC_INDEX_MAX] = {false};
|
||||
- char value_sup[PROPERTY_VALUE_MAX], value_dis[PROPERTY_VALUE_MAX];
|
||||
+ char value_sup[PROPERTY_VALUE_MAX], value_dis[PROPERTY_VALUE_MAX], value_phh[PROPERTY_VALUE_MAX];
|
||||
|
||||
osi_property_get("ro.bluetooth.a2dp_offload.supported", value_sup, "false");
|
||||
osi_property_get("persist.bluetooth.a2dp_offload.disabled", value_dis,
|
||||
"false");
|
||||
+ osi_property_get("persist.sys.phh.disable_a2dp_offload", value_phh, "false");
|
||||
a2dp_offload_status =
|
||||
(strcmp(value_sup, "true") == 0) && (strcmp(value_dis, "false") == 0);
|
||||
+ if(strcmp(value_phh, "true") == 0)
|
||||
+ a2dp_offload_status = false;
|
||||
+
|
||||
+ LOG_ERROR(LOG_TAG, "Got a2dp offload status %s", a2dp_offload_status ? "on" : "off");
|
||||
|
||||
if (a2dp_offload_status) {
|
||||
char value_cap[PROPERTY_VALUE_MAX];
|
||||
@@ -654,7 +659,7 @@ bool A2dpCodecs::init() {
|
||||
}
|
||||
}
|
||||
|
||||
- return (!ordered_source_codecs_.empty() && !ordered_sink_codecs_.empty());
|
||||
+ return (!ordered_source_codecs_.empty() && !ordered_sink_codecs_.empty()) && !a2dp_offload_status;
|
||||
}
|
||||
|
||||
A2dpCodecConfig* A2dpCodecs::findSourceCodecConfig(
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,29 @@
|
||||
From b7ff0d28b15d50e4c3aa6ff636eed67290d20e33 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Tue, 14 Aug 2018 19:33:03 +0200
|
||||
Subject: [PATCH 1/7] Detect allowed sdcard options based on vndk
|
||||
|
||||
Some kernel crashes when using too recent sdcardfs options
|
||||
|
||||
Change-Id: I632e485f9b2a09a46d4a1fde2ea15217f8d92eff
|
||||
---
|
||||
sdcard/sdcard.cpp | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/sdcard/sdcard.cpp b/sdcard/sdcard.cpp
|
||||
index 622de5b7a..955ddbb4c 100644
|
||||
--- a/sdcard/sdcard.cpp
|
||||
+++ b/sdcard/sdcard.cpp
|
||||
@@ -110,7 +110,8 @@ static bool sdcardfs_setup(const std::string& source_path, const std::string& de
|
||||
if (unshared_obb) new_opts_list.push_back("unshared_obb,");
|
||||
// Try several attempts, each time with one less option, to gracefully
|
||||
// handle older kernels that aren't updated yet.
|
||||
- for (int i = 0; i <= new_opts_list.size(); ++i) {
|
||||
+ int first_option_to_try = property_get_bool("persist.sys.phh.modern_sdcard", false) ? 0 : 2;
|
||||
+ for (int i = first_option_to_try; i <= new_opts_list.size(); ++i) {
|
||||
std::string new_opts;
|
||||
for (int j = 0; j < new_opts_list.size() - i; ++j) {
|
||||
new_opts += new_opts_list[j];
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From 79508b1e216217f4e9b8a8692049407e30bbb0b6 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Wed, 2 Jan 2019 17:17:20 +0100
|
||||
Subject: [PATCH 2/7] Ignore /proc/kmsg if reading from it faults
|
||||
|
||||
On some devices, (The only known one is Y6 2018), reading from
|
||||
/proc/kmsg fails, with a status EFAULT
|
||||
This isn't just from logd, a simple cat /proc/kmsg does that as well.
|
||||
|
||||
Simply stop reading logs from kernel in that case
|
||||
|
||||
Change-Id: I4b902b7ec36107c722e2f5cc5dbb7964734bb71d
|
||||
---
|
||||
logd/LogKlog.cpp | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/logd/LogKlog.cpp b/logd/LogKlog.cpp
|
||||
index edd326aec..8ff719f6e 100644
|
||||
--- a/logd/LogKlog.cpp
|
||||
+++ b/logd/LogKlog.cpp
|
||||
@@ -238,6 +238,9 @@ bool LogKlog::onDataAvailable(SocketClient* cli) {
|
||||
break;
|
||||
}
|
||||
if (retval < 0) {
|
||||
+ if(errno == EFAULT) {
|
||||
+ stopListener();
|
||||
+ }
|
||||
return false;
|
||||
}
|
||||
len += retval;
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,41 @@
|
||||
From 87add47acc49be7c6b2eb9802f8d99382409847a Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Thu, 12 Sep 2019 13:05:37 +0200
|
||||
Subject: [PATCH 3/7] [first stage] If Vboot2 fails, fall-back to Vboot1
|
||||
|
||||
Some devices, for instance Honor View 10, running Pie vendor declares
|
||||
vbmeta in their device-tree, but doesn't have a vbmeta partition.
|
||||
|
||||
Test: without this fix the device reboots into bootloader
|
||||
Test: with this fix, the device boots.
|
||||
|
||||
Please note that other fixes are also required to get this device to
|
||||
actually boot.
|
||||
|
||||
Change-Id: I97a7042fb03f817c41b801d558e438d2c1f6c375
|
||||
---
|
||||
init/first_stage_mount.cpp | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/init/first_stage_mount.cpp b/init/first_stage_mount.cpp
|
||||
index 8eb2f9748..990d76928 100644
|
||||
--- a/init/first_stage_mount.cpp
|
||||
+++ b/init/first_stage_mount.cpp
|
||||
@@ -809,7 +809,13 @@ bool DoFirstStageMount() {
|
||||
LOG(ERROR) << "Failed to create FirstStageMount";
|
||||
return false;
|
||||
}
|
||||
- return handle->DoFirstStageMount();
|
||||
+ if(!handle->DoFirstStageMount()) {
|
||||
+ handle = nullptr;
|
||||
+ auto fstab = ReadFirstStageFstab();
|
||||
+ std::unique_ptr<FirstStageMount> v = std::make_unique<FirstStageMountVBootV1>(std::move(fstab));
|
||||
+ return v->DoFirstStageMount();
|
||||
+ }
|
||||
+ return true;
|
||||
}
|
||||
|
||||
void SetInitAvbVersionInRecovery() {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,32 @@
|
||||
From c45bbb47bdbab406a5e24f82ec76dbe7a44adcca Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Fri, 1 Nov 2019 18:22:13 +0100
|
||||
Subject: [PATCH 4/7] Ugly but secure: Set /dev/uinput as 0666 to fix
|
||||
fingerprint sensor on some devices
|
||||
|
||||
cf https://github.com/phhusson/device_phh_treble/pull/122/commits/e000d69c286b6686777ea6f1867f379e30273e48
|
||||
This is safe because even though it's 0666, its SELinux policy is very
|
||||
tight, and only bluetooth HAL, shell (and fingerprint HAL on Xiaomi) can
|
||||
access it.
|
||||
|
||||
Change-Id: Id374e781957927d5604cb96c7a39b3fb28b3a6c5
|
||||
---
|
||||
rootdir/ueventd.rc | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/rootdir/ueventd.rc b/rootdir/ueventd.rc
|
||||
index 9c2cdf27f..081037d44 100644
|
||||
--- a/rootdir/ueventd.rc
|
||||
+++ b/rootdir/ueventd.rc
|
||||
@@ -45,7 +45,7 @@ subsystem sound
|
||||
|
||||
# these should not be world writable
|
||||
/dev/uhid 0660 uhid uhid
|
||||
-/dev/uinput 0660 uhid uhid
|
||||
+/dev/uinput 0666 uhid uhid
|
||||
/dev/rtc0 0640 system system
|
||||
/dev/tty0 0660 root system
|
||||
/dev/graphics/* 0660 root graphics
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,47 @@
|
||||
From 12d11df31c36c0d043efb30b8b3010ba816cb9d0 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Fri, 1 Nov 2019 18:22:13 +0100
|
||||
Subject: [PATCH 5/7] Have sdcard daemon detect sdcardfs params based on vndk
|
||||
version
|
||||
|
||||
Change-Id: Id374e781957927d5604cb96c7a39b3fb28b3a6c5
|
||||
---
|
||||
sdcard/sdcard.cpp | 11 ++++++-----
|
||||
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/sdcard/sdcard.cpp b/sdcard/sdcard.cpp
|
||||
index 955ddbb4c..e580190e9 100644
|
||||
--- a/sdcard/sdcard.cpp
|
||||
+++ b/sdcard/sdcard.cpp
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/macros.h>
|
||||
+#include <android-base/properties.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <android-base/strings.h>
|
||||
|
||||
@@ -103,15 +104,15 @@ static bool sdcardfs_setup(const std::string& source_path, const std::string& de
|
||||
mode_t mask, bool derive_gid, bool default_normal, bool unshared_obb,
|
||||
bool use_esdfs) {
|
||||
// Add new options at the end of the vector.
|
||||
+ int vndk = android::base::GetIntProperty<int>("ro.vndk.version", 29);
|
||||
std::vector<std::string> new_opts_list;
|
||||
if (multi_user) new_opts_list.push_back("multiuser,");
|
||||
- if (derive_gid) new_opts_list.push_back("derive_gid,");
|
||||
- if (default_normal) new_opts_list.push_back("default_normal,");
|
||||
- if (unshared_obb) new_opts_list.push_back("unshared_obb,");
|
||||
+ if (derive_gid && vndk >= 27) new_opts_list.push_back("derive_gid,");
|
||||
+ if (default_normal && vndk >= 28) new_opts_list.push_back("default_normal,");
|
||||
+ if (unshared_obb && vndk >= 29) new_opts_list.push_back("unshared_obb,");
|
||||
// Try several attempts, each time with one less option, to gracefully
|
||||
// handle older kernels that aren't updated yet.
|
||||
- int first_option_to_try = property_get_bool("persist.sys.phh.modern_sdcard", false) ? 0 : 2;
|
||||
- for (int i = first_option_to_try; i <= new_opts_list.size(); ++i) {
|
||||
+ for (int i = 0; i <= new_opts_list.size(); ++i) {
|
||||
std::string new_opts;
|
||||
for (int j = 0; j < new_opts_list.size() - i; ++j) {
|
||||
new_opts += new_opts_list[j];
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,847 @@
|
||||
From 1fc45dd14daaa997ed09f0ceb674a08032186f7b Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 21 Sep 2020 18:13:18 +0200
|
||||
Subject: [PATCH 6/7] Revert "Move adbd's legacy USB implementation to
|
||||
fastboot."
|
||||
|
||||
This reverts commit 27831220711f5ab4ccb2fca6253786c13245559a.
|
||||
---
|
||||
adb/Android.bp | 17 ++-
|
||||
adb/adb.cpp | 4 -
|
||||
adb/adb.h | 3 +-
|
||||
adb/client/main.cpp | 1 -
|
||||
adb/client/usb_dispatch.cpp | 3 +-
|
||||
adb/client/usb_libusb.cpp | 5 +-
|
||||
adb/client/usb_linux.cpp | 3 +-
|
||||
adb/client/usb_osx.cpp | 2 -
|
||||
adb/client/usb_windows.cpp | 2 -
|
||||
.../device => adb/daemon/include/adbd}/usb.h | 9 +-
|
||||
adb/daemon/usb.cpp | 30 ++++-
|
||||
adb/daemon/{usb_ffs.h => usb_dummy.cpp} | 30 ++++-
|
||||
adb/daemon/usb_ffs.cpp | 3 +-
|
||||
.../usb.cpp => adb/daemon/usb_legacy.cpp | 111 +++++++++++++++++-
|
||||
adb/transport.cpp | 2 -
|
||||
adb/transport.h | 37 +++---
|
||||
adb/{client => }/transport_usb.cpp | 8 +-
|
||||
adb/{client => }/usb.h | 42 +++----
|
||||
fastboot/Android.bp | 2 +-
|
||||
fastboot/device/usb_client.h | 2 +-
|
||||
20 files changed, 229 insertions(+), 87 deletions(-)
|
||||
rename {fastboot/device => adb/daemon/include/adbd}/usb.h (84%)
|
||||
rename adb/daemon/{usb_ffs.h => usb_dummy.cpp} (52%)
|
||||
rename fastboot/device/usb.cpp => adb/daemon/usb_legacy.cpp (70%)
|
||||
rename adb/{client => }/transport_usb.cpp (97%)
|
||||
rename adb/{client => }/usb.h (72%)
|
||||
|
||||
diff --git a/adb/Android.bp b/adb/Android.bp
|
||||
index dee48bf80..78c79702a 100644
|
||||
--- a/adb/Android.bp
|
||||
+++ b/adb/Android.bp
|
||||
@@ -160,6 +160,7 @@ libadb_srcs = [
|
||||
"transport.cpp",
|
||||
"transport_fd.cpp",
|
||||
"transport_local.cpp",
|
||||
+ "transport_usb.cpp",
|
||||
"types.cpp",
|
||||
]
|
||||
|
||||
@@ -195,7 +196,6 @@ cc_library_host_static {
|
||||
"client/usb_libusb.cpp",
|
||||
"client/usb_dispatch.cpp",
|
||||
"client/transport_mdns.cpp",
|
||||
- "client/transport_usb.cpp",
|
||||
"client/pairing/pairing_client.cpp",
|
||||
],
|
||||
|
||||
@@ -375,6 +375,10 @@ cc_library_static {
|
||||
"daemon/adb_wifi.cpp",
|
||||
],
|
||||
|
||||
+ local_include_dirs: [
|
||||
+ "daemon/include",
|
||||
+ ],
|
||||
+
|
||||
generated_headers: ["platform_tools_version"],
|
||||
|
||||
static_libs: [
|
||||
@@ -405,6 +409,12 @@ cc_library_static {
|
||||
"daemon/transport_qemu.cpp",
|
||||
"daemon/usb.cpp",
|
||||
"daemon/usb_ffs.cpp",
|
||||
+ "daemon/usb_legacy.cpp",
|
||||
+ ]
|
||||
+ },
|
||||
+ linux_glibc: {
|
||||
+ srcs: [
|
||||
+ "daemon/usb_dummy.cpp",
|
||||
]
|
||||
},
|
||||
recovery: {
|
||||
@@ -547,9 +557,8 @@ cc_library {
|
||||
"libmdnssd",
|
||||
],
|
||||
|
||||
- visibility: [
|
||||
- "//bootable/recovery/minadbd",
|
||||
- "//system/core/adb",
|
||||
+ export_include_dirs: [
|
||||
+ "daemon/include",
|
||||
],
|
||||
}
|
||||
|
||||
diff --git a/adb/adb.cpp b/adb/adb.cpp
|
||||
index c3e9731a3..efc1b853f 100644
|
||||
--- a/adb/adb.cpp
|
||||
+++ b/adb/adb.cpp
|
||||
@@ -66,10 +66,6 @@ using namespace std::chrono_literals;
|
||||
#include "daemon/logging.h"
|
||||
#endif
|
||||
|
||||
-#if ADB_HOST
|
||||
-#include "client/usb.h"
|
||||
-#endif
|
||||
-
|
||||
std::string adb_version() {
|
||||
// Don't change the format of this --- it's parsed by ddmlib.
|
||||
return android::base::StringPrintf(
|
||||
diff --git a/adb/adb.h b/adb/adb.h
|
||||
index ce12a55f9..86d205c98 100644
|
||||
--- a/adb/adb.h
|
||||
+++ b/adb/adb.h
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "fdevent/fdevent.h"
|
||||
#include "socket.h"
|
||||
#include "types.h"
|
||||
+#include "usb.h"
|
||||
|
||||
constexpr size_t MAX_PAYLOAD_V1 = 4 * 1024;
|
||||
constexpr size_t MAX_PAYLOAD = 1024 * 1024;
|
||||
@@ -138,6 +139,7 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply
|
||||
|
||||
/* initialize a transport object's func pointers and state */
|
||||
int init_socket_transport(atransport* t, unique_fd s, int port, int local);
|
||||
+void init_usb_transport(atransport* t, usb_handle* usb);
|
||||
|
||||
std::string getEmulatorSerialString(int console_port);
|
||||
#if ADB_HOST
|
||||
@@ -250,5 +252,4 @@ void update_transport_status();
|
||||
// Wait until device scan has completed and every transport is ready, or a timeout elapses.
|
||||
void adb_wait_for_device_initialization();
|
||||
|
||||
-void usb_init();
|
||||
#endif
|
||||
diff --git a/adb/client/main.cpp b/adb/client/main.cpp
|
||||
index 78f7b8f20..a85a18c4e 100644
|
||||
--- a/adb/client/main.cpp
|
||||
+++ b/adb/client/main.cpp
|
||||
@@ -36,7 +36,6 @@
|
||||
#include "adb_listeners.h"
|
||||
#include "adb_utils.h"
|
||||
#include "adb_wifi.h"
|
||||
-#include "client/usb.h"
|
||||
#include "commandline.h"
|
||||
#include "sysdeps/chrono.h"
|
||||
#include "transport.h"
|
||||
diff --git a/adb/client/usb_dispatch.cpp b/adb/client/usb_dispatch.cpp
|
||||
index 7b97117de..f55ae9010 100644
|
||||
--- a/adb/client/usb_dispatch.cpp
|
||||
+++ b/adb/client/usb_dispatch.cpp
|
||||
@@ -15,8 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <android-base/logging.h>
|
||||
-
|
||||
-#include "client/usb.h"
|
||||
+#include "usb.h"
|
||||
|
||||
void usb_init() {
|
||||
if (should_use_libusb()) {
|
||||
diff --git a/adb/client/usb_libusb.cpp b/adb/client/usb_libusb.cpp
|
||||
index 07cbc9418..53f01a0ce 100644
|
||||
--- a/adb/client/usb_libusb.cpp
|
||||
+++ b/adb/client/usb_libusb.cpp
|
||||
@@ -14,9 +14,9 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
-#include "sysdeps.h"
|
||||
+#include "usb.h"
|
||||
|
||||
-#include "client/usb.h"
|
||||
+#include "sysdeps.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "adb.h"
|
||||
#include "adb_utils.h"
|
||||
#include "transport.h"
|
||||
+#include "usb.h"
|
||||
|
||||
using android::base::StringPrintf;
|
||||
|
||||
diff --git a/adb/client/usb_linux.cpp b/adb/client/usb_linux.cpp
|
||||
index 95b1817dc..343e7b59a 100644
|
||||
--- a/adb/client/usb_linux.cpp
|
||||
+++ b/adb/client/usb_linux.cpp
|
||||
@@ -18,8 +18,6 @@
|
||||
|
||||
#include "sysdeps.h"
|
||||
|
||||
-#include "client/usb.h"
|
||||
-
|
||||
#include <ctype.h>
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
@@ -50,6 +48,7 @@
|
||||
|
||||
#include "adb.h"
|
||||
#include "transport.h"
|
||||
+#include "usb.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
using namespace std::literals;
|
||||
diff --git a/adb/client/usb_osx.cpp b/adb/client/usb_osx.cpp
|
||||
index a93fa3a6b..7207ca733 100644
|
||||
--- a/adb/client/usb_osx.cpp
|
||||
+++ b/adb/client/usb_osx.cpp
|
||||
@@ -18,8 +18,6 @@
|
||||
|
||||
#include "sysdeps.h"
|
||||
|
||||
-#include "client/usb.h"
|
||||
-
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
|
||||
#include <IOKit/IOKitLib.h>
|
||||
diff --git a/adb/client/usb_windows.cpp b/adb/client/usb_windows.cpp
|
||||
index e209230c7..197c6fa5c 100644
|
||||
--- a/adb/client/usb_windows.cpp
|
||||
+++ b/adb/client/usb_windows.cpp
|
||||
@@ -18,8 +18,6 @@
|
||||
|
||||
#include "sysdeps.h"
|
||||
|
||||
-#include "client/usb.h"
|
||||
-
|
||||
// clang-format off
|
||||
#include <winsock2.h> // winsock.h *must* be included before windows.h.
|
||||
#include <windows.h>
|
||||
diff --git a/fastboot/device/usb.h b/adb/daemon/include/adbd/usb.h
|
||||
similarity index 84%
|
||||
rename from fastboot/device/usb.h
|
||||
rename to adb/daemon/include/adbd/usb.h
|
||||
index 6c3f54252..2204246c1 100644
|
||||
--- a/fastboot/device/usb.h
|
||||
+++ b/adb/daemon/include/adbd/usb.h
|
||||
@@ -36,14 +36,17 @@ struct aio_block {
|
||||
};
|
||||
|
||||
struct usb_handle {
|
||||
- usb_handle() {}
|
||||
+ usb_handle() : kicked(false) {
|
||||
+ }
|
||||
|
||||
std::condition_variable notify;
|
||||
std::mutex lock;
|
||||
+ std::atomic<bool> kicked;
|
||||
bool open_new_connection = true;
|
||||
|
||||
int (*write)(usb_handle* h, const void* data, int len);
|
||||
int (*read)(usb_handle* h, void* data, int len, bool allow_partial);
|
||||
+ void (*kick)(usb_handle* h);
|
||||
void (*close)(usb_handle* h);
|
||||
|
||||
// FunctionFS
|
||||
@@ -60,4 +63,6 @@ struct usb_handle {
|
||||
size_t io_size;
|
||||
};
|
||||
|
||||
-usb_handle* create_usb_handle(unsigned num_bufs, unsigned io_size);
|
||||
+usb_handle *create_usb_handle(unsigned num_bufs, unsigned io_size);
|
||||
+bool open_functionfs(android::base::unique_fd* control, android::base::unique_fd* bulk_out,
|
||||
+ android::base::unique_fd* bulk_in);
|
||||
diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp
|
||||
index a66387193..b908094d3 100644
|
||||
--- a/adb/daemon/usb.cpp
|
||||
+++ b/adb/daemon/usb.cpp
|
||||
@@ -45,15 +45,19 @@
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/thread_annotations.h>
|
||||
|
||||
+#include <adbd/usb.h>
|
||||
+
|
||||
#include "adb_unique_fd.h"
|
||||
#include "adb_utils.h"
|
||||
-#include "daemon/usb_ffs.h"
|
||||
#include "sysdeps/chrono.h"
|
||||
#include "transport.h"
|
||||
#include "types.h"
|
||||
|
||||
using android::base::StringPrintf;
|
||||
|
||||
+// We can't find out whether we have support for AIO on ffs endpoints until we submit a read.
|
||||
+static std::optional<bool> gFfsAioSupported;
|
||||
+
|
||||
// Not all USB controllers support operations larger than 16k, so don't go above that.
|
||||
// Also, each submitted operation does an allocation in the kernel of that size, so we want to
|
||||
// minimize our queue depth while still maintaining a deep enough queue to keep the USB stack fed.
|
||||
@@ -618,10 +622,17 @@ struct UsbFfsConnection : public Connection {
|
||||
block->pending = true;
|
||||
struct iocb* iocb = &block->control;
|
||||
if (io_submit(aio_context_.get(), 1, &iocb) != 1) {
|
||||
+ if (errno == EINVAL && !gFfsAioSupported.has_value()) {
|
||||
+ HandleError("failed to submit first read, AIO on FFS not supported");
|
||||
+ gFfsAioSupported = false;
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
HandleError(StringPrintf("failed to submit read: %s", strerror(errno)));
|
||||
return false;
|
||||
}
|
||||
|
||||
+ gFfsAioSupported = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -738,10 +749,17 @@ struct UsbFfsConnection : public Connection {
|
||||
static constexpr int kInterruptionSignal = SIGUSR1;
|
||||
};
|
||||
|
||||
+void usb_init_legacy();
|
||||
+
|
||||
static void usb_ffs_open_thread() {
|
||||
adb_thread_setname("usb ffs open");
|
||||
|
||||
while (true) {
|
||||
+ if (gFfsAioSupported.has_value() && !gFfsAioSupported.value()) {
|
||||
+ LOG(INFO) << "failed to use nonblocking ffs, falling back to legacy";
|
||||
+ return usb_init_legacy();
|
||||
+ }
|
||||
+
|
||||
unique_fd control;
|
||||
unique_fd bulk_out;
|
||||
unique_fd bulk_in;
|
||||
@@ -763,5 +781,13 @@ static void usb_ffs_open_thread() {
|
||||
}
|
||||
|
||||
void usb_init() {
|
||||
- std::thread(usb_ffs_open_thread).detach();
|
||||
+ bool use_nonblocking = android::base::GetBoolProperty(
|
||||
+ "persist.adb.nonblocking_ffs",
|
||||
+ android::base::GetBoolProperty("ro.adb.nonblocking_ffs", true));
|
||||
+
|
||||
+ if (use_nonblocking) {
|
||||
+ std::thread(usb_ffs_open_thread).detach();
|
||||
+ } else {
|
||||
+ usb_init_legacy();
|
||||
+ }
|
||||
}
|
||||
diff --git a/adb/daemon/usb_ffs.h b/adb/daemon/usb_dummy.cpp
|
||||
similarity index 52%
|
||||
rename from adb/daemon/usb_ffs.h
|
||||
rename to adb/daemon/usb_dummy.cpp
|
||||
index a19d7ccce..c9bf79731 100644
|
||||
--- a/adb/daemon/usb_ffs.h
|
||||
+++ b/adb/daemon/usb_dummy.cpp
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright (C) 2020 The Android Open Source Project
|
||||
+ * 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.
|
||||
@@ -14,9 +14,29 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
-#pragma once
|
||||
+#include <adbd/usb.h>
|
||||
|
||||
-#include <android-base/unique_fd.h>
|
||||
+#include <android-base/logging.h>
|
||||
|
||||
-bool open_functionfs(android::base::unique_fd* control, android::base::unique_fd* bulk_out,
|
||||
- android::base::unique_fd* bulk_in);
|
||||
+int usb_write(usb_handle*, const void*, int) {
|
||||
+ LOG(FATAL) << "unimplemented";
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+int usb_read(usb_handle*, void*, int) {
|
||||
+ LOG(FATAL) << "unimplemented";
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+int usb_close(usb_handle*) {
|
||||
+ LOG(FATAL) << "unimplemented";
|
||||
+ return -1;
|
||||
+}
|
||||
+
|
||||
+void usb_reset(usb_handle*) {
|
||||
+ LOG(FATAL) << "unimplemented";
|
||||
+}
|
||||
+
|
||||
+void usb_kick(usb_handle*) {
|
||||
+ LOG(FATAL) << "unimplemented";
|
||||
+}
|
||||
diff --git a/adb/daemon/usb_ffs.cpp b/adb/daemon/usb_ffs.cpp
|
||||
index e538ca885..b19fa5d58 100644
|
||||
--- a/adb/daemon/usb_ffs.cpp
|
||||
+++ b/adb/daemon/usb_ffs.cpp
|
||||
@@ -18,8 +18,6 @@
|
||||
|
||||
#include "sysdeps.h"
|
||||
|
||||
-#include "daemon/usb_ffs.h"
|
||||
-
|
||||
#include <linux/usb/ch9.h>
|
||||
#include <linux/usb/functionfs.h>
|
||||
|
||||
@@ -28,6 +26,7 @@
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
#include "adb.h"
|
||||
+#include "adbd/usb.h"
|
||||
|
||||
#define MAX_PACKET_SIZE_FS 64
|
||||
#define MAX_PACKET_SIZE_HS 512
|
||||
diff --git a/fastboot/device/usb.cpp b/adb/daemon/usb_legacy.cpp
|
||||
similarity index 70%
|
||||
rename from fastboot/device/usb.cpp
|
||||
rename to adb/daemon/usb_legacy.cpp
|
||||
index 4bee7b20c..fe80e7d59 100644
|
||||
--- a/fastboot/device/usb.cpp
|
||||
+++ b/adb/daemon/usb_legacy.cpp
|
||||
@@ -14,7 +14,9 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
-#include "usb.h"
|
||||
+#define TRACE_TAG USB
|
||||
+
|
||||
+#include "sysdeps.h"
|
||||
|
||||
#include <dirent.h>
|
||||
#include <errno.h>
|
||||
@@ -39,9 +41,12 @@
|
||||
#include <android-base/logging.h>
|
||||
#include <android-base/properties.h>
|
||||
|
||||
+#include "adb.h"
|
||||
+#include "adbd/usb.h"
|
||||
+#include "transport.h"
|
||||
+
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
-#define D(...)
|
||||
#define MAX_PACKET_SIZE_FS 64
|
||||
#define MAX_PACKET_SIZE_HS 512
|
||||
#define MAX_PACKET_SIZE_SS 1024
|
||||
@@ -51,6 +56,8 @@ using namespace std::chrono_literals;
|
||||
// Number of buffers needed to fit MAX_PAYLOAD, with an extra for ZLPs.
|
||||
#define USB_FFS_NUM_BUFS ((4 * MAX_PAYLOAD / USB_FFS_BULK_SIZE) + 1)
|
||||
|
||||
+static unique_fd& dummy_fd = *new unique_fd();
|
||||
+
|
||||
static void aio_block_init(aio_block* aiob, unsigned num_bufs) {
|
||||
aiob->iocb.resize(num_bufs);
|
||||
aiob->iocbs.resize(num_bufs);
|
||||
@@ -75,6 +82,46 @@ static int getMaxPacketSize(int ffs_fd) {
|
||||
}
|
||||
}
|
||||
|
||||
+static bool init_functionfs(struct usb_handle* h) {
|
||||
+ LOG(INFO) << "initializing functionfs";
|
||||
+ if (!open_functionfs(&h->control, &h->bulk_out, &h->bulk_in)) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ h->read_aiob.fd = h->bulk_out.get();
|
||||
+ h->write_aiob.fd = h->bulk_in.get();
|
||||
+ h->reads_zero_packets = true;
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static void usb_legacy_ffs_open_thread(usb_handle* usb) {
|
||||
+ adb_thread_setname("usb legacy ffs open");
|
||||
+
|
||||
+ while (true) {
|
||||
+ // wait until the USB device needs opening
|
||||
+ std::unique_lock<std::mutex> lock(usb->lock);
|
||||
+ while (!usb->open_new_connection) {
|
||||
+ usb->notify.wait(lock);
|
||||
+ }
|
||||
+ usb->open_new_connection = false;
|
||||
+ lock.unlock();
|
||||
+
|
||||
+ while (true) {
|
||||
+ if (init_functionfs(usb)) {
|
||||
+ LOG(INFO) << "functionfs successfully initialized";
|
||||
+ break;
|
||||
+ }
|
||||
+ std::this_thread::sleep_for(1s);
|
||||
+ }
|
||||
+
|
||||
+ LOG(INFO) << "registering usb transport";
|
||||
+ register_usb_transport(usb, nullptr, nullptr, 1);
|
||||
+ }
|
||||
+
|
||||
+ // never gets here
|
||||
+ abort();
|
||||
+}
|
||||
+
|
||||
static int usb_ffs_write(usb_handle* h, const void* data, int len) {
|
||||
D("about to write (fd=%d, len=%d)", h->bulk_in.get(), len);
|
||||
|
||||
@@ -82,7 +129,7 @@ static int usb_ffs_write(usb_handle* h, const void* data, int len) {
|
||||
int orig_len = len;
|
||||
while (len > 0) {
|
||||
int write_len = std::min(USB_FFS_BULK_SIZE, len);
|
||||
- int n = write(h->bulk_in, buf, write_len);
|
||||
+ int n = adb_write(h->bulk_in, buf, write_len);
|
||||
if (n < 0) {
|
||||
D("ERROR: fd = %d, n = %d: %s", h->bulk_in.get(), n, strerror(errno));
|
||||
return -1;
|
||||
@@ -103,7 +150,7 @@ static int usb_ffs_read(usb_handle* h, void* data, int len, bool allow_partial)
|
||||
unsigned count = 0;
|
||||
while (len > 0) {
|
||||
int read_len = std::min(USB_FFS_BULK_SIZE, len);
|
||||
- int n = read(h->bulk_out, buf, read_len);
|
||||
+ int n = adb_read(h->bulk_out, buf, read_len);
|
||||
if (n < 0) {
|
||||
D("ERROR: fd = %d, n = %d: %s", h->bulk_out.get(), n, strerror(errno));
|
||||
return -1;
|
||||
@@ -185,7 +232,7 @@ static int usb_ffs_do_aio(usb_handle* h, const void* data, int len, bool read) {
|
||||
}
|
||||
}
|
||||
|
||||
-static int usb_ffs_aio_read(usb_handle* h, void* data, int len, bool /* allow_partial */) {
|
||||
+static int usb_ffs_aio_read(usb_handle* h, void* data, int len, bool allow_partial) {
|
||||
return usb_ffs_do_aio(h, data, len, true);
|
||||
}
|
||||
|
||||
@@ -193,9 +240,32 @@ static int usb_ffs_aio_write(usb_handle* h, const void* data, int len) {
|
||||
return usb_ffs_do_aio(h, data, len, false);
|
||||
}
|
||||
|
||||
+static void usb_ffs_kick(usb_handle* h) {
|
||||
+ int err;
|
||||
+
|
||||
+ err = ioctl(h->bulk_in.get(), FUNCTIONFS_CLEAR_HALT);
|
||||
+ if (err < 0) {
|
||||
+ D("[ kick: source (fd=%d) clear halt failed (%d) ]", h->bulk_in.get(), errno);
|
||||
+ }
|
||||
+
|
||||
+ err = ioctl(h->bulk_out.get(), FUNCTIONFS_CLEAR_HALT);
|
||||
+ if (err < 0) {
|
||||
+ D("[ kick: sink (fd=%d) clear halt failed (%d) ]", h->bulk_out.get(), errno);
|
||||
+ }
|
||||
+
|
||||
+ // don't close ep0 here, since we may not need to reinitialize it with
|
||||
+ // the same descriptors again. if however ep1/ep2 fail to re-open in
|
||||
+ // init_functionfs, only then would we close and open ep0 again.
|
||||
+ // Ditto the comment in usb_adb_kick.
|
||||
+ h->kicked = true;
|
||||
+ TEMP_FAILURE_RETRY(dup2(dummy_fd.get(), h->bulk_out.get()));
|
||||
+ TEMP_FAILURE_RETRY(dup2(dummy_fd.get(), h->bulk_in.get()));
|
||||
+}
|
||||
+
|
||||
static void usb_ffs_close(usb_handle* h) {
|
||||
LOG(INFO) << "closing functionfs transport";
|
||||
|
||||
+ h->kicked = false;
|
||||
h->bulk_out.reset();
|
||||
h->bulk_in.reset();
|
||||
|
||||
@@ -221,6 +291,37 @@ usb_handle* create_usb_handle(unsigned num_bufs, unsigned io_size) {
|
||||
aio_block_init(&h->write_aiob, num_bufs);
|
||||
}
|
||||
h->io_size = io_size;
|
||||
+ h->kick = usb_ffs_kick;
|
||||
h->close = usb_ffs_close;
|
||||
return h;
|
||||
}
|
||||
+
|
||||
+void usb_init_legacy() {
|
||||
+ D("[ usb_init - using legacy FunctionFS ]");
|
||||
+ dummy_fd.reset(adb_open("/dev/null", O_WRONLY | O_CLOEXEC));
|
||||
+ CHECK_NE(-1, dummy_fd.get());
|
||||
+
|
||||
+ std::thread(usb_legacy_ffs_open_thread, create_usb_handle(USB_FFS_NUM_BUFS, USB_FFS_BULK_SIZE))
|
||||
+ .detach();
|
||||
+}
|
||||
+
|
||||
+int usb_write(usb_handle* h, const void* data, int len) {
|
||||
+ return h->write(h, data, len);
|
||||
+}
|
||||
+
|
||||
+int usb_read(usb_handle* h, void* data, int len) {
|
||||
+ return h->read(h, data, len, false /* allow_partial */);
|
||||
+}
|
||||
+
|
||||
+int usb_close(usb_handle* h) {
|
||||
+ h->close(h);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void usb_reset(usb_handle* h) {
|
||||
+ usb_close(h);
|
||||
+}
|
||||
+
|
||||
+void usb_kick(usb_handle* h) {
|
||||
+ h->kick(h);
|
||||
+}
|
||||
diff --git a/adb/transport.cpp b/adb/transport.cpp
|
||||
index fe286dee4..f9d7aca53 100644
|
||||
--- a/adb/transport.cpp
|
||||
+++ b/adb/transport.cpp
|
||||
@@ -1453,7 +1453,6 @@ void kick_all_tcp_devices() {
|
||||
|
||||
#endif
|
||||
|
||||
-#if ADB_HOST
|
||||
void register_usb_transport(usb_handle* usb, const char* serial, const char* devpath,
|
||||
unsigned writeable) {
|
||||
atransport* t = new atransport(writeable ? kCsOffline : kCsNoPerm);
|
||||
@@ -1475,7 +1474,6 @@ void register_usb_transport(usb_handle* usb, const char* serial, const char* dev
|
||||
|
||||
register_transport(t);
|
||||
}
|
||||
-#endif
|
||||
|
||||
#if ADB_HOST
|
||||
// This should only be used for transports with connection_state == kCsNoPerm.
|
||||
diff --git a/adb/transport.h b/adb/transport.h
|
||||
index 26d804b3f..895f63ee6 100644
|
||||
--- a/adb/transport.h
|
||||
+++ b/adb/transport.h
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "adb.h"
|
||||
#include "adb_unique_fd.h"
|
||||
#include "types.h"
|
||||
+#include "usb.h"
|
||||
|
||||
typedef std::unordered_set<std::string> FeatureSet;
|
||||
|
||||
@@ -202,6 +203,20 @@ struct FdConnection : public BlockingConnection {
|
||||
std::unique_ptr<adb::tls::TlsConnection> tls_;
|
||||
};
|
||||
|
||||
+struct UsbConnection : public BlockingConnection {
|
||||
+ explicit UsbConnection(usb_handle* handle) : handle_(handle) {}
|
||||
+ ~UsbConnection();
|
||||
+
|
||||
+ bool Read(apacket* packet) override final;
|
||||
+ bool Write(apacket* packet) override final;
|
||||
+ bool DoTlsHandshake(RSA* key, std::string* auth_key) override final;
|
||||
+
|
||||
+ void Close() override final;
|
||||
+ virtual void Reset() override final;
|
||||
+
|
||||
+ usb_handle* handle_;
|
||||
+};
|
||||
+
|
||||
// Waits for a transport's connection to be not pending. This is a separate
|
||||
// object so that the transport can be destroyed and another thread can be
|
||||
// notified of it in a race-free way.
|
||||
@@ -237,10 +252,6 @@ enum class ReconnectResult {
|
||||
Abort,
|
||||
};
|
||||
|
||||
-#if ADB_HOST
|
||||
-struct usb_handle;
|
||||
-#endif
|
||||
-
|
||||
class atransport : public enable_weak_from_this<atransport> {
|
||||
public:
|
||||
// TODO(danalbert): We expose waaaaaaay too much stuff because this was
|
||||
@@ -281,10 +292,8 @@ class atransport : public enable_weak_from_this<atransport> {
|
||||
return connection_;
|
||||
}
|
||||
|
||||
-#if ADB_HOST
|
||||
void SetUsbHandle(usb_handle* h) { usb_handle_ = h; }
|
||||
usb_handle* GetUsbHandle() { return usb_handle_; }
|
||||
-#endif
|
||||
|
||||
const TransportId id;
|
||||
|
||||
@@ -391,10 +400,8 @@ class atransport : public enable_weak_from_this<atransport> {
|
||||
// The underlying connection object.
|
||||
std::shared_ptr<Connection> connection_ GUARDED_BY(mutex_);
|
||||
|
||||
-#if ADB_HOST
|
||||
// USB handle for the connection, if available.
|
||||
usb_handle* usb_handle_ = nullptr;
|
||||
-#endif
|
||||
|
||||
// A callback that will be invoked when the atransport needs to reconnect.
|
||||
ReconnectCallback reconnect_;
|
||||
@@ -435,15 +442,8 @@ void kick_all_transports_by_auth_key(std::string_view auth_key);
|
||||
#endif
|
||||
|
||||
void register_transport(atransport* transport);
|
||||
-
|
||||
-#if ADB_HOST
|
||||
-void init_usb_transport(atransport* t, usb_handle* usb);
|
||||
-void register_usb_transport(usb_handle* h, const char* serial, const char* devpath,
|
||||
- unsigned writeable);
|
||||
-
|
||||
-// This should only be used for transports with connection_state == kCsNoPerm.
|
||||
-void unregister_usb_transport(usb_handle* usb);
|
||||
-#endif
|
||||
+void register_usb_transport(usb_handle* h, const char* serial,
|
||||
+ const char* devpath, unsigned writeable);
|
||||
|
||||
/* Connect to a network address and register it as a device */
|
||||
void connect_device(const std::string& address, std::string* response);
|
||||
@@ -453,6 +453,9 @@ bool register_socket_transport(unique_fd s, std::string serial, int port, int lo
|
||||
atransport::ReconnectCallback reconnect, bool use_tls,
|
||||
int* error = nullptr);
|
||||
|
||||
+// This should only be used for transports with connection_state == kCsNoPerm.
|
||||
+void unregister_usb_transport(usb_handle* usb);
|
||||
+
|
||||
bool check_header(apacket* p, atransport* t);
|
||||
|
||||
void close_usb_devices(bool reset = false);
|
||||
diff --git a/adb/client/transport_usb.cpp b/adb/transport_usb.cpp
|
||||
similarity index 97%
|
||||
rename from adb/client/transport_usb.cpp
|
||||
rename to adb/transport_usb.cpp
|
||||
index 777edde0b..fb81b37e0 100644
|
||||
--- a/adb/client/transport_usb.cpp
|
||||
+++ b/adb/transport_usb.cpp
|
||||
@@ -16,10 +16,6 @@
|
||||
|
||||
#define TRACE_TAG TRANSPORT
|
||||
|
||||
-#include "sysdeps.h"
|
||||
-
|
||||
-#include "client/usb.h"
|
||||
-
|
||||
#include <memory>
|
||||
|
||||
#include "sysdeps.h"
|
||||
@@ -139,8 +135,8 @@ static int remote_read(apacket* p, usb_handle* usb) {
|
||||
}
|
||||
|
||||
p->payload.resize(p->msg.data_length);
|
||||
- if (usb_read(usb, &p->payload[0], p->payload.size()) !=
|
||||
- static_cast<int>(p->payload.size())) {
|
||||
+ if (usb_read(usb, &p->payload[0], p->payload.size())
|
||||
+ != static_cast<int>(p->payload.size())) {
|
||||
PLOG(ERROR) << "remote usb: terminated (data)";
|
||||
return -1;
|
||||
}
|
||||
diff --git a/adb/client/usb.h b/adb/usb.h
|
||||
similarity index 72%
|
||||
rename from adb/client/usb.h
|
||||
rename to adb/usb.h
|
||||
index b371788cc..eb8ca6cc0 100644
|
||||
--- a/adb/client/usb.h
|
||||
+++ b/adb/usb.h
|
||||
@@ -18,9 +18,6 @@
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
-#include "adb.h"
|
||||
-#include "transport.h"
|
||||
-
|
||||
// USB host/client interface.
|
||||
|
||||
#define ADB_USB_INTERFACE(handle_ref_type) \
|
||||
@@ -33,38 +30,35 @@
|
||||
void usb_kick(handle_ref_type h); \
|
||||
size_t usb_get_max_packet_size(handle_ref_type)
|
||||
|
||||
+#if !ADB_HOST
|
||||
+// The daemon has a single implementation.
|
||||
+
|
||||
+struct usb_handle;
|
||||
+ADB_USB_INTERFACE(usb_handle*);
|
||||
+
|
||||
+#else // linux host || darwin
|
||||
// Linux and Darwin clients have native and libusb implementations.
|
||||
|
||||
namespace libusb {
|
||||
-struct usb_handle;
|
||||
-ADB_USB_INTERFACE(libusb::usb_handle*);
|
||||
-} // namespace libusb
|
||||
+ struct usb_handle;
|
||||
+ ADB_USB_INTERFACE(libusb::usb_handle*);
|
||||
+}
|
||||
|
||||
namespace native {
|
||||
-struct usb_handle;
|
||||
-ADB_USB_INTERFACE(native::usb_handle*);
|
||||
-} // namespace native
|
||||
+ struct usb_handle;
|
||||
+ ADB_USB_INTERFACE(native::usb_handle*);
|
||||
+}
|
||||
|
||||
// Empty base that both implementations' opaque handles inherit from.
|
||||
-struct usb_handle {};
|
||||
+struct usb_handle {
|
||||
+};
|
||||
|
||||
ADB_USB_INTERFACE(::usb_handle*);
|
||||
|
||||
+#endif // linux host || darwin
|
||||
+
|
||||
+
|
||||
// USB device detection.
|
||||
int is_adb_interface(int usb_class, int usb_subclass, int usb_protocol);
|
||||
|
||||
bool should_use_libusb();
|
||||
-
|
||||
-struct UsbConnection : public BlockingConnection {
|
||||
- explicit UsbConnection(usb_handle* handle) : handle_(handle) {}
|
||||
- ~UsbConnection();
|
||||
-
|
||||
- bool Read(apacket* packet) override final;
|
||||
- bool Write(apacket* packet) override final;
|
||||
- bool DoTlsHandshake(RSA* key, std::string* auth_key) override final;
|
||||
-
|
||||
- void Close() override final;
|
||||
- virtual void Reset() override final;
|
||||
-
|
||||
- usb_handle* handle_;
|
||||
-};
|
||||
diff --git a/fastboot/Android.bp b/fastboot/Android.bp
|
||||
index cf0f1ac93..aace6a6cb 100644
|
||||
--- a/fastboot/Android.bp
|
||||
+++ b/fastboot/Android.bp
|
||||
@@ -115,7 +115,6 @@ cc_binary {
|
||||
"device/fastboot_device.cpp",
|
||||
"device/flashing.cpp",
|
||||
"device/main.cpp",
|
||||
- "device/usb.cpp",
|
||||
"device/usb_client.cpp",
|
||||
"device/tcp_client.cpp",
|
||||
"device/utility.cpp",
|
||||
@@ -128,6 +127,7 @@ cc_binary {
|
||||
"android.hardware.boot@1.1",
|
||||
"android.hardware.fastboot@1.0",
|
||||
"android.hardware.health@2.0",
|
||||
+ "libadbd",
|
||||
"libasyncio",
|
||||
"libbase",
|
||||
"libbootloader_message",
|
||||
diff --git a/fastboot/device/usb_client.h b/fastboot/device/usb_client.h
|
||||
index e702a0d22..e6a1a8b8c 100644
|
||||
--- a/fastboot/device/usb_client.h
|
||||
+++ b/fastboot/device/usb_client.h
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
#include <memory>
|
||||
|
||||
-#include "usb.h"
|
||||
+#include <adbd/usb.h>
|
||||
|
||||
#include "transport.h"
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,32 @@
|
||||
From 69b547930f6484cd8b0117b445b4468b9035655b Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 28 Sep 2020 21:41:34 +0200
|
||||
Subject: [PATCH 7/7] Enable PASSCRED incoditionnally. This is needed on A-only
|
||||
devices that cant set passcred on socket
|
||||
|
||||
Change-Id: I74168aa94d91fd91e1baa321582a2b2893efa3af
|
||||
---
|
||||
logd/LogListener.cpp | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/logd/LogListener.cpp b/logd/LogListener.cpp
|
||||
index ba610424f..4f1df46fa 100644
|
||||
--- a/logd/LogListener.cpp
|
||||
+++ b/logd/LogListener.cpp
|
||||
@@ -121,11 +121,8 @@ int LogListener::getLogSocket() {
|
||||
if (sock < 0) { // logd started up in init.sh
|
||||
sock = socket_local_server(
|
||||
socketName, ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_DGRAM);
|
||||
-
|
||||
- int on = 1;
|
||||
- if (setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on))) {
|
||||
- return -1;
|
||||
- }
|
||||
}
|
||||
+ int on = 1;
|
||||
+ setsockopt(sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
|
||||
return sock;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 286db70cc6de5cf8f8642cdfb27ae76922f97abb Mon Sep 17 00:00:00 2001
|
||||
From: Luca Stefani <luca.stefani.ge1@gmail.com>
|
||||
Date: Wed, 9 Sep 2020 12:43:54 +0200
|
||||
Subject: [PATCH] libfscrypt: Bail out if we can't open directory
|
||||
|
||||
* On QCOM Q vendor init.qcom.rc has a 'mkdir' entry
|
||||
for /data/system
|
||||
* While the encryption policy matches and is applied properly in
|
||||
permissive, vendor_init doesn't have enough perms to open
|
||||
and run ioctl over system_data_file to check its policy
|
||||
* Instead of opening the possiblity to vendors, just
|
||||
bail out if we fail to open the directory
|
||||
|
||||
Test: m, boot r-gsi on Zenfone 6
|
||||
Change-Id: I5ea37019221cd0887b8a5d7454f5a42ac01335c7
|
||||
---
|
||||
libfscrypt/fscrypt.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libfscrypt/fscrypt.cpp b/libfscrypt/fscrypt.cpp
|
||||
index a52ed90c..435de51d 100644
|
||||
--- a/libfscrypt/fscrypt.cpp
|
||||
+++ b/libfscrypt/fscrypt.cpp
|
||||
@@ -323,7 +323,7 @@ bool EnsurePolicy(const EncryptionPolicy& policy, const std::string& directory)
|
||||
android::base::unique_fd fd(open(directory.c_str(), O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC));
|
||||
if (fd == -1) {
|
||||
PLOG(ERROR) << "Failed to open directory " << directory;
|
||||
- return false;
|
||||
+ return true;
|
||||
}
|
||||
|
||||
bool already_encrypted = fscrypt_is_encrypted(fd);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,33 @@
|
||||
From f287850503008d796b7873e5fc0b06981c2318fe Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sun, 20 Sep 2020 20:53:14 +0200
|
||||
Subject: [PATCH 1/2] Disable vndk.lite
|
||||
|
||||
Change-Id: I129bbee49f6c9b901ca4f5cf55dae2ec36bea107
|
||||
---
|
||||
modules/environment.cc | 6 ++----
|
||||
1 file changed, 2 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/modules/environment.cc b/modules/environment.cc
|
||||
index e63be71..bc2630b 100644
|
||||
--- a/modules/environment.cc
|
||||
+++ b/modules/environment.cc
|
||||
@@ -24,13 +24,11 @@ namespace android {
|
||||
namespace linkerconfig {
|
||||
namespace modules {
|
||||
bool IsLegacyDevice() {
|
||||
- return (!Variables::GetValue("ro.vndk.version").has_value() &&
|
||||
- !Variables::GetValue("ro.vndk.lite").has_value()) ||
|
||||
- Variables::GetValue("ro.treble.enabled") == "false";
|
||||
+ return false;
|
||||
}
|
||||
|
||||
bool IsVndkLiteDevice() {
|
||||
- return Variables::GetValue("ro.vndk.lite").value_or("") == "true";
|
||||
+ return false;
|
||||
}
|
||||
|
||||
bool IsVndkInSystemNamespace() {
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,81 @@
|
||||
From d4880eec8fa830f6c8fe68fe1ebbb05adc5bbbb1 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 28 Sep 2020 21:02:19 +0200
|
||||
Subject: [PATCH 2/2] Add special handling of vndk 26 (remove liblog.so from
|
||||
llndk, it is provided by vndk, and allow linking against libnativeloader)
|
||||
|
||||
Change-Id: I29b0bb6087ba58f69ee6406e003513bceb6785d8
|
||||
---
|
||||
contents/namespace/vendordefault.cc | 16 ++++++++++++++--
|
||||
contents/namespace/vndk.cc | 5 +++++
|
||||
2 files changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/contents/namespace/vendordefault.cc b/contents/namespace/vendordefault.cc
|
||||
index 6d56904..c93c489 100644
|
||||
--- a/contents/namespace/vendordefault.cc
|
||||
+++ b/contents/namespace/vendordefault.cc
|
||||
@@ -17,6 +17,7 @@
|
||||
// This is the default linker namespace for a vendor process (a process started
|
||||
// from /vendor/bin/*).
|
||||
|
||||
+#include <iostream>
|
||||
#include "linkerconfig/namespacebuilder.h"
|
||||
|
||||
#include "linkerconfig/common.h"
|
||||
@@ -92,7 +93,7 @@ Namespace BuildVendorDefaultNamespace([[maybe_unused]] const Context& ctx) {
|
||||
AsanPath::SAME_PATH);
|
||||
}
|
||||
|
||||
- if (ctx.IsDefaultConfig() && GetVendorVndkVersion() == "27") {
|
||||
+ if (ctx.IsDefaultConfig() && (GetVendorVndkVersion() == "27" || GetVendorVndkVersion()== "26")) {
|
||||
ns.AddSearchPath("/vendor/${LIB}/hw", AsanPath::WITH_DATA_ASAN);
|
||||
ns.AddSearchPath("/vendor/${LIB}/egl", AsanPath::WITH_DATA_ASAN);
|
||||
}
|
||||
@@ -107,9 +108,20 @@ Namespace BuildVendorDefaultNamespace([[maybe_unused]] const Context& ctx) {
|
||||
ns.AddRequires(kVndkLiteVendorRequires);
|
||||
ns.AddProvides(GetSystemStubLibraries());
|
||||
} else {
|
||||
+ auto llndk = Var("LLNDK_LIBRARIES_VENDOR");
|
||||
+ std::cerr << "handing llndk for default vendor namespace" << std::endl;
|
||||
+ if(GetVendorVndkVersion()== "26") {
|
||||
+ std::cerr << "vndk 26" << std::endl;
|
||||
+ std::string lookFor = ":liblog.so";
|
||||
+ std::cerr << "Before " << llndk << std::endl;
|
||||
+
|
||||
+ llndk = llndk.replace(llndk.find(lookFor), lookFor.length(), "");
|
||||
+ std::cerr << "After " << llndk << std::endl;
|
||||
+ }
|
||||
+
|
||||
ns.GetLink(ctx.GetSystemNamespaceName())
|
||||
.AddSharedLib(
|
||||
- {Var("LLNDK_LIBRARIES_VENDOR"), Var("SANITIZER_DEFAULT_VENDOR")});
|
||||
+ {llndk, Var("SANITIZER_DEFAULT_VENDOR")});
|
||||
ns.GetLink("vndk").AddSharedLib({Var("VNDK_SAMEPROCESS_LIBRARIES_VENDOR"),
|
||||
Var("VNDK_CORE_LIBRARIES_VENDOR")});
|
||||
if (android::linkerconfig::modules::IsVndkInSystemNamespace()) {
|
||||
diff --git a/contents/namespace/vndk.cc b/contents/namespace/vndk.cc
|
||||
index a95db80..589f745 100644
|
||||
--- a/contents/namespace/vndk.cc
|
||||
+++ b/contents/namespace/vndk.cc
|
||||
@@ -17,6 +17,7 @@
|
||||
// This namespace is exclusively for vndk-sp libs.
|
||||
|
||||
#include "linkerconfig/environment.h"
|
||||
+using android::linkerconfig::modules::GetVendorVndkVersion;
|
||||
#include "linkerconfig/namespacebuilder.h"
|
||||
|
||||
using android::linkerconfig::modules::AsanPath;
|
||||
@@ -121,6 +122,10 @@ Namespace BuildVndkNamespace([[maybe_unused]] const Context& ctx,
|
||||
|
||||
ns.AddRequires(std::vector{"libneuralnetworks.so"});
|
||||
|
||||
+ if(GetVendorVndkVersion() == "26" || GetVendorVndkVersion() == "27" ) {
|
||||
+ ns.GetLink("com_android_art").AddSharedLib("libnativeloader.so");
|
||||
+ }
|
||||
+
|
||||
return ns;
|
||||
}
|
||||
} // namespace contents
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,28 @@
|
||||
From 791aba3f1be4cf9ba56a94d1744cc308ac439a2b Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 28 Sep 2020 22:03:00 +0200
|
||||
Subject: [PATCH] Enable passcred (useful on A-only when init cant do it for
|
||||
us)
|
||||
|
||||
Change-Id: I0984518531011276acf21c4f226dea35a7f9373f
|
||||
---
|
||||
lmkd.cpp | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/lmkd.cpp b/lmkd.cpp
|
||||
index 882ae4a..2f1c649 100644
|
||||
--- a/lmkd.cpp
|
||||
+++ b/lmkd.cpp
|
||||
@@ -2924,6 +2924,9 @@ static int init(void) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ int on = 1;
|
||||
+ setsockopt(ctrl_sock.sock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
|
||||
+
|
||||
ret = listen(ctrl_sock.sock, MAX_DATA_CONN);
|
||||
if (ret < 0) {
|
||||
ALOGE("lmkd control socket listen failed (errno=%d)", errno);
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,25 @@
|
||||
From 32affddf47a6a3aba580707f349565b3655a16b7 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sat, 17 Feb 2018 19:39:38 +0100
|
||||
Subject: [PATCH 1/6] Allow deletion of symlink
|
||||
|
||||
Change-Id: I9731895f88729072297f753088583aabbe6990f4
|
||||
---
|
||||
FsCrypt.cpp | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/FsCrypt.cpp b/FsCrypt.cpp
|
||||
index e21524a..ca8e6f9 100644
|
||||
--- a/FsCrypt.cpp
|
||||
+++ b/FsCrypt.cpp
|
||||
@@ -313,6 +313,7 @@ static bool prepare_dir(const std::string& dir, mode_t mode, uid_t uid, gid_t gi
|
||||
static bool destroy_dir(const std::string& dir) {
|
||||
LOG(DEBUG) << "Destroying: " << dir;
|
||||
if (rmdir(dir.c_str()) != 0 && errno != ENOENT) {
|
||||
+ if(unlink(dir.c_str()) == 0) return true;
|
||||
PLOG(ERROR) << "Failed to destroy " << dir;
|
||||
return false;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,44 @@
|
||||
From f19e29be30ae859c084bebd2d5c32f7ff94bc31f Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 20 Aug 2018 22:37:54 +0200
|
||||
Subject: [PATCH 2/6] Support Samsung's implementation of exfat, called sdfat
|
||||
|
||||
---
|
||||
fs/Exfat.cpp | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/fs/Exfat.cpp b/fs/Exfat.cpp
|
||||
index 34f1024..3aa9494 100644
|
||||
--- a/fs/Exfat.cpp
|
||||
+++ b/fs/Exfat.cpp
|
||||
@@ -35,7 +35,7 @@ static const char* kFsckPath = "/system/bin/fsck.exfat";
|
||||
|
||||
bool IsSupported() {
|
||||
return access(kMkfsPath, X_OK) == 0 && access(kFsckPath, X_OK) == 0 &&
|
||||
- IsFilesystemSupported("exfat");
|
||||
+ (IsFilesystemSupported("exfat") || IsFilesystemSupported("sdfat"));
|
||||
}
|
||||
|
||||
status_t Check(const std::string& source) {
|
||||
@@ -61,13 +61,16 @@ status_t Mount(const std::string& source, const std::string& target, int ownerUi
|
||||
auto mountData = android::base::StringPrintf("uid=%d,gid=%d,fmask=%o,dmask=%o", ownerUid,
|
||||
ownerGid, permMask, permMask);
|
||||
|
||||
- if (mount(source.c_str(), target.c_str(), "exfat", mountFlags, mountData.c_str()) == 0) {
|
||||
+ const char *fs = "exfat";
|
||||
+ if(IsFilesystemSupported("sdfat"))
|
||||
+ fs = "sdfat";
|
||||
+ if (mount(source.c_str(), target.c_str(), fs, mountFlags, mountData.c_str()) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
PLOG(ERROR) << "Mount failed; attempting read-only";
|
||||
mountFlags |= MS_RDONLY;
|
||||
- if (mount(source.c_str(), target.c_str(), "exfat", mountFlags, mountData.c_str()) == 0) {
|
||||
+ if (mount(source.c_str(), target.c_str(), fs, mountFlags, mountData.c_str()) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,41 @@
|
||||
From d6f033bfbd7c03b30a23b287e84b1608c35d6038 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 16 Sep 2019 13:49:05 +0200
|
||||
Subject: [PATCH] Check needsCheckpoint only if checkpoint is supported
|
||||
|
||||
This is needed because some devices (Xiaomi MiPad 4, uncertified)
|
||||
declares a bootctrl HAL in manifest, but doesn't have it.
|
||||
vold will then hang in needsCheckpoint waiting for bootctrl
|
||||
|
||||
Change-Id: I2dafcbca7e994d7a3ac36ef3698590db2ab482fa
|
||||
---
|
||||
cryptfs.cpp | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/cryptfs.cpp b/cryptfs.cpp
|
||||
index 063c5be..df48b15 100644
|
||||
--- a/cryptfs.cpp
|
||||
+++ b/cryptfs.cpp
|
||||
@@ -1363,7 +1363,7 @@ static int create_crypto_blk_dev_hw(struct crypt_mnt_ftr* crypt_ftr, const unsig
|
||||
load_count = load_crypto_mapping_table(crypt_ftr, master_key, real_blk_name, name, fd,
|
||||
extra_params);
|
||||
}
|
||||
-
|
||||
+
|
||||
if (load_count < 0) {
|
||||
SLOGE("Cannot load dm-crypt mapping table.\n");
|
||||
goto errout;
|
||||
@@ -1963,7 +1963,9 @@ static int cryptfs_restart_internal(int restart_main) {
|
||||
SLOGE("Failed to setexeccon");
|
||||
return -1;
|
||||
}
|
||||
- bool needs_cp = android::vold::cp_needsCheckpoint();
|
||||
+ bool supportsCheckpoint = false;
|
||||
+ android::vold::cp_supportsCheckpoint(supportsCheckpoint);
|
||||
+ bool needs_cp = supportsCheckpoint && android::vold::cp_needsCheckpoint();
|
||||
#ifdef CONFIG_HW_DISK_ENCRYPTION
|
||||
while ((mount_rc = fs_mgr_do_mount(&fstab_default, DATA_MNT_POINT, blkdev.data(), 0,
|
||||
needs_cp, false)) != 0) {
|
||||
--
|
||||
2.25.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From 8ffe3b736fa6736eb12951977eabdde6cd999359 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Tue, 28 Jan 2020 00:27:17 +0100
|
||||
Subject: [PATCH 4/6] Sony has `texfat` exfat fs
|
||||
|
||||
---
|
||||
fs/Exfat.cpp | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/fs/Exfat.cpp b/fs/Exfat.cpp
|
||||
index 3aa9494..03ad649 100644
|
||||
--- a/fs/Exfat.cpp
|
||||
+++ b/fs/Exfat.cpp
|
||||
@@ -35,7 +35,11 @@ static const char* kFsckPath = "/system/bin/fsck.exfat";
|
||||
|
||||
bool IsSupported() {
|
||||
return access(kMkfsPath, X_OK) == 0 && access(kFsckPath, X_OK) == 0 &&
|
||||
- (IsFilesystemSupported("exfat") || IsFilesystemSupported("sdfat"));
|
||||
+ (
|
||||
+ IsFilesystemSupported("exfat") ||
|
||||
+ IsFilesystemSupported("sdfat") ||
|
||||
+ IsFilesystemSupported("texfat")
|
||||
+ );
|
||||
}
|
||||
|
||||
status_t Check(const std::string& source) {
|
||||
@@ -64,6 +68,8 @@ status_t Mount(const std::string& source, const std::string& target, int ownerUi
|
||||
const char *fs = "exfat";
|
||||
if(IsFilesystemSupported("sdfat"))
|
||||
fs = "sdfat";
|
||||
+ if(IsFilesystemSupported("texfat"))
|
||||
+ fs = "texfat";
|
||||
if (mount(source.c_str(), target.c_str(), fs, mountFlags, mountData.c_str()) == 0) {
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,38 @@
|
||||
From f558003318cd010d46dc3fca1508cf282d4ca56b Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sat, 7 Mar 2020 14:49:09 +0100
|
||||
Subject: [PATCH 5/6] Failing to create facedata shouldn't be fatal
|
||||
|
||||
Some Pie vendors create it on their own, so SELinux would deny that
|
||||
Also not all devices have face unlock anyway
|
||||
|
||||
See https://github.com/phhusson/treble_experimentations/issues/1119
|
||||
---
|
||||
vold_prepare_subdirs.cpp | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/vold_prepare_subdirs.cpp b/vold_prepare_subdirs.cpp
|
||||
index d624d73..60056f3 100644
|
||||
--- a/vold_prepare_subdirs.cpp
|
||||
+++ b/vold_prepare_subdirs.cpp
|
||||
@@ -164,7 +164,7 @@ static bool prepare_subdirs(const std::string& volume_uuid, int user_id, int fla
|
||||
}
|
||||
auto facedata_path = vendor_de_path + "/facedata";
|
||||
if (!prepare_dir(sehandle, 0700, AID_SYSTEM, AID_SYSTEM, facedata_path)) {
|
||||
- return false;
|
||||
+ LOG(ERROR) << "Failed preparing folder for de facedata";
|
||||
}
|
||||
}
|
||||
if (flags & android::os::IVold::STORAGE_FLAG_CE) {
|
||||
@@ -187,7 +187,7 @@ static bool prepare_subdirs(const std::string& volume_uuid, int user_id, int fla
|
||||
auto vendor_ce_path = android::vold::BuildDataVendorCePath(user_id);
|
||||
auto facedata_path = vendor_ce_path + "/facedata";
|
||||
if (!prepare_dir(sehandle, 0700, AID_SYSTEM, AID_SYSTEM, facedata_path)) {
|
||||
- return false;
|
||||
+ LOG(ERROR) << "Failed preparing folder for de facedata";
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
@ -0,0 +1,25 @@
|
||||
From c1ccb433badede868ab164e0b74d942fa6341559 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Wed, 11 Mar 2020 14:02:35 +0100
|
||||
Subject: [PATCH 6/6] Every voldmanaged storage is adoptable
|
||||
|
||||
---
|
||||
main.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/main.cpp b/main.cpp
|
||||
index ebe5510..113d9b9 100644
|
||||
--- a/main.cpp
|
||||
+++ b/main.cpp
|
||||
@@ -249,7 +249,7 @@ static int process_config(VolumeManager* vm, bool* has_adoptable, bool* has_quot
|
||||
std::string nickname(entry.label);
|
||||
int flags = 0;
|
||||
|
||||
- if (entry.is_encryptable()) {
|
||||
+ if (entry.is_encryptable() || true) {
|
||||
flags |= android::vold::Disk::Flags::kAdoptable;
|
||||
*has_adoptable = true;
|
||||
}
|
||||
--
|
||||
2.17.1
|
||||
|
Loading…
x
Reference in New Issue
Block a user