Initial unified commit for Android 14, with "light" GSI target

This commit is contained in:
Andy CrossGate Yan
2024-02-17 16:48:27 +08:00
commit ea765d3ff5
117 changed files with 15033 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
From 1a8eee6d2a1d79412902331b74283eec77414c6b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 19 Feb 2022 08:20:25 -0500
Subject: [PATCH 1/2] Add new mechanism to fake vendor props on a per-process
basis
This reads debug.phh.props.<process name>. If its value is "vendor",
then ro.product.device/ro.product.manufacturer is read from vendor
---
libc/system_properties/system_properties.cpp | 38 ++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/libc/system_properties/system_properties.cpp b/libc/system_properties/system_properties.cpp
index 1cb15c3df..d6e7e3e68 100644
--- a/libc/system_properties/system_properties.cpp
+++ b/libc/system_properties/system_properties.cpp
@@ -35,6 +35,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
+#include <fcntl.h>
#include <new>
@@ -50,6 +51,32 @@
#define SERIAL_DIRTY(serial) ((serial)&1)
#define SERIAL_VALUE_LEN(serial) ((serial) >> 24)
+static char comm[128];
+static bool self_ok = false;
+static char comm_override[PROP_VALUE_MAX];
+
+static void read_self() {
+ //NB: Not atomic, but should be good enough, there is no possible corruption from concurrency
+ if(self_ok) return;
+ self_ok = true;
+
+ int fd = open("/proc/self/comm", O_RDONLY);
+ if(fd<0) return;
+ read(fd, comm, sizeof(comm)-1);
+ for(unsigned i=0; i<sizeof(comm); i++)
+ if(comm[i] == '\n')
+ comm[i] = 0;
+ close(fd);
+
+ //That's calling ourselves but that's fine because we already have self_ok = true
+ char propName[PROP_NAME_MAX];
+ memset(propName, 0, PROP_NAME_MAX);
+ strncpy(propName, "debug.phh.props.", PROP_NAME_MAX - 1);
+ strncat(propName, comm, PROP_NAME_MAX - 1);
+
+ __system_property_get(propName, comm_override);
+}
+
static bool is_dir(const char* pathname) {
struct stat info;
if (stat(pathname, &info) == -1) {
@@ -216,6 +243,17 @@ void SystemProperties::ReadCallback(const prop_info* pi,
}
int SystemProperties::Get(const char* name, char* value) {
+ read_self();
+ if(strcmp(comm_override, "vendor") == 0) {
+ if(strcmp(name, "ro.product.device") == 0) {
+ int r = Get("ro.product.vendor.device", value);
+ if(r>0) return r;
+ }
+ if(strcmp(name, "ro.product.manufacturer") == 0) {
+ int r = Get("ro.product.vendor.manufacturer", value);
+ if(r>0) return r;
+ }
+ }
const prop_info* pi = Find(name);
if (pi != nullptr) {
--
2.34.1

View File

@@ -0,0 +1,145 @@
From ad25fd64270b2c3dc9fbce5e97c2eb75d63f015b Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Thu, 19 Jan 2023 16:44:01 -0500
Subject: [PATCH 2/2] Rework property overriding
- Support property read with callback in addition to previous
constant-size property_get
- Add another class of redirect "keymaster", to redirect to AOSP/GSI
props + SPL based on boot.img
---
libc/system_properties/system_properties.cpp | 77 +++++++++++++++-----
1 file changed, 58 insertions(+), 19 deletions(-)
diff --git a/libc/system_properties/system_properties.cpp b/libc/system_properties/system_properties.cpp
index d6e7e3e68..40ff48bad 100644
--- a/libc/system_properties/system_properties.cpp
+++ b/libc/system_properties/system_properties.cpp
@@ -35,6 +35,7 @@
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
+#include <string.h>
#include <fcntl.h>
#include <new>
@@ -60,23 +61,70 @@ static void read_self() {
if(self_ok) return;
self_ok = true;
- int fd = open("/proc/self/comm", O_RDONLY);
+ char cmdline[128];
+ int fd = open("/proc/self/cmdline", O_RDONLY);
if(fd<0) return;
- read(fd, comm, sizeof(comm)-1);
- for(unsigned i=0; i<sizeof(comm); i++)
- if(comm[i] == '\n')
- comm[i] = 0;
+ read(fd, cmdline, sizeof(cmdline)-1);
+ for(unsigned i=0; i<sizeof(cmdline); i++)
+ if(cmdline[i] == '\n')
+ cmdline[i] = 0;
close(fd);
+ // Truncate to last /, we don't want `/` in the prop
+ const char *c = strrchr(cmdline, '/');
+ if (c != nullptr) {
+ c = c+1;
+ } else {
+ c = cmdline;
+ }
+ // Take only the last 16 bytes (prop names max is 32)
+ if(strlen(c) < 15) {
+ strcpy(comm, c);
+ } else {
+ strcpy(comm, c + strlen(c) - 15);
+ }
+
+
//That's calling ourselves but that's fine because we already have self_ok = true
char propName[PROP_NAME_MAX];
memset(propName, 0, PROP_NAME_MAX);
strncpy(propName, "debug.phh.props.", PROP_NAME_MAX - 1);
- strncat(propName, comm, PROP_NAME_MAX - 1);
+ strncat(propName, comm, PROP_NAME_MAX - strlen(propName) - 1);
+ //async_safe_format_log(ANDROID_LOG_WARN, "libc", "Reading debug prop %s", propName);
__system_property_get(propName, comm_override);
}
+static const char* redirectToProp(const char *name) {
+ read_self();
+ /*if(strstr(name, "ro.keymaster") != nullptr || strstr(name, "security_patch") != nullptr || strstr(name, "release") != nullptr) {
+ async_safe_format_log(ANDROID_LOG_WARN, "libc", "Process/comm %s/%s is reading %s", comm, comm_override, name);
+ }*/
+ if(strcmp(comm_override, "vendor") == 0) {
+ if(strcmp(name, "ro.product.device") == 0) {
+ return "ro.product.vendor.device";
+ }
+ if(strcmp(name, "ro.product.manufacturer") == 0) {
+ return "ro.product.vendor.manufacturer";
+ }
+ }
+ if(strcmp(comm_override, "keymaster") == 0) {
+ if(strcmp(name, "ro.product.model") == 0) {
+ return "ro.keymaster.mod";
+ }
+ if(strcmp(name, "ro.product.brand") == 0) {
+ return "ro.keymaster.brn";
+ }
+ if(strcmp(name, "ro.build.version.release") == 0) {
+ return "ro.keymaster.xxx.release";
+ }
+ if(strcmp(name, "ro.build.version.security_patch") == 0) {
+ return "ro.keymaster.xxx.security_patch";
+ }
+ }
+ return name;
+}
+
static bool is_dir(const char* pathname) {
struct stat info;
if (stat(pathname, &info) == -1) {
@@ -150,17 +198,19 @@ uint32_t SystemProperties::AreaSerial() {
}
const prop_info* SystemProperties::Find(const char* name) {
+ const char* newName = redirectToProp(name);
+
if (!initialized_) {
return nullptr;
}
- prop_area* pa = contexts_->GetPropAreaForName(name);
+ prop_area* pa = contexts_->GetPropAreaForName(newName);
if (!pa) {
async_safe_format_log(ANDROID_LOG_WARN, "libc", "Access denied finding property \"%s\"", name);
return nullptr;
}
- return pa->find(name);
+ return pa->find(newName);
}
static bool is_read_only(const char* name) {
@@ -243,17 +293,6 @@ void SystemProperties::ReadCallback(const prop_info* pi,
}
int SystemProperties::Get(const char* name, char* value) {
- read_self();
- if(strcmp(comm_override, "vendor") == 0) {
- if(strcmp(name, "ro.product.device") == 0) {
- int r = Get("ro.product.vendor.device", value);
- if(r>0) return r;
- }
- if(strcmp(name, "ro.product.manufacturer") == 0) {
- int r = Get("ro.product.vendor.manufacturer", value);
- if(r>0) return r;
- }
- }
const prop_info* pi = Find(name);
if (pi != nullptr) {
--
2.34.1

View File

@@ -0,0 +1,75 @@
From 32c4d23814d4b387226dd4b4abae04663f89afbe Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Wed, 8 Dec 2021 07:04:53 +0000
Subject: [PATCH] Remove init.vndk-nodef.rc
This partially reverts "Deprecate VNDK-lite support from Legacy GSI".
Paired with https://github.com/LineageOS/android_system_core/commit/0b265e35ddf42638fa807f5349a10c40e3d46446, it kicks permissive devices into bootloader.
Given that GSI+permissive won't ever be a Lineage official scenario, revert this only on our side.
Thanks @Kethen for the insight!
Change-Id: I7c14fe5229e953f620bb225fa5c981752d0ac5f9
---
target/product/gsi/Android.mk | 13 -------------
target/product/gsi/init.gsi.rc | 2 --
target/product/gsi/init.vndk-nodef.rc | 3 ---
target/product/gsi_release.mk | 1 -
4 files changed, 19 deletions(-)
delete mode 100644 target/product/gsi/init.vndk-nodef.rc
diff --git a/target/product/gsi/Android.mk b/target/product/gsi/Android.mk
index 107c94f685..0ad39c3610 100644
--- a/target/product/gsi/Android.mk
+++ b/target/product/gsi/Android.mk
@@ -256,16 +256,3 @@ LOCAL_SYSTEM_EXT_MODULE := true
LOCAL_MODULE_RELATIVE_PATH := init
include $(BUILD_PREBUILT)
-
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := init.vndk-nodef.rc
-LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
-LOCAL_LICENSE_CONDITIONS := notice
-LOCAL_NOTICE_FILE := build/soong/licenses/LICENSE
-LOCAL_SRC_FILES := $(LOCAL_MODULE)
-LOCAL_MODULE_CLASS := ETC
-LOCAL_SYSTEM_EXT_MODULE := true
-LOCAL_MODULE_RELATIVE_PATH := gsi
-
-include $(BUILD_PREBUILT)
diff --git a/target/product/gsi/init.gsi.rc b/target/product/gsi/init.gsi.rc
index 69c8e467be..c6faba78d9 100644
--- a/target/product/gsi/init.gsi.rc
+++ b/target/product/gsi/init.gsi.rc
@@ -1,5 +1,3 @@
#
# Android init script for GSI required initialization
#
-
-import /system/system_ext/etc/gsi/init.vndk-${ro.vndk.version:-nodef}.rc
diff --git a/target/product/gsi/init.vndk-nodef.rc b/target/product/gsi/init.vndk-nodef.rc
deleted file mode 100644
index 1b141a05e7..0000000000
--- a/target/product/gsi/init.vndk-nodef.rc
+++ /dev/null
@@ -1,3 +0,0 @@
-on early-init
- # Reboot if BOARD_VNDK_VERSION is not defined
- exec - root -- /system/bin/reboot bootloader
diff --git a/target/product/gsi_release.mk b/target/product/gsi_release.mk
index 3b977927d1..7bade98ca1 100644
--- a/target/product/gsi_release.mk
+++ b/target/product/gsi_release.mk
@@ -62,7 +62,6 @@ PRODUCT_PACKAGES += com.android.apex.cts.shim.v1_with_prebuilts.flattened
PRODUCT_PACKAGES += \
gsi_skip_mount.cfg \
init.gsi.rc \
- init.vndk-nodef.rc \
# Overlay the GSI specific SystemUI setting
PRODUCT_PACKAGES += gsi_overlay_systemui
--
2.34.1

View File

@@ -0,0 +1,326 @@
From b5b0fd54c77d0c5feb3eb20395fa6e2400c41172 Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Thu, 18 Aug 2022 15:44:46 -0400
Subject: [PATCH 1/3] APM: Restore S, R and Q behavior respectively for
telephony audio
This conditionally reverts part of b2e5cb (T), 51c9cc (S) and afd4ce (R)
when the VNDK version is equal to or before S, R and Q respectively.
On R, commit afd4ce made it so that both HW and SW bridging go through
`createAudioPatch()`, which is broken on some devices such as on MTK Q
vendor, because their HAL do not support HW patching via the newer
`createAudioPatch()` method. Instead, the patching on Q was done through
`setOutputDevices()`.
On S, commit 51c9cc refactored the related code again such that HW
bridging for the Rx direction is essentially removed, replaced with SW
bridging through `startAudioSource()`. This is, again, broken on MTK R
vendor devices.
On T, commit b2e5cb applied the same SW bridging to the Tx direction.
All of these commits rely on assumptions that are not tested through
VTS and just presumed to be true. Although we can blame MTK for not
supporting all the possible cases in their HAL, it will not fix
anything, and really frameworks code should not depend on such untested
assumptions.
To work around said issues, we restore old behavior from S, R and Q
relying on the value of `ro.vndk.version`.
Change-Id: I56d36d2aef4319935cb88a3e4771b23c6d5b2145
---
.../managerdefault/AudioPolicyManager.cpp | 206 ++++++++++++------
.../managerdefault/AudioPolicyManager.h | 3 +
2 files changed, 147 insertions(+), 62 deletions(-)
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index f093e685ba..9a90009f9e 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -689,6 +689,17 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
disconnectTelephonyAudioSource(mCallRxSourceClient);
disconnectTelephonyAudioSource(mCallTxSourceClient);
+ // release existing RX patch if any
+ if (mCallRxPatch != 0) {
+ releaseAudioPatchInternal(mCallRxPatch->getHandle());
+ mCallRxPatch.clear();
+ }
+ // release TX patch if any
+ if (mCallTxPatch != 0) {
+ releaseAudioPatchInternal(mCallTxPatch->getHandle());
+ mCallTxPatch.clear();
+ }
+
auto telephonyRxModule =
mHwModules.getModuleForDeviceType(AUDIO_DEVICE_IN_TELEPHONY_RX, AUDIO_FORMAT_DEFAULT);
auto telephonyTxModule =
@@ -711,9 +722,20 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
ALOGE("%s() no telephony Tx and/or RX device", __func__);
return INVALID_OPERATION;
}
- // createAudioPatchInternal now supports both HW / SW bridging
- createRxPatch = true;
- createTxPatch = true;
+ if (property_get_int32("ro.vndk.version", 31) >= 30) {
+ // createAudioPatchInternal now supports both HW / SW bridging
+ createRxPatch = true;
+ createTxPatch = true;
+ } else {
+ // pre-R behavior: some devices before VNDK 30 do not support createAudioPatch correctly
+ // for HW bridging even though they declare support for it
+ // do not create a patch (aka Sw Bridging) if Primary HW module has declared supporting a
+ // route between telephony RX to Sink device and Source device to telephony TX
+ ALOGI("%s() Using pre-R behavior for createRxPatch and createTxPatch", __func__);
+ const auto &primaryModule = telephonyRxModule;
+ createRxPatch = !primaryModule->supportsPatch(rxSourceDevice, rxDevices.itemAt(0));
+ createTxPatch = !primaryModule->supportsPatch(txSourceDevice, txSinkDevice);
+ }
} else {
// If the RX device is on the primary HW module, then use legacy routing method for
// voice calls via setOutputDevice() on primary output.
@@ -730,7 +752,14 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
if (!createRxPatch) {
muteWaitMs = setOutputDevices(mPrimaryOutput, rxDevices, true, delayMs);
} else { // create RX path audio patch
- connectTelephonyRxAudioSource();
+ if (property_get_int32("ro.vndk.version", 31) >= 31) {
+ connectTelephonyRxAudioSource();
+ } else {
+ // pre-S behavior: some devices do not support SW bridging correctly when HW bridge is
+ // available through createAudioPatch(); startAudioSource() forces SW bridging.
+ ALOGI("%s() Using pre-S behavior to create HW Rx patch", __func__);
+ mCallRxPatch = createTelephonyPatch(true /*isRx*/, rxDevices.itemAt(0), delayMs);
+ }
// If the TX device is on the primary HW module but RX device is
// on other HW module, SinkMetaData of telephony input should handle it
// assuming the device uses audio HAL V5.0 and above
@@ -745,7 +774,12 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
closeActiveClients(activeDesc);
}
}
- connectTelephonyTxAudioSource(txSourceDevice, txSinkDevice, delayMs);
+ if (property_get_int32("ro.vndk.version", 33) >= 33) {
+ connectTelephonyTxAudioSource(txSourceDevice, txSinkDevice, delayMs);
+ } else {
+ // pre-T behavior: hw bridging for tx too; skip the SwOutput
+ mCallTxPatch = createTelephonyPatch(false /*isRx*/, txSourceDevice, delayMs);
+ }
}
if (waitMs != nullptr) {
*waitMs = muteWaitMs;
@@ -753,6 +787,36 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
return NO_ERROR;
}
+sp<AudioPatch> AudioPolicyManager::createTelephonyPatch(
+ bool isRx, const sp<DeviceDescriptor> &device, uint32_t delayMs) {
+ PatchBuilder patchBuilder;
+
+ if (device == nullptr) {
+ return nullptr;
+ }
+
+ // @TODO: still ignoring the address, or not dealing platform with multiple telephony devices
+ if (isRx) {
+ patchBuilder.addSink(device).
+ addSource(mAvailableInputDevices.getDevice(
+ AUDIO_DEVICE_IN_TELEPHONY_RX, String8(), AUDIO_FORMAT_DEFAULT));
+ } else {
+ patchBuilder.addSource(device).
+ addSink(mAvailableOutputDevices.getDevice(
+ AUDIO_DEVICE_OUT_TELEPHONY_TX, String8(), AUDIO_FORMAT_DEFAULT));
+ }
+
+ audio_patch_handle_t patchHandle = AUDIO_PATCH_HANDLE_NONE;
+ status_t status =
+ createAudioPatchInternal(patchBuilder.patch(), &patchHandle, mUidCached, delayMs, nullptr);
+ ssize_t index = mAudioPatches.indexOfKey(patchHandle);
+ if (status != NO_ERROR || index < 0) {
+ ALOGW("%s() error %d creating %s audio patch", __func__, status, isRx ? "RX" : "TX");
+ return nullptr;
+ }
+ return mAudioPatches.valueAt(index);
+}
+
bool AudioPolicyManager::isDeviceOfModule(
const sp<DeviceDescriptor>& devDesc, const char *moduleId) const {
sp<HwModule> module = mHwModules.getModuleFromName(moduleId);
@@ -4958,83 +5022,101 @@ status_t AudioPolicyManager::createAudioPatchInternal(const struct audio_patch *
// in config XML to reach the sink so that is can be declared as available.
audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
sp<SwAudioOutputDescriptor> outputDesc;
- if (!sourceDesc->isInternal()) {
- // take care of dynamic routing for SwOutput selection,
- audio_attributes_t attributes = sourceDesc->attributes();
- audio_stream_type_t stream = sourceDesc->stream();
- audio_attributes_t resultAttr;
- audio_config_t config = AUDIO_CONFIG_INITIALIZER;
- config.sample_rate = sourceDesc->config().sample_rate;
- audio_channel_mask_t sourceMask = sourceDesc->config().channel_mask;
- config.channel_mask =
- (audio_channel_mask_get_representation(sourceMask)
- == AUDIO_CHANNEL_REPRESENTATION_INDEX) ? sourceMask
- : audio_channel_mask_in_to_out(sourceMask);
- config.format = sourceDesc->config().format;
- audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE;
- audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
- bool isRequestedDeviceForExclusiveUse = false;
- output_type_t outputType;
- bool isSpatialized;
- bool isBitPerfect;
- getOutputForAttrInt(&resultAttr, &output, AUDIO_SESSION_NONE, &attributes,
- &stream, sourceDesc->uid(), &config, &flags,
- &selectedDeviceId, &isRequestedDeviceForExclusiveUse,
- nullptr, &outputType, &isSpatialized, &isBitPerfect);
- if (output == AUDIO_IO_HANDLE_NONE) {
- ALOGV("%s no output for device %s",
- __FUNCTION__, sinkDevice->toString().c_str());
- return INVALID_OPERATION;
- }
- outputDesc = mOutputs.valueFor(output);
- if (outputDesc->isDuplicated()) {
- ALOGE("%s output is duplicated", __func__);
- return INVALID_OPERATION;
- }
- bool closeOutput = outputDesc->mDirectOpenCount != 0;
- sourceDesc->setSwOutput(outputDesc, closeOutput);
- } else {
- // Same for "raw patches" aka created from createAudioPatch API
- SortedVector<audio_io_handle_t> outputs =
- getOutputsForDevices(DeviceVector(sinkDevice), mOutputs);
- // if the sink device is reachable via an opened output stream, request to
- // go via this output stream by adding a second source to the patch
- // description
- output = selectOutput(outputs);
- if (output == AUDIO_IO_HANDLE_NONE) {
- ALOGE("%s no output available for internal patch sink", __func__);
- return INVALID_OPERATION;
- }
- outputDesc = mOutputs.valueFor(output);
- if (outputDesc->isDuplicated()) {
- ALOGV("%s output for device %s is duplicated",
- __func__, sinkDevice->toString().c_str());
- return INVALID_OPERATION;
+ if (sourceDesc != nullptr) {
+ if (!sourceDesc->isInternal()) {
+ // take care of dynamic routing for SwOutput selection,
+ audio_attributes_t attributes = sourceDesc->attributes();
+ audio_stream_type_t stream = sourceDesc->stream();
+ audio_attributes_t resultAttr;
+ audio_config_t config = AUDIO_CONFIG_INITIALIZER;
+ config.sample_rate = sourceDesc->config().sample_rate;
+ audio_channel_mask_t sourceMask = sourceDesc->config().channel_mask;
+ config.channel_mask =
+ (audio_channel_mask_get_representation(sourceMask)
+ == AUDIO_CHANNEL_REPRESENTATION_INDEX) ? sourceMask
+ : audio_channel_mask_in_to_out(sourceMask);
+ config.format = sourceDesc->config().format;
+ audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE;
+ audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
+ bool isRequestedDeviceForExclusiveUse = false;
+ output_type_t outputType;
+ bool isSpatialized;
+ bool isBitPerfect;
+ getOutputForAttrInt(&resultAttr, &output, AUDIO_SESSION_NONE, &attributes,
+ &stream, sourceDesc->uid(), &config, &flags,
+ &selectedDeviceId, &isRequestedDeviceForExclusiveUse,
+ nullptr, &outputType, &isSpatialized, &isBitPerfect);
+ if (output == AUDIO_IO_HANDLE_NONE) {
+ ALOGV("%s no output for device %s",
+ __FUNCTION__, sinkDevice->toString().c_str());
+ return INVALID_OPERATION;
+ }
+ outputDesc = mOutputs.valueFor(output);
+ if (outputDesc->isDuplicated()) {
+ ALOGE("%s output is duplicated", __func__);
+ return INVALID_OPERATION;
+ }
+ bool closeOutput = outputDesc->mDirectOpenCount != 0;
+ sourceDesc->setSwOutput(outputDesc, closeOutput);
+ } else {
+ // Same for "raw patches" aka created from createAudioPatch API
+ SortedVector<audio_io_handle_t> outputs =
+ getOutputsForDevices(DeviceVector(sinkDevice), mOutputs);
+ // if the sink device is reachable via an opened output stream, request to
+ // go via this output stream by adding a second source to the patch
+ // description
+ output = selectOutput(outputs);
+ if (output == AUDIO_IO_HANDLE_NONE) {
+ ALOGE("%s no output available for internal patch sink", __func__);
+ return INVALID_OPERATION;
+ }
+ outputDesc = mOutputs.valueFor(output);
+ if (outputDesc->isDuplicated()) {
+ ALOGV("%s output for device %s is duplicated",
+ __func__, sinkDevice->toString().c_str());
+ return INVALID_OPERATION;
+ }
}
- sourceDesc->setSwOutput(outputDesc, /* closeOutput= */ false);
}
// create a software bridge in PatchPanel if:
// - source and sink devices are on different HW modules OR
// - audio HAL version is < 3.0
// - audio HAL version is >= 3.0 but no route has been declared between devices
- // - called from startAudioSource (aka sourceDesc is not internal) and source device
+ // - called from startAudioSource (aka sourceDesc is neither null nor internal) and source device
// does not have a gain controller
if (!srcDevice->hasSameHwModuleAs(sinkDevice) ||
(srcDevice->getModuleVersionMajor() < 3) ||
!srcDevice->getModule()->supportsPatch(srcDevice, sinkDevice) ||
- (!sourceDesc->isInternal() &&
+ ((sourceDesc != nullptr && !sourceDesc->isInternal()) &&
srcDevice->getAudioPort()->getGains().size() == 0)) {
// support only one sink device for now to simplify output selection logic
if (patch->num_sinks > 1) {
return INVALID_OPERATION;
}
- sourceDesc->setUseSwBridge();
+ if (sourceDesc == nullptr) {
+ SortedVector<audio_io_handle_t> outputs =
+ getOutputsForDevices(DeviceVector(sinkDevice), mOutputs);
+ // if the sink device is reachable via an opened output stream, request to
+ // go via this output stream by adding a second source to the patch
+ // description
+ output = selectOutput(outputs);
+ if (output != AUDIO_IO_HANDLE_NONE) {
+ outputDesc = mOutputs.valueFor(output);
+ if (outputDesc->isDuplicated()) {
+ ALOGV("%s output for device %s is duplicated",
+ __FUNCTION__, sinkDevice->toString().c_str());
+ return INVALID_OPERATION;
+ }
+ }
+ } else {
+ sourceDesc->setUseSwBridge();
+ }
if (outputDesc != nullptr) {
audio_port_config srcMixPortConfig = {};
outputDesc->toAudioPortConfig(&srcMixPortConfig, nullptr);
// for volume control, we may need a valid stream
srcMixPortConfig.ext.mix.usecase.stream =
- (!sourceDesc->isInternal() || isCallTxAudioSource(sourceDesc)) ?
+ (sourceDesc != nullptr && (!sourceDesc->isInternal() || isCallTxAudioSource(sourceDesc))) ?
mEngine->getStreamTypeForAttributes(sourceDesc->attributes()) :
AUDIO_STREAM_PATCH;
patchBuilder.addSource(srcMixPortConfig);
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 88bafefdb1..188b5732b3 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -953,6 +953,9 @@ protected:
SoundTriggerSessionCollection mSoundTriggerSessions;
+ sp<AudioPatch> mCallTxPatch;
+ sp<AudioPatch> mCallRxPatch;
+
HwAudioOutputCollection mHwOutputs;
SourceClientCollection mAudioSources;
--
2.34.1

View File

@@ -0,0 +1,61 @@
From cf178b74640512639620ed5f99122407225053f8 Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Wed, 24 Aug 2022 15:42:39 -0400
Subject: [PATCH 2/3] APM: Optionally force-load audio policy for system-side
bt audio HAL
Required to support our system-side bt audio implementation, i.e.
`sysbta`.
Co-authored-by: Pierre-Hugues Husson <phh@phh.me>
Change-Id: I279fff541a531f922f3fa55b8f14d00237db59ff
---
.../managerdefinitions/src/Serializer.cpp | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 3d5c1d2e42..881c188e4c 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -25,6 +25,7 @@
#include <libxml/parser.h>
#include <libxml/xinclude.h>
#include <media/convert.h>
+#include <cutils/properties.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
#include <utils/Errors.h>
@@ -885,6 +886,30 @@ status_t PolicySerializer::deserialize(const char *configFile, AudioPolicyConfig
if (status != NO_ERROR) {
return status;
}
+
+ // Remove modules called bluetooth, bluetooth_qti or a2dp, and inject our own
+ if (property_get_bool("persist.bluetooth.system_audio_hal.enabled", false)) {
+ for (auto it = modules.begin(); it != modules.end(); it++) {
+ const char *name = (*it)->getName();
+ if (strcmp(name, "a2dp") == 0 ||
+ strcmp(name, "a2dpsink") == 0 ||
+ strcmp(name, "bluetooth") == 0 ||
+ strcmp(name, "bluetooth_qti") == 0) {
+
+ ALOGE("Removed module %s\n", name);
+ it = modules.erase(it);
+ }
+ if (it == modules.end()) break;
+ }
+ const char* a2dpFileName = "/system/etc/sysbta_audio_policy_configuration.xml";
+ if (version == "7.0")
+ a2dpFileName = "/system/etc/sysbta_audio_policy_configuration_7_0.xml";
+ auto doc = make_xmlUnique(xmlParseFile(a2dpFileName));
+ xmlNodePtr root = xmlDocGetRootElement(doc.get());
+ auto maybeA2dpModule = deserialize<ModuleTraits>(root, config);
+ modules.add(std::get<1>(maybeA2dpModule));
+ }
+
config->setHwModules(modules);
// Global Configuration
--
2.34.1

View File

@@ -0,0 +1,79 @@
From f792286920c7c2c43758a8e1053bab89948bf305 Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Thu, 25 Aug 2022 13:30:29 -0400
Subject: [PATCH 3/3] APM: Remove A2DP audio ports from the primary HAL
These ports defined in the primary HAL are intended for A2DP offloading,
however they do not work in general on GSIs, and will interfere with
sysbta, the system-side generic bluetooth audio implementation.
Remove them as we parse the policy XML.
Co-authored-by: Pierre-Hugues Husson <phh@phh.me>
Change-Id: I3305594a17285da113167b419543543f0ef71122
---
.../managerdefinitions/src/Serializer.cpp | 26 ++++++++++++++++---
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
index 881c188e4c..8519cfdc04 100644
--- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
+++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp
@@ -26,6 +26,7 @@
#include <libxml/xinclude.h>
#include <media/convert.h>
#include <cutils/properties.h>
+#include <system/audio.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
#include <utils/Errors.h>
@@ -334,11 +335,8 @@ status_t PolicySerializer::deserializeCollection(const xmlNode *cur,
Trait::collectionTag);
return status;
}
- } else if (mIgnoreVendorExtensions && std::get<status_t>(maybeElement) == NO_INIT) {
- // Skip a vendor extension element.
- } else {
- return BAD_VALUE;
}
+ // Ignore elements that failed to parse, e.g. routes with invalid sinks
}
}
if (!xmlStrcmp(cur->name, reinterpret_cast<const xmlChar*>(Trait::tag))) {
@@ -679,6 +677,7 @@ std::variant<status_t, ModuleTraits::Element> PolicySerializer::deserialize<Modu
ALOGE("%s: No %s found", __func__, Attributes::name);
return BAD_VALUE;
}
+
uint32_t versionMajor = 0, versionMinor = 0;
std::string versionLiteral = getXmlAttribute(cur, Attributes::version);
if (!versionLiteral.empty()) {
@@ -704,6 +703,25 @@ std::variant<status_t, ModuleTraits::Element> PolicySerializer::deserialize<Modu
if (status != NO_ERROR) {
return status;
}
+ bool shouldEraseA2DP = name == "primary" && property_get_bool("persist.bluetooth.system_audio_hal.enabled", false);
+ if (shouldEraseA2DP) {
+ // Having A2DP ports in the primary audio HAL module will interfere with sysbta
+ // so remove them here. Note that we do not need to explicitly remove the
+ // corresponding routes below, because routes with invalid sinks will be ignored
+ auto iter = devicePorts.begin();
+ while (iter != devicePorts.end()) {
+ auto port = *iter;
+ auto type = port->type();
+ if (type == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP
+ || type == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES
+ || type == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) {
+ ALOGE("Erasing A2DP device port %s", port->getTagName().c_str());
+ iter = devicePorts.erase(iter);
+ } else {
+ iter++;
+ }
+ }
+ }
module->setDeclaredDevices(devicePorts);
RouteTraits::Collection routes;
--
2.34.1

View File

@@ -0,0 +1,39 @@
From 36920a508f5c97585652116c356451ae759bf946 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 25 Oct 2020 23:57:26 +0100
Subject: [PATCH 1/5] Re-implement fnmatch-like behaviour for RRO java-side
T: Also apply to FrameworkParsingPackageUtils (@PeterCxy)
Change-Id: Id38292a9a1453aa87b8401c1fdb390fa4e63c7d1
---
.../pm/parsing/FrameworkParsingPackageUtils.java | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
index b75ba82ad091..b344f7232190 100644
--- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
@@ -223,8 +223,17 @@ public class FrameworkParsingPackageUtils {
continue;
}
// 3. Check if prop is equal to expected value.
- if (!currValue.equals(propValues[i])) {
- return false;
+ final String value = propValues[i];
+ if(value.startsWith("+")) {
+ final java.util.regex.Pattern regex = java.util.regex.Pattern.compile(value.substring(1, value.length()).replace("*", ".*"));
+ java.util.regex.Matcher matcher = regex.matcher(currValue);
+ if (!matcher.find()) {
+ return false;
+ }
+ } else {
+ if(!value.equals(currValue)) {
+ return false;
+ }
}
}
return true;
--
2.34.1

View File

@@ -0,0 +1,46 @@
From 69fbb22f3d265d9baf7ba87c2e0d42671a898037 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sat, 24 Mar 2018 08:01:48 +0100
Subject: [PATCH 2/5] LightsService: Alternative backlight scale
Reserved a manual override just in case
Change-Id: I46ae69c758d1a4609d89cf1c293488ea5fc76787
---
.../com/android/server/lights/LightsService.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index fea6b29d9260..2a9a3b63ea2e 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -32,6 +32,7 @@ import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.os.Trace;
import android.provider.Settings;
import android.util.Slog;
@@ -295,6 +296,18 @@ public class LightsService extends SystemService {
return;
}
int brightnessInt = BrightnessSynchronizer.brightnessFloatToInt(brightness);
+ if (mHwLight.id == 0) {
+ int scaleOverrideValue = SystemProperties.getInt("persist.sys.treble.backlight_scale.override_value", -1);
+ if (scaleOverrideValue != -1) {
+ setLightLocked(brightnessInt * scaleOverrideValue / 255, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+ return;
+ }
+ int scaleValue = SystemProperties.getInt("persist.sys.treble.backlight_scale.value", -1);
+ if (scaleValue != -1) {
+ setLightLocked(brightnessInt * scaleValue / 255, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
+ return;
+ }
+ }
int color = brightnessInt & 0x000000ff;
color = 0xff000000 | (color << 16) | (color << 8) | color;
setLightLocked(color, LIGHT_FLASH_NONE, 0, 0, brightnessMode);
--
2.34.1

View File

@@ -0,0 +1,110 @@
From f5e64bb671b92afc7e9d897c950f3c51aebfe882 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 15 Oct 2022 09:33:56 +0000
Subject: [PATCH 3/5] Revert "Remove more FDE methods from StorageManager"
This reverts commit bd13f84152449a3ead6fa8604fd31f48c0224676.
Change-Id: Ic394934ec27b1a486c60123130825d44dad73412
---
.../android/os/storage/StorageManager.java | 57 +++++++++++++++++++
.../internal/os/RoSystemProperties.java | 4 ++
2 files changed, 61 insertions(+)
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index 80dd48825ba7..cb4769ff4ec3 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1660,6 +1660,15 @@ public class StorageManager {
return false;
}
+ /** {@hide}
+ * Is this device encryptable or already encrypted?
+ * @return true for encryptable or encrypted
+ * false not encrypted and not encryptable
+ */
+ public static boolean isEncryptable() {
+ return RoSystemProperties.CRYPTO_ENCRYPTABLE;
+ }
+
/** {@hide}
* Is this device encrypted?
* <p>
@@ -1693,6 +1702,54 @@ public class StorageManager {
return isFileEncrypted();
}
+ /** {@hide}
+ * Is this device block encrypted?
+ * @return true for block encrypted. (Implies isEncrypted() == true)
+ * false not encrypted or file encrypted
+ */
+ public static boolean isBlockEncrypted() {
+ return false;
+ }
+
+ /** {@hide}
+ * Is this device block encrypted with credentials?
+ * @return true for crediential block encrypted.
+ * (Implies isBlockEncrypted() == true)
+ * false not encrypted, file encrypted or default block encrypted
+ */
+ public static boolean isNonDefaultBlockEncrypted() {
+ return false;
+ }
+
+ /** {@hide}
+ * Is this device in the process of being block encrypted?
+ * @return true for encrypting.
+ * false otherwise
+ * Whether device isEncrypted at this point is undefined
+ * Note that only system services and CryptKeeper will ever see this return
+ * true - no app will ever be launched in this state.
+ * Also note that this state will not change without a teardown of the
+ * framework, so no service needs to check for changes during their lifespan
+ */
+ public static boolean isBlockEncrypting() {
+ return false;
+ }
+
+ /** {@hide}
+ * Is this device non default block encrypted and in the process of
+ * prompting for credentials?
+ * @return true for prompting for credentials.
+ * (Implies isNonDefaultBlockEncrypted() == true)
+ * false otherwise
+ * Note that only system services and CryptKeeper will ever see this return
+ * true - no app will ever be launched in this state.
+ * Also note that this state will not change without a teardown of the
+ * framework, so no service needs to check for changes during their lifespan
+ */
+ public static boolean inCryptKeeperBounce() {
+ return false;
+ }
+
/** {@hide}
* @deprecated Use {@link #isFileEncrypted} instead, since emulated FBE is no longer supported.
*/
diff --git a/core/java/com/android/internal/os/RoSystemProperties.java b/core/java/com/android/internal/os/RoSystemProperties.java
index 40d5c4761dff..66288706b0f1 100644
--- a/core/java/com/android/internal/os/RoSystemProperties.java
+++ b/core/java/com/android/internal/os/RoSystemProperties.java
@@ -68,10 +68,14 @@ public class RoSystemProperties {
public static final CryptoProperties.type_values CRYPTO_TYPE =
CryptoProperties.type().orElse(CryptoProperties.type_values.NONE);
// These are pseudo-properties
+ public static final boolean CRYPTO_ENCRYPTABLE =
+ CRYPTO_STATE != CryptoProperties.state_values.UNSUPPORTED;
public static final boolean CRYPTO_ENCRYPTED =
CRYPTO_STATE == CryptoProperties.state_values.ENCRYPTED;
public static final boolean CRYPTO_FILE_ENCRYPTED =
CRYPTO_TYPE == CryptoProperties.type_values.FILE;
+ public static final boolean CRYPTO_BLOCK_ENCRYPTED =
+ CRYPTO_TYPE == CryptoProperties.type_values.BLOCK;
public static final boolean CONTROL_PRIVAPP_PERMISSIONS_LOG =
"log".equalsIgnoreCase(CONTROL_PRIVAPP_PERMISSIONS);
--
2.34.1

View File

@@ -0,0 +1,40 @@
From aaf44460fbf5dcdbb844e4c5bba99b48576e59ef Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Wed, 2 Aug 2023 20:59:53 +0800
Subject: [PATCH 4/5] Restore getSimStateForSlotIndex in SubscriptionManager
MTK IMS still needs it here
Change-Id: I41bac57c68055f369232359a464642daab94403b
---
.../android/telephony/SubscriptionManager.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 64e43568e4d6..cfb4f12815a2 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -2549,6 +2549,20 @@ public class SubscriptionManager {
return TelephonyManager.getDefault().isNetworkRoaming(subId);
}
+ /**
+ * Returns a constant indicating the state of sim for the slot index.
+ *
+ * @param slotIndex Logical SIM slot index.
+ *
+ * @see TelephonyManager.SimState
+ *
+ * @hide
+ */
+ @TelephonyManager.SimState
+ public static int getSimStateForSlotIndex(int slotIndex) {
+ return TelephonyManager.getSimStateForSlotIndex(slotIndex);
+ }
+
/**
* Set a field in the subscription database. Note not all fields are supported.
*
--
2.34.1

View File

@@ -0,0 +1,88 @@
From d9dd8793634f892d905e46d45e190f72f8761def Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sun, 19 Nov 2023 23:07:03 +0800
Subject: [PATCH 5/5] Restore getPhysicalDisplayIds in SurfaceControl
For convenience of accessing DynamicDisplayInfo from Settings
Copy over the updated implementation from DisplayControl while we're at it
This partially reverts commit e2f333728788ad88a65208a6119aed90e13e7040.
Change-Id: Ie056ecaf76acbc70d73e1c26cc4542088fcda18d
---
core/java/android/view/SurfaceControl.java | 8 ++++++++
core/jni/android_view_SurfaceControl.cpp | 18 ++++++++++++++++++
2 files changed, 26 insertions(+)
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index c11f4975149d..cf9262aafb03 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -179,6 +179,7 @@ public final class SurfaceControl implements Parcelable {
private static native boolean nativeClearAnimationFrameStats();
private static native boolean nativeGetAnimationFrameStats(WindowAnimationFrameStats outStats);
+ private static native long[] nativeGetPhysicalDisplayIds();
private static native void nativeSetDisplaySurface(long transactionObj,
IBinder displayToken, long nativeSurfaceObject);
private static native void nativeSetDisplayLayerStack(long transactionObj,
@@ -2402,6 +2403,13 @@ public final class SurfaceControl implements Parcelable {
IVirtualDisplayCallback.Stub.asInterface(displayToken));
}
+ /**
+ * @hide
+ */
+ public static long[] getPhysicalDisplayIds() {
+ return nativeGetPhysicalDisplayIds();
+ }
+
/**
* Returns whether protected content is supported in GPU composition.
* @hide
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 424925328dfd..2ebd6bec0b18 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -36,6 +36,7 @@
#include <gui/SurfaceComposerClient.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
+#include <nativehelper/ScopedPrimitiveArray.h>
#include <nativehelper/ScopedUtfChars.h>
#include <private/gui/ComposerService.h>
#include <stdio.h>
@@ -985,6 +986,21 @@ static void nativeSetDestinationFrame(JNIEnv* env, jclass clazz, jlong transacti
transaction->setDestinationFrame(ctrl, crop);
}
+static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) {
+ const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds();
+ ScopedLongArrayRW values(env, env->NewLongArray(displayIds.size()));
+ if (values.get() == nullptr) {
+ jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
+ return nullptr;
+ }
+
+ for (size_t i = 0; i < displayIds.size(); ++i) {
+ values[i] = static_cast<jlong>(displayIds[i].value);
+ }
+
+ return values.getJavaArray();
+}
+
static jobject nativeGetDisplayedContentSamplingAttributes(JNIEnv* env, jclass clazz,
jobject tokenObj) {
sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
@@ -2133,6 +2149,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeSetFrameRate },
{"nativeSetDefaultFrameRateCompatibility", "(JJI)V",
(void*)nativeSetDefaultFrameRateCompatibility},
+ {"nativeGetPhysicalDisplayIds", "()[J",
+ (void*)nativeGetPhysicalDisplayIds },
{"nativeSetDisplaySurface", "(JLandroid/os/IBinder;J)V",
(void*)nativeSetDisplaySurface },
{"nativeSetDisplayLayerStack", "(JLandroid/os/IBinder;I)V",
--
2.34.1

View File

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

View File

@@ -0,0 +1,33 @@
From 2bb0d801335970b8f0e9b8b7ffdf86128ae19468 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 14 Nov 2021 13:47:29 -0500
Subject: [PATCH] Pie MTK IMS calls static
ImsManager.updateImsServiceConfig(Context,int,boolean). Bring it back
Change-Id: I3dd66d436629d37c8ec795df6569736195ae570e
---
src/java/com/android/ims/ImsManager.java | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index c41426d..2c6d656 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -1667,6 +1667,14 @@ public class ImsManager implements FeatureUpdates {
}
}
+ public static void updateImsServiceConfig(Context context, int phoneId, boolean force) {
+ ImsManager mgr = ImsManager.getInstance(context, phoneId);
+ if (mgr != null) {
+ mgr.updateImsServiceConfig();
+ }
+ Rlog.e(TAG, "updateImsServiceConfig: ImsManager null, returning without update.");
+ }
+
/**
* Push configuration updates to the ImsService implementation.
*/
--
2.25.1

View File

@@ -0,0 +1,47 @@
From fc4ecc73093f88934a65a9371ae7af274c2b143d Mon Sep 17 00:00:00 2001
From: ironydelerium <42721860+ironydelerium@users.noreply.github.com>
Date: Fri, 31 Dec 2021 02:20:28 -0800
Subject: [PATCH] Reintroduce 'public void
TelephonyMetrics.writeRilSendSms(int, int, int, int)'. (#8)
The MediaTek IMS package for Android Q, at the very least (likely for the rest, too)
invoke this method in their `sendSms` method; Google, in their infinite wisdom,
decided that this method needed a message ID passed in as well, changing the signature
to 'public void TelephonyMetrics.writeRilSendSms(int, int, int, int, long)' and resulting
in a MethodNotFoundException being raised in com.mediatek.ims, crashing it.
Fixes https://github.com/phhusson/treble_experimentations/issues/2125.
Co-authored-by: Sarah Vandomelen <sarah@sightworks.com>
Change-Id: I789f470fb38d86dd37e8408536e208a7a49e7e26
---
.../telephony/metrics/TelephonyMetrics.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java b/src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java
index 5b47ae5b7a..f3e7717aca 100644
--- a/src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java
+++ b/src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java
@@ -2324,6 +2324,19 @@ public class TelephonyMetrics {
smsSession.increaseExpectedResponse();
}
+ /**
+ * Write Send SMS event (backwards-compatible method for R and earlier IMS implementations)
+ *
+ * @param phoneId Phone id
+ * @param rilSerial RIL request serial number
+ * @param tech SMS RAT
+ * @param format SMS format. Either {@link SmsMessage#FORMAT_3GPP} or
+ * {@link SmsMessage#FORMAT_3GPP2}.
+ */
+ public void writeRilSendSms(int phoneId, int rilSerial, int tech, int format) {
+ writeRilSendSms(phoneId, rilSerial, tech, format, 0);
+ }
+
/**
* Write Send SMS event using ImsService. Expecting response from
* {@link #writeOnSmsSolicitedResponse}.
--
2.25.1

View File

@@ -0,0 +1,27 @@
From 31b4f85f4d8d4e3aad6cab62d88ec7c065b62607 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Fri, 30 Sep 2022 11:32:24 +0000
Subject: [PATCH] Add an enum for Treble settings
Change-Id: I8dc25afa27e938ee82594a8343e73c7c494003e2
---
stats/enums/app/settings_enums.proto | 3 +++
1 file changed, 3 insertions(+)
diff --git a/stats/enums/app/settings_enums.proto b/stats/enums/app/settings_enums.proto
index 50a68098..7392b1ce 100644
--- a/stats/enums/app/settings_enums.proto
+++ b/stats/enums/app/settings_enums.proto
@@ -2217,6 +2217,9 @@ enum PageId {
// OPEN: Settings > System > Input & Gesture > Double twist gesture
SETTINGS_GESTURE_DOUBLE_TWIST = 755;
+ // OPEN: Settings > Treble Settings
+ SETTINGS_TREBLE_CATEGORY = 777;
+
// OPEN: Settings > Apps > Default Apps > Default browser
DEFAULT_BROWSER_PICKER = 785;
--
2.34.1

View File

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

View File

@@ -0,0 +1,363 @@
From 5310d801b343b76a82247193b092e7944681e3c0 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Thu, 22 Sep 2022 12:37:50 +0000
Subject: [PATCH 1/8] TrebleSettings: Screen resolution & refresh rate
Change-Id: I4a4679cdb6d4ede55479e9ab2f014342025b0fec
---
AndroidManifest.xml | 8 +
res/drawable/ic_settings_treble.xml | 10 +
res/values/menu_keys.xml | 1 +
res/values/strings.xml | 10 +
res/xml/top_level_settings.xml | 9 +
res/xml/treble_settings.xml | 18 ++
...lutionRefreshRatePreferenceController.java | 176 ++++++++++++++++++
.../settings/treble/TrebleSettings.java | 39 ++++
8 files changed, 271 insertions(+)
create mode 100644 res/drawable/ic_settings_treble.xml
create mode 100644 res/xml/treble_settings.xml
create mode 100644 src/com/android/settings/treble/ScreenResolutionRefreshRatePreferenceController.java
create mode 100644 src/com/android/settings/treble/TrebleSettings.java
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f05f3d2381..9cf3b4fd2d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -241,6 +241,14 @@
android:value="com.android.settings.shortcut.CreateShortcut" />
</activity>
+ <receiver
+ android:name=".treble.ScreenResolutionRefreshRatePreferenceController$BootReceiver"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED"/>
+ </intent-filter>
+ </receiver>
+
<!-- Wireless Controls -->
<activity
android:name=".Settings$NetworkDashboardActivity"
diff --git a/res/drawable/ic_settings_treble.xml b/res/drawable/ic_settings_treble.xml
new file mode 100644
index 0000000000..3c56ed7032
--- /dev/null
+++ b/res/drawable/ic_settings_treble.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M10.82 12.49c.02-.16.04-.32.04-.49 0-.17-.02-.33-.04-.49l1.08-.82c.1-.07.12-.21.06-.32l-1.03-1.73c-.06-.11-.2-.15-.31-.11l-1.28.5c-.27-.2-.56-.36-.87-.49l-.2-1.33c0-.12-.11-.21-.24-.21H5.98c-.13 0-.24.09-.26.21l-.2 1.32c-.31.12-.6.3-.87.49l-1.28-.5c-.12-.05-.25 0-.31.11l-1.03 1.73c-.06.12-.03.25.07.33l1.08.82c-.02.16-.03.33-.03.49 0 .17.02.33.04.49l-1.09.83c-.1.07-.12.21-.06.32l1.03 1.73c.06.11.2.15.31.11l1.28-.5c.27.2.56.36.87.49l.2 1.32c.01.12.12.21.25.21h2.06c.13 0 .24-.09.25-.21l.2-1.32c.31-.12.6-.3.87-.49l1.28.5c.12.05.25 0 .31-.11l1.03-1.73c.06-.11.04-.24-.06-.32l-1.1-.83zM7 13.75c-.99 0-1.8-.78-1.8-1.75s.81-1.75 1.8-1.75 1.8.78 1.8 1.75S8 13.75 7 13.75zM18 1.01L8 1c-1.1 0-2 .9-2 2v3h2V5h10v14H8v-1H6v3c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-1.99-2-1.99z"/>
+</vector>
diff --git a/res/values/menu_keys.xml b/res/values/menu_keys.xml
index 27e9639122..ef25f9971c 100755
--- a/res/values/menu_keys.xml
+++ b/res/values/menu_keys.xml
@@ -16,6 +16,7 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="menu_key_treble" translatable="false">top_level_treble</string>
<string name="menu_key_network" translatable="false">top_level_network</string>
<string name="menu_key_communal" translatable="false">top_level_communal</string>
<string name="menu_key_connected_devices" translatable="false">top_level_connected_devices</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 32cb7803a6..dcb08f0731 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6875,6 +6875,16 @@
<!-- Text to describe the dashboard fragment title [CHAR LIMIT=16] -->
<string name="dashboard_title">Settings</string>
+ <!-- Title for setting tile leading to Treble settings [CHAR LIMIT=40]-->
+ <string name="treble_settings">Treble settings</string>
+ <!-- Summary for Treble settings [CHAR LIMIT=NONE]-->
+ <string name="treble_settings_summary">Fixes &amp; tweaks for GSIs</string>
+ <!-- Display category name [CHAR LIMIT=none] -->
+ <string name="treble_settings_category_name_display">Display</string>
+
+ <!-- Treble settings screen, screen resolution and refresh rate settings title -->
+ <string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
+
<!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
<string name="network_dashboard_title">Network &amp; internet</string>
<!-- Summary for Network and Internet settings, explaining it contains mobile, wifi setting and data usage settings [CHAR LIMIT=NONE]-->
diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml
index d050a1f274..258a567f56 100644
--- a/res/xml/top_level_settings.xml
+++ b/res/xml/top_level_settings.xml
@@ -20,6 +20,15 @@
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="top_level_settings">
+ <com.android.settings.widget.HomepagePreference
+ android:fragment="com.android.settings.treble.TrebleSettings"
+ android:icon="@drawable/ic_settings_treble"
+ android:key="top_level_treble"
+ android:order="-160"
+ android:title="@string/treble_settings"
+ android:summary="@string/treble_settings_summary"
+ settings:highlightableMenuKey="@string/menu_key_treble"/>
+
<com.android.settings.widget.HomepagePreference
android:fragment="com.android.settings.network.NetworkDashboardFragment"
android:icon="@drawable/ic_settings_wireless"
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
new file mode 100644
index 0000000000..1a82c468a2
--- /dev/null
+++ b/res/xml/treble_settings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res-auto"
+ android:key="treble_settings_screen"
+ android:title="@string/treble_settings">
+
+ <PreferenceCategory
+ android:title="@string/treble_settings_category_name_display">
+
+ <ListPreference
+ android:key="screen_resolution_refresh_rate"
+ android:title="@string/screen_resolution_refresh_rate_title" />
+
+ </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/src/com/android/settings/treble/ScreenResolutionRefreshRatePreferenceController.java b/src/com/android/settings/treble/ScreenResolutionRefreshRatePreferenceController.java
new file mode 100644
index 0000000000..d8d7b4faf6
--- /dev/null
+++ b/src/com/android/settings/treble/ScreenResolutionRefreshRatePreferenceController.java
@@ -0,0 +1,176 @@
+package com.android.settings.treble;
+
+import static android.content.Intent.ACTION_BOOT_COMPLETED;
+
+import android.app.ActivityManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.view.SurfaceControl;
+import android.view.SurfaceControl.DisplayMode;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.BasePreferenceController;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ScreenResolutionRefreshRatePreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String SCREEN_RESOLUTION_REFRESH_RATE_KEY = "screen_resolution_refresh_rate";
+ private static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
+ private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
+ private static final int SURFACE_FLINGER_CODE = 1035;
+ private static final String TREBLE_DISPLAY_MODE_PROPERTY = "persist.sys.treble.display_mode";
+ private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
+
+ private ActivityManager mAm;
+ private ListPreference mListPreference;
+ private List<DisplayMode> mModes = new ArrayList<>();
+ private List<String> mEntries = new ArrayList<>();
+ private List<String> mValues = new ArrayList<>();
+
+ public ScreenResolutionRefreshRatePreferenceController(Context context) {
+ super(context, SCREEN_RESOLUTION_REFRESH_RATE_KEY);
+
+ mAm = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+
+ long[] physicalDisplayIds = SurfaceControl.getPhysicalDisplayIds();
+ DisplayMode[] supportedDisplayModes =
+ SurfaceControl.getDynamicDisplayInfo(physicalDisplayIds[0]).supportedDisplayModes;
+ Set<String> summarySet = new HashSet<>();
+ for (DisplayMode m : supportedDisplayModes) {
+ String summary = String.format("%dx%d @ %dHz", m.width, m.height, Math.round(m.refreshRate));
+ if (!summarySet.contains(summary)) {
+ summarySet.add(summary);
+ mModes.add(m);
+ }
+ }
+ Collections.sort(mModes, Comparator.comparing((DisplayMode m)->m.width)
+ .thenComparing(m->m.height)
+ .thenComparing(m->m.refreshRate)
+ .thenComparing(m->m.id));
+ for (DisplayMode m : mModes) {
+ String summary = String.format("%dx%d @ %dHz", m.width, m.height, Math.round(m.refreshRate));
+ mEntries.add(summary);
+ mValues.add(String.valueOf(m.id));
+ }
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return SCREEN_RESOLUTION_REFRESH_RATE_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mListPreference = screen.findPreference(getPreferenceKey());
+ mListPreference.setEntries(mEntries.toArray(new String[mEntries.size()]));
+ mListPreference.setEntryValues(mValues.toArray(new String[mValues.size()]));
+
+ if (mEntries.size() <= 1) {
+ mListPreference.setEnabled(false);
+ }
+
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ long[] physicalDisplayIds = SurfaceControl.getPhysicalDisplayIds();
+ int id = SurfaceControl.getDynamicDisplayInfo(physicalDisplayIds[0]).activeDisplayModeId;
+ int index = mListPreference.findIndexOfValue(String.valueOf(id));
+ try {
+ mListPreference.setValueIndex(index);
+ mListPreference.setSummary(mListPreference.getEntries()[index]);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ DisplayMode currentMode = getCurrentMode();
+ int id = Integer.valueOf((String) newValue);
+ DisplayMode newMode = getModeById(id);
+ setModeFromBackdoor(id);
+ SystemProperties.set(TREBLE_DISPLAY_MODE_PROPERTY, (String) newValue);
+ int index = mListPreference.findIndexOfValue((String) newValue);
+ mListPreference.setValueIndex(index);
+ mListPreference.setSummary(mListPreference.getEntries()[index]);
+ if ((newMode.width != currentMode.width) || (newMode.height != currentMode.height)) {
+ try {
+ for (ActivityManager.RunningAppProcessInfo app: mAm.getRunningAppProcesses()) {
+ if (app.processName.equals(SYSTEMUI_PACKAGE_NAME)) {
+ ActivityManager.getService().killApplicationProcess(app.processName, app.uid);
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return true;
+ }
+
+ private DisplayMode getCurrentMode() {
+ long[] physicalDisplayIds = SurfaceControl.getPhysicalDisplayIds();
+ int id = SurfaceControl.getDynamicDisplayInfo(physicalDisplayIds[0]).activeDisplayModeId;
+ return getModeById(id);
+ }
+
+ private DisplayMode getModeById(int id) {
+ for (DisplayMode m : mModes) {
+ if (m.id == id) {
+ return m;
+ }
+ }
+ return null;
+ }
+
+ public static void setModeFromBackdoor(int id) {
+ IBinder surfaceFlinger = ServiceManager.getService(SURFACE_FLINGER_SERVICE_KEY);
+ try {
+ if (surfaceFlinger != null) {
+ Parcel data = Parcel.obtain();
+ data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
+ data.writeInt(id);
+ surfaceFlinger.transact(SURFACE_FLINGER_CODE, data, null, 0);
+ data.recycle();
+ }
+ } catch (RemoteException ex) {}
+ }
+
+ public static class BootReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
+ int id = SystemProperties.getInt(TREBLE_DISPLAY_MODE_PROPERTY, -1);
+ if (id != -1) {
+ setModeFromBackdoor(id);
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
new file mode 100644
index 0000000000..e581539229
--- /dev/null
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -0,0 +1,39 @@
+package com.android.settings.treble;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.core.AbstractPreferenceController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TrebleSettings extends DashboardFragment {
+
+ private static final String TAG = "TrebleSettings";
+
+ @Override
+ protected int getPreferenceScreenResId() {
+ return R.xml.treble_settings;
+ }
+
+ @Override
+ protected String getLogTag() {
+ return TAG;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.SETTINGS_TREBLE_CATEGORY;
+ }
+
+ @Override
+ protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+ final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
+ return controllers;
+ }
+
+}
--
2.34.1

View File

@@ -0,0 +1,288 @@
From 01ce7e73cb79e56484594b0ce03eb2ebfa193e90 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 24 Sep 2022 03:38:41 +0000
Subject: [PATCH 2/8] TrebleSettings: Basic audio and display fixes
- Alternative audio policy
- Disable soundvolume effect
- Alternative backlight scale
Change-Id: I4f22dcd9c59c40b3fd70ba642db35b9466467b7d
---
res/values/strings.xml | 8 +++
res/xml/treble_settings.xml | 17 ++++++
...SoundvolumeEffectPreferenceController.java | 59 +++++++++++++++++++
.../settings/treble/TrebleSettings.java | 3 +
...nativeAudioPolicyPreferenceController.java | 59 +++++++++++++++++++
...iveBacklightScalePreferenceController.java | 53 +++++++++++++++++
6 files changed, 199 insertions(+)
create mode 100644 src/com/android/settings/treble/DisableSoundvolumeEffectPreferenceController.java
create mode 100644 src/com/android/settings/treble/UseAlternativeAudioPolicyPreferenceController.java
create mode 100644 src/com/android/settings/treble/UseAlternativeBacklightScalePreferenceController.java
diff --git a/res/values/strings.xml b/res/values/strings.xml
index dcb08f0731..f799b4d0c7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6879,11 +6879,19 @@
<string name="treble_settings">Treble settings</string>
<!-- Summary for Treble settings [CHAR LIMIT=NONE]-->
<string name="treble_settings_summary">Fixes &amp; tweaks for GSIs</string>
+ <!-- Audio category name [CHAR LIMIT=none] -->
+ <string name="treble_settings_category_name_audio">Audio</string>
<!-- Display category name [CHAR LIMIT=none] -->
<string name="treble_settings_category_name_display">Display</string>
+ <!-- Treble settings screen, use alternative audio policy title -->
+ <string name="use_alternative_audio_policy_title">Use alternative audio policy</string>
+ <!-- Treble settings screen, disable soundvolume effect title -->
+ <string name="disable_soundvolume_effect_title">Disable soundvolume effect</string>
<!-- Treble settings screen, screen resolution and refresh rate settings title -->
<string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
+ <!-- Treble settings screen, use alternative backlight scale title -->
+ <string name="use_alternative_backlight_scale_title">Use alternative backlight scale</string>
<!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
<string name="network_dashboard_title">Network &amp; internet</string>
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 1a82c468a2..336137c95f 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -6,6 +6,19 @@
android:key="treble_settings_screen"
android:title="@string/treble_settings">
+ <PreferenceCategory
+ android:title="@string/treble_settings_category_name_audio">
+
+ <SwitchPreference
+ android:key="use_alternative_audio_policy"
+ android:title="@string/use_alternative_audio_policy_title" />
+
+ <SwitchPreference
+ android:key="disable_soundvolume_effect"
+ android:title="@string/disable_soundvolume_effect_title" />
+
+ </PreferenceCategory>
+
<PreferenceCategory
android:title="@string/treble_settings_category_name_display">
@@ -13,6 +26,10 @@
android:key="screen_resolution_refresh_rate"
android:title="@string/screen_resolution_refresh_rate_title" />
+ <SwitchPreference
+ android:key="use_alternative_backlight_scale"
+ android:title="@string/use_alternative_backlight_scale_title" />
+
</PreferenceCategory>
</PreferenceScreen>
diff --git a/src/com/android/settings/treble/DisableSoundvolumeEffectPreferenceController.java b/src/com/android/settings/treble/DisableSoundvolumeEffectPreferenceController.java
new file mode 100644
index 0000000000..8feb318f55
--- /dev/null
+++ b/src/com/android/settings/treble/DisableSoundvolumeEffectPreferenceController.java
@@ -0,0 +1,59 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class DisableSoundvolumeEffectPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String DISABLE_SOUNDVOLUME_EFFECT_KEY = "disable_soundvolume_effect";
+ private static final String RO_HARDWARE_PROPERTY = "ro.hardware";
+ private static final String TREBLE_CAF_DISABLE_SOUNDVOLUME_EFFECT_PROPERTY = "persist.sys.treble.caf.disable_soundvolume_effect";
+
+ private SwitchPreference mSwitchPreference;
+
+ public DisableSoundvolumeEffectPreferenceController(Context context) {
+ super(context, DISABLE_SOUNDVOLUME_EFFECT_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return DISABLE_SOUNDVOLUME_EFFECT_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+
+ if (!SystemProperties.get(RO_HARDWARE_PROPERTY, "N/A").equals("qcom")) {
+ mSwitchPreference.setEnabled(false);
+ }
+
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(TREBLE_CAF_DISABLE_SOUNDVOLUME_EFFECT_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(TREBLE_CAF_DISABLE_SOUNDVOLUME_EFFECT_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index e581539229..5c1611c053 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -32,7 +32,10 @@ public class TrebleSettings extends DashboardFragment {
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
+ controllers.add(new UseAlternativeAudioPolicyPreferenceController(context));
+ controllers.add(new DisableSoundvolumeEffectPreferenceController(context));
controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
+ controllers.add(new UseAlternativeBacklightScalePreferenceController(context));
return controllers;
}
diff --git a/src/com/android/settings/treble/UseAlternativeAudioPolicyPreferenceController.java b/src/com/android/settings/treble/UseAlternativeAudioPolicyPreferenceController.java
new file mode 100644
index 0000000000..fbc327cba0
--- /dev/null
+++ b/src/com/android/settings/treble/UseAlternativeAudioPolicyPreferenceController.java
@@ -0,0 +1,59 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class UseAlternativeAudioPolicyPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String USE_ALTERNATIVE_AUDIO_POLICY_KEY = "use_alternative_audio_policy";
+ private static final String RO_HARDWARE_PROPERTY = "ro.hardware";
+ private static final String TREBLE_CAF_AUDIO_POLICY_PROPERTY = "persist.sys.treble.caf.audio_policy";
+
+ private SwitchPreference mSwitchPreference;
+
+ public UseAlternativeAudioPolicyPreferenceController(Context context) {
+ super(context, USE_ALTERNATIVE_AUDIO_POLICY_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return USE_ALTERNATIVE_AUDIO_POLICY_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+
+ if (!SystemProperties.get(RO_HARDWARE_PROPERTY, "N/A").equals("qcom")) {
+ mSwitchPreference.setEnabled(false);
+ }
+
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(TREBLE_CAF_AUDIO_POLICY_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(TREBLE_CAF_AUDIO_POLICY_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/UseAlternativeBacklightScalePreferenceController.java b/src/com/android/settings/treble/UseAlternativeBacklightScalePreferenceController.java
new file mode 100644
index 0000000000..bd9de82d90
--- /dev/null
+++ b/src/com/android/settings/treble/UseAlternativeBacklightScalePreferenceController.java
@@ -0,0 +1,53 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class UseAlternativeBacklightScalePreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String USE_ALTERNATIVE_BACKLIGHT_SCALE_KEY = "use_alternative_backlight_scale";
+ private static final String TREBLE_BACKLIGHT_SCALE_PROPERTY = "persist.sys.treble.backlight_scale";
+
+ private SwitchPreference mSwitchPreference;
+
+ public UseAlternativeBacklightScalePreferenceController(Context context) {
+ super(context, USE_ALTERNATIVE_BACKLIGHT_SCALE_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return USE_ALTERNATIVE_BACKLIGHT_SCALE_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(TREBLE_BACKLIGHT_SCALE_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(TREBLE_BACKLIGHT_SCALE_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
--
2.34.1

View File

@@ -0,0 +1,374 @@
From 9cef4d5c64956f27e73320c6f5cc28201bd2692c Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Tue, 11 Oct 2022 10:29:36 +0000
Subject: [PATCH 3/8] TrebleSettings: IMS
Change-Id: Id7a12e150d4a3dc988f8ce1a888ad88443fa0ea4
---
Android.bp | 1 +
res/values/strings.xml | 9 +
res/xml/treble_settings.xml | 13 ++
.../InstallImsApkPreferenceController.java | 209 ++++++++++++++++++
...VolteAvailabilityPreferenceController.java | 59 +++++
.../settings/treble/TrebleSettings.java | 2 +
6 files changed, 293 insertions(+)
create mode 100644 src/com/android/settings/treble/InstallImsApkPreferenceController.java
create mode 100644 src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java
diff --git a/Android.bp b/Android.bp
index 8cd7aa76aa..20efe42a50 100644
--- a/Android.bp
+++ b/Android.bp
@@ -105,6 +105,7 @@ android_library {
"LineagePreferenceLib",
"vendor.lineage.fastcharge-V1.0-java",
"SystemUISharedLib",
+ "android.hidl.manager-V1.0-java",
],
plugins: ["androidx.room_room-compiler-plugin"],
diff --git a/res/values/strings.xml b/res/values/strings.xml
index f799b4d0c7..1df0fe22f1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6883,6 +6883,8 @@
<string name="treble_settings_category_name_audio">Audio</string>
<!-- Display category name [CHAR LIMIT=none] -->
<string name="treble_settings_category_name_display">Display</string>
+ <!-- IMS category name [CHAR LIMIT=none] -->
+ <string name="treble_settings_category_name_ims">IMS</string>
<!-- Treble settings screen, use alternative audio policy title -->
<string name="use_alternative_audio_policy_title">Use alternative audio policy</string>
@@ -6892,6 +6894,13 @@
<string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
<!-- Treble settings screen, use alternative backlight scale title -->
<string name="use_alternative_backlight_scale_title">Use alternative backlight scale</string>
+ <!-- Treble settings screen, install IMS APK title -->
+ <string name="install_ims_apk_title">Install IMS APK</string>
+ <!-- Treble settings screen, install IMS APK toasts -->
+ <string name="install_ims_apk_toast_downloading">Downloading IMS APK...</string>
+ <string name="install_ims_apk_toast_completed">IMS APK installed. Reboot required.</string>
+ <!-- Treble settings screen, override VoLTE availability title -->
+ <string name="override_volte_availability_title">Override VoLTE availability</string>
<!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
<string name="network_dashboard_title">Network &amp; internet</string>
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 336137c95f..09e6bc5d00 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -32,4 +32,17 @@
</PreferenceCategory>
+ <PreferenceCategory
+ android:title="@string/treble_settings_category_name_ims">
+
+ <Preference
+ android:key="install_ims_apk"
+ android:title="@string/install_ims_apk_title" />
+
+ <SwitchPreference
+ android:key="override_volte_availability"
+ android:title="@string/override_volte_availability_title" />
+
+ </PreferenceCategory>
+
</PreferenceScreen>
diff --git a/src/com/android/settings/treble/InstallImsApkPreferenceController.java b/src/com/android/settings/treble/InstallImsApkPreferenceController.java
new file mode 100644
index 0000000000..6a63cbf1bf
--- /dev/null
+++ b/src/com/android/settings/treble/InstallImsApkPreferenceController.java
@@ -0,0 +1,209 @@
+package com.android.settings.treble;
+
+import android.app.DownloadManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageInstaller;
+import android.database.Cursor;
+import android.hidl.manager.V1_0.IServiceManager;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class InstallImsApkPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceClickListener {
+
+ private static final String TAG = "TrebleSettings";
+ private static final String INSTALL_IMS_APK_KEY = "install_ims_apk";
+ private static final String[] IMS_SLOTS = {
+ "imsrild1", "imsrild2", "imsrild3",
+ "slot1", "slot2", "slot3",
+ "imsSlot1", "imsSlot2",
+ "mtkSlot1", "mtkSlot2",
+ "imsradio0", "imsradio1"
+ };
+ private static final String RO_PRODUCT_VENDOR_BRAND_PROPERTY = "ro.product.vendor.brand";
+
+ private Preference mPreference;
+ private String mImsType = "none";
+ private String mImsApkUrl = "";
+
+ public InstallImsApkPreferenceController(Context context) {
+ super(context, INSTALL_IMS_APK_KEY);
+
+ mImsType = getImsType();
+ Log.d(TAG, "IMS type = " + mImsType);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return INSTALL_IMS_APK_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mPreference = screen.findPreference(getPreferenceKey());
+
+ if (mImsType.equals("none")) {
+ mPreference.setEnabled(false);
+ } else {
+ mPreference.setOnPreferenceClickListener(this);
+ String summary = "IMS type: ";
+ switch (mImsType) {
+ case "qcom":
+ summary += "Qualcomm";
+ break;
+ case "mtk_p":
+ summary += "MediaTek P";
+ break;
+ case "mtk_q":
+ summary += "MediaTek Q";
+ break;
+ case "mtk_r":
+ summary += "MediaTek R";
+ break;
+ case "mtk_s":
+ summary += "MediaTek S";
+ break;
+ default:
+ break;
+ }
+ mPreference.setSummary(summary);
+ }
+
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ switch (mImsType) {
+ case "qcom":
+ mImsApkUrl = "https://treble.phh.me/ims-caf-u.apk";
+ break;
+ case "mtk_p":
+ mImsApkUrl = "https://treble.phh.me/stable/ims-mtk-p.apk";
+ break;
+ case "mtk_q":
+ mImsApkUrl = "https://treble.phh.me/stable/ims-mtk-q.apk";
+ break;
+ case "mtk_r":
+ mImsApkUrl = "https://treble.phh.me/stable/ims-mtk-r.apk";
+ break;
+ case "mtk_s":
+ mImsApkUrl = "https://treble.phh.me/stable/ims-mtk-s.apk";
+ break;
+ default:
+ break;
+ }
+
+ Context context = preference.getContext();
+ DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(mImsApkUrl));
+ request.setTitle("IMS APK");
+ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, "ims.apk");
+ long id = dm.enqueue(request);
+ Toast.makeText(context, context.getString(R.string.install_ims_apk_toast_downloading), Toast.LENGTH_LONG).show();
+
+ context.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1L) != id) {
+ return;
+ }
+ Cursor cursor = dm.query(new DownloadManager.Query().setFilterById(id));
+ if (!cursor.moveToFirst()) {
+ return;
+ }
+ Uri localUri = Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
+ String path = localUri.getPath();
+ if (path == null) {
+ return;
+ }
+ long fileSize = 0;
+ File file = new File(path);
+ if (file.isFile()) {
+ fileSize = file.length();
+ } else {
+ return;
+ }
+
+ try (InputStream in = new FileInputStream(path)) {
+ PackageInstaller pi = context.getPackageManager().getPackageInstaller();
+ int sessionId = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
+ PackageInstaller.Session session = pi.openSession(sessionId);
+ try (OutputStream out = session.openWrite(TAG, 0, fileSize)) {
+ byte[] buffer = new byte[512 * 1024];
+ while (in.available() > 0) {
+ int l = in.read(buffer);
+ out.write(buffer, 0, l);
+ }
+ session.fsync(out);
+ }
+ String action = TAG + "_" + sessionId;
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, sessionId,
+ new Intent(action), PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
+ context.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Toast.makeText(context, context.getString(R.string.install_ims_apk_toast_completed), Toast.LENGTH_LONG).show();
+ }
+ }, new IntentFilter(action));
+ session.commit(pendingIntent.getIntentSender());
+ context.unregisterReceiver(this);
+ } catch (IOException ex) {
+ Log.d(TAG, "IOException while installing IMS APK");
+ }
+ }
+ }, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
+
+ return false;
+ }
+
+ protected static String getImsType() {
+ try {
+ IServiceManager hidlManager = IServiceManager.getService();
+ for (String slot: IMS_SLOTS) {
+ if (hidlManager.get("vendor.qti.hardware.radio.ims@1.0::IImsRadio", slot) != null
+ || ServiceManager.getService("vendor.qti.hardware.radio.ims.IImsRadio/" + slot) != null) {
+ return "qcom";
+ } else if (hidlManager.get("vendor.mediatek.hardware.radio@3.0::IRadio", slot) != null) {
+ return "mtk_p";
+ } else if (hidlManager.get("vendor.mediatek.hardware.mtkradioex@1.0::IMtkRadioEx", slot) != null) {
+ return "mtk_q";
+ } else if (hidlManager.get("vendor.mediatek.hardware.mtkradioex@2.0::IMtkRadioEx", slot) != null) {
+ return "mtk_r";
+ } else if (hidlManager.get("vendor.mediatek.hardware.mtkradioex@3.0::IMtkRadioEx", slot) != null) {
+ return "mtk_s";
+ }
+ }
+ } catch (RemoteException ex) {}
+
+ return "none";
+ }
+
+}
diff --git a/src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java b/src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java
new file mode 100644
index 0000000000..1ab12d3ca0
--- /dev/null
+++ b/src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java
@@ -0,0 +1,59 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class OverrideVolteAvailabilityPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String OVERRIDE_VOLTE_AVAILABILITY_KEY = "override_volte_availability";
+ private static final String[] IMSMANAGER_DEBUG_OVERRIDE_PROPERTIES = {
+ "persist.dbg.volte_avail_ovr",
+ "persist.dbg.wfc_avail_ovr",
+ "persist.dbg.allow_ims_off"
+ };
+
+ private SwitchPreference mSwitchPreference;
+
+ public OverrideVolteAvailabilityPreferenceController(Context context) {
+ super(context, OVERRIDE_VOLTE_AVAILABILITY_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return OVERRIDE_VOLTE_AVAILABILITY_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(IMSMANAGER_DEBUG_OVERRIDE_PROPERTIES[0], false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ for (String prop: IMSMANAGER_DEBUG_OVERRIDE_PROPERTIES) {
+ SystemProperties.set(prop, ((boolean) newValue) ? "1" : "0");
+ }
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 5c1611c053..50e3eda8c6 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -36,6 +36,8 @@ public class TrebleSettings extends DashboardFragment {
controllers.add(new DisableSoundvolumeEffectPreferenceController(context));
controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
controllers.add(new UseAlternativeBacklightScalePreferenceController(context));
+ controllers.add(new InstallImsApkPreferenceController(context));
+ controllers.add(new OverrideVolteAvailabilityPreferenceController(context));
return controllers;
}
--
2.34.1

View File

@@ -0,0 +1,116 @@
From 75e694dddc0a06a097983f0a8674849f3cec5fb6 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 10 Dec 2022 12:04:37 +0000
Subject: [PATCH 4/8] TrebleSettings: Disable A2DP offload
Change-Id: I737f49d146f83d96793f4436850529e3c528acbe
---
res/values/strings.xml | 2 +
res/xml/treble_settings.xml | 4 ++
...isableA2DPOffloadPreferenceController.java | 53 +++++++++++++++++++
.../settings/treble/TrebleSettings.java | 1 +
4 files changed, 60 insertions(+)
create mode 100644 src/com/android/settings/treble/DisableA2DPOffloadPreferenceController.java
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1df0fe22f1..8f1056da77 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6890,6 +6890,8 @@
<string name="use_alternative_audio_policy_title">Use alternative audio policy</string>
<!-- Treble settings screen, disable soundvolume effect title -->
<string name="disable_soundvolume_effect_title">Disable soundvolume effect</string>
+ <!-- Treble settings screen, disable A2DP offload title -->
+ <string name="disable_a2dp_offload_title">Disable A2DP offload</string>
<!-- Treble settings screen, screen resolution and refresh rate settings title -->
<string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
<!-- Treble settings screen, use alternative backlight scale title -->
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 09e6bc5d00..b58e7a1282 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -17,6 +17,10 @@
android:key="disable_soundvolume_effect"
android:title="@string/disable_soundvolume_effect_title" />
+ <SwitchPreference
+ android:key="disable_a2dp_offload"
+ android:title="@string/disable_a2dp_offload_title" />
+
</PreferenceCategory>
<PreferenceCategory
diff --git a/src/com/android/settings/treble/DisableA2DPOffloadPreferenceController.java b/src/com/android/settings/treble/DisableA2DPOffloadPreferenceController.java
new file mode 100644
index 0000000000..f53103160d
--- /dev/null
+++ b/src/com/android/settings/treble/DisableA2DPOffloadPreferenceController.java
@@ -0,0 +1,53 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class DisableA2DPOffloadPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String DISABLE_A2DP_OFFLOAD_KEY = "disable_a2dp_offload";
+ private static final String A2DP_OFFLOAD_DISABLED_PROPERTY = "persist.bluetooth.a2dp_offload.disabled";
+
+ private SwitchPreference mSwitchPreference;
+
+ public DisableA2DPOffloadPreferenceController(Context context) {
+ super(context, DISABLE_A2DP_OFFLOAD_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return DISABLE_A2DP_OFFLOAD_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(A2DP_OFFLOAD_DISABLED_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(A2DP_OFFLOAD_DISABLED_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 50e3eda8c6..5e9b7f88e2 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -34,6 +34,7 @@ public class TrebleSettings extends DashboardFragment {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new UseAlternativeAudioPolicyPreferenceController(context));
controllers.add(new DisableSoundvolumeEffectPreferenceController(context));
+ controllers.add(new DisableA2DPOffloadPreferenceController(context));
controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
controllers.add(new UseAlternativeBacklightScalePreferenceController(context));
controllers.add(new InstallImsApkPreferenceController(context));
--
2.34.1

View File

@@ -0,0 +1,116 @@
From 51821d58357b577cbc62ce5a2e9d0b4f19e686b3 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 10 Dec 2022 14:16:50 +0000
Subject: [PATCH 5/8] TrebleSettings: Alternative audio jack detection
Change-Id: I5d6d48f26a4a2134fd6edf996eca89a1fc42e6de
---
res/values/strings.xml | 2 +
res/xml/treble_settings.xml | 4 ++
.../settings/treble/TrebleSettings.java | 1 +
...udioJackDetectionPreferenceController.java | 53 +++++++++++++++++++
4 files changed, 60 insertions(+)
create mode 100644 src/com/android/settings/treble/UseAlternativeAudioJackDetectionPreferenceController.java
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8f1056da77..deb2cf9d77 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6892,6 +6892,8 @@
<string name="disable_soundvolume_effect_title">Disable soundvolume effect</string>
<!-- Treble settings screen, disable A2DP offload title -->
<string name="disable_a2dp_offload_title">Disable A2DP offload</string>
+ <!-- Treble settings screen, use alternative audio jack detection title -->
+ <string name="use_alternative_audio_jack_detection_title">Use alternative audio jack detection</string>
<!-- Treble settings screen, screen resolution and refresh rate settings title -->
<string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
<!-- Treble settings screen, use alternative backlight scale title -->
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index b58e7a1282..47097a14c7 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -21,6 +21,10 @@
android:key="disable_a2dp_offload"
android:title="@string/disable_a2dp_offload_title" />
+ <SwitchPreference
+ android:key="use_alternative_audio_jack_detection"
+ android:title="@string/use_alternative_audio_jack_detection_title" />
+
</PreferenceCategory>
<PreferenceCategory
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 5e9b7f88e2..09aa001e82 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -35,6 +35,7 @@ public class TrebleSettings extends DashboardFragment {
controllers.add(new UseAlternativeAudioPolicyPreferenceController(context));
controllers.add(new DisableSoundvolumeEffectPreferenceController(context));
controllers.add(new DisableA2DPOffloadPreferenceController(context));
+ controllers.add(new UseAlternativeAudioJackDetectionPreferenceController(context));
controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
controllers.add(new UseAlternativeBacklightScalePreferenceController(context));
controllers.add(new InstallImsApkPreferenceController(context));
diff --git a/src/com/android/settings/treble/UseAlternativeAudioJackDetectionPreferenceController.java b/src/com/android/settings/treble/UseAlternativeAudioJackDetectionPreferenceController.java
new file mode 100644
index 0000000000..0d60b72db1
--- /dev/null
+++ b/src/com/android/settings/treble/UseAlternativeAudioJackDetectionPreferenceController.java
@@ -0,0 +1,53 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class UseAlternativeAudioJackDetectionPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String USE_ALTERNATIVE_AUDIO_JACK_DETECTION_KEY = "use_alternative_audio_jack_detection";
+ private static final String DEVINPUT_JACK_PROPERTY = "persist.sys.overlay.devinputjack";
+
+ private SwitchPreference mSwitchPreference;
+
+ public UseAlternativeAudioJackDetectionPreferenceController(Context context) {
+ super(context, USE_ALTERNATIVE_AUDIO_JACK_DETECTION_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return USE_ALTERNATIVE_AUDIO_JACK_DETECTION_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(DEVINPUT_JACK_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(DEVINPUT_JACK_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
--
2.34.1

View File

@@ -0,0 +1,116 @@
From 77dfd4ad7da5a0320f143b06324da05a212229fc Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 17 Dec 2022 10:29:05 +0000
Subject: [PATCH 6/8] TrebleSettings: Override minimum brightness
Change-Id: I6d621f7dd04b675b6e2e851a5e474dc9a9841eb0
---
res/values/strings.xml | 2 +
res/xml/treble_settings.xml | 4 ++
...MinimumBrightnessPreferenceController.java | 53 +++++++++++++++++++
.../settings/treble/TrebleSettings.java | 1 +
4 files changed, 60 insertions(+)
create mode 100644 src/com/android/settings/treble/OverrideMinimumBrightnessPreferenceController.java
diff --git a/res/values/strings.xml b/res/values/strings.xml
index deb2cf9d77..865a9c4f5f 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6898,6 +6898,8 @@
<string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
<!-- Treble settings screen, use alternative backlight scale title -->
<string name="use_alternative_backlight_scale_title">Use alternative backlight scale</string>
+ <!-- Treble settings screen, override minimum brightness title -->
+ <string name="override_minimum_brightness_title">Override minimum brightness</string>
<!-- Treble settings screen, install IMS APK title -->
<string name="install_ims_apk_title">Install IMS APK</string>
<!-- Treble settings screen, install IMS APK toasts -->
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 47097a14c7..5c18461b69 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -38,6 +38,10 @@
android:key="use_alternative_backlight_scale"
android:title="@string/use_alternative_backlight_scale_title" />
+ <SwitchPreference
+ android:key="override_minimum_brightness"
+ android:title="@string/override_minimum_brightness_title" />
+
</PreferenceCategory>
<PreferenceCategory
diff --git a/src/com/android/settings/treble/OverrideMinimumBrightnessPreferenceController.java b/src/com/android/settings/treble/OverrideMinimumBrightnessPreferenceController.java
new file mode 100644
index 0000000000..95200fbeaa
--- /dev/null
+++ b/src/com/android/settings/treble/OverrideMinimumBrightnessPreferenceController.java
@@ -0,0 +1,53 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class OverrideMinimumBrightnessPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String OVERRIDE_MINIMUM_BRIGHTNESS_KEY = "override_minimum_brightness";
+ private static final String MINIMAL_BRIGHTNESS_PROPERTY = "persist.sys.overlay.minimal_brightness";
+
+ private SwitchPreference mSwitchPreference;
+
+ public OverrideMinimumBrightnessPreferenceController(Context context) {
+ super(context, OVERRIDE_MINIMUM_BRIGHTNESS_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return OVERRIDE_MINIMUM_BRIGHTNESS_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(MINIMAL_BRIGHTNESS_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(MINIMAL_BRIGHTNESS_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 09aa001e82..39a0e19972 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -38,6 +38,7 @@ public class TrebleSettings extends DashboardFragment {
controllers.add(new UseAlternativeAudioJackDetectionPreferenceController(context));
controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
controllers.add(new UseAlternativeBacklightScalePreferenceController(context));
+ controllers.add(new OverrideMinimumBrightnessPreferenceController(context));
controllers.add(new InstallImsApkPreferenceController(context));
controllers.add(new OverrideVolteAvailabilityPreferenceController(context));
return controllers;
--
2.34.1

View File

@@ -0,0 +1,128 @@
From 47061bc2ff7442d892e488a0a369d61d7ecdfc0c Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 17 Dec 2022 11:00:38 +0000
Subject: [PATCH 7/8] TrebleSettings: Override navbar availability
Change-Id: I7c771caf6274543fed23a8cc47411bf8c369ac2c
---
res/values/strings.xml | 4 ++
res/xml/treble_settings.xml | 9 ++++
...avbarAvailabilityPreferenceController.java | 53 +++++++++++++++++++
.../settings/treble/TrebleSettings.java | 1 +
4 files changed, 67 insertions(+)
create mode 100644 src/com/android/settings/treble/OverrideNavbarAvailabilityPreferenceController.java
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 865a9c4f5f..67d944d9bf 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6885,6 +6885,8 @@
<string name="treble_settings_category_name_display">Display</string>
<!-- IMS category name [CHAR LIMIT=none] -->
<string name="treble_settings_category_name_ims">IMS</string>
+ <!-- UI category name [CHAR LIMIT=none] -->
+ <string name="treble_settings_category_name_ui">UI</string>
<!-- Treble settings screen, use alternative audio policy title -->
<string name="use_alternative_audio_policy_title">Use alternative audio policy</string>
@@ -6907,6 +6909,8 @@
<string name="install_ims_apk_toast_completed">IMS APK installed. Reboot required.</string>
<!-- Treble settings screen, override VoLTE availability title -->
<string name="override_volte_availability_title">Override VoLTE availability</string>
+ <!-- Treble settings screen, override navbar availability title -->
+ <string name="override_navbar_availability_title">Override navigation bar availability</string>
<!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
<string name="network_dashboard_title">Network &amp; internet</string>
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 5c18461b69..250a8ee75a 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -57,4 +57,13 @@
</PreferenceCategory>
+ <PreferenceCategory
+ android:title="@string/treble_settings_category_name_ui">
+
+ <SwitchPreference
+ android:key="override_navbar_availability"
+ android:title="@string/override_navbar_availability_title" />
+
+ </PreferenceCategory>
+
</PreferenceScreen>
diff --git a/src/com/android/settings/treble/OverrideNavbarAvailabilityPreferenceController.java b/src/com/android/settings/treble/OverrideNavbarAvailabilityPreferenceController.java
new file mode 100644
index 0000000000..d6baa33739
--- /dev/null
+++ b/src/com/android/settings/treble/OverrideNavbarAvailabilityPreferenceController.java
@@ -0,0 +1,53 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class OverrideNavbarAvailabilityPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String OVERRIDE_NAVBAR_AVAILABILITY_KEY = "override_navbar_availability";
+ private static final String TREBLE_MAINKEYS_PROPERTY = "persist.sys.treble.mainkeys";
+
+ private SwitchPreference mSwitchPreference;
+
+ public OverrideNavbarAvailabilityPreferenceController(Context context) {
+ super(context, OVERRIDE_NAVBAR_AVAILABILITY_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return OVERRIDE_NAVBAR_AVAILABILITY_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = (SystemProperties.getInt(TREBLE_MAINKEYS_PROPERTY, 0) == 0);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(TREBLE_MAINKEYS_PROPERTY, ((boolean) newValue) ? "0" : "1");
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 39a0e19972..634b7ce3ce 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -41,6 +41,7 @@ public class TrebleSettings extends DashboardFragment {
controllers.add(new OverrideMinimumBrightnessPreferenceController(context));
controllers.add(new InstallImsApkPreferenceController(context));
controllers.add(new OverrideVolteAvailabilityPreferenceController(context));
+ controllers.add(new OverrideNavbarAvailabilityPreferenceController(context));
return controllers;
}
--
2.34.1

View File

@@ -0,0 +1,133 @@
From 3b2b06803b579a2572ca1707aee7b56d1bfd0cff Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 17 Dec 2022 14:30:52 +0000
Subject: [PATCH 8/8] TrebleSettings: Securize on-demand
Change-Id: I76f54620277ccdc41636d74d1afa6330c382ce6a
---
res/values/strings.xml | 6 +++
res/xml/treble_settings.xml | 10 ++++
.../treble/SecurizePreferenceController.java | 53 +++++++++++++++++++
.../settings/treble/TrebleSettings.java | 1 +
4 files changed, 70 insertions(+)
create mode 100644 src/com/android/settings/treble/SecurizePreferenceController.java
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 67d944d9bf..f034a9ff39 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6885,6 +6885,8 @@
<string name="treble_settings_category_name_display">Display</string>
<!-- IMS category name [CHAR LIMIT=none] -->
<string name="treble_settings_category_name_ims">IMS</string>
+ <!-- System category name [CHAR LIMIT=none] -->
+ <string name="treble_settings_category_name_system">System</string>
<!-- UI category name [CHAR LIMIT=none] -->
<string name="treble_settings_category_name_ui">UI</string>
@@ -6909,6 +6911,10 @@
<string name="install_ims_apk_toast_completed">IMS APK installed. Reboot required.</string>
<!-- Treble settings screen, override VoLTE availability title -->
<string name="override_volte_availability_title">Override VoLTE availability</string>
+ <!-- Treble settings screen, securize title -->
+ <string name="securize_title">Spoof system properties</string>
+ <!-- Treble settings screen, securize summary -->
+ <string name="securize_summary">For better chances of passing SafetyNet\nMight cause bootloop on some devices</string>
<!-- Treble settings screen, override navbar availability title -->
<string name="override_navbar_availability_title">Override navigation bar availability</string>
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 250a8ee75a..1f24352421 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -57,6 +57,16 @@
</PreferenceCategory>
+ <PreferenceCategory
+ android:title="@string/treble_settings_category_name_system">
+
+ <SwitchPreference
+ android:key="securize"
+ android:title="@string/securize_title"
+ android:summary="@string/securize_summary" />
+
+ </PreferenceCategory>
+
<PreferenceCategory
android:title="@string/treble_settings_category_name_ui">
diff --git a/src/com/android/settings/treble/SecurizePreferenceController.java b/src/com/android/settings/treble/SecurizePreferenceController.java
new file mode 100644
index 0000000000..0b59bbad81
--- /dev/null
+++ b/src/com/android/settings/treble/SecurizePreferenceController.java
@@ -0,0 +1,53 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class SecurizePreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String SECURIZE_KEY = "securize";
+ private static final String SECURIZE_PROPERTY = "persist.sys.treble.securize";
+
+ private SwitchPreference mSwitchPreference;
+
+ public SecurizePreferenceController(Context context) {
+ super(context, SECURIZE_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return SECURIZE_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(SECURIZE_PROPERTY, false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ SystemProperties.set(SECURIZE_PROPERTY, String.valueOf((boolean) newValue));
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 634b7ce3ce..149c18f231 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -41,6 +41,7 @@ public class TrebleSettings extends DashboardFragment {
controllers.add(new OverrideMinimumBrightnessPreferenceController(context));
controllers.add(new InstallImsApkPreferenceController(context));
controllers.add(new OverrideVolteAvailabilityPreferenceController(context));
+ controllers.add(new SecurizePreferenceController(context));
controllers.add(new OverrideNavbarAvailabilityPreferenceController(context));
return controllers;
}
--
2.34.1

View File

@@ -0,0 +1,116 @@
From 706908e6a63595671e12bd34fb7f6ff2d2892cdb Mon Sep 17 00:00:00 2001
From: Peter Cai <peter@typeblog.net>
Date: Wed, 24 Aug 2022 15:45:18 -0400
Subject: [PATCH] audio_hal_interface: Optionally use sysbta HAL
Required to support sysbta, our system-side bt audio implementation.
Change-Id: I59973e6ec84c5923be8a7c67b36b2e237f000860
---
system/audio_hal_interface/aidl/client_interface_aidl.cc | 8 ++++----
system/audio_hal_interface/aidl/client_interface_aidl.h | 7 +++++++
system/audio_hal_interface/hal_version_manager.cc | 9 ++++++++-
3 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/system/audio_hal_interface/aidl/client_interface_aidl.cc b/system/audio_hal_interface/aidl/client_interface_aidl.cc
index 897b891aa7..ed41627c3e 100644
--- a/system/audio_hal_interface/aidl/client_interface_aidl.cc
+++ b/system/audio_hal_interface/aidl/client_interface_aidl.cc
@@ -56,7 +56,7 @@ BluetoothAudioClientInterface::BluetoothAudioClientInterface(
bool BluetoothAudioClientInterface::is_aidl_available() {
return AServiceManager_isDeclared(
- kDefaultAudioProviderFactoryInterface.c_str());
+ audioProviderFactoryInterface().c_str());
}
std::vector<AudioCapabilities>
@@ -72,7 +72,7 @@ BluetoothAudioClientInterface::GetAudioCapabilities(SessionType session_type) {
}
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(
::ndk::SpAIBinder(AServiceManager_waitForService(
- kDefaultAudioProviderFactoryInterface.c_str())));
+ audioProviderFactoryInterface().c_str())));
if (provider_factory == nullptr) {
LOG(ERROR) << __func__ << ", can't get capability from unknown factory";
@@ -99,7 +99,7 @@ void BluetoothAudioClientInterface::FetchAudioProvider() {
}
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(
::ndk::SpAIBinder(AServiceManager_waitForService(
- kDefaultAudioProviderFactoryInterface.c_str())));
+ audioProviderFactoryInterface().c_str())));
if (provider_factory == nullptr) {
LOG(ERROR) << __func__ << ", can't get capability from unknown factory";
@@ -266,7 +266,7 @@ int BluetoothAudioClientInterface::GetAidlInterfaceVersion() {
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(
::ndk::SpAIBinder(AServiceManager_waitForService(
- kDefaultAudioProviderFactoryInterface.c_str())));
+ audioProviderFactoryInterface().c_str())));
if (provider_factory == nullptr) {
LOG(ERROR) << __func__ << ", can't get aidl version from unknown factory";
diff --git a/system/audio_hal_interface/aidl/client_interface_aidl.h b/system/audio_hal_interface/aidl/client_interface_aidl.h
index 8a40c1d7d7..6d962d3473 100644
--- a/system/audio_hal_interface/aidl/client_interface_aidl.h
+++ b/system/audio_hal_interface/aidl/client_interface_aidl.h
@@ -28,6 +28,7 @@
#include "bluetooth_audio_port_impl.h"
#include "common/message_loop_thread.h"
#include "transport_instance.h"
+#include "osi/include/properties.h"
#define BLUETOOTH_AUDIO_HAL_PROP_DISABLED \
"persist.bluetooth.bluetooth_audio_hal.disabled"
@@ -119,6 +120,12 @@ class BluetoothAudioClientInterface {
// "android.hardware.bluetooth.audio.IBluetoothAudioProviderFactory/default";
static inline const std::string kDefaultAudioProviderFactoryInterface =
std::string() + IBluetoothAudioProviderFactory::descriptor + "/default";
+ static inline const std::string kSystemAudioProviderFactoryInterface =
+ std::string() + IBluetoothAudioProviderFactory::descriptor + "/sysbta";
+ static inline const std::string audioProviderFactoryInterface() {
+ return osi_property_get_bool("persist.bluetooth.system_audio_hal.enabled", false)
+ ? kSystemAudioProviderFactoryInterface : kDefaultAudioProviderFactoryInterface;
+ }
private:
IBluetoothTransportInstance* transport_;
diff --git a/system/audio_hal_interface/hal_version_manager.cc b/system/audio_hal_interface/hal_version_manager.cc
index a2c192f37d..c3d1cf35c2 100644
--- a/system/audio_hal_interface/hal_version_manager.cc
+++ b/system/audio_hal_interface/hal_version_manager.cc
@@ -24,6 +24,7 @@
#include <memory>
#include "aidl/audio_aidl_interfaces.h"
+#include "osi/include/properties.h"
namespace bluetooth {
namespace audio {
@@ -33,6 +34,12 @@ using ::aidl::android::hardware::bluetooth::audio::
static const std::string kDefaultAudioProviderFactoryInterface =
std::string() + IBluetoothAudioProviderFactory::descriptor + "/default";
+static const std::string kSystemAudioProviderFactoryInterface =
+ std::string() + IBluetoothAudioProviderFactory::descriptor + "/sysbta";
+static inline const std::string audioProviderFactoryInterface() {
+ return osi_property_get_bool("persist.bluetooth.system_audio_hal.enabled", false)
+ ? kSystemAudioProviderFactoryInterface : kDefaultAudioProviderFactoryInterface;
+}
std::unique_ptr<HalVersionManager> HalVersionManager::instance_ptr =
std::make_unique<HalVersionManager>();
@@ -92,7 +99,7 @@ HalVersionManager::GetProvidersFactory_2_0() {
HalVersionManager::HalVersionManager() {
if (AServiceManager_checkService(
- kDefaultAudioProviderFactoryInterface.c_str()) != nullptr) {
+ audioProviderFactoryInterface().c_str()) != nullptr) {
hal_version_ = BluetoothAudioHalVersion::VERSION_AIDL_V1;
return;
}
--
2.34.1

View File

@@ -0,0 +1,34 @@
From 04eb0f02934f58c1c842da1ea365275ba03c5b58 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Wed, 19 Oct 2022 02:20:05 +0000
Subject: [PATCH] Revert "detect inability to write to index != 0 of bpf map
array"
This reverts commit ead9d83423877458023056f6ccf9390950d6726f.
---
bpfloader/BpfLoader.cpp | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/bpfloader/BpfLoader.cpp b/bpfloader/BpfLoader.cpp
index 5cd80b7..bc72811 100644
--- a/bpfloader/BpfLoader.cpp
+++ b/bpfloader/BpfLoader.cpp
@@ -199,15 +199,6 @@ int main(int argc, char** argv) {
}
}
- int key = 1;
- int value = 123;
- android::base::unique_fd map(
- android::bpf::createMap(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value), 2, 0));
- if (android::bpf::writeToMapEntry(map, &key, &value, BPF_ANY)) {
- ALOGE("Critical kernel bug - failure to write into index 1 of 2 element bpf map array.");
- return 1;
- }
-
if (android::base::SetProperty("bpf.progs_loaded", "1") == false) {
ALOGE("Failed to set bpf.progs_loaded property");
return 1;
--
2.25.1

View File

@@ -0,0 +1,37 @@
From cd56da986fdf17fc6d5d82d6cb553a8444093099 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Mon, 26 Sep 2022 14:41:41 +0000
Subject: [PATCH 1/4] Make xbin and su executable by other
Needed by PHH-SU
Change-Id: I5304b787ce4602036904a373a409bb08f8f969de
---
libcutils/fs_config.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp
index f90a1bc3c..ef35e0588 100644
--- a/libcutils/fs_config.cpp
+++ b/libcutils/fs_config.cpp
@@ -87,7 +87,7 @@ static const struct fs_path_config android_dirs[] = {
{ 00751, AID_ROOT, AID_SHELL, 0, "system/bin" },
{ 00755, AID_ROOT, AID_ROOT, 0, "system/etc/ppp" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/vendor" },
- { 00750, AID_ROOT, AID_SHELL, 0, "system/xbin" },
+ { 00755, AID_ROOT, AID_SHELL, 0, "system/xbin" },
{ 00751, AID_ROOT, AID_SHELL, 0, "system/apex/*/bin" },
{ 00750, AID_ROOT, AID_SYSTEM, 0, "system_ext/apex/com.android.tethering/bin/for-system" },
{ 00751, AID_ROOT, AID_SHELL, 0, "system_ext/bin" },
@@ -192,7 +192,7 @@ static const struct fs_path_config android_files[] = {
// the following two files are INTENTIONALLY set-uid, but they
// are NOT included on user builds.
{ 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/procmem" },
- { 04750, AID_ROOT, AID_SHELL, 0, "system/xbin/su" },
+ { 04755, AID_ROOT, AID_SHELL, 0, "system/xbin/su" },
// the following files have enhanced capabilities and ARE included
// in user builds.
--
2.34.1

View File

@@ -0,0 +1,87 @@
From 4d4585b2f4f0f7dd1b6ae28cae77b8340d9e0bae Mon Sep 17 00:00:00 2001
From: Victor Bo <bvoid@yandex.ru>
Date: Wed, 3 Mar 2021 06:31:17 -0500
Subject: [PATCH 2/4] Restore /sbin for Magisk compatibility
Squash of:
- Revert "Do not create /sbin"
- Revert "Remove sbin from fs_config.cpp"
- add /sbin to the PATH
Change-Id: I1224c9b64ce8eb14f7d15c8441c0633a7e6a20de
---
CleanSpec.mk | 2 --
libcutils/fs_config.cpp | 3 +++
rootdir/Android.mk | 2 +-
rootdir/init.environ.rc.in | 1 +
4 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 0a534a2bd..81150a0fa 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -80,8 +80,6 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/vndksp.libraries.txt)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/sbin/charger)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/sbin/charger)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/sbin)
-$(call add-clean-step, rm -rf $(PRODUCT_OUT)/recovery/root/sbin)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/product_services)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/product_services.img)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/product_services)
diff --git a/libcutils/fs_config.cpp b/libcutils/fs_config.cpp
index ef35e0588..76174ce1c 100644
--- a/libcutils/fs_config.cpp
+++ b/libcutils/fs_config.cpp
@@ -80,6 +80,7 @@ static const struct fs_path_config android_dirs[] = {
{ 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" },
{ 00755, AID_ROOT, AID_SYSTEM, 0, "mnt" },
{ 00751, AID_ROOT, AID_SHELL, 0, "product/bin" },
+ { 00750, AID_ROOT, AID_SHELL, 0, "sbin" },
{ 00751, AID_ROOT, AID_SHELL, 0, "product/apex/*/bin" },
{ 00777, AID_ROOT, AID_ROOT, 0, "sdcard" },
{ 00751, AID_ROOT, AID_SDCARD_R, 0, "storage" },
@@ -168,6 +169,7 @@ static const struct fs_path_config android_files[] = {
{ 00600, AID_ROOT, AID_ROOT, 0, "system_ext/build.prop" },
{ 00444, AID_ROOT, AID_ROOT, 0, system_ext_conf_dir + 1 },
{ 00444, AID_ROOT, AID_ROOT, 0, system_ext_conf_file + 1 },
+ { 00750, AID_ROOT, AID_SHELL, 0, "sbin/fs_mgr" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/bin/crash_dump32" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/bin/crash_dump64" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/bin/debuggerd" },
@@ -222,6 +224,7 @@ static const struct fs_path_config android_files[] = {
{ 00750, AID_ROOT, AID_SHELL, 0, "init*" },
{ 00755, AID_ROOT, AID_SHELL, 0, "odm/bin/*" },
{ 00755, AID_ROOT, AID_SHELL, 0, "product/bin/*" },
+ { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" },
{ 00755, AID_ROOT, AID_SHELL, 0, "product/apex/*bin/*" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/xbin/*" },
diff --git a/rootdir/Android.mk b/rootdir/Android.mk
index 3362872c0..1b686c38f 100644
--- a/rootdir/Android.mk
+++ b/rootdir/Android.mk
@@ -91,7 +91,7 @@ endif
#
# create some directories (some are mount points) and symlinks
LOCAL_POST_INSTALL_CMD := mkdir -p $(addprefix $(TARGET_ROOT_OUT)/, \
- dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk \
+ sbin dev proc sys system data data_mirror odm oem acct config storage mnt apex debug_ramdisk \
linkerconfig second_stage_resources postinstall $(BOARD_ROOT_EXTRA_FOLDERS)); \
ln -sf /system/bin $(TARGET_ROOT_OUT)/bin; \
ln -sf /system/etc $(TARGET_ROOT_OUT)/etc; \
diff --git a/rootdir/init.environ.rc.in b/rootdir/init.environ.rc.in
index bf6e986c4..090fa5a78 100644
--- a/rootdir/init.environ.rc.in
+++ b/rootdir/init.environ.rc.in
@@ -10,6 +10,7 @@ on early-init
export ANDROID_TZDATA_ROOT /apex/com.android.tzdata
export EXTERNAL_STORAGE /sdcard
export ASEC_MOUNTPOINT /mnt/asec
+ export PATH /sbin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin
%EXPORT_GLOBAL_ASAN_OPTIONS%
%EXPORT_GLOBAL_GCOV_OPTIONS%
%EXPORT_GLOBAL_CLANG_COVERAGE_OPTIONS%
--
2.34.1

View File

@@ -0,0 +1,31 @@
From 0cf9d044459a3e0259917dca782103126b0c2d42 Mon Sep 17 00:00:00 2001
From: Isaac Chen <tingyi364@gmail.com>
Date: Wed, 23 Jun 2021 13:07:30 +0800
Subject: [PATCH 3/4] init: Do not start console service when debuggable
Google added a check for this in R, when it's running it will show a
notification about that performance is impacted.
Signed-off-by: Isaac Chen <tingyi364@gmail.com>
Change-Id: I34cfd6b42d3b9aee4b3e63181480cfb8b1255f29
---
rootdir/init.rc | 3 ---
1 file changed, 3 deletions(-)
diff --git a/rootdir/init.rc b/rootdir/init.rc
index 1e6918d00..8b48a9c87 100644
--- a/rootdir/init.rc
+++ b/rootdir/init.rc
@@ -1312,9 +1312,6 @@ on property:ro.debuggable=1
# Give reads to anyone for the accessibility trace folder on debug builds.
chmod 0775 /data/misc/a11ytrace
-on init && property:ro.debuggable=1
- start console
-
on userspace-reboot-requested
# TODO(b/135984674): reset all necessary properties here.
setprop sys.boot_completed ""
--
2.34.1

View File

@@ -0,0 +1,35 @@
From a27092d9b56b807b66f121321e9242a9a4db834f Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Sun, 18 Oct 2020 18:14:47 +0200
Subject: [PATCH 4/4] Don't abandon creating property tree if there is a
conflict, and hope for the best
Change-Id: I194c815fdd58bfb84aaf7db02b8f0d00b4db21e8
---
.../libpropertyinfoserializer/property_info_serializer.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/property_service/libpropertyinfoserializer/property_info_serializer.cpp b/property_service/libpropertyinfoserializer/property_info_serializer.cpp
index 803657ab8..ecdd0be20 100644
--- a/property_service/libpropertyinfoserializer/property_info_serializer.cpp
+++ b/property_service/libpropertyinfoserializer/property_info_serializer.cpp
@@ -19,6 +19,7 @@
#include "property_info_parser/property_info_parser.h"
#include <set>
+#include <iostream>
#include "trie_builder.h"
#include "trie_serializer.h"
@@ -34,7 +35,7 @@ bool BuildTrie(const std::vector<PropertyInfoEntry>& property_info,
for (const auto& [name, context, type, is_exact] : property_info) {
if (!trie_builder.AddToTrie(name, context, type, is_exact, error)) {
- return false;
+ std::cerr << "Failed adding " << name << " to property trie... let's hope for the best" << std::endl;
}
}
--
2.34.1

View File

@@ -0,0 +1,60 @@
From 1c1e3e209c687d9ef0e86c80a113208251a375b9 Mon Sep 17 00:00:00 2001
From: Pierre-Hugues Husson <phh@phh.me>
Date: Tue, 18 Oct 2022 16:08:09 -0400
Subject: [PATCH] Exfat can be mounted with "exfat" kernel fs driver, or
"sdfat" or "texfat" (Samsung and Sony variants)
@AndyCGYan: Adapt to LineageOS vold
Change-Id: I331e66d8cb37664adbd493b9190123e29f01fd9d
---
Utils.cpp | 5 +++++
fs/Exfat.cpp | 11 +++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/Utils.cpp b/Utils.cpp
index a7e85f2..fb67067 100644
--- a/Utils.cpp
+++ b/Utils.cpp
@@ -1059,6 +1059,11 @@ bool IsFilesystemSupported(const std::string& fsType) {
/* fuse filesystems */
supported.append("fuse\tntfs\n");
+ /* treat sdfat/texfat as exfat */
+ if (supported.find("sdfat\n") != std::string::npos || supported.find("texfat\n") != std::string::npos) {
+ supported.append("\texfat\n");
+ }
+
return supported.find(fsType + "\n") != std::string::npos;
}
diff --git a/fs/Exfat.cpp b/fs/Exfat.cpp
index c8b19e0..46a0e2d 100644
--- a/fs/Exfat.cpp
+++ b/fs/Exfat.cpp
@@ -61,13 +61,20 @@ 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";
+ } else if (IsFilesystemSupported("texfat")) {
+ fs = "texfat";
+ }
+
+ 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.25.1

View File

@@ -0,0 +1,25 @@
From 6ac3e22846c212278b9870f045bb9491c8f5e3a3 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Wed, 21 Sep 2022 13:36:07 +0000
Subject: [PATCH 1/2] Exclude TrebleApp & co.
Change-Id: Ieb62801a79c6e015634fd58b654c63c1de5aef7e
---
overlay.mk | 3 ---
1 file changed, 3 deletions(-)
diff --git a/overlay.mk b/overlay.mk
index a1de82b..a7fc18a 100644
--- a/overlay.mk
+++ b/overlay.mk
@@ -1,7 +1,4 @@
PRODUCT_PACKAGES += \
- HardwareOverlayPicker \
- QtiAudio \
- TrebleApp \
treble-overlay-NavBar \
treble-overlay-NightMode \
treble-overlay-SystemUI-FalseLocks \
--
2.34.1

View File

@@ -0,0 +1,135 @@
From ea0f9443f862e2059cef4c3f8f64707d1d3ff46c Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Tue, 11 Oct 2022 10:53:34 +0000
Subject: [PATCH 2/2] Enable IMS overlays statically on QCOM/MTK devices
Change-Id: I851cf859328cc431e8bb163297c33837d4270f58
---
CAF-IMS/AndroidManifest.xml | 8 ++++----
CAF-IMS/res/values/config.xml | 4 ++--
MTK-IMS/AndroidManifest.xml | 8 ++++----
MTK-IMS/res/values/config.xml | 8 +++++---
Telephony/CAF-IMS/AndroidManifest.xml | 6 ++++--
Telephony/CAF-IMS/res/values/config.xml | 2 +-
Telephony/MTK-IMS/AndroidManifest.xml | 6 ++++--
Telephony/MTK-IMS/res/values/config.xml | 3 +--
8 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/CAF-IMS/AndroidManifest.xml b/CAF-IMS/AndroidManifest.xml
index 47236c6..5376fb8 100644
--- a/CAF-IMS/AndroidManifest.xml
+++ b/CAF-IMS/AndroidManifest.xml
@@ -3,8 +3,8 @@
android:versionCode="1"
android:versionName="1.0">
<overlay android:targetPackage="android"
- android:requiredSystemPropertyName="persist.sys.phh.ims.caf"
- android:requiredSystemPropertyValue="true"
- android:priority="39"
- android:isStatic="true" />
+ android:requiredSystemPropertyName="ro.hardware"
+ android:requiredSystemPropertyValue="qcom"
+ android:priority="39"
+ android:isStatic="true" />
</manifest>
diff --git a/CAF-IMS/res/values/config.xml b/CAF-IMS/res/values/config.xml
index 1af87c7..5b85ebd 100644
--- a/CAF-IMS/res/values/config.xml
+++ b/CAF-IMS/res/values/config.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="config_ims_package">org.codeaurora.ims</string>
- <bool name="config_dynamic_bind_ims">true</bool>
+ <string name="config_ims_package">org.codeaurora.ims</string>
+ <bool name="config_dynamic_bind_ims">true</bool>
<bool name="config_carrier_volte_available">true</bool>
<bool name="config_device_volte_available">true</bool>
<bool name="config_device_wfc_ims_available">true</bool>
diff --git a/MTK-IMS/AndroidManifest.xml b/MTK-IMS/AndroidManifest.xml
index 96ba83e..33132cc 100644
--- a/MTK-IMS/AndroidManifest.xml
+++ b/MTK-IMS/AndroidManifest.xml
@@ -3,8 +3,8 @@
android:versionCode="1"
android:versionName="1.0">
<overlay android:targetPackage="android"
- android:requiredSystemPropertyName="persist.sys.phh.ims.mtk"
- android:requiredSystemPropertyValue="true"
- android:priority="79"
- android:isStatic="true" />
+ android:requiredSystemPropertyName="ro.hardware"
+ android:requiredSystemPropertyValue="+mt6*"
+ android:priority="79"
+ android:isStatic="true" />
</manifest>
diff --git a/MTK-IMS/res/values/config.xml b/MTK-IMS/res/values/config.xml
index f5e0486..2d49a11 100644
--- a/MTK-IMS/res/values/config.xml
+++ b/MTK-IMS/res/values/config.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="config_ims_package">com.mediatek.ims</string>
- <bool name="config_carrier_volte_available">true</bool>
- <bool name="config_dynamic_bind_ims">true</bool>
+ <string name="config_ims_package">com.mediatek.ims</string>
+ <bool name="config_dynamic_bind_ims">true</bool>
+ <bool name="config_carrier_volte_available">true</bool>
+ <bool name="config_device_volte_available">true</bool>
+ <bool name="config_device_wfc_ims_available">true</bool>
</resources>
diff --git a/Telephony/CAF-IMS/AndroidManifest.xml b/Telephony/CAF-IMS/AndroidManifest.xml
index 2267406..365525c 100644
--- a/Telephony/CAF-IMS/AndroidManifest.xml
+++ b/Telephony/CAF-IMS/AndroidManifest.xml
@@ -3,6 +3,8 @@
android:versionCode="1"
android:versionName="1.0">
<overlay android:targetPackage="com.android.phone"
- android:priority="79"
- />
+ android:requiredSystemPropertyName="ro.hardware"
+ android:requiredSystemPropertyValue="qcom"
+ android:priority="79"
+ android:isStatic="true" />
</manifest>
diff --git a/Telephony/CAF-IMS/res/values/config.xml b/Telephony/CAF-IMS/res/values/config.xml
index 565ee42..ddf685d 100644
--- a/Telephony/CAF-IMS/res/values/config.xml
+++ b/Telephony/CAF-IMS/res/values/config.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="config_ims_mmtel_package">org.codeaurora.ims</string>
+ <string name="config_ims_mmtel_package">org.codeaurora.ims</string>
</resources>
diff --git a/Telephony/MTK-IMS/AndroidManifest.xml b/Telephony/MTK-IMS/AndroidManifest.xml
index 5afe885..644d06b 100644
--- a/Telephony/MTK-IMS/AndroidManifest.xml
+++ b/Telephony/MTK-IMS/AndroidManifest.xml
@@ -3,6 +3,8 @@
android:versionCode="1"
android:versionName="1.0">
<overlay android:targetPackage="com.android.phone"
- android:priority="79"
- />
+ android:requiredSystemPropertyName="ro.hardware"
+ android:requiredSystemPropertyValue="+mt6*"
+ android:priority="79"
+ android:isStatic="true" />
</manifest>
diff --git a/Telephony/MTK-IMS/res/values/config.xml b/Telephony/MTK-IMS/res/values/config.xml
index ead0cc2..01eca95 100644
--- a/Telephony/MTK-IMS/res/values/config.xml
+++ b/Telephony/MTK-IMS/res/values/config.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="config_ims_mmtel_package">com.mediatek.ims</string>
-
+ <string name="config_ims_mmtel_package">com.mediatek.ims</string>
</resources>
--
2.34.1

View File

@@ -0,0 +1,48 @@
From f3ffdeec910a9d36e92c88071c95016c3ecf2e1c Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Sat, 24 Sep 2022 11:40:52 +0000
Subject: [PATCH 1/2] vendor_lineage: Commonly build some packages
These were in handheld_product.mk and thus weren't included in GSI targets:
Contacts, DeskClock, Gallery2, SettingsIntelligence, fwb overlays
Change-Id: I00cc5918164ed70c612c5caa31eb8d2d0cd05b62
---
config/common_full.mk | 3 +++
config/common_mobile.mk | 4 +++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/config/common_full.mk b/config/common_full.mk
index f7eecd84..51e1e022 100644
--- a/config/common_full.mk
+++ b/config/common_full.mk
@@ -9,8 +9,11 @@ $(call inherit-product-if-exists, external/google-fonts/rubik/fonts.mk)
# Apps
PRODUCT_PACKAGES += \
+ Contacts \
+ DeskClock \
Eleven \
Etar \
+ Gallery2 \
Profiles \
Recorder \
Seedvault
diff --git a/config/common_mobile.mk b/config/common_mobile.mk
index 560074e4..9f3ae002 100644
--- a/config/common_mobile.mk
+++ b/config/common_mobile.mk
@@ -15,7 +15,9 @@ PRODUCT_PRODUCT_PROPERTIES += \
# Apps
PRODUCT_PACKAGES += \
Backgrounds \
- Glimpse
+ Glimpse \
+ SettingsIntelligence \
+ frameworks-base-overlays
ifeq ($(PRODUCT_TYPE), go)
PRODUCT_PACKAGES += \
--
2.34.1

View File

@@ -0,0 +1,34 @@
From 1dcb3c39633bc877678577d9f6d43b8b3b51f953 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Tue, 19 Oct 2021 15:48:43 +0000
Subject: [PATCH 2/2] vendor_lineage: Disable ADB authentication
Change-Id: I4370583ecab1c88ef6f42e29d3eaa52c24d13f09
---
config/common.mk | 5 -----
1 file changed, 5 deletions(-)
diff --git a/config/common.mk b/config/common.mk
index 00d0a416..c9930600 100644
--- a/config/common.mk
+++ b/config/common.mk
@@ -13,16 +13,11 @@ PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \
ro.com.google.clientidbase=$(PRODUCT_GMS_CLIENTID_BASE)
endif
-ifeq ($(TARGET_BUILD_VARIANT),eng)
# Disable ADB authentication
PRODUCT_SYSTEM_DEFAULT_PROPERTIES += ro.adb.secure=0
-else
-# Enable ADB authentication
-PRODUCT_SYSTEM_DEFAULT_PROPERTIES += ro.adb.secure=1
# Disable extra StrictMode features on all non-engineering builds
PRODUCT_SYSTEM_DEFAULT_PROPERTIES += persist.sys.strictmode.disable=true
-endif
# Backup Tool
PRODUCT_COPY_FILES += \
--
2.34.1