Compare commits
No commits in common. "aosp15" and "aosp14" have entirely different histories.
54 changed files with 686 additions and 4715 deletions
|
@ -1,4 +1,4 @@
|
|||
From 9f770e862954f07e8a7cce36aedd4879b10641c6 Mon Sep 17 00:00:00 2001
|
||||
From 13537c3a17b60050d431d7d5b9dbfc591ee41762 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] Add new mechanism to fake vendor props on a per-process basis
|
||||
|
@ -17,7 +17,7 @@ Squashed: Rework property overriding
|
|||
1 file changed, 79 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libc/system_properties/system_properties.cpp b/libc/system_properties/system_properties.cpp
|
||||
index e0d38a8..4f54885 100644
|
||||
index 9dd5e35ce..4524f8410 100644
|
||||
--- a/libc/system_properties/system_properties.cpp
|
||||
+++ b/libc/system_properties/system_properties.cpp
|
||||
@@ -36,6 +36,8 @@
|
||||
|
@ -109,7 +109,7 @@ index e0d38a8..4f54885 100644
|
|||
static bool is_dir(const char* pathname) {
|
||||
struct stat info;
|
||||
if (stat(pathname, &info) == -1) {
|
||||
@@ -160,17 +235,19 @@ uint32_t SystemProperties::AreaSerial() {
|
||||
@@ -156,17 +231,19 @@ uint32_t SystemProperties::AreaSerial() {
|
||||
}
|
||||
|
||||
const prop_info* SystemProperties::Find(const char* name) {
|
||||
|
@ -132,5 +132,5 @@ index e0d38a8..4f54885 100644
|
|||
|
||||
static bool is_appcompat_override(const char* name) {
|
||||
--
|
||||
2.48.1
|
||||
2.43.1
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From 875011b65d3839871b488b18d483fd56f2306a7b Mon Sep 17 00:00:00 2001
|
||||
From 682110b814e507f7ab30f0027fb3d41519fc809d Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Wed, 24 Aug 2022 15:42:39 -0400
|
||||
Subject: [PATCH 1/6] APM: Optionally force-load audio policy for system-side
|
||||
Subject: [PATCH 1/5] APM: Optionally force-load audio policy for system-side
|
||||
bt audio HAL
|
||||
|
||||
Required to support our system-side bt audio implementation, i.e.
|
||||
|
@ -57,5 +57,5 @@ index 6f19a7a145..08836377b7 100644
|
|||
|
||||
// Global Configuration
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From d24b962cb20fb0a3e807d05c534f43f8bd0ce350 Mon Sep 17 00:00:00 2001
|
||||
From 4dc4f2ff0eb1df7d8bfaab7d5d6a006035c3b403 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Thu, 25 Aug 2022 13:30:29 -0400
|
||||
Subject: [PATCH 2/6] APM: Remove A2DP audio ports from the primary HAL
|
||||
Subject: [PATCH 2/5] 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
|
||||
|
@ -75,5 +75,5 @@ index 08836377b7..0f7c903909 100644
|
|||
|
||||
RouteTraits::Collection routes;
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From b3bc05d8e2bb94c4992a12a943d16c27554fa54d Mon Sep 17 00:00:00 2001
|
||||
From 819c95781f525035656b02f00d5251d1328f5073 Mon Sep 17 00:00:00 2001
|
||||
From: ponces <ponces26@gmail.com>
|
||||
Date: Mon, 24 Oct 2022 09:38:34 +0100
|
||||
Subject: [PATCH 3/6] voip: Fix high pitched voice on Qualcomm devices
|
||||
Subject: [PATCH 3/5] voip: Fix high pitched voice on Qualcomm devices
|
||||
|
||||
Change-Id: I6d314912169776b76d07d8c0301ec5249c1870a2
|
||||
---
|
||||
|
@ -52,5 +52,5 @@ index 0f7c903909..c4474cf1c2 100644
|
|||
ALOGE("%s: No %s found", __func__, Attributes::name);
|
||||
return BAD_VALUE;
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From d483a03149f587b3078d81256ac356382aafdd6b Mon Sep 17 00:00:00 2001
|
||||
From 96765f345007ee59522f839a6e994f571dc782d3 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Thu, 18 Aug 2022 15:44:46 -0400
|
||||
Subject: [PATCH 6/6] APM: Restore S, R and Q behavior respectively for
|
||||
Subject: [PATCH 4/5] APM: Restore S, R and Q behavior respectively for
|
||||
telephony audio
|
||||
|
||||
This conditionally reverts part of b2e5cb (T), 51c9cc (S) and afd4ce (R)
|
||||
|
@ -33,13 +33,13 @@ Change-Id: I56d36d2aef4319935cb88a3e4771b23c6d5b2145
|
|||
---
|
||||
.../managerdefault/AudioPolicyManager.cpp | 206 ++++++++++++------
|
||||
.../managerdefault/AudioPolicyManager.h | 3 +
|
||||
2 files changed, 148 insertions(+), 61 deletions(-)
|
||||
2 files changed, 147 insertions(+), 62 deletions(-)
|
||||
|
||||
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
|
||||
index 73b574ccfa..4c44acb966 100644
|
||||
index 135548fb9c..fc99bdbd78 100644
|
||||
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
|
||||
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
|
||||
@@ -746,6 +746,17 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
@@ -692,6 +692,17 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
ALOGV("%s device rxDevice %s txDevice %s", __func__,
|
||||
rxDevices.itemAt(0)->toString().c_str(), txSourceDevice->toString().c_str());
|
||||
|
||||
|
@ -57,7 +57,7 @@ index 73b574ccfa..4c44acb966 100644
|
|||
auto telephonyRxModule =
|
||||
mHwModules.getModuleForDeviceType(AUDIO_DEVICE_IN_TELEPHONY_RX, AUDIO_FORMAT_DEFAULT);
|
||||
auto telephonyTxModule =
|
||||
@@ -768,9 +779,20 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
@@ -714,9 +725,20 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
ALOGE("%s() no telephony Tx and/or RX device", __func__);
|
||||
return INVALID_OPERATION;
|
||||
}
|
||||
|
@ -81,13 +81,13 @@ index 73b574ccfa..4c44acb966 100644
|
|||
} else {
|
||||
// If the RX device is on the primary HW module, then use legacy routing method for
|
||||
// voice calls via setOutputDevice() on primary output.
|
||||
@@ -794,7 +816,14 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
@@ -737,7 +759,14 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
}
|
||||
muteWaitMs = setOutputDevices(__func__, mPrimaryOutput, rxDevices, true, delayMs);
|
||||
} else { // create RX path audio patch
|
||||
- connectTelephonyRxAudioSource(delayMs);
|
||||
- connectTelephonyRxAudioSource();
|
||||
+ if (property_get_int32("ro.vndk.version", 31) >= 31) {
|
||||
+ connectTelephonyRxAudioSource(delayMs);
|
||||
+ connectTelephonyRxAudioSource();
|
||||
+ } else {
|
||||
+ // pre-S behavior: some devices do not support SW bridging correctly when HW bridge is
|
||||
+ // available through createAudioPatch(); startAudioSource() forces SW bridging.
|
||||
|
@ -97,21 +97,21 @@ index 73b574ccfa..4c44acb966 100644
|
|||
// 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
|
||||
@@ -810,6 +839,13 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
@@ -752,7 +781,12 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
closeActiveClients(activeDesc);
|
||||
}
|
||||
}
|
||||
connectTelephonyTxAudioSource(txSourceDevice, txSinkDevice, delayMs);
|
||||
+
|
||||
- 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);
|
||||
+ }
|
||||
} else if (fix_call_audio_patch()) {
|
||||
disconnectTelephonyAudioSource(mCallTxSourceClient);
|
||||
}
|
||||
@@ -819,6 +855,36 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
if (waitMs != nullptr) {
|
||||
*waitMs = muteWaitMs;
|
||||
@@ -760,6 +794,36 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
|
@ -148,7 +148,7 @@ index 73b574ccfa..4c44acb966 100644
|
|||
bool AudioPolicyManager::isDeviceOfModule(
|
||||
const sp<DeviceDescriptor>& devDesc, const char *moduleId) const {
|
||||
sp<HwModule> module = mHwModules.getModuleFromName(moduleId);
|
||||
@@ -5636,83 +5702,101 @@ status_t AudioPolicyManager::createAudioPatchInternal(const struct audio_patch *
|
||||
@@ -5087,83 +5151,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;
|
||||
|
@ -166,14 +166,14 @@ index 73b574ccfa..4c44acb966 100644
|
|||
- : audio_channel_mask_in_to_out(sourceMask);
|
||||
- config.format = sourceDesc->config().format;
|
||||
- audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE;
|
||||
- DeviceIdVector selectedDeviceIds;
|
||||
- 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,
|
||||
- &selectedDeviceIds, &isRequestedDeviceForExclusiveUse,
|
||||
- &selectedDeviceId, &isRequestedDeviceForExclusiveUse,
|
||||
- nullptr, &outputType, &isSpatialized, &isBitPerfect);
|
||||
- if (output == AUDIO_IO_HANDLE_NONE) {
|
||||
- ALOGV("%s no output for device %s",
|
||||
|
@ -219,14 +219,14 @@ index 73b574ccfa..4c44acb966 100644
|
|||
+ : audio_channel_mask_in_to_out(sourceMask);
|
||||
+ config.format = sourceDesc->config().format;
|
||||
+ audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE;
|
||||
+ DeviceIdVector selectedDeviceIds;
|
||||
+ 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,
|
||||
+ &selectedDeviceIds, &isRequestedDeviceForExclusiveUse,
|
||||
+ &selectedDeviceId, &isRequestedDeviceForExclusiveUse,
|
||||
+ nullptr, &outputType, &isSpatialized, &isBitPerfect);
|
||||
+ if (output == AUDIO_IO_HANDLE_NONE) {
|
||||
+ ALOGV("%s no output for device %s",
|
||||
|
@ -302,16 +302,16 @@ index 73b574ccfa..4c44acb966 100644
|
|||
outputDesc->toAudioPortConfig(&srcMixPortConfig, nullptr);
|
||||
// for volume control, we may need a valid stream
|
||||
srcMixPortConfig.ext.mix.usecase.stream =
|
||||
- (!sourceDesc->isInternal() || sourceDesc->isCallTx()) ?
|
||||
+ (sourceDesc != nullptr && (!sourceDesc->isInternal() || sourceDesc->isCallTx())) ?
|
||||
- (!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 44863eedc2..e8024942fd 100644
|
||||
index a1c8f6202c..ee1b595e30 100644
|
||||
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
|
||||
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
|
||||
@@ -1017,6 +1017,9 @@ protected:
|
||||
@@ -964,6 +964,9 @@ protected:
|
||||
|
||||
SoundTriggerSessionCollection mSoundTriggerSessions;
|
||||
|
||||
|
@ -322,5 +322,5 @@ index 44863eedc2..e8024942fd 100644
|
|||
SourceClientCollection mAudioSources;
|
||||
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From 88eee2c55fa4e85aeef0df59c9b788b2b7868c6b Mon Sep 17 00:00:00 2001
|
||||
From caaf4d4bd4fcc3fd59a2185b69ba0d77fe2e66c6 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 5 Aug 2019 18:09:50 +0200
|
||||
Subject: [PATCH 4/6] Fix BT in-call on CAF devices
|
||||
Subject: [PATCH 5/5] Fix BT in-call on CAF devices
|
||||
|
||||
See https://github.com/phhusson/treble_experimentations/issues/374
|
||||
|
||||
|
@ -127,5 +127,5 @@ index c4474cf1c2..c1df8f278b 100644
|
|||
|
||||
for (const xmlNode *children = cur->xmlChildrenNode; children != NULL;
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
From 79a670c8e20a8eb68849be7e3f9b4c0421d92073 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 21 Dec 2020 20:19:11 +0100
|
||||
Subject: [PATCH 5/6] Make camera IDs filter-out optional
|
||||
|
||||
Nowadays most people have Camera 2 apps, and would like to have all
|
||||
cameras, rather than limit which cameras are available.
|
||||
Add a property for that.
|
||||
---
|
||||
.../common/CameraProviderManager.cpp | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
|
||||
index a8d748028b..203a166a36 100644
|
||||
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
|
||||
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
|
||||
@@ -324,7 +324,9 @@ std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds
|
||||
// API1 app doesn't handle logical and physical camera devices well. So
|
||||
// for each camera facing, only take the first id advertised by HAL in
|
||||
// all [logical, physical1, physical2, ...] id combos, and filter out the rest.
|
||||
- filterLogicalCameraIdsLocked(providerDeviceIds);
|
||||
+ if(!property_get_bool("persist.sys.phh.include_all_cameras", false)) {
|
||||
+ filterLogicalCameraIdsLocked(providerDeviceIds);
|
||||
+ }
|
||||
collectDeviceIdsLocked(providerDeviceIds, publicDeviceIds, systemDeviceIds);
|
||||
}
|
||||
auto sortFunc =
|
||||
@@ -1108,10 +1110,12 @@ SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCame
|
||||
|
||||
// Go through the capabilities and check if it has
|
||||
// ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
|
||||
- for (size_t i = 0; i < entryCap.count; ++i) {
|
||||
- uint8_t capability = entryCap.data.u8[i];
|
||||
- if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA) {
|
||||
- return SystemCameraKind::SYSTEM_ONLY_CAMERA;
|
||||
+ if(!property_get_bool("persist.sys.phh.include_all_cameras", false)) {
|
||||
+ for (size_t i = 0; i < entryCap.count; ++i) {
|
||||
+ uint8_t capability = entryCap.data.u8[i];
|
||||
+ if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA) {
|
||||
+ return SystemCameraKind::SYSTEM_ONLY_CAMERA;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
return SystemCameraKind::PUBLIC;
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From 3c6a1bbffa88d93be209b41b911f192618a3b8e6 Mon Sep 17 00:00:00 2001
|
||||
From 01d09cb926af28c390360747b7e4ce78d913ba5d Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Tue, 12 Oct 2021 21:37:22 -0400
|
||||
Subject: [PATCH 01/11] PackageParser: support glob matching for properties
|
||||
Subject: [PATCH 01/10] PackageParser: support glob matching for properties
|
||||
|
||||
Needed to make phh's vendor overlays work
|
||||
---
|
||||
|
@ -9,7 +9,7 @@ Needed to make phh's vendor overlays work
|
|||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
|
||||
index 4b579e7db..8176cf8e8 100644
|
||||
index 4b579e7db9f8..8176cf8e8567 100644
|
||||
--- a/core/java/android/content/pm/PackageParser.java
|
||||
+++ b/core/java/android/content/pm/PackageParser.java
|
||||
@@ -2545,8 +2545,16 @@ public class PackageParser {
|
||||
|
@ -32,5 +32,5 @@ index 4b579e7db..8176cf8e8 100644
|
|||
}
|
||||
return true;
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From 6d3e460a5e0df0f6ac2f653d0577560a2c8f32d3 Mon Sep 17 00:00:00 2001
|
||||
From e9c04f963f87ed7c44c63017f34e24a450c3a3c9 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Fri, 2 Sep 2022 21:36:06 -0400
|
||||
Subject: [PATCH 02/11] FrameworkParsingPackageUtils: Add glob matching support
|
||||
Subject: [PATCH 02/10] FrameworkParsingPackageUtils: Add glob matching support
|
||||
for properties
|
||||
|
||||
This is now required in addition to the one in PackageParser in order
|
||||
|
@ -13,7 +13,7 @@ Change-Id: Ie8679c0ffe03cead4a68bd2d0eb429f05af2d417
|
|||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
|
||||
index e30f871b6..a2979f695 100644
|
||||
index 153dd9a93490..900151440ca9 100644
|
||||
--- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
|
||||
+++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java
|
||||
@@ -215,8 +215,16 @@ public class FrameworkParsingPackageUtils {
|
||||
|
@ -36,5 +36,5 @@ index e30f871b6..a2979f695 100644
|
|||
}
|
||||
return true;
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From 176fce488f4206d10e3d4873bce3a43a97540890 Mon Sep 17 00:00:00 2001
|
||||
From 55faa21dece9f9eafdfed5506c6c72130ccf9704 Mon Sep 17 00:00:00 2001
|
||||
From: Oliver Scott <olivercscott@gmail.com>
|
||||
Date: Thu, 8 Jul 2021 10:41:43 -0400
|
||||
Subject: [PATCH 03/11] Global VPN feature [1/2]
|
||||
Subject: [PATCH 03/10] Global VPN feature [1/2]
|
||||
|
||||
* Modify existing VPN user range functions to conditionally have traffic
|
||||
from all users pass through the global VPN.
|
||||
|
@ -28,10 +28,10 @@ Signed-off-by: Mohammad Hasan Keramat J <ikeramat@protonmail.com>
|
|||
3 files changed, 46 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
|
||||
index 4acb6312f..dbc9845a8 100644
|
||||
index 51585af10f5d..4603fc609f3d 100644
|
||||
--- a/core/java/android/provider/Settings.java
|
||||
+++ b/core/java/android/provider/Settings.java
|
||||
@@ -18232,6 +18232,12 @@ public final class Settings {
|
||||
@@ -17696,6 +17696,12 @@ public final class Settings {
|
||||
CLOCKWORK_HOME_READY,
|
||||
};
|
||||
|
||||
|
@ -45,7 +45,7 @@ index 4acb6312f..dbc9845a8 100644
|
|||
* Keys we no longer back up under the current schema, but want to continue to
|
||||
* process when restoring historical backup datasets.
|
||||
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
|
||||
index f39762766..c7dc809c9 100644
|
||||
index f39762766633..c7dc809c986d 100644
|
||||
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
|
||||
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
|
||||
@@ -44,6 +44,7 @@ import android.os.Handler;
|
||||
|
@ -72,10 +72,10 @@ index f39762766..c7dc809c9 100644
|
|||
mVpnUserId = newUserInfo.restrictedProfileParentId;
|
||||
} else {
|
||||
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
|
||||
index 4c5f65285..1c546be6f 100644
|
||||
index b7ece2ea65b1..82a3f45ca993 100644
|
||||
--- a/services/core/java/com/android/server/connectivity/Vpn.java
|
||||
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
|
||||
@@ -778,6 +778,15 @@ public class Vpn {
|
||||
@@ -776,6 +776,15 @@ public class Vpn {
|
||||
return mAlwaysOn;
|
||||
}
|
||||
|
||||
|
@ -91,7 +91,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
/**
|
||||
* Checks if a VPN app supports always-on mode.
|
||||
*
|
||||
@@ -1720,6 +1729,7 @@ public class Vpn {
|
||||
@@ -1718,6 +1727,7 @@ public class Vpn {
|
||||
try {
|
||||
// Restricted users are not allowed to create VPNs, they are tied to Owner
|
||||
enforceNotRestrictedUser();
|
||||
|
@ -99,7 +99,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
|
||||
final PackageManager packageManager = mUserIdContext.getPackageManager();
|
||||
if (packageManager == null) {
|
||||
@@ -1870,7 +1880,7 @@ public class Vpn {
|
||||
@@ -1868,7 +1878,7 @@ public class Vpn {
|
||||
addUserToRanges(ranges, userId, allowedApplications, disallowedApplications);
|
||||
|
||||
// If the user can have restricted profiles, assign all its restricted profiles too
|
||||
|
@ -108,7 +108,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
final long token = Binder.clearCallingIdentity();
|
||||
List<UserInfo> users;
|
||||
try {
|
||||
@@ -1879,7 +1889,8 @@ public class Vpn {
|
||||
@@ -1877,7 +1887,8 @@ public class Vpn {
|
||||
Binder.restoreCallingIdentity(token);
|
||||
}
|
||||
for (UserInfo user : users) {
|
||||
|
@ -118,7 +118,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
addUserToRanges(ranges, user.id, allowedApplications, disallowedApplications);
|
||||
}
|
||||
}
|
||||
@@ -1960,7 +1971,8 @@ public class Vpn {
|
||||
@@ -1958,7 +1969,8 @@ public class Vpn {
|
||||
public void onUserAdded(int userId) {
|
||||
// If the user is restricted tie them to the parent user's VPN
|
||||
UserInfo user = mUserManager.getUserInfo(userId);
|
||||
|
@ -128,7 +128,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
synchronized(Vpn.this) {
|
||||
final Set<Range<Integer>> existingRanges = mNetworkCapabilities.getUids();
|
||||
if (existingRanges != null) {
|
||||
@@ -1989,7 +2001,8 @@ public class Vpn {
|
||||
@@ -1987,7 +1999,8 @@ public class Vpn {
|
||||
public void onUserRemoved(int userId) {
|
||||
// clean up if restricted
|
||||
UserInfo user = mUserManager.getUserInfo(userId);
|
||||
|
@ -138,7 +138,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
synchronized(Vpn.this) {
|
||||
final Set<Range<Integer>> existingRanges = mNetworkCapabilities.getUids();
|
||||
if (existingRanges != null) {
|
||||
@@ -2414,6 +2427,17 @@ public class Vpn {
|
||||
@@ -2412,6 +2425,17 @@ public class Vpn {
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -156,7 +156,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
/**
|
||||
* Start legacy VPN, controlling native daemons as needed. Creates a
|
||||
* secondary thread to perform connection work, returning quickly.
|
||||
@@ -2497,6 +2521,7 @@ public class Vpn {
|
||||
@@ -2495,6 +2519,7 @@ public class Vpn {
|
||||
new UserHandle(mUserId))) {
|
||||
throw new SecurityException("Restricted users cannot establish VPNs");
|
||||
}
|
||||
|
@ -164,7 +164,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
|
||||
// Load certificates.
|
||||
String privateKey = "";
|
||||
@@ -4039,6 +4064,7 @@ public class Vpn {
|
||||
@@ -4029,6 +4054,7 @@ public class Vpn {
|
||||
|
||||
verifyCallingUidAndPackage(packageName);
|
||||
enforceNotRestrictedUser();
|
||||
|
@ -172,7 +172,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
validateRequiredFeatures(profile);
|
||||
|
||||
if (profile.isRestrictedToTestNetworks) {
|
||||
@@ -4081,6 +4107,7 @@ public class Vpn {
|
||||
@@ -4071,6 +4097,7 @@ public class Vpn {
|
||||
|
||||
verifyCallingUidAndPackage(packageName);
|
||||
enforceNotRestrictedUser();
|
||||
|
@ -180,7 +180,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
|
||||
final long token = Binder.clearCallingIdentity();
|
||||
try {
|
||||
@@ -4150,6 +4177,7 @@ public class Vpn {
|
||||
@@ -4140,6 +4167,7 @@ public class Vpn {
|
||||
requireNonNull(packageName, "No package name provided");
|
||||
|
||||
enforceNotRestrictedUser();
|
||||
|
@ -188,7 +188,7 @@ index 4c5f65285..1c546be6f 100644
|
|||
|
||||
// Prepare VPN for startup
|
||||
if (!prepare(packageName, null /* newPackage */, VpnManager.TYPE_VPN_PLATFORM)) {
|
||||
@@ -4272,6 +4300,7 @@ public class Vpn {
|
||||
@@ -4262,6 +4290,7 @@ public class Vpn {
|
||||
requireNonNull(packageName, "No package name provided");
|
||||
|
||||
enforceNotRestrictedUser();
|
||||
|
@ -197,5 +197,5 @@ index 4c5f65285..1c546be6f 100644
|
|||
// To stop the VPN profile, the caller must be the current prepared package and must be
|
||||
// running an Ikev2VpnProfile.
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
From 30aef337016de69871d0bdd70568cd7d018540d7 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 20 Dec 2021 15:01:41 -0500
|
||||
Subject: [PATCH 04/10] Dynamically resize boot animation to match screen size
|
||||
|
||||
Change-Id: I54e49fc6b8c670103852e212d1416e27ff976205
|
||||
---
|
||||
cmds/bootanimation/BootAnimation.cpp | 22 ++++++++++++++++++++++
|
||||
1 file changed, 22 insertions(+)
|
||||
|
||||
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
|
||||
index 77b74e9898b8..ba14cc03fccb 100644
|
||||
--- a/cmds/bootanimation/BootAnimation.cpp
|
||||
+++ b/cmds/bootanimation/BootAnimation.cpp
|
||||
@@ -618,6 +618,28 @@ status_t BootAnimation::readyToRun() {
|
||||
mFlingerSurface = s;
|
||||
mTargetInset = -1;
|
||||
|
||||
+ if ( mAnimation != nullptr ) {
|
||||
+ SLOGE("Got screen size %d, animation size %d", mWidth, mAnimation->width);
|
||||
+ int origWidth = mAnimation->width;
|
||||
+ if ( mAnimation->width*2 < mWidth ) {
|
||||
+ SLOGE("Making animation bigger");
|
||||
+ mAnimation->width *= 2;
|
||||
+ mAnimation->height *= 2;
|
||||
+ } else if ( mWidth < mAnimation->width ) {
|
||||
+ SLOGE("Making animation smaller");
|
||||
+ mAnimation->width /= 2;
|
||||
+ mAnimation->height /= 2;
|
||||
+ }
|
||||
+ for (Animation::Part& part : mAnimation->parts) {
|
||||
+ for(auto& frame: part.frames) {
|
||||
+ if(frame.trimWidth == origWidth && frame.trimX == 0 && frame.trimY == 0) {
|
||||
+ frame.trimWidth = mAnimation->width;
|
||||
+ frame.trimHeight = mAnimation->height;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
// Rotate the boot animation according to the value specified in the sysprop
|
||||
// ro.bootanim.set_orientation_<display_id>. Four values are supported: ORIENTATION_0,
|
||||
// ORIENTATION_90, ORIENTATION_180 and ORIENTATION_270.
|
||||
--
|
||||
2.44.0
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From cca38c720efc73912913a59be2a3d261017c2863 Mon Sep 17 00:00:00 2001
|
||||
From a8cddefcb64fad404a0af0358505057f8890ef1d 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 04/11] Restore getSimStateForSlotIndex in SubscriptionManager
|
||||
Subject: [PATCH 05/10] Restore getSimStateForSlotIndex in SubscriptionManager
|
||||
|
||||
MTK IMS still needs it here
|
||||
|
||||
|
@ -11,10 +11,10 @@ Change-Id: I41bac57c68055f369232359a464642daab94403b
|
|||
1 file changed, 14 insertions(+)
|
||||
|
||||
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
|
||||
index e0af22369..2175b3d96 100644
|
||||
index c5f2d42389e5..1324741145bd 100644
|
||||
--- a/telephony/java/android/telephony/SubscriptionManager.java
|
||||
+++ b/telephony/java/android/telephony/SubscriptionManager.java
|
||||
@@ -2913,6 +2913,20 @@ public class SubscriptionManager {
|
||||
@@ -2902,6 +2902,20 @@ public class SubscriptionManager {
|
||||
return TelephonyManager.getDefault().isNetworkRoaming(subId);
|
||||
}
|
||||
|
||||
|
@ -36,5 +36,5 @@ index e0af22369..2175b3d96 100644
|
|||
* Set a field in the subscription database. Note not all fields are supported.
|
||||
*
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From f9a12ae1920588f2d75849462abf7d2ba9d0373b Mon Sep 17 00:00:00 2001
|
||||
From 3090e1f2fc65eb525db64ff05c7a13f1e328deaf Mon Sep 17 00:00:00 2001
|
||||
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
|
||||
Date: Sat, 12 Aug 2023 20:11:17 +0800
|
||||
Subject: [PATCH 05/11] Add runWithCleanCallingIdentity variant with both
|
||||
Subject: [PATCH 06/10] Add runWithCleanCallingIdentity variant with both
|
||||
executor and return value
|
||||
|
||||
This complements the fixup to ImsPhoneCallTracker (in fw/o/t) for U
|
||||
|
@ -12,10 +12,10 @@ Change-Id: If444290787025e130dce4bdeaf92372ae32793fe
|
|||
1 file changed, 30 insertions(+)
|
||||
|
||||
diff --git a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
|
||||
index 422433891..3bbecf0f2 100644
|
||||
index a63db88cb614..1d5a36885307 100644
|
||||
--- a/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
|
||||
+++ b/telephony/common/com/android/internal/telephony/util/TelephonyUtils.java
|
||||
@@ -47,7 +47,9 @@ import com.android.internal.telephony.ITelephony;
|
||||
@@ -44,7 +44,9 @@ import com.android.internal.telephony.ITelephony;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
@ -25,7 +25,7 @@ index 422433891..3bbecf0f2 100644
|
|||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Supplier;
|
||||
@@ -159,6 +161,34 @@ public final class TelephonyUtils {
|
||||
@@ -153,6 +155,34 @@ public final class TelephonyUtils {
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -61,5 +61,5 @@ index 422433891..3bbecf0f2 100644
|
|||
* Filter values in bundle to only basic types.
|
||||
*/
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
From 45736b5d760fdac0ec405f1620942ff9a7c023d9 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 22 Sep 2024 22:53:01 -0400
|
||||
Subject: [PATCH 06/11] AuthService: HIDL and AIDL fingerprint services are
|
||||
mutually exclusive
|
||||
|
||||
...and make sure that we prioritize AIDL over HIDL. This is essential
|
||||
for GSIs to boot on newer devices while having the HIDL property set for
|
||||
compatibility with older ones.
|
||||
|
||||
Change-Id: I834297a44674820d813d8f6d376dfd294f084f3b
|
||||
---
|
||||
.../com/android/server/biometrics/AuthService.java | 10 ++++------
|
||||
1 file changed, 4 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java
|
||||
index 2d802b21c..0730d634f 100644
|
||||
--- a/services/core/java/com/android/server/biometrics/AuthService.java
|
||||
+++ b/services/core/java/com/android/server/biometrics/AuthService.java
|
||||
@@ -908,15 +908,13 @@ public class AuthService extends SystemService {
|
||||
|
||||
handlerProvider.getFingerprintHandler().post(() -> {
|
||||
final FingerprintSensorConfigurations mFingerprintSensorConfigurations =
|
||||
- new FingerprintSensorConfigurations(!(hidlConfigStrings != null
|
||||
- && hidlConfigStrings.length > 0));
|
||||
-
|
||||
- if (hidlConfigStrings != null && hidlConfigStrings.length > 0) {
|
||||
- mFingerprintSensorConfigurations.addHidlSensors(hidlConfigStrings, context);
|
||||
- }
|
||||
+ new FingerprintSensorConfigurations(fingerprintAidlInstances != null
|
||||
+ && fingerprintAidlInstances.length > 0);
|
||||
|
||||
if (fingerprintAidlInstances != null && fingerprintAidlInstances.length > 0) {
|
||||
mFingerprintSensorConfigurations.addAidlSensors(fingerprintAidlInstances);
|
||||
+ } else if (hidlConfigStrings != null && hidlConfigStrings.length > 0) {
|
||||
+ mFingerprintSensorConfigurations.addHidlSensors(hidlConfigStrings, context);
|
||||
}
|
||||
|
||||
if (fingerprintService != null) {
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,25 +1,69 @@
|
|||
From 6cd16322e3d44ea9d96c74af96a967e48fa88d44 Mon Sep 17 00:00:00 2001
|
||||
From da661076da778c1ea9b9ef4411b386e445ab1675 Mon Sep 17 00:00:00 2001
|
||||
From: dhacker29 <dhackerdvm@gmail.com>
|
||||
Date: Tue, 24 Nov 2015 01:53:47 -0500
|
||||
Subject: [PATCH 07/11] fw/b: Use ro.build.version.incremental to signal OTA
|
||||
Subject: [PATCH 07/10] fw/b: Use ro.build.version.incremental to signal OTA
|
||||
upgrades
|
||||
|
||||
Co-authored-by: maxwen <max.weninger@gmail.com>
|
||||
Co-authored-by: Sam Mortimer <sam@mortimer.me.uk>
|
||||
Co-authored-by: Wang Han <416810799@qq.com>
|
||||
Squash of:
|
||||
|
||||
Author: dhacker29 <dhackerdvm@gmail.com>
|
||||
Date: Tue Nov 24 01:53:47 2015 -0500
|
||||
Core: Use ro.build.date to signal mIsUpgrade
|
||||
|
||||
M: We use a static fingerprint that is only changed when a new OEM build is released, so
|
||||
every flash shows Android is starting instead of upgrading. This will fix that.
|
||||
N: even though we dont have the dexopt sceen on N, this is still needed to delete the
|
||||
correct caches, and grant/deny specific runtime permissions like a true oem update
|
||||
would do.
|
||||
Updated for Nougat By: BeansTown106
|
||||
|
||||
Change-Id: I0e3ed5c8f0351e48944432ae6a0c5194ddeff1fa
|
||||
|
||||
Author: Sam Mortimer <sam@mortimer.me.uk>
|
||||
Date: Fri Sep 28 13:45:00 2018 -0700
|
||||
fw/b UserManagerService: Use ro.build.date to signal upgrades
|
||||
|
||||
*) We changed PackageManagerService to use Build.DATE instead of
|
||||
Build.FINGERPRINT to detect upgrade. Do the same for
|
||||
UserManagerService.
|
||||
*) Affects generation of preboot intent and app data migration.
|
||||
|
||||
Change-Id: I56887b7ca842afdcf3cf84b27b4c04667cf43307
|
||||
|
||||
Author: Wang Han <416810799@qq.com>
|
||||
Date: Sat Dec 29 23:33:20 2018 +0800
|
||||
ShortcutService: Use ro.build.date to signal package scanning
|
||||
|
||||
* Affects system apps scanning.
|
||||
|
||||
Change-Id: I5f6d6647929f5b5ae7e820b18e95bf5ed2ec8d1c
|
||||
|
||||
Author: maxwen <max.weninger@gmail.com>
|
||||
Date: Tue Nov 19 01:02:01 2019 +0100
|
||||
base: Use ro.build.date to clear cache dirs on update
|
||||
|
||||
instead of using ro.build.fingerprint we explictly need to use ro.build.date
|
||||
|
||||
Change-Id: Ib3e80e58eb8c9a21c108e9f5cd2dbdb7ada8e3a4
|
||||
|
||||
Author: maxwen <max.weninger@gmail.com>
|
||||
Date: Wed Oct 28 07:07:10 2020 -0400
|
||||
One more Build.FINGERPRINT to Build.DATE change
|
||||
|
||||
Change-Id: I13dbf3d7f6587d3fcd6591cc0f861b34b6d5561c
|
||||
|
||||
Change-Id: If0eb969ba509981f9209ffa37a949d9042ef4c2a
|
||||
---
|
||||
core/java/android/app/admin/SystemUpdateInfo.java | 4 ++--
|
||||
core/java/android/content/pm/PackagePartitions.java | 2 +-
|
||||
.../java/com/android/server/appwidget/AppWidgetXmlUtil.java | 4 ++--
|
||||
.../java/com/android/server/pm/PackageManagerService.java | 5 +++--
|
||||
.../com/android/server/pm/PackageManagerServiceUtils.java | 3 +--
|
||||
services/core/java/com/android/server/pm/Settings.java | 2 +-
|
||||
.../core/java/com/android/server/pm/ShortcutService.java | 2 +-
|
||||
7 files changed, 11 insertions(+), 11 deletions(-)
|
||||
core/java/android/app/admin/SystemUpdateInfo.java | 4 ++--
|
||||
.../com/android/server/am/UserController.java | 3 ++-
|
||||
.../android/server/pm/PackageManagerService.java | 15 +++++++--------
|
||||
.../core/java/com/android/server/pm/Settings.java | 4 ++--
|
||||
.../com/android/server/pm/ShortcutService.java | 2 +-
|
||||
.../com/android/server/pm/UserManagerService.java | 8 ++++----
|
||||
6 files changed, 18 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/core/java/android/app/admin/SystemUpdateInfo.java b/core/java/android/app/admin/SystemUpdateInfo.java
|
||||
index 9e6c91f4e..7459b0e05 100644
|
||||
index 9e6c91f4ec31..7459b0e05e3a 100644
|
||||
--- a/core/java/android/app/admin/SystemUpdateInfo.java
|
||||
+++ b/core/java/android/app/admin/SystemUpdateInfo.java
|
||||
@@ -133,7 +133,7 @@ public final class SystemUpdateInfo implements Parcelable {
|
||||
|
@ -40,103 +84,108 @@ index 9e6c91f4e..7459b0e05 100644
|
|||
return null;
|
||||
}
|
||||
try {
|
||||
diff --git a/core/java/android/content/pm/PackagePartitions.java b/core/java/android/content/pm/PackagePartitions.java
|
||||
index ff80e614b..da3b68ecf 100644
|
||||
--- a/core/java/android/content/pm/PackagePartitions.java
|
||||
+++ b/core/java/android/content/pm/PackagePartitions.java
|
||||
@@ -131,7 +131,7 @@ public class PackagePartitions {
|
||||
final String partitionName = SYSTEM_PARTITIONS.get(i).getName();
|
||||
digestProperties[i] = "ro." + partitionName + ".build.fingerprint";
|
||||
}
|
||||
- digestProperties[SYSTEM_PARTITIONS.size()] = "ro.build.fingerprint"; // build fingerprint
|
||||
+ digestProperties[SYSTEM_PARTITIONS.size()] = "ro.build.version.incremental";
|
||||
return SystemProperties.digestOf(digestProperties);
|
||||
}
|
||||
|
||||
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java
|
||||
index ce9130ad5..737ecae1c 100644
|
||||
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java
|
||||
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java
|
||||
@@ -117,7 +117,7 @@ public class AppWidgetXmlUtil {
|
||||
out.attributeInt(null, ATTR_WIDGET_FEATURES, info.widgetFeatures);
|
||||
out.attributeInt(null, ATTR_DESCRIPTION_RES, info.descriptionRes);
|
||||
out.attributeBoolean(null, ATTR_PROVIDER_INHERITANCE, info.isExtendedFromAppWidgetProvider);
|
||||
- out.attribute(null, ATTR_OS_FINGERPRINT, Build.FINGERPRINT);
|
||||
+ out.attribute(null, ATTR_OS_FINGERPRINT, Build.VERSION.INCREMENTAL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,7 +128,7 @@ public class AppWidgetXmlUtil {
|
||||
@NonNull final TypedXmlPullParser parser) {
|
||||
Objects.requireNonNull(parser);
|
||||
final String fingerprint = parser.getAttributeValue(null, ATTR_OS_FINGERPRINT);
|
||||
- if (!Build.FINGERPRINT.equals(fingerprint)) {
|
||||
+ if (!Build.VERSION.INCREMENTAL.equals(fingerprint)) {
|
||||
return null;
|
||||
}
|
||||
final AppWidgetProviderInfo info = new AppWidgetProviderInfo();
|
||||
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
|
||||
index 3abfe082db27..a6dbeb4bd051 100644
|
||||
--- a/services/core/java/com/android/server/am/UserController.java
|
||||
+++ b/services/core/java/com/android/server/am/UserController.java
|
||||
@@ -89,6 +89,7 @@ import android.content.pm.UserInfo;
|
||||
import android.content.pm.UserProperties;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.Binder;
|
||||
+import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Debug;
|
||||
import android.os.Handler;
|
||||
@@ -775,7 +776,7 @@ class UserController implements Handler.Callback {
|
||||
// purposefully block sending BOOT_COMPLETED until after all
|
||||
// PRE_BOOT receivers are finished to avoid ANR'ing apps
|
||||
final UserInfo info = getUserInfo(userId);
|
||||
- if (!Objects.equals(info.lastLoggedInFingerprint, PackagePartitions.FINGERPRINT)
|
||||
+ if (!Objects.equals(info.lastLoggedInFingerprint, Build.VERSION.INCREMENTAL)
|
||||
|| SystemProperties.getBoolean("persist.pm.mock-upgrade", false)) {
|
||||
// Suppress double notifications for managed profiles that
|
||||
// were unlocked automatically as part of their parent user being
|
||||
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
|
||||
index aadf11227..8b0c4f42b 100644
|
||||
index c814a1ef1c13..441d0163cf1a 100644
|
||||
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
|
||||
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
|
||||
@@ -2239,7 +2239,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
@@ -1789,7 +1789,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
}
|
||||
|
||||
PackageManagerService m = new PackageManagerService(injector, factoryTest,
|
||||
- PackagePartitions.FINGERPRINT, Build.IS_ENG, Build.IS_USERDEBUG,
|
||||
+ Build.VERSION.INCREMENTAL, Build.IS_ENG, Build.IS_USERDEBUG,
|
||||
Build.VERSION.SDK_INT, Build.VERSION.INCREMENTAL);
|
||||
t.traceEnd(); // "create package manager"
|
||||
|
||||
@@ -2269,9 +2269,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
mIsUpgrade =
|
||||
!partitionsFingerprint.equals(ver.fingerprint);
|
||||
if (mIsUpgrade) {
|
||||
PackageManagerServiceUtils.logCriticalInfo(Log.INFO,
|
||||
"Upgrading from " + ver.fingerprint + " (" + ver.buildFingerprint + ") to "
|
||||
- PackageManagerServiceUtils.logCriticalInfo(Log.INFO,
|
||||
- "Upgrading from " + ver.fingerprint + " (" + ver.buildFingerprint + ") to "
|
||||
- + PackagePartitions.FINGERPRINT + " (" + Build.FINGERPRINT + ")");
|
||||
+ + PackagePartitions.FINGERPRINT
|
||||
+ + " (" + Build.VERSION.INCREMENTAL + ")");
|
||||
+ PackageManagerServiceUtils.logCriticalInfo(Log.INFO, "Upgrading from "
|
||||
+ + ver.fingerprint + " to " + Build.VERSION.INCREMENTAL);
|
||||
}
|
||||
mPriorSdkVersion = mIsUpgrade ? ver.sdkVersion : -1;
|
||||
mInitAppsHelper = new InitAppsHelper(this, mApexManager, mInstallPackageHelper,
|
||||
@@ -2397,7 +2398,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
| Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES);
|
||||
@@ -2408,8 +2407,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
// allow... it would be nice to have some better way to handle
|
||||
// this situation.
|
||||
if (mIsUpgrade) {
|
||||
- Slog.i(TAG, "Partitions fingerprint changed from " + ver.fingerprint + " to "
|
||||
- + PackagePartitions.FINGERPRINT
|
||||
+ Slog.i(TAG, "Build incremental version changed from " + ver.fingerprint + " to "
|
||||
+ + Build.VERSION.INCREMENTAL
|
||||
+ "; regranting permissions for internal storage");
|
||||
}
|
||||
mPermissionManager.onStorageVolumeMounted(
|
||||
@@ -2431,7 +2430,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
// across OTAs and are used to drive profile verification (post OTA) and
|
||||
// profile compilation (without waiting to collect a fresh set of profiles).
|
||||
if (mIsUpgrade) {
|
||||
- Slog.i(TAG, "Build fingerprint changed; clearing code caches");
|
||||
+ Slog.i(TAG, "Build incremental version changed; clearing code caches");
|
||||
for (int i = 0; i < packageSettings.size(); i++) {
|
||||
final PackageSetting ps = packageSettings.valueAt(i);
|
||||
if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, ps.getVolumeUuid())) {
|
||||
@@ -2443,7 +2442,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
|
||||
}
|
||||
}
|
||||
- ver.buildFingerprint = Build.FINGERPRINT;
|
||||
+ ver.buildFingerprint = Build.VERSION.INCREMENTAL;
|
||||
ver.fingerprint = PackagePartitions.FINGERPRINT;
|
||||
ver.buildFingerprint = Build.FINGERPRINT;
|
||||
- ver.fingerprint = PackagePartitions.FINGERPRINT;
|
||||
+ ver.fingerprint = Build.VERSION.INCREMENTAL;
|
||||
}
|
||||
|
||||
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
|
||||
index 7af39f74d..4bd83e739 100644
|
||||
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
|
||||
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
|
||||
@@ -1400,8 +1400,6 @@ public class PackageManagerServiceUtils {
|
||||
// that starts with "eng." to signify that this is an engineering build and not
|
||||
// destined for release.
|
||||
if (isUserDebugBuild && incrementalVersion.startsWith("eng.")) {
|
||||
- Slog.w(TAG, "Wiping cache directory because the system partition changed.");
|
||||
-
|
||||
// Heuristic: If the /system directory has been modified recently due to an "adb sync"
|
||||
// or a regular make, then blow away the cache. Note that mtimes are *NOT* reliable
|
||||
// in general and should not be used for production changes. In this specific case,
|
||||
@@ -1409,6 +1407,7 @@ public class PackageManagerServiceUtils {
|
||||
File frameworkDir =
|
||||
new File(Environment.getRootDirectory(), "framework");
|
||||
if (cacheDir.lastModified() < frameworkDir.lastModified()) {
|
||||
+ Slog.w(TAG, "Wiping cache directory because the system partition changed.");
|
||||
FileUtils.deleteContents(cacheBaseDir);
|
||||
cacheDir = FileUtils.createDir(cacheBaseDir, cacheName);
|
||||
}
|
||||
// Defer the app data fixup until we are done with app data clearing above.
|
||||
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
|
||||
index 485a28070..78086791a 100644
|
||||
index fe65010b7281..04a8e24839e9 100644
|
||||
--- a/services/core/java/com/android/server/pm/Settings.java
|
||||
+++ b/services/core/java/com/android/server/pm/Settings.java
|
||||
@@ -485,7 +485,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
||||
public void forceCurrent() {
|
||||
@@ -482,7 +482,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
||||
sdkVersion = Build.VERSION.SDK_INT;
|
||||
databaseVersion = CURRENT_DATABASE_VERSION;
|
||||
- buildFingerprint = Build.FINGERPRINT;
|
||||
+ buildFingerprint = Build.VERSION.INCREMENTAL;
|
||||
fingerprint = PackagePartitions.FINGERPRINT;
|
||||
buildFingerprint = Build.FINGERPRINT;
|
||||
- fingerprint = PackagePartitions.FINGERPRINT;
|
||||
+ fingerprint = Build.VERSION.INCREMENTAL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6020,7 +6020,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile
|
||||
}
|
||||
|
||||
private String getExtendedFingerprint(long version) {
|
||||
- return PackagePartitions.FINGERPRINT + "?pc_version=" + version;
|
||||
+ return Build.VERSION.INCREMENTAL + "?pc_version=" + version;
|
||||
}
|
||||
|
||||
private static long uniformRandom(double low, double high) {
|
||||
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
|
||||
index 1052c94d7..21481d216 100644
|
||||
index c1ab3f9e3eb9..1b0c9917f43e 100644
|
||||
--- a/services/core/java/com/android/server/pm/ShortcutService.java
|
||||
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
|
||||
@@ -5259,7 +5259,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
@@ -5230,7 +5230,7 @@ public class ShortcutService extends IShortcutService.Stub {
|
||||
|
||||
// Injection point.
|
||||
String injectBuildFingerprint() {
|
||||
|
@ -145,6 +194,46 @@ index 1052c94d7..21481d216 100644
|
|||
}
|
||||
|
||||
final void wtf(String message) {
|
||||
--
|
||||
2.48.1
|
||||
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
|
||||
index 7349755402b1..8ff9359c98e7 100644
|
||||
--- a/services/core/java/com/android/server/pm/UserManagerService.java
|
||||
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
|
||||
@@ -5420,7 +5420,7 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
userInfo.creationTime = getCreationTime();
|
||||
userInfo.partial = true;
|
||||
userInfo.preCreated = preCreate;
|
||||
- userInfo.lastLoggedInFingerprint = PackagePartitions.FINGERPRINT;
|
||||
+ userInfo.lastLoggedInFingerprint = Build.VERSION.INCREMENTAL;
|
||||
if (userTypeDetails.hasBadge() && parentId != UserHandle.USER_NULL) {
|
||||
userInfo.profileBadge = getFreeProfileBadgeLU(parentId, userType);
|
||||
}
|
||||
@@ -6722,7 +6722,7 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
TimingsTraceAndSlog t = new TimingsTraceAndSlog();
|
||||
t.traceBegin("onBeforeStartUser-" + userId);
|
||||
// Migrate only if build fingerprints mismatch
|
||||
- boolean migrateAppsData = !PackagePartitions.FINGERPRINT.equals(
|
||||
+ boolean migrateAppsData = !Build.VERSION.INCREMENTAL.equals(
|
||||
userInfo.lastLoggedInFingerprint);
|
||||
t.traceBegin("prepareUserData");
|
||||
mUserDataPreparer.prepareUserData(userInfo, StorageManager.FLAG_STORAGE_DE);
|
||||
@@ -6752,7 +6752,7 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
return;
|
||||
}
|
||||
// Migrate only if build fingerprints mismatch
|
||||
- boolean migrateAppsData = !PackagePartitions.FINGERPRINT.equals(
|
||||
+ boolean migrateAppsData = !Build.VERSION.INCREMENTAL.equals(
|
||||
userInfo.lastLoggedInFingerprint);
|
||||
|
||||
final TimingsTraceAndSlog t = new TimingsTraceAndSlog();
|
||||
@@ -6797,7 +6797,7 @@ public class UserManagerService extends IUserManager.Stub {
|
||||
if (now > EPOCH_PLUS_30_YEARS) {
|
||||
userData.info.lastLoggedInTime = now;
|
||||
}
|
||||
- userData.info.lastLoggedInFingerprint = PackagePartitions.FINGERPRINT;
|
||||
+ userData.info.lastLoggedInFingerprint = Build.VERSION.INCREMENTAL;
|
||||
scheduleWriteUser(userId);
|
||||
}
|
||||
|
||||
--
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
From 8b3f59482cf7f27406d9a8c9ef717e6bc70cfb88 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sat, 21 Dec 2024 11:04:35 -0500
|
||||
Subject: [PATCH 08/11] Add support for treating virtual biometric sensors as
|
||||
real ones
|
||||
|
||||
This happens on Unihertz Jelly Max. They forgot to change their sensor
|
||||
instance name from "virtual" to something else.
|
||||
|
||||
Change-Id: I106d41cd078e6b1e354c72ec35fa240a44397c5e
|
||||
---
|
||||
.../fingerprint/FingerprintSensorConfigurations.java | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java b/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java
|
||||
index 48c5887d8..bec56d9a6 100644
|
||||
--- a/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java
|
||||
+++ b/core/java/android/hardware/fingerprint/FingerprintSensorConfigurations.java
|
||||
@@ -29,6 +29,7 @@ import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
+import android.os.SystemProperties;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
|
||||
@@ -172,6 +173,10 @@ public class FingerprintSensorConfigurations implements Parcelable {
|
||||
* @return real fqName
|
||||
*/
|
||||
public static String remapFqName(String fqName) {
|
||||
+ if (SystemProperties.getBoolean("persist.sys.phh.virtual_sensors_are_real", false)) {
|
||||
+ return fqName;
|
||||
+ }
|
||||
+
|
||||
if (!fqName.contains(IFingerprint.DESCRIPTOR + "/virtual")) {
|
||||
return fqName; //no remap needed for real hardware HAL
|
||||
} else {
|
||||
@@ -185,7 +190,7 @@ public class FingerprintSensorConfigurations implements Parcelable {
|
||||
* @return aidl interface
|
||||
*/
|
||||
public static IFingerprint getIFingerprint(String fqName) {
|
||||
- if (fqName.contains("virtual")) {
|
||||
+ if (fqName.contains("virtual") && !SystemProperties.getBoolean("persist.sys.phh.virtual_sensors_are_real", false)) {
|
||||
String fqNameMapped = remapFqName(fqName);
|
||||
Slog.i(TAG, "getIFingerprint fqName is mapped: " + fqName + "->" + fqNameMapped);
|
||||
try {
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
From 52196edce8f30a2b061beb934f477eec673ef43e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sat, 9 Dec 2023 18:37:08 -0500
|
||||
Subject: [PATCH 08/10] Revert "Convert BubbleDataRepositoryTest to use
|
||||
mockito-kotlin"
|
||||
|
||||
This reverts commit 625a23ff22f0a9327b9a24341dfa0b8fbaf61a1b.
|
||||
---
|
||||
.../Shell/tests/unittest/Android.bp | 1 -
|
||||
.../shell/bubbles/BubbleDataRepositoryTest.kt | 17 ++++++++++-------
|
||||
2 files changed, 10 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/libs/WindowManager/Shell/tests/unittest/Android.bp b/libs/WindowManager/Shell/tests/unittest/Android.bp
|
||||
index 32c070305e05..6eaf19953093 100644
|
||||
--- a/libs/WindowManager/Shell/tests/unittest/Android.bp
|
||||
+++ b/libs/WindowManager/Shell/tests/unittest/Android.bp
|
||||
@@ -48,7 +48,6 @@ android_test {
|
||||
"frameworks-base-testutils",
|
||||
"kotlinx-coroutines-android",
|
||||
"kotlinx-coroutines-core",
|
||||
- "mockito-kotlin2",
|
||||
"mockito-target-extended-minus-junit4",
|
||||
"truth",
|
||||
"testables",
|
||||
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt
|
||||
index e35995775f76..0e05e01a8da3 100644
|
||||
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt
|
||||
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/bubbles/BubbleDataRepositoryTest.kt
|
||||
@@ -29,11 +29,11 @@ import com.google.common.truth.Truth.assertThat
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
-import org.mockito.kotlin.any
|
||||
-import org.mockito.kotlin.mock
|
||||
-import org.mockito.kotlin.never
|
||||
-import org.mockito.kotlin.spy
|
||||
-import org.mockito.kotlin.verify
|
||||
+import org.mockito.Mockito
|
||||
+import org.mockito.Mockito.mock
|
||||
+import org.mockito.Mockito.never
|
||||
+import org.mockito.Mockito.spy
|
||||
+import org.mockito.Mockito.verify
|
||||
|
||||
class BubbleDataRepositoryTest : ShellTestCase() {
|
||||
|
||||
@@ -124,7 +124,7 @@ class BubbleDataRepositoryTest : ShellTestCase() {
|
||||
|
||||
private val testHandler = Handler(Looper.getMainLooper())
|
||||
private val mainExecutor = HandlerExecutor(testHandler)
|
||||
- private val launcherApps = mock<LauncherApps>()
|
||||
+ private val launcherApps = mock(LauncherApps::class.java)
|
||||
|
||||
private val persistedBubbles = SparseArray<List<BubbleEntity>>()
|
||||
|
||||
@@ -158,7 +158,8 @@ class BubbleDataRepositoryTest : ShellTestCase() {
|
||||
assertThat(persistedBubbles).isEqualTo(validEntitiesByUser)
|
||||
|
||||
// No invalid users, so no persist to disk happened
|
||||
- verify(dataRepository, never()).persistToDisk(any())
|
||||
+ verify(dataRepository, never()).persistToDisk(
|
||||
+ any(SparseArray<List<BubbleEntity>>()::class.java))
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -198,4 +199,6 @@ class BubbleDataRepositoryTest : ShellTestCase() {
|
||||
// Verify that persist to disk happened with the new valid entities list.
|
||||
verify(dataRepository).persistToDisk(validEntitiesByUser)
|
||||
}
|
||||
+
|
||||
+ fun <T> any(type: Class<T>): T = Mockito.any<T>(type)
|
||||
}
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.44.0
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
From 0f6bac48544a7b15180fe62f970c6c9760d12b5c Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Fri, 15 Dec 2023 22:48:39 -0500
|
||||
Subject: [PATCH 09/10] FingerprintService: Do not use HIDL providers when AIDL
|
||||
is present
|
||||
|
||||
This fixes duplicated sensor ID when config_biometric_sensors is defined
|
||||
on AIDL devices.
|
||||
|
||||
Change-Id: I9942e91a95106a7a11ab7ddf145d87562d1b7c0d
|
||||
---
|
||||
.../biometrics/sensors/fingerprint/FingerprintService.java | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
|
||||
index 1ba12134ab29..09a24052e18f 100644
|
||||
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
|
||||
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java
|
||||
@@ -913,8 +913,9 @@ public class FingerprintService extends SystemService {
|
||||
filteredInstances = filterAvailableHalInstances(hidlSensors, aidlSensors);
|
||||
|
||||
final List<ServiceProvider> providers = new ArrayList<>();
|
||||
- providers.addAll(getHidlProviders(filteredInstances.first));
|
||||
providers.addAll(getAidlProviders(filteredInstances.second));
|
||||
+ if (providers.isEmpty()) // Only use HIDL providers if AIDL ones are not found
|
||||
+ providers.addAll(getHidlProviders(filteredInstances.first));
|
||||
|
||||
return providers;
|
||||
});
|
||||
--
|
||||
2.44.0
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
From 2f4c395069d1dfd7cce9a896f17868aa4aaf91c4 Mon Sep 17 00:00:00 2001
|
||||
From: Pranav Vashi <neobuddy89@gmail.com>
|
||||
Date: Sat, 21 Sep 2024 13:44:09 +0530
|
||||
Subject: [PATCH 09/11] WebView: Add check before setting default or fallback
|
||||
provider
|
||||
|
||||
Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
|
||||
---
|
||||
.../webkit/WebViewUpdateServiceImpl2.java | 34 ++++++++++++++-----
|
||||
1 file changed, 26 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
|
||||
index 9e8dc2690..9e415bf63 100644
|
||||
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
|
||||
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.android.server.webkit;
|
||||
|
||||
+import android.app.AppGlobals;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
@@ -113,7 +114,7 @@ class WebViewUpdateServiceImpl2 {
|
||||
|
||||
WebViewProviderInfo defaultProvider = null;
|
||||
for (WebViewProviderInfo provider : webviewProviders) {
|
||||
- if (provider.availableByDefault) {
|
||||
+ if (provider.availableByDefault && isPackageAvailable(provider.packageName)) {
|
||||
defaultProvider = provider;
|
||||
break;
|
||||
}
|
||||
@@ -182,6 +183,15 @@ class WebViewUpdateServiceImpl2 {
|
||||
}
|
||||
}
|
||||
|
||||
+ private static boolean isPackageAvailable(String packageName) {
|
||||
+ try {
|
||||
+ AppGlobals.getInitialApplication().getPackageManager().getPackageInfo(packageName, 0);
|
||||
+ return true;
|
||||
+ } catch (NameNotFoundException e) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
private boolean shouldTriggerRepairLocked() {
|
||||
if (mAttemptedToRepairBefore) {
|
||||
return false;
|
||||
@@ -208,12 +218,20 @@ class WebViewUpdateServiceImpl2 {
|
||||
}
|
||||
mAttemptedToRepairBefore = true;
|
||||
}
|
||||
- Slog.w(
|
||||
- TAG,
|
||||
- "No provider available for all users, trying to install and enable "
|
||||
- + mDefaultProvider.packageName);
|
||||
- mSystemInterface.installExistingPackageForAllUsers(mDefaultProvider.packageName);
|
||||
- mSystemInterface.enablePackageForAllUsers(mDefaultProvider.packageName, true);
|
||||
+
|
||||
+ WebViewProviderInfo[] webviewProviders = mSystemInterface.getWebViewPackages();
|
||||
+ WebViewProviderInfo fallbackProvider = getFallbackProvider(webviewProviders);
|
||||
+ if (fallbackProvider != null) {
|
||||
+ Slog.w(TAG, "No valid provider, trying to install and enable "
|
||||
+ + fallbackProvider.packageName);
|
||||
+ mSystemInterface.installExistingPackageForAllUsers(fallbackProvider.packageName);
|
||||
+ mSystemInterface.enablePackageForAllUsers(fallbackProvider.packageName, true);
|
||||
+ } else {
|
||||
+ Slog.w(TAG, "No provider available for all users, trying to install and enable "
|
||||
+ + mDefaultProvider.packageName);
|
||||
+ mSystemInterface.installExistingPackageForAllUsers(mDefaultProvider.packageName);
|
||||
+ mSystemInterface.enablePackageForAllUsers(mDefaultProvider.packageName, true);
|
||||
+ }
|
||||
}
|
||||
|
||||
public void prepareWebViewInSystemServer() {
|
||||
@@ -691,7 +709,7 @@ class WebViewUpdateServiceImpl2 {
|
||||
*/
|
||||
private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) {
|
||||
for (WebViewProviderInfo provider : webviewPackages) {
|
||||
- if (provider.isFallback) {
|
||||
+ if (provider.isFallback && isPackageAvailable(provider.packageName)) {
|
||||
return provider;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From 30058cdf576d1496ca63560f878eacf940e36ea2 Mon Sep 17 00:00:00 2001
|
||||
From 3b581eb494050e35ba1e044898bb85811bc4ec61 Mon Sep 17 00:00:00 2001
|
||||
From: LuK1337 <priv.luk@gmail.com>
|
||||
Date: Mon, 19 Feb 2024 16:20:04 +0100
|
||||
Subject: [PATCH 10/11] Allow signature spoofing for microG Companion/Services
|
||||
Subject: [PATCH 10/10] Allow signature spoofing for microG Companion/Services
|
||||
|
||||
This patch enables signature spoofing when the following conditions are
|
||||
met:
|
||||
|
@ -12,18 +12,16 @@ met:
|
|||
|
||||
Additionally, we let these apps be forceQueryable if they so desire.
|
||||
|
||||
phh change: No need to be debuggable
|
||||
|
||||
Change-Id: I8fc82ed266a2cc59636b662c7ea7e29c94f509b5
|
||||
---
|
||||
.../com/android/server/pm/AppsFilterImpl.java | 2 +
|
||||
.../com/android/server/pm/ComputerEngine.java | 54 +++++++++++++++++++
|
||||
services/core/jni/Android.bp | 7 +++
|
||||
.../com_android_server_pm_ComputerEngine.cpp | 38 +++++++++++++
|
||||
services/core/jni/onload.cpp | 2 +
|
||||
5 files changed, 103 insertions(+)
|
||||
create mode 100644 services/core/jni/com_android_server_pm_ComputerEngine.cpp
|
||||
.../com/android/server/pm/ComputerEngine.java | 47 +++++++++++++++++++
|
||||
2 files changed, 49 insertions(+)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/pm/AppsFilterImpl.java b/services/core/java/com/android/server/pm/AppsFilterImpl.java
|
||||
index cc4c2b5bf..57263da93 100644
|
||||
index cc4c2b5bf893..57263da936d6 100644
|
||||
--- a/services/core/java/com/android/server/pm/AppsFilterImpl.java
|
||||
+++ b/services/core/java/com/android/server/pm/AppsFilterImpl.java
|
||||
@@ -36,6 +36,7 @@ import static com.android.server.pm.AppsFilterUtils.canQueryAsUpdateOwner;
|
||||
|
@ -43,10 +41,10 @@ index cc4c2b5bf..57263da93 100644
|
|||
|| newPkg.isForceQueryable()
|
||||
|| ArrayUtils.contains(mForceQueryableByDevicePackageNames,
|
||||
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
|
||||
index be2f58dc2..3eb3df412 100644
|
||||
index 9afdde53643c..fe73eadb3352 100644
|
||||
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
|
||||
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
|
||||
@@ -103,6 +103,7 @@ import android.content.pm.UserPackage;
|
||||
@@ -102,6 +102,7 @@ import android.content.pm.UserPackage;
|
||||
import android.content.pm.VersionedPackage;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
|
@ -54,7 +52,7 @@ index be2f58dc2..3eb3df412 100644
|
|||
import android.os.IBinder;
|
||||
import android.os.ParcelableException;
|
||||
import android.os.PatternMatcher;
|
||||
@@ -176,6 +177,7 @@ import java.util.Collections;
|
||||
@@ -174,6 +175,7 @@ import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
@ -62,7 +60,7 @@ index be2f58dc2..3eb3df412 100644
|
|||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
@@ -424,6 +426,10 @@ public class ComputerEngine implements Computer {
|
||||
@@ -423,6 +425,10 @@ public class ComputerEngine implements Computer {
|
||||
private final PackageManagerInternal.ExternalSourcesPolicy mExternalSourcesPolicy;
|
||||
private final CrossProfileIntentResolverEngine mCrossProfileIntentResolverEngine;
|
||||
|
||||
|
@ -73,17 +71,11 @@ index be2f58dc2..3eb3df412 100644
|
|||
// PackageManagerService attributes that are primitives are referenced through the
|
||||
// pms object directly. Primitives are the only attributes so referenced.
|
||||
protected final PackageManagerService mService;
|
||||
@@ -1483,6 +1489,49 @@ public class ComputerEngine implements Computer {
|
||||
@@ -1465,6 +1471,42 @@ public class ComputerEngine implements Computer {
|
||||
return result;
|
||||
}
|
||||
|
||||
+ private static native boolean isDebuggable();
|
||||
+
|
||||
+ public static boolean isMicrogSigned(AndroidPackage p) {
|
||||
+ if (!isDebuggable()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ // Allowlist the following apps:
|
||||
+ // * com.android.vending - microG Companion
|
||||
+ // * com.google.android.gms - microG Services
|
||||
|
@ -91,7 +83,6 @@ index be2f58dc2..3eb3df412 100644
|
|||
+ !p.getPackageName().equals("com.google.android.gms")) {
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return Signature.areExactMatch(
|
||||
+ p.getSigningDetails(), new Signature[]{MICROG_REAL_SIGNATURE});
|
||||
+ }
|
||||
|
@ -123,107 +114,25 @@ index be2f58dc2..3eb3df412 100644
|
|||
public final PackageInfo generatePackageInfo(PackageStateInternal ps,
|
||||
@PackageManager.PackageInfoFlagsBits long flags, int userId) {
|
||||
if (!mUserManager.exists(userId)) return null;
|
||||
@@ -1538,6 +1587,11 @@ public class ComputerEngine implements Computer {
|
||||
mApexManager.getActivePackageNameForApexModuleName(apexModuleName));
|
||||
}
|
||||
}
|
||||
+
|
||||
@@ -1513,6 +1555,10 @@ public class ComputerEngine implements Computer {
|
||||
packageInfo.packageName = packageInfo.applicationInfo.packageName =
|
||||
resolveExternalPackageName(p);
|
||||
|
||||
+ generateFakeSignature(p).ifPresent(fakeSignature -> {
|
||||
+ packageInfo.signatures = new Signature[]{fakeSignature};
|
||||
+ });
|
||||
+
|
||||
if (Flags.provideInfoOfApkInApex()) {
|
||||
final String apexModuleName = ps.getApexModuleName();
|
||||
if (apexModuleName != null) {
|
||||
@@ -1520,6 +1566,7 @@ public class ComputerEngine implements Computer {
|
||||
mApexManager.getActivePackageNameForApexModuleName(apexModuleName));
|
||||
}
|
||||
}
|
||||
+
|
||||
return packageInfo;
|
||||
} else if ((flags & (MATCH_UNINSTALLED_PACKAGES | MATCH_ARCHIVED_PACKAGES)) != 0
|
||||
&& PackageUserStateUtils.isAvailable(state, flags)) {
|
||||
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
|
||||
index 4c0cee404..a4d192c8e 100644
|
||||
--- a/services/core/jni/Android.bp
|
||||
+++ b/services/core/jni/Android.bp
|
||||
@@ -71,6 +71,7 @@ cc_library_static {
|
||||
"com_android_server_vibrator_VibratorManagerService.cpp",
|
||||
"com_android_server_pdb_PersistentDataBlockService.cpp",
|
||||
"com_android_server_am_LowMemDetector.cpp",
|
||||
+ "com_android_server_pm_ComputerEngine.cpp",
|
||||
"com_android_server_pm_PackageManagerShellCommandDataLoader.cpp",
|
||||
"com_android_server_sensor_SensorService.cpp",
|
||||
"com_android_server_wm_TaskFpsCallbackController.cpp",
|
||||
@@ -94,6 +95,12 @@ cc_library_static {
|
||||
header_libs: [
|
||||
"bionic_libc_platform_headers",
|
||||
],
|
||||
+
|
||||
+ product_variables: {
|
||||
+ debuggable: {
|
||||
+ cflags: ["-DANDROID_DEBUGGABLE"],
|
||||
+ }
|
||||
+ },
|
||||
}
|
||||
|
||||
cc_defaults {
|
||||
diff --git a/services/core/jni/com_android_server_pm_ComputerEngine.cpp b/services/core/jni/com_android_server_pm_ComputerEngine.cpp
|
||||
new file mode 100644
|
||||
index 000000000..bbe298097
|
||||
--- /dev/null
|
||||
+++ b/services/core/jni/com_android_server_pm_ComputerEngine.cpp
|
||||
@@ -0,0 +1,38 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2024 The LineageOS Project
|
||||
+ *
|
||||
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
||||
+ * you may not use this file except in compliance with the License.
|
||||
+ * You may obtain a copy of the License at
|
||||
+ *
|
||||
+ * http://www.apache.org/licenses/LICENSE-2.0
|
||||
+ *
|
||||
+ * Unless required by applicable law or agreed to in writing, software
|
||||
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
||||
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
+ * See the License for the specific language governing permissions and
|
||||
+ * limitations under the License.
|
||||
+ */
|
||||
+
|
||||
+#include <nativehelper/JNIHelp.h>
|
||||
+
|
||||
+namespace android {
|
||||
+
|
||||
+static bool isDebuggable(JNIEnv* env) {
|
||||
+#ifdef ANDROID_DEBUGGABLE
|
||||
+ return true;
|
||||
+#else
|
||||
+ return false;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static const JNINativeMethod method_table[] = {
|
||||
+ {"isDebuggable", "()Z", (void*)isDebuggable},
|
||||
+};
|
||||
+
|
||||
+int register_android_server_com_android_server_pm_ComputerEngine(JNIEnv* env) {
|
||||
+ return jniRegisterNativeMethods(env, "com/android/server/pm/ComputerEngine",
|
||||
+ method_table, NELEM(method_table));
|
||||
+}
|
||||
+
|
||||
+} // namespace android
|
||||
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
|
||||
index 09fd8d4ac..0d61a13d2 100644
|
||||
--- a/services/core/jni/onload.cpp
|
||||
+++ b/services/core/jni/onload.cpp
|
||||
@@ -58,6 +58,7 @@ int register_android_server_utils_AnrTimer(JNIEnv *env);
|
||||
int register_android_server_utils_LazyJniRegistrar(JNIEnv* env);
|
||||
int register_com_android_server_soundtrigger_middleware_AudioSessionProviderImpl(JNIEnv* env);
|
||||
int register_com_android_server_soundtrigger_middleware_ExternalCaptureStateTracker(JNIEnv* env);
|
||||
+int register_android_server_com_android_server_pm_ComputerEngine(JNIEnv* env);
|
||||
int register_android_server_com_android_server_pm_PackageManagerShellCommandDataLoader(JNIEnv* env);
|
||||
int register_android_server_AdbDebuggingManager(JNIEnv* env);
|
||||
int register_android_server_FaceService(JNIEnv* env);
|
||||
@@ -124,6 +125,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
|
||||
register_android_server_utils_LazyJniRegistrar(env);
|
||||
register_com_android_server_soundtrigger_middleware_AudioSessionProviderImpl(env);
|
||||
register_com_android_server_soundtrigger_middleware_ExternalCaptureStateTracker(env);
|
||||
+ register_android_server_com_android_server_pm_ComputerEngine(env);
|
||||
register_android_server_com_android_server_pm_PackageManagerShellCommandDataLoader(env);
|
||||
register_android_server_AdbDebuggingManager(env);
|
||||
register_android_server_FaceService(env);
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
From 31cfef8a4245e49b99fc36cc8eaf7b0452ae9985 Mon Sep 17 00:00:00 2001
|
||||
From: Jonathan Klee <jonathan.klee@e.email>
|
||||
Date: Thu, 12 Dec 2024 15:27:57 +0100
|
||||
Subject: [PATCH 11/11] Allow spoofing signingInfo for microG
|
||||
Companion/Services
|
||||
|
||||
- Spoof PackageInfo signingInfo + signatures so that
|
||||
G suite apps do not complain anymore.
|
||||
|
||||
Change-Id: I86f182c9e1d18b0e997803842577a90ef740cfd1
|
||||
Signed-off-by: althafvly <althafvly@gmail.com>
|
||||
---
|
||||
.../java/com/android/server/pm/ComputerEngine.java | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
|
||||
index 3eb3df412..6f5813065 100644
|
||||
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
|
||||
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
|
||||
@@ -170,6 +170,7 @@ import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
+import java.security.cert.CertificateException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@@ -1590,6 +1591,18 @@ public class ComputerEngine implements Computer {
|
||||
|
||||
generateFakeSignature(p).ifPresent(fakeSignature -> {
|
||||
packageInfo.signatures = new Signature[]{fakeSignature};
|
||||
+ try {
|
||||
+ packageInfo.signingInfo = new SigningInfo(
|
||||
+ new SigningDetails(
|
||||
+ packageInfo.signatures,
|
||||
+ SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V3,
|
||||
+ SigningDetails.toSigningKeys(packageInfo.signatures),
|
||||
+ null
|
||||
+ )
|
||||
+ );
|
||||
+ } catch (CertificateException e) {
|
||||
+ Slog.e(TAG, "Caught an exception when creating signing keys: ", e);
|
||||
+ }
|
||||
});
|
||||
|
||||
return packageInfo;
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
From b02d33fe80bed126c8caeebb51ced31e9b0c710e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 6 Oct 2024 09:06:48 -0400
|
||||
Subject: [PATCH 1/7] sensorservice: Add support for ignoring broken sensors
|
||||
|
||||
This allows those sensors to be replaced by SensorFusion when possible.
|
||||
|
||||
Change-Id: I5509ee1f54fdf4838f6e3b109819a689f483cfc4
|
||||
---
|
||||
services/sensorservice/SensorDevice.cpp | 17 +++++++++++++++++
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp
|
||||
index 9c4d1ace15..5a95096fdb 100644
|
||||
--- a/services/sensorservice/SensorDevice.cpp
|
||||
+++ b/services/sensorservice/SensorDevice.cpp
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "SensorDevice.h"
|
||||
|
||||
#include <android-base/logging.h>
|
||||
+#include <android-base/properties.h>
|
||||
#include <android/util/ProtoOutputStream.h>
|
||||
#include <com_android_frameworks_sensorservice_flags.h>
|
||||
#include <cutils/atomic.h>
|
||||
@@ -32,6 +33,8 @@
|
||||
#include <condition_variable>
|
||||
#include <cstddef>
|
||||
#include <mutex>
|
||||
+#include <sstream>
|
||||
+#include <string>
|
||||
#include <thread>
|
||||
|
||||
#include "AidlSensorHalWrapper.h"
|
||||
@@ -86,10 +89,24 @@ void SensorDevice::initializeSensorList() {
|
||||
auto list = mHalWrapper->getSensorsList();
|
||||
const size_t count = list.size();
|
||||
|
||||
+ auto sensorFilter = base::GetProperty("persist.sys.phh.sensor_filter", "");
|
||||
+
|
||||
mActivationCount.setCapacity(count);
|
||||
Info model;
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
sensor_t sensor = list[i];
|
||||
+ std::string vendorNamePair = std::string(sensor.vendor) + ":" + std::string(sensor.name);
|
||||
+
|
||||
+ std::istringstream iss(sensorFilter);
|
||||
+ std::string item;
|
||||
+ bool shouldIgnore = false;
|
||||
+ while (std::getline(iss, item, ';')) {
|
||||
+ if (item == vendorNamePair) {
|
||||
+ shouldIgnore = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (shouldIgnore) continue;
|
||||
|
||||
if (sensor.type < DEVICE_PRIVATE_BASE) {
|
||||
sensor.resolution = SensorDeviceUtils::resolutionForSensor(sensor);
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,297 +0,0 @@
|
|||
From 050301ed102cd6b41756adf114243a3cfa8b70a6 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Sat, 25 Nov 2023 08:15:28 -0500
|
||||
Subject: [PATCH 2/7] Add MTK GED KPI support to fix broken Mediatek gpufreq
|
||||
|
||||
Mediatek GPU scheduler likes to have the timestamps of the frames to be
|
||||
able to adjust DVFS.
|
||||
Technically this isn't completely needed, because it looks like DVFS can
|
||||
work once we started triggering /proc/ged. But now that the work is
|
||||
done, let's do it completely.
|
||||
|
||||
In benchmarks on Poco X4 GT, before this patch result is 1500, after is
|
||||
5700. If we disable the patch after enabling it without rebooting, it
|
||||
goes to 5400. So looks like GED KPI thingy does try to do a bit more
|
||||
than just standard DVFS.
|
||||
|
||||
Thanks @sarthakroy2002 for the help and support (other people helped as
|
||||
well)
|
||||
|
||||
Change-Id: Ic29a231ea8651efd598083611197aaa9e3c1fbbe
|
||||
---
|
||||
libs/gui/Surface.cpp | 202 +++++++++++++++++++++++++++++++++
|
||||
libs/gui/include/gui/Surface.h | 3 +
|
||||
2 files changed, 205 insertions(+)
|
||||
|
||||
diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp
|
||||
index e41f9bbf43..d6863467a3 100644
|
||||
--- a/libs/gui/Surface.cpp
|
||||
+++ b/libs/gui/Surface.cpp
|
||||
@@ -26,6 +26,9 @@
|
||||
#include <deque>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
+#include <sys/ioctl.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <unistd.h>
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -50,6 +53,9 @@
|
||||
#include <gui/LayerState.h>
|
||||
#include <private/gui/ComposerService.h>
|
||||
#include <private/gui/ComposerServiceAIDL.h>
|
||||
+#include <android-base/properties.h>
|
||||
+
|
||||
+#include <binder/IPCThreadState.h>
|
||||
|
||||
#include <com_android_graphics_libgui_flags.h>
|
||||
|
||||
@@ -76,6 +82,37 @@ bool isInterceptorRegistrationOp(int op) {
|
||||
}
|
||||
|
||||
} // namespace
|
||||
+ //
|
||||
+#define GED_MAGIC 'g'
|
||||
+#define GED_BRIDGE_COMMAND_GPU_TIMESTAMP 103
|
||||
+#define GED_IOWR(INDEX) _IOWR(GED_MAGIC, INDEX, GED_BRIDGE_PACKAGE)
|
||||
+#define GED_BRIDGE_IO_GPU_TIMESTAMP \
|
||||
+ GED_IOWR(GED_BRIDGE_COMMAND_GPU_TIMESTAMP)
|
||||
+typedef struct _GED_BRIDGE_PACKAGE {
|
||||
+ unsigned int ui32FunctionID;
|
||||
+ int i32Size;
|
||||
+ void *pvParamIn;
|
||||
+ int i32InBufferSize;
|
||||
+ void *pvParamOut;
|
||||
+ int i32OutBufferSize;
|
||||
+} GED_BRIDGE_PACKAGE;
|
||||
+
|
||||
+struct GED_BRIDGE_IN_GPU_TIMESTAMP {
|
||||
+ int pid;
|
||||
+ uint64_t ullWnd;
|
||||
+ int32_t i32FrameID;
|
||||
+ int fence_fd;
|
||||
+ int QedBuffer_length;
|
||||
+ int isSF;
|
||||
+};
|
||||
+
|
||||
+struct GED_BRIDGE_OUT_GPU_TIMESTAMP {
|
||||
+ int eError;
|
||||
+ int is_ged_kpi_enabled;
|
||||
+};
|
||||
+
|
||||
+static int doMtkGedKpi = -1;
|
||||
+static int ged_fd = -1;
|
||||
|
||||
#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)
|
||||
Surface::ProducerDeathListenerProxy::ProducerDeathListenerProxy(wp<SurfaceListener> surfaceListener)
|
||||
@@ -147,6 +184,47 @@ Surface::Surface(const sp<IGraphicBufferProducer>& bufferProducer, bool controll
|
||||
mSwapIntervalZero = false;
|
||||
mMaxBufferCount = NUM_BUFFER_SLOTS;
|
||||
mSurfaceControlHandle = surfaceControlHandle;
|
||||
+
|
||||
+ if (doMtkGedKpi == -1) {
|
||||
+ doMtkGedKpi = android::base::GetIntProperty("persist.sys.phh.mtk_ged_kpi", 0);
|
||||
+ }
|
||||
+
|
||||
+ if (ged_fd == -1 && doMtkGedKpi == 1) {
|
||||
+ ALOGE("Opening ged");
|
||||
+ ged_fd = open("/proc/ged", O_RDONLY);
|
||||
+ ALOGE("Opening ged ret = %d", ged_fd);
|
||||
+ {
|
||||
+ struct GED_BRIDGE_IN_GPU_TIMESTAMP in = {
|
||||
+ .pid = 0,
|
||||
+ //.ullWnd = (uint64_t)(intptr_t)this,
|
||||
+ .ullWnd = 0,
|
||||
+ .i32FrameID = 0,
|
||||
+ .fence_fd = 0,
|
||||
+ .isSF = 0,
|
||||
+ .QedBuffer_length = 0,
|
||||
+ };
|
||||
+ struct GED_BRIDGE_OUT_GPU_TIMESTAMP out;
|
||||
+ memset(&in, 0, sizeof(in));
|
||||
+ GED_BRIDGE_PACKAGE package = {
|
||||
+ .ui32FunctionID = GED_BRIDGE_IO_GPU_TIMESTAMP,
|
||||
+ .i32Size = sizeof(GED_BRIDGE_PACKAGE),
|
||||
+ .pvParamIn = &in,
|
||||
+ .i32InBufferSize = sizeof(in),
|
||||
+ .pvParamOut = &out,
|
||||
+ .i32OutBufferSize = sizeof(out),
|
||||
+ };
|
||||
+ if (ged_fd >= 0) {
|
||||
+ int ret = ioctl(ged_fd, GED_BRIDGE_IO_GPU_TIMESTAMP, &package);
|
||||
+ ALOGE("First null timestamp ioctl returned %d %d %d", ret, out.eError, out.is_ged_kpi_enabled);
|
||||
+ if (out.is_ged_kpi_enabled != 1) {
|
||||
+ ALOGE("is_ged_kpi_enabled reported disabled");
|
||||
+ doMtkGedKpi = 0;
|
||||
+ }
|
||||
+ } else {
|
||||
+ ALOGE("No /proc/ged");
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
Surface::~Surface() {
|
||||
@@ -699,6 +777,36 @@ int Surface::dequeueBuffer(android_native_buffer_t** buffer, int* fenceFd) {
|
||||
}
|
||||
}
|
||||
|
||||
+ if (mGraphicBufferProducer != nullptr && ged_fd >= 0) {
|
||||
+ uint64_t uniqueId;
|
||||
+ mGraphicBufferProducer->getUniqueId(&uniqueId);
|
||||
+
|
||||
+ const int32_t dupFenceFd = fence->isValid() ? fence->dup() : -1;
|
||||
+
|
||||
+ struct GED_BRIDGE_IN_GPU_TIMESTAMP in = {
|
||||
+ .pid = mPid,
|
||||
+ .ullWnd = uniqueId,
|
||||
+ .i32FrameID = static_cast<int32_t>(reinterpret_cast<intptr_t>(gbuf->handle)) & 0x3fffffff,
|
||||
+ .fence_fd = dupFenceFd,
|
||||
+ .isSF = mIsSurfaceFlinger ? 1 : 0,
|
||||
+ .QedBuffer_length = -2,
|
||||
+ };
|
||||
+ struct GED_BRIDGE_OUT_GPU_TIMESTAMP out;
|
||||
+ memset(&out, 0, sizeof(out));
|
||||
+ GED_BRIDGE_PACKAGE package = {
|
||||
+ .ui32FunctionID = GED_BRIDGE_IO_GPU_TIMESTAMP,
|
||||
+ .i32Size = sizeof(GED_BRIDGE_PACKAGE),
|
||||
+ .pvParamIn = &in,
|
||||
+ .i32InBufferSize = sizeof(in),
|
||||
+ .pvParamOut = &out,
|
||||
+ .i32OutBufferSize = sizeof(out),
|
||||
+ };
|
||||
+
|
||||
+ int ret = ioctl(ged_fd, GED_BRIDGE_IO_GPU_TIMESTAMP, &package);
|
||||
+ ALOGV("GPU timestamp ioctl returned %d %d %d %d", ret, out.eError, out.is_ged_kpi_enabled, in.i32FrameID);
|
||||
+
|
||||
+ close(dupFenceFd);
|
||||
+ }
|
||||
if (fence->isValid()) {
|
||||
*fenceFd = fence->dup();
|
||||
if (*fenceFd == -1) {
|
||||
@@ -1187,6 +1295,60 @@ void Surface::onBufferQueuedLocked(int slot, sp<Fence> fence,
|
||||
}
|
||||
|
||||
mQueueBufferCondition.broadcast();
|
||||
+ if (mGraphicBufferProducer != nullptr && ged_fd >= 0) {
|
||||
+ sp<GraphicBuffer>& gbuf(mSlots[slot].buffer);
|
||||
+ uint64_t uniqueId;
|
||||
+ mGraphicBufferProducer->getUniqueId(&uniqueId);
|
||||
+
|
||||
+ const int32_t dupFenceFd = fence->isValid() ? fence->dup() : -1;
|
||||
+ // onQueue
|
||||
+ {
|
||||
+ struct GED_BRIDGE_IN_GPU_TIMESTAMP in = {
|
||||
+ .pid = mPid,
|
||||
+ .ullWnd = uniqueId,
|
||||
+ .i32FrameID = static_cast<int32_t>(reinterpret_cast<intptr_t>(gbuf->handle)) & 0x3fffffff,
|
||||
+ .fence_fd = dupFenceFd,
|
||||
+ .isSF = mIsSurfaceFlinger ? 1 : 0,
|
||||
+ .QedBuffer_length = static_cast<int>(output.numPendingBuffers),
|
||||
+ };
|
||||
+ struct GED_BRIDGE_OUT_GPU_TIMESTAMP out;
|
||||
+ memset(&out, 0, sizeof(out));
|
||||
+ GED_BRIDGE_PACKAGE package = {
|
||||
+ .ui32FunctionID = GED_BRIDGE_IO_GPU_TIMESTAMP,
|
||||
+ .i32Size = sizeof(GED_BRIDGE_PACKAGE),
|
||||
+ .pvParamIn = &in,
|
||||
+ .i32InBufferSize = sizeof(in),
|
||||
+ .pvParamOut = &out,
|
||||
+ .i32OutBufferSize = sizeof(out),
|
||||
+ };
|
||||
+ int ret = ioctl(ged_fd, GED_BRIDGE_IO_GPU_TIMESTAMP, &package);
|
||||
+ ALOGV("GPU timestamp ioctl returned %d %d %d", ret, out.eError, in.i32FrameID);
|
||||
+ }
|
||||
+ // acquire
|
||||
+ {
|
||||
+ struct GED_BRIDGE_IN_GPU_TIMESTAMP in = {
|
||||
+ .pid = mPid,
|
||||
+ .isSF = mIsSurfaceFlinger ? 1 : 0,
|
||||
+ .ullWnd = uniqueId,
|
||||
+ .i32FrameID = static_cast<int32_t>(reinterpret_cast<intptr_t>(gbuf->handle)) & 0x3fffffff,
|
||||
+ .fence_fd = dupFenceFd,
|
||||
+ .QedBuffer_length = -1,
|
||||
+ };
|
||||
+ struct GED_BRIDGE_OUT_GPU_TIMESTAMP out;
|
||||
+ memset(&out, 0, sizeof(out));
|
||||
+ GED_BRIDGE_PACKAGE package = {
|
||||
+ .ui32FunctionID = GED_BRIDGE_IO_GPU_TIMESTAMP,
|
||||
+ .i32Size = sizeof(GED_BRIDGE_PACKAGE),
|
||||
+ .pvParamIn = &in,
|
||||
+ .i32InBufferSize = sizeof(in),
|
||||
+ .pvParamOut = &in,
|
||||
+ .i32OutBufferSize = sizeof(out),
|
||||
+ };
|
||||
+ int ret = ioctl(ged_fd, GED_BRIDGE_IO_GPU_TIMESTAMP, &package);
|
||||
+ ALOGV("GPU timestamp ioctl returned %d %d %d", ret, out.eError, in.i32FrameID);
|
||||
+ }
|
||||
+ close(dupFenceFd);
|
||||
+ }
|
||||
|
||||
if (CC_UNLIKELY(atrace_is_tag_enabled(ATRACE_TAG_GRAPHICS))) {
|
||||
static gui::FenceMonitor gpuCompletionThread("GPU completion");
|
||||
@@ -2111,6 +2273,46 @@ int Surface::connect(int api, const sp<SurfaceListener>& listener, bool reportBu
|
||||
}
|
||||
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_PLATFORM_API_IMPROVEMENTS)
|
||||
}
|
||||
+
|
||||
+ // For MTK GED KPI, we need to grab the Surface owner's PID
|
||||
+ // and also know whether that owner is surfaceflinger
|
||||
+ if (api == NATIVE_WINDOW_API_EGL && ged_fd >= 0) {
|
||||
+ IPCThreadState *ipc = IPCThreadState::selfOrNull();
|
||||
+ const sp<IBinder>& token = IInterface::asBinder(mGraphicBufferProducer);
|
||||
+ mPid = (token != NULL && NULL != token->localBinder())
|
||||
+ ? getpid()
|
||||
+ : (ipc != nullptr)?ipc->getCallingPid():-1;
|
||||
+
|
||||
+ // We've got caller PID. Now checking whether it is surfaceflinger
|
||||
+ char cmdline[128];
|
||||
+ char path[128];
|
||||
+ snprintf(path, sizeof(path)-1, "/proc/%d/cmdline", mPid);
|
||||
+ int fd = open(path, O_RDONLY);
|
||||
+ read(fd, cmdline, sizeof(cmdline)-1);
|
||||
+ // Normally cmdline is already \0-separated, but well
|
||||
+ for(unsigned i=0; i<sizeof(cmdline); i++)
|
||||
+ if(cmdline[i] == '\n')
|
||||
+ cmdline[i] = 0;
|
||||
+ cmdline[sizeof(cmdline)-1] = 0;
|
||||
+
|
||||
+ close(fd);
|
||||
+
|
||||
+ // Truncate to last / (also called basename)
|
||||
+ const char *c = strrchr(cmdline, '/');
|
||||
+ if (c != nullptr) {
|
||||
+ c = c+1;
|
||||
+ } else {
|
||||
+ c = cmdline;
|
||||
+ }
|
||||
+ if(strcmp(c, "surfaceflinger") == 0) {
|
||||
+ ALOGE("is surfaceflinger = 1");
|
||||
+ mIsSurfaceFlinger = true;
|
||||
+ } else {
|
||||
+ ALOGE("is surfaceflinger = 0");
|
||||
+ mIsSurfaceFlinger = false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if (!err && api == NATIVE_WINDOW_API_CPU) {
|
||||
mConnectedToCpu = true;
|
||||
// Clear the dirty region in case we're switching from a non-CPU API
|
||||
diff --git a/libs/gui/include/gui/Surface.h b/libs/gui/include/gui/Surface.h
|
||||
index 14a351316d..e0843a8016 100644
|
||||
--- a/libs/gui/include/gui/Surface.h
|
||||
+++ b/libs/gui/include/gui/Surface.h
|
||||
@@ -742,6 +742,9 @@ protected:
|
||||
|
||||
// Buffers that are successfully dequeued/attached and handed to clients
|
||||
std::unordered_set<int> mDequeuedSlots;
|
||||
+
|
||||
+ pid_t mPid;
|
||||
+ bool mIsSurfaceFlinger;
|
||||
};
|
||||
|
||||
} // namespace android
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,101 +0,0 @@
|
|||
From 37580f1924099111b2995e910ed64bb4182b9c39 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Mon, 7 Oct 2024 22:07:58 -0400
|
||||
Subject: [PATCH 3/7] vibratorservice: Support optionally ignoring vibrator
|
||||
effects
|
||||
|
||||
On Unihertz Jelly Max the preloaded vibrator HAL is utterly broken.
|
||||
|
||||
Change-Id: I308190a225932fba2a4aa1c830c03ab874d8032e
|
||||
---
|
||||
services/vibratorservice/Android.bp | 1 +
|
||||
.../vibratorservice/VibratorHalWrapper.cpp | 31 +++++++++++++++++++
|
||||
2 files changed, 32 insertions(+)
|
||||
|
||||
diff --git a/services/vibratorservice/Android.bp b/services/vibratorservice/Android.bp
|
||||
index 4735ae5897..6263b0506f 100644
|
||||
--- a/services/vibratorservice/Android.bp
|
||||
+++ b/services/vibratorservice/Android.bp
|
||||
@@ -41,6 +41,7 @@ cc_library_shared {
|
||||
},
|
||||
|
||||
shared_libs: [
|
||||
+ "libbase",
|
||||
"libbinder_ndk",
|
||||
"libhidlbase",
|
||||
"liblog",
|
||||
diff --git a/services/vibratorservice/VibratorHalWrapper.cpp b/services/vibratorservice/VibratorHalWrapper.cpp
|
||||
index 3ddc4f2aca..11178659ff 100644
|
||||
--- a/services/vibratorservice/VibratorHalWrapper.cpp
|
||||
+++ b/services/vibratorservice/VibratorHalWrapper.cpp
|
||||
@@ -17,6 +17,7 @@
|
||||
#define LOG_TAG "VibratorHalWrapper"
|
||||
|
||||
#include <aidl/android/hardware/vibrator/IVibrator.h>
|
||||
+#include <android-base/properties.h>
|
||||
#include <android/hardware/vibrator/1.3/IVibrator.h>
|
||||
#include <hardware/vibrator.h>
|
||||
#include <cmath>
|
||||
@@ -44,6 +45,22 @@ namespace V1_2 = android::hardware::vibrator::V1_2;
|
||||
namespace V1_3 = android::hardware::vibrator::V1_3;
|
||||
namespace Aidl = aidl::android::hardware::vibrator;
|
||||
|
||||
+const Effect EFFECT_WITH_FALLBACK[] = {
|
||||
+ Effect::CLICK,
|
||||
+ Effect::DOUBLE_CLICK,
|
||||
+ Effect::HEAVY_CLICK,
|
||||
+ Effect::TICK,
|
||||
+};
|
||||
+
|
||||
+#define RETURN_UNSUPPORTED_IF_IGNORED() \
|
||||
+ bool shouldIgnoreEffects = android::base::GetBoolProperty("persist.sys.phh.ignore_vibrator_effects", false); \
|
||||
+ auto casted_effect = static_cast<Effect>(effect); \
|
||||
+ bool isEffectWithFallback = std::find(std::begin(EFFECT_WITH_FALLBACK), std::end(EFFECT_WITH_FALLBACK), casted_effect) \
|
||||
+ != std::end(EFFECT_WITH_FALLBACK); \
|
||||
+ if (shouldIgnoreEffects && isEffectWithFallback) { \
|
||||
+ return HalResult<milliseconds>::unsupported(); \
|
||||
+ }
|
||||
+
|
||||
namespace android {
|
||||
|
||||
namespace vibrator {
|
||||
@@ -63,8 +80,18 @@ Info HalWrapper::getInfo() {
|
||||
getCapabilities();
|
||||
getPrimitiveDurations();
|
||||
std::lock_guard<std::mutex> lock(mInfoMutex);
|
||||
+ bool shouldIgnoreEffects = android::base::GetBoolProperty("persist.sys.phh.ignore_vibrator_effects", false);
|
||||
if (mInfoCache.mSupportedEffects.isFailed()) {
|
||||
mInfoCache.mSupportedEffects = getSupportedEffectsInternal();
|
||||
+ if (mInfoCache.mSupportedEffects.isOk()) {
|
||||
+ std::vector<Effect> filtered;
|
||||
+ for (auto& effect : mInfoCache.mSupportedEffects.value()) {
|
||||
+ if (std::find(std::begin(EFFECT_WITH_FALLBACK), std::end(EFFECT_WITH_FALLBACK), effect) == std::end(EFFECT_WITH_FALLBACK)) {
|
||||
+ filtered.push_back(effect);
|
||||
+ }
|
||||
+ }
|
||||
+ mInfoCache.mSupportedEffects = HalResult<std::vector<Effect>>::ok(filtered);
|
||||
+ }
|
||||
}
|
||||
if (mInfoCache.mSupportedBraking.isFailed()) {
|
||||
mInfoCache.mSupportedBraking = getSupportedBrakingInternal();
|
||||
@@ -305,6 +332,8 @@ HalResult<void> AidlHalWrapper::alwaysOnDisable(int32_t id) {
|
||||
|
||||
HalResult<milliseconds> AidlHalWrapper::performEffect(
|
||||
Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) {
|
||||
+ RETURN_UNSUPPORTED_IF_IGNORED();
|
||||
+
|
||||
HalResult<Capabilities> capabilities = getCapabilities();
|
||||
bool supportsCallback = capabilities.isOk() &&
|
||||
static_cast<int32_t>(capabilities.value() & Capabilities::PERFORM_CALLBACK);
|
||||
@@ -582,6 +611,8 @@ template <typename T>
|
||||
HalResult<milliseconds> HidlHalWrapper<I>::performInternal(
|
||||
perform_fn<T> performFn, sp<I> handle, T effect, EffectStrength strength,
|
||||
const std::function<void()>& completionCallback) {
|
||||
+ RETURN_UNSUPPORTED_IF_IGNORED();
|
||||
+
|
||||
V1_0::Status status;
|
||||
int32_t lengthMs;
|
||||
auto effectCallback = [&status, &lengthMs](V1_0::Status retStatus, uint32_t retLengthMs) {
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,348 +0,0 @@
|
|||
From b12faaf3064de58caf0f6bfaf7fcac5a47f5024d Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 12:54:56 -0400
|
||||
Subject: [PATCH 4/7] Revert "Remove flag single_hop_screenshots"
|
||||
|
||||
This reverts commit 16c4c32c55231dc241c386a0423710baa452b7de.
|
||||
|
||||
Change-Id: Ib1618cd4e1f83ba1f211a04429538b32e8de79da
|
||||
---
|
||||
.../surfaceflinger/RegionSamplingThread.cpp | 22 ++-
|
||||
services/surfaceflinger/SurfaceFlinger.cpp | 184 ++++++++++++++----
|
||||
services/surfaceflinger/SurfaceFlinger.h | 10 +-
|
||||
.../surfaceflinger/common/FlagManager.cpp | 2 +
|
||||
.../common/include/common/FlagManager.h | 1 +
|
||||
.../tests/unittests/TestableSurfaceFlinger.h | 3 +-
|
||||
6 files changed, 171 insertions(+), 51 deletions(-)
|
||||
|
||||
diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
index 21d3396ebe..08f831c8e5 100644
|
||||
--- a/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
+++ b/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
@@ -353,13 +353,21 @@ void RegionSamplingThread::captureSample() {
|
||||
sampledBounds.getSize(), ui::Dataspace::V0_SRGB, displayWeak,
|
||||
RenderArea::Options::CAPTURE_SECURE_LAYERS);
|
||||
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>> layers;
|
||||
- auto displayState =
|
||||
- mFlinger.getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers);
|
||||
- FenceResult fenceResult =
|
||||
- mFlinger.captureScreenshot(renderAreaBuilder, buffer, kRegionSampling, kGrayscale,
|
||||
- kIsProtected, kAttachGainmap, nullptr, displayState, layers)
|
||||
- .get();
|
||||
+ FenceResult fenceResult;
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot()) {
|
||||
+ std::vector<std::pair<Layer*, sp<LayerFE>>> layers;
|
||||
+ auto displayState =
|
||||
+ mFlinger.getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers);
|
||||
+ fenceResult = mFlinger.captureScreenshot(renderAreaBuilder, buffer, kRegionSampling,
|
||||
+ kGrayscale, kIsProtected, kAttachGainmap, nullptr,
|
||||
+ displayState, layers)
|
||||
+ .get();
|
||||
+ } else {
|
||||
+ fenceResult = mFlinger.captureScreenshotLegacy(renderAreaBuilder, getLayerSnapshotsFn,
|
||||
+ buffer, kRegionSampling, kGrayscale,
|
||||
+ kIsProtected, kAttachGainmap, nullptr)
|
||||
+ .get();
|
||||
+ }
|
||||
if (fenceResult.ok()) {
|
||||
fenceResult.value()->waitForever(LOG_TAG);
|
||||
}
|
||||
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
index 896d13d31d..852a8b81e1 100644
|
||||
--- a/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
@@ -7389,41 +7389,79 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaBuilderVariant renderAreaBuil
|
||||
return;
|
||||
}
|
||||
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>> layers;
|
||||
- auto displayState = getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers);
|
||||
-
|
||||
- const bool supportsProtected = getRenderEngine().supportsProtectedContent();
|
||||
- bool hasProtectedLayer = false;
|
||||
- if (allowProtected && supportsProtected) {
|
||||
- hasProtectedLayer = layersHasProtectedLayer(layers);
|
||||
- }
|
||||
- const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
|
||||
- const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
|
||||
- GRALLOC_USAGE_HW_TEXTURE |
|
||||
- (isProtected ? GRALLOC_USAGE_PROTECTED
|
||||
- : GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
|
||||
- sp<GraphicBuffer> buffer =
|
||||
- getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(),
|
||||
- static_cast<android_pixel_format>(reqPixelFormat),
|
||||
- 1 /* layerCount */, usage, "screenshot");
|
||||
-
|
||||
- const status_t bufferStatus = buffer->initCheck();
|
||||
- if (bufferStatus != OK) {
|
||||
- // Animations may end up being really janky, but don't crash here.
|
||||
- // Otherwise an irreponsible process may cause an SF crash by allocating
|
||||
- // too much.
|
||||
- ALOGE("%s: Buffer failed to allocate: %d", __func__, bufferStatus);
|
||||
- invokeScreenCaptureError(bufferStatus, captureListener);
|
||||
- return;
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot()) {
|
||||
+ std::vector<std::pair<Layer*, sp<LayerFE>>> layers;
|
||||
+ auto displayState =
|
||||
+ getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers);
|
||||
+
|
||||
+ const bool supportsProtected = getRenderEngine().supportsProtectedContent();
|
||||
+ bool hasProtectedLayer = false;
|
||||
+ if (allowProtected && supportsProtected) {
|
||||
+ hasProtectedLayer = layersHasProtectedLayer(layers);
|
||||
+ }
|
||||
+ const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
|
||||
+ const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
|
||||
+ GRALLOC_USAGE_HW_TEXTURE |
|
||||
+ (isProtected ? GRALLOC_USAGE_PROTECTED
|
||||
+ : GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
|
||||
+ sp<GraphicBuffer> buffer =
|
||||
+ getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(),
|
||||
+ static_cast<android_pixel_format>(reqPixelFormat),
|
||||
+ 1 /* layerCount */, usage, "screenshot");
|
||||
+
|
||||
+ const status_t bufferStatus = buffer->initCheck();
|
||||
+ if (bufferStatus != OK) {
|
||||
+ // Animations may end up being really janky, but don't crash here.
|
||||
+ // Otherwise an irreponsible process may cause an SF crash by allocating
|
||||
+ // too much.
|
||||
+ ALOGE("%s: Buffer failed to allocate: %d", __func__, bufferStatus);
|
||||
+ invokeScreenCaptureError(bufferStatus, captureListener);
|
||||
+ return;
|
||||
+ }
|
||||
+ const std::shared_ptr<renderengine::ExternalTexture> texture = std::make_shared<
|
||||
+ renderengine::impl::ExternalTexture>(buffer, getRenderEngine(),
|
||||
+ renderengine::impl::ExternalTexture::Usage::
|
||||
+ WRITEABLE);
|
||||
+ auto futureFence = captureScreenshot(renderAreaBuilder, texture, false /* regionSampling */,
|
||||
+ grayscale, isProtected, attachGainmap, captureListener,
|
||||
+ displayState, layers);
|
||||
+ futureFence.get();
|
||||
+
|
||||
+ } else {
|
||||
+ const bool supportsProtected = getRenderEngine().supportsProtectedContent();
|
||||
+ bool hasProtectedLayer = false;
|
||||
+ if (allowProtected && supportsProtected) {
|
||||
+ auto layers = mScheduler->schedule([=]() { return getLayerSnapshotsFn(); }).get();
|
||||
+ hasProtectedLayer = layersHasProtectedLayer(layers);
|
||||
+ }
|
||||
+ const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
|
||||
+ const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
|
||||
+ GRALLOC_USAGE_HW_TEXTURE |
|
||||
+ (isProtected ? GRALLOC_USAGE_PROTECTED
|
||||
+ : GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
|
||||
+ sp<GraphicBuffer> buffer =
|
||||
+ getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(),
|
||||
+ static_cast<android_pixel_format>(reqPixelFormat),
|
||||
+ 1 /* layerCount */, usage, "screenshot");
|
||||
+
|
||||
+ const status_t bufferStatus = buffer->initCheck();
|
||||
+ if (bufferStatus != OK) {
|
||||
+ // Animations may end up being really janky, but don't crash here.
|
||||
+ // Otherwise an irreponsible process may cause an SF crash by allocating
|
||||
+ // too much.
|
||||
+ ALOGE("%s: Buffer failed to allocate: %d", __func__, bufferStatus);
|
||||
+ invokeScreenCaptureError(bufferStatus, captureListener);
|
||||
+ return;
|
||||
+ }
|
||||
+ const std::shared_ptr<renderengine::ExternalTexture> texture = std::make_shared<
|
||||
+ renderengine::impl::ExternalTexture>(buffer, getRenderEngine(),
|
||||
+ renderengine::impl::ExternalTexture::Usage::
|
||||
+ WRITEABLE);
|
||||
+ auto futureFence = captureScreenshotLegacy(renderAreaBuilder, getLayerSnapshotsFn, texture,
|
||||
+ false /* regionSampling */, grayscale,
|
||||
+ isProtected, attachGainmap, captureListener);
|
||||
+ futureFence.get();
|
||||
}
|
||||
- const std::shared_ptr<renderengine::ExternalTexture> texture = std::make_shared<
|
||||
- renderengine::impl::ExternalTexture>(buffer, getRenderEngine(),
|
||||
- renderengine::impl::ExternalTexture::Usage::
|
||||
- WRITEABLE);
|
||||
- auto futureFence =
|
||||
- captureScreenshot(renderAreaBuilder, texture, false /* regionSampling */, grayscale,
|
||||
- isProtected, attachGainmap, captureListener, displayState, layers);
|
||||
- futureFence.get();
|
||||
}
|
||||
|
||||
std::optional<SurfaceFlinger::OutputCompositionState>
|
||||
@@ -7489,7 +7527,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
|
||||
|
||||
ftl::SharedFuture<FenceResult> renderFuture =
|
||||
renderScreenImpl(renderArea.get(), buffer, regionSampling, grayscale, isProtected,
|
||||
- captureResults, displayState, layers);
|
||||
+ attachGainmap, captureResults, displayState, layers);
|
||||
|
||||
if (captureResults.capturedHdrLayers && attachGainmap &&
|
||||
FlagManager::getInstance().true_hdr_screenshots()) {
|
||||
@@ -7524,7 +7562,8 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
|
||||
ScreenCaptureResults unusedResults;
|
||||
ftl::SharedFuture<FenceResult> hdrRenderFuture =
|
||||
renderScreenImpl(renderArea.get(), hdrTexture, regionSampling, grayscale,
|
||||
- isProtected, unusedResults, displayState, layers);
|
||||
+ isProtected, attachGainmap, unusedResults, displayState,
|
||||
+ layers);
|
||||
|
||||
renderFuture =
|
||||
ftl::Future(std::move(renderFuture))
|
||||
@@ -7570,10 +7609,67 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
|
||||
return renderFuture;
|
||||
}
|
||||
|
||||
+ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshotLegacy(
|
||||
+ RenderAreaBuilderVariant renderAreaBuilder, GetLayerSnapshotsFunction getLayerSnapshotsFn,
|
||||
+ const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling,
|
||||
+ bool grayscale, bool isProtected, bool attachGainmap,
|
||||
+ const sp<IScreenCaptureListener>& captureListener) {
|
||||
+ SFTRACE_CALL();
|
||||
+
|
||||
+ auto takeScreenshotFn = [=, this, renderAreaBuilder = std::move(renderAreaBuilder)]() REQUIRES(
|
||||
+ kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> {
|
||||
+ auto layers = getLayerSnapshotsFn();
|
||||
+ auto displayState = getDisplayStateFromRenderAreaBuilder(renderAreaBuilder);
|
||||
+
|
||||
+ ScreenCaptureResults captureResults;
|
||||
+ std::unique_ptr<const RenderArea> renderArea =
|
||||
+ std::visit([](auto&& arg) -> std::unique_ptr<RenderArea> { return arg.build(); },
|
||||
+ renderAreaBuilder);
|
||||
+
|
||||
+ if (!renderArea) {
|
||||
+ ALOGW("Skipping screen capture because of invalid render area.");
|
||||
+ if (captureListener) {
|
||||
+ captureResults.fenceResult = base::unexpected(NO_MEMORY);
|
||||
+ captureListener->onScreenCaptureCompleted(captureResults);
|
||||
+ }
|
||||
+ return ftl::yield<FenceResult>(base::unexpected(NO_ERROR)).share();
|
||||
+ }
|
||||
+
|
||||
+ ftl::SharedFuture<FenceResult> renderFuture =
|
||||
+ renderScreenImpl(renderArea.get(), buffer, regionSampling, grayscale, isProtected,
|
||||
+ attachGainmap, captureResults, displayState, layers);
|
||||
+
|
||||
+ if (captureListener) {
|
||||
+ // Defer blocking on renderFuture back to the Binder thread.
|
||||
+ return ftl::Future(std::move(renderFuture))
|
||||
+ .then([captureListener, captureResults = std::move(captureResults)](
|
||||
+ FenceResult fenceResult) mutable -> FenceResult {
|
||||
+ captureResults.fenceResult = std::move(fenceResult);
|
||||
+ captureListener->onScreenCaptureCompleted(captureResults);
|
||||
+ return base::unexpected(NO_ERROR);
|
||||
+ })
|
||||
+ .share();
|
||||
+ }
|
||||
+ return renderFuture;
|
||||
+ };
|
||||
+
|
||||
+ // TODO(b/294936197): Run takeScreenshotsFn() in a binder thread to reduce the number
|
||||
+ // of calls on the main thread.
|
||||
+ auto future =
|
||||
+ mScheduler->schedule(FTL_FAKE_GUARD(kMainThreadContext, std::move(takeScreenshotFn)));
|
||||
+
|
||||
+ // Flatten nested futures.
|
||||
+ auto chain = ftl::Future(std::move(future)).then([](ftl::SharedFuture<FenceResult> future) {
|
||||
+ return future;
|
||||
+ });
|
||||
+
|
||||
+ return chain.share();
|
||||
+}
|
||||
+
|
||||
ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
|
||||
const RenderArea* renderArea, const std::shared_ptr<renderengine::ExternalTexture>& buffer,
|
||||
- bool regionSampling, bool grayscale, bool isProtected, ScreenCaptureResults& captureResults,
|
||||
- std::optional<OutputCompositionState>& displayState,
|
||||
+ bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap,
|
||||
+ ScreenCaptureResults& captureResults, std::optional<OutputCompositionState>& displayState,
|
||||
std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) {
|
||||
SFTRACE_CALL();
|
||||
|
||||
@@ -7719,9 +7815,15 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
|
||||
//
|
||||
// TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call
|
||||
// to CompositionEngine::present.
|
||||
- ftl::SharedFuture<FenceResult> presentFuture = mRenderEngine->isThreaded()
|
||||
- ? ftl::yield(present()).share()
|
||||
- : mScheduler->schedule(std::move(present)).share();
|
||||
+ ftl::SharedFuture<FenceResult> presentFuture;
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot()) {
|
||||
+ presentFuture = mRenderEngine->isThreaded()
|
||||
+ ? ftl::yield(present()).share()
|
||||
+ : mScheduler->schedule(std::move(present)).share();
|
||||
+ } else {
|
||||
+ presentFuture = mRenderEngine->isThreaded() ? ftl::defer(std::move(present)).share()
|
||||
+ : ftl::yield(present()).share();
|
||||
+ }
|
||||
|
||||
return presentFuture;
|
||||
}
|
||||
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
|
||||
index 1e2c08747b..835cb572b4 100644
|
||||
--- a/services/surfaceflinger/SurfaceFlinger.h
|
||||
+++ b/services/surfaceflinger/SurfaceFlinger.h
|
||||
@@ -885,10 +885,16 @@ private:
|
||||
std::optional<OutputCompositionState>& displayState,
|
||||
std::vector<std::pair<Layer*, sp<LayerFE>>>& layers);
|
||||
|
||||
+ ftl::SharedFuture<FenceResult> captureScreenshotLegacy(
|
||||
+ RenderAreaBuilderVariant, GetLayerSnapshotsFunction,
|
||||
+ const std::shared_ptr<renderengine::ExternalTexture>&, bool regionSampling,
|
||||
+ bool grayscale, bool isProtected, bool attachGainmap,
|
||||
+ const sp<IScreenCaptureListener>&);
|
||||
+
|
||||
ftl::SharedFuture<FenceResult> renderScreenImpl(
|
||||
const RenderArea*, const std::shared_ptr<renderengine::ExternalTexture>&,
|
||||
- bool regionSampling, bool grayscale, bool isProtected, ScreenCaptureResults&,
|
||||
- std::optional<OutputCompositionState>& displayState,
|
||||
+ bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap,
|
||||
+ ScreenCaptureResults&, std::optional<OutputCompositionState>& displayState,
|
||||
std::vector<std::pair<Layer*, sp<LayerFE>>>& layers);
|
||||
|
||||
void readPersistentProperties();
|
||||
diff --git a/services/surfaceflinger/common/FlagManager.cpp b/services/surfaceflinger/common/FlagManager.cpp
|
||||
index 5e78426c77..5c417ba748 100644
|
||||
--- a/services/surfaceflinger/common/FlagManager.cpp
|
||||
+++ b/services/surfaceflinger/common/FlagManager.cpp
|
||||
@@ -166,6 +166,7 @@ void FlagManager::dump(std::string& result) const {
|
||||
DUMP_ACONFIG_FLAG(skip_invisible_windows_in_input);
|
||||
DUMP_ACONFIG_FLAG(begone_bright_hlg);
|
||||
DUMP_ACONFIG_FLAG(window_blur_kawase2);
|
||||
+ DUMP_ACONFIG_FLAG(single_hop_screenshot);
|
||||
|
||||
#undef DUMP_ACONFIG_FLAG
|
||||
#undef DUMP_LEGACY_SERVER_FLAG
|
||||
@@ -259,6 +260,7 @@ FLAG_MANAGER_ACONFIG_FLAG(local_tonemap_screenshots, "debug.sf.local_tonemap_scr
|
||||
FLAG_MANAGER_ACONFIG_FLAG(override_trusted_overlay, "");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(flush_buffer_slots_to_uncache, "");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(force_compile_graphite_renderengine, "");
|
||||
+FLAG_MANAGER_ACONFIG_FLAG(single_hop_screenshot, "");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(true_hdr_screenshots, "debug.sf.true_hdr_screenshots");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(display_config_error_hal, "");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(connected_display_hdr, "debug.sf.connected_display_hdr");
|
||||
diff --git a/services/surfaceflinger/common/include/common/FlagManager.h b/services/surfaceflinger/common/include/common/FlagManager.h
|
||||
index d8887f538f..15284ba0ee 100644
|
||||
--- a/services/surfaceflinger/common/include/common/FlagManager.h
|
||||
+++ b/services/surfaceflinger/common/include/common/FlagManager.h
|
||||
@@ -95,6 +95,7 @@ public:
|
||||
bool override_trusted_overlay() const;
|
||||
bool flush_buffer_slots_to_uncache() const;
|
||||
bool force_compile_graphite_renderengine() const;
|
||||
+ bool single_hop_screenshot() const;
|
||||
bool trace_frame_rate_override() const;
|
||||
bool true_hdr_screenshots() const;
|
||||
bool display_config_error_hal() const;
|
||||
diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
|
||||
index 7f0b7a6585..fd8bc0d22d 100644
|
||||
--- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
|
||||
+++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
|
||||
@@ -475,7 +475,8 @@ public:
|
||||
|
||||
return mFlinger->renderScreenImpl(renderArea.get(), buffer, regionSampling,
|
||||
false /* grayscale */, false /* isProtected */,
|
||||
- captureResults, displayState, layers);
|
||||
+ false /* attachGainmap */, captureResults, displayState,
|
||||
+ layers);
|
||||
}
|
||||
|
||||
auto getLayerSnapshotsForScreenshotsFn(ui::LayerStack layerStack, uint32_t uid) {
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,334 +0,0 @@
|
|||
From aa5e6f794b3e2c9f5bdbc40da702b14dd9a1764e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 13:19:17 -0400
|
||||
Subject: [PATCH 5/7] Revert "Reorder release fence attachment for non-threaded
|
||||
RE"
|
||||
|
||||
This reverts commit 0b80c74300b73e937ee9a9cb58487bd126daa4d8.
|
||||
---
|
||||
.../surfaceflinger/RegionSamplingThread.cpp | 11 ++-
|
||||
services/surfaceflinger/SurfaceFlinger.cpp | 97 ++++++++++---------
|
||||
services/surfaceflinger/SurfaceFlinger.h | 16 ++-
|
||||
.../tests/unittests/TestableSurfaceFlinger.h | 3 +-
|
||||
4 files changed, 69 insertions(+), 58 deletions(-)
|
||||
|
||||
diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
index 08f831c8e5..011fd9e20a 100644
|
||||
--- a/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
+++ b/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
@@ -354,13 +354,14 @@ void RegionSamplingThread::captureSample() {
|
||||
RenderArea::Options::CAPTURE_SECURE_LAYERS);
|
||||
|
||||
FenceResult fenceResult;
|
||||
- if (FlagManager::getInstance().single_hop_screenshot()) {
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>> layers;
|
||||
- auto displayState =
|
||||
- mFlinger.getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers);
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot() &&
|
||||
+ mFlinger.mRenderEngine->isThreaded()) {
|
||||
+ std::vector<sp<LayerFE>> layerFEs;
|
||||
+ auto displayState = mFlinger.getSnapshotsFromMainThread(renderAreaBuilder,
|
||||
+ getLayerSnapshotsFn, layerFEs);
|
||||
fenceResult = mFlinger.captureScreenshot(renderAreaBuilder, buffer, kRegionSampling,
|
||||
kGrayscale, kIsProtected, kAttachGainmap, nullptr,
|
||||
- displayState, layers)
|
||||
+ displayState, layerFEs)
|
||||
.get();
|
||||
} else {
|
||||
fenceResult = mFlinger.captureScreenshotLegacy(renderAreaBuilder, getLayerSnapshotsFn,
|
||||
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
index 852a8b81e1..067a8bafe0 100644
|
||||
--- a/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
@@ -7335,10 +7335,9 @@ void SurfaceFlinger::attachReleaseFenceFutureToLayer(Layer* layer, LayerFE* laye
|
||||
// typically a layer with DRM contents, or have the GRALLOC_USAGE_PROTECTED set on the buffer.
|
||||
// A protected layer has no implication on whether it's secure, which is explicitly set by
|
||||
// application to avoid being screenshot or drawn via unsecure display.
|
||||
-bool SurfaceFlinger::layersHasProtectedLayer(
|
||||
- const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const {
|
||||
+bool SurfaceFlinger::layersHasProtectedLayer(const std::vector<sp<LayerFE>>& layers) const {
|
||||
bool protectedLayerFound = false;
|
||||
- for (auto& [_, layerFE] : layers) {
|
||||
+ for (auto& layerFE : layers) {
|
||||
protectedLayerFound |=
|
||||
(layerFE->mSnapshot->isVisible && layerFE->mSnapshot->hasProtectedContent);
|
||||
if (protectedLayerFound) {
|
||||
@@ -7354,21 +7353,15 @@ bool SurfaceFlinger::layersHasProtectedLayer(
|
||||
// risk of deadlocks.
|
||||
std::optional<SurfaceFlinger::OutputCompositionState> SurfaceFlinger::getSnapshotsFromMainThread(
|
||||
RenderAreaBuilderVariant& renderAreaBuilder, GetLayerSnapshotsFunction getLayerSnapshotsFn,
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) {
|
||||
+ std::vector<sp<LayerFE>>& layerFEs) {
|
||||
return mScheduler
|
||||
- ->schedule([=, this, &renderAreaBuilder, &layers]() REQUIRES(kMainThreadContext) {
|
||||
+ ->schedule([=, this, &renderAreaBuilder, &layerFEs]() REQUIRES(kMainThreadContext) {
|
||||
SFTRACE_NAME("getSnapshotsFromMainThread");
|
||||
- layers = getLayerSnapshotsFn();
|
||||
- // Non-threaded RenderEngine eventually returns to the main thread a 2nd time
|
||||
- // to complete the screenshot. Release fences should only be added during the 2nd
|
||||
- // hop to main thread in order to avoid potential deadlocks from waiting for the
|
||||
- // the future fence to fire.
|
||||
- if (mRenderEngine->isThreaded()) {
|
||||
- for (auto& [layer, layerFE] : layers) {
|
||||
- attachReleaseFenceFutureToLayer(layer, layerFE.get(),
|
||||
- ui::INVALID_LAYER_STACK);
|
||||
- }
|
||||
+ auto layers = getLayerSnapshotsFn();
|
||||
+ for (auto& [layer, layerFE] : layers) {
|
||||
+ attachReleaseFenceFutureToLayer(layer, layerFE.get(), ui::INVALID_LAYER_STACK);
|
||||
}
|
||||
+ layerFEs = extractLayerFEs(layers);
|
||||
return getDisplayStateFromRenderAreaBuilder(renderAreaBuilder);
|
||||
})
|
||||
.get();
|
||||
@@ -7389,15 +7382,15 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaBuilderVariant renderAreaBuil
|
||||
return;
|
||||
}
|
||||
|
||||
- if (FlagManager::getInstance().single_hop_screenshot()) {
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>> layers;
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot() && mRenderEngine->isThreaded()) {
|
||||
+ std::vector<sp<LayerFE>> layerFEs;
|
||||
auto displayState =
|
||||
- getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers);
|
||||
+ getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layerFEs);
|
||||
|
||||
const bool supportsProtected = getRenderEngine().supportsProtectedContent();
|
||||
bool hasProtectedLayer = false;
|
||||
if (allowProtected && supportsProtected) {
|
||||
- hasProtectedLayer = layersHasProtectedLayer(layers);
|
||||
+ hasProtectedLayer = layersHasProtectedLayer(layerFEs);
|
||||
}
|
||||
const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
|
||||
const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
|
||||
@@ -7424,7 +7417,7 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaBuilderVariant renderAreaBuil
|
||||
WRITEABLE);
|
||||
auto futureFence = captureScreenshot(renderAreaBuilder, texture, false /* regionSampling */,
|
||||
grayscale, isProtected, attachGainmap, captureListener,
|
||||
- displayState, layers);
|
||||
+ displayState, layerFEs);
|
||||
futureFence.get();
|
||||
|
||||
} else {
|
||||
@@ -7432,7 +7425,7 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaBuilderVariant renderAreaBuil
|
||||
bool hasProtectedLayer = false;
|
||||
if (allowProtected && supportsProtected) {
|
||||
auto layers = mScheduler->schedule([=]() { return getLayerSnapshotsFn(); }).get();
|
||||
- hasProtectedLayer = layersHasProtectedLayer(layers);
|
||||
+ hasProtectedLayer = layersHasProtectedLayer(extractLayerFEs(layers));
|
||||
}
|
||||
const bool isProtected = hasProtectedLayer && allowProtected && supportsProtected;
|
||||
const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
|
||||
@@ -7500,13 +7493,22 @@ SurfaceFlinger::getDisplayStateFromRenderAreaBuilder(RenderAreaBuilderVariant& r
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
+std::vector<sp<LayerFE>> SurfaceFlinger::extractLayerFEs(
|
||||
+ const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const {
|
||||
+ std::vector<sp<LayerFE>> layerFEs;
|
||||
+ layerFEs.reserve(layers.size());
|
||||
+ for (const auto& [_, layerFE] : layers) {
|
||||
+ layerFEs.push_back(layerFE);
|
||||
+ }
|
||||
+ return layerFEs;
|
||||
+}
|
||||
+
|
||||
ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
|
||||
const RenderAreaBuilderVariant& renderAreaBuilder,
|
||||
const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling,
|
||||
bool grayscale, bool isProtected, bool attachGainmap,
|
||||
const sp<IScreenCaptureListener>& captureListener,
|
||||
- std::optional<OutputCompositionState>& displayState,
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) {
|
||||
+ std::optional<OutputCompositionState>& displayState, std::vector<sp<LayerFE>>& layerFEs) {
|
||||
SFTRACE_CALL();
|
||||
|
||||
ScreenCaptureResults captureResults;
|
||||
@@ -7525,9 +7527,11 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
|
||||
float displayBrightnessNits = displayState.value().displayBrightnessNits;
|
||||
float sdrWhitePointNits = displayState.value().sdrWhitePointNits;
|
||||
|
||||
+ // Empty vector needed to pass into renderScreenImpl for legacy path
|
||||
+ std::vector<std::pair<Layer*, sp<android::LayerFE>>> layers;
|
||||
ftl::SharedFuture<FenceResult> renderFuture =
|
||||
renderScreenImpl(renderArea.get(), buffer, regionSampling, grayscale, isProtected,
|
||||
- attachGainmap, captureResults, displayState, layers);
|
||||
+ attachGainmap, captureResults, displayState, layers, layerFEs);
|
||||
|
||||
if (captureResults.capturedHdrLayers && attachGainmap &&
|
||||
FlagManager::getInstance().true_hdr_screenshots()) {
|
||||
@@ -7563,7 +7567,7 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshot(
|
||||
ftl::SharedFuture<FenceResult> hdrRenderFuture =
|
||||
renderScreenImpl(renderArea.get(), hdrTexture, regionSampling, grayscale,
|
||||
isProtected, attachGainmap, unusedResults, displayState,
|
||||
- layers);
|
||||
+ layers, layerFEs);
|
||||
|
||||
renderFuture =
|
||||
ftl::Future(std::move(renderFuture))
|
||||
@@ -7619,6 +7623,9 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshotLegacy(
|
||||
auto takeScreenshotFn = [=, this, renderAreaBuilder = std::move(renderAreaBuilder)]() REQUIRES(
|
||||
kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> {
|
||||
auto layers = getLayerSnapshotsFn();
|
||||
+ for (auto& [layer, layerFE] : layers) {
|
||||
+ attachReleaseFenceFutureToLayer(layer, layerFE.get(), ui::INVALID_LAYER_STACK);
|
||||
+ }
|
||||
auto displayState = getDisplayStateFromRenderAreaBuilder(renderAreaBuilder);
|
||||
|
||||
ScreenCaptureResults captureResults;
|
||||
@@ -7635,9 +7642,10 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshotLegacy(
|
||||
return ftl::yield<FenceResult>(base::unexpected(NO_ERROR)).share();
|
||||
}
|
||||
|
||||
+ auto layerFEs = extractLayerFEs(layers);
|
||||
ftl::SharedFuture<FenceResult> renderFuture =
|
||||
renderScreenImpl(renderArea.get(), buffer, regionSampling, grayscale, isProtected,
|
||||
- attachGainmap, captureResults, displayState, layers);
|
||||
+ attachGainmap, captureResults, displayState, layers, layerFEs);
|
||||
|
||||
if (captureListener) {
|
||||
// Defer blocking on renderFuture back to the Binder thread.
|
||||
@@ -7670,10 +7678,10 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
|
||||
const RenderArea* renderArea, const std::shared_ptr<renderengine::ExternalTexture>& buffer,
|
||||
bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap,
|
||||
ScreenCaptureResults& captureResults, std::optional<OutputCompositionState>& displayState,
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) {
|
||||
+ std::vector<std::pair<Layer*, sp<LayerFE>>>& layers, std::vector<sp<LayerFE>>& layerFEs) {
|
||||
SFTRACE_CALL();
|
||||
|
||||
- for (auto& [_, layerFE] : layers) {
|
||||
+ for (auto& layerFE : layerFEs) {
|
||||
frontend::LayerSnapshot* snapshot = layerFE->mSnapshot.get();
|
||||
captureResults.capturedSecureLayers |= (snapshot->isVisible && snapshot->isSecure);
|
||||
captureResults.capturedHdrLayers |= isHdrLayer(*snapshot);
|
||||
@@ -7732,32 +7740,29 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
|
||||
captureResults.buffer = capturedBuffer->getBuffer();
|
||||
|
||||
ui::LayerStack layerStack{ui::DEFAULT_LAYER_STACK};
|
||||
- if (!layers.empty()) {
|
||||
- const sp<LayerFE>& layerFE = layers.back().second;
|
||||
+ if (!layerFEs.empty()) {
|
||||
+ const sp<LayerFE>& layerFE = layerFEs.back();
|
||||
layerStack = layerFE->getCompositionState()->outputFilter.layerStack;
|
||||
}
|
||||
|
||||
+ auto copyLayerFEs = [&layerFEs]() {
|
||||
+ std::vector<sp<compositionengine::LayerFE>> ceLayerFEs;
|
||||
+ ceLayerFEs.reserve(layerFEs.size());
|
||||
+ for (const auto& layerFE : layerFEs) {
|
||||
+ ceLayerFEs.push_back(layerFE);
|
||||
+ }
|
||||
+ return ceLayerFEs;
|
||||
+ };
|
||||
+
|
||||
auto present = [this, buffer = capturedBuffer, dataspace = captureResults.capturedDataspace,
|
||||
sdrWhitePointNits, displayBrightnessNits, grayscale, isProtected,
|
||||
- layers = std::move(layers), layerStack, regionSampling,
|
||||
+ layerFEs = copyLayerFEs(), layerStack, regionSampling,
|
||||
renderArea = std::move(renderArea), renderIntent,
|
||||
enableLocalTonemapping]() -> FenceResult {
|
||||
std::unique_ptr<compositionengine::CompositionEngine> compositionEngine =
|
||||
mFactory.createCompositionEngine();
|
||||
compositionEngine->setRenderEngine(mRenderEngine.get());
|
||||
|
||||
- std::vector<sp<compositionengine::LayerFE>> layerFEs;
|
||||
- layerFEs.reserve(layers.size());
|
||||
- for (auto& [layer, layerFE] : layers) {
|
||||
- // Release fences were not yet added for non-threaded render engine. To avoid
|
||||
- // deadlocks between main thread and binder threads waiting for the future fence
|
||||
- // result, fences should be added to layers in the same hop onto the main thread.
|
||||
- if (!mRenderEngine->isThreaded()) {
|
||||
- attachReleaseFenceFutureToLayer(layer, layerFE.get(), ui::INVALID_LAYER_STACK);
|
||||
- }
|
||||
- layerFEs.push_back(layerFE);
|
||||
- }
|
||||
-
|
||||
compositionengine::Output::ColorProfile colorProfile{.dataspace = dataspace,
|
||||
.renderIntent = renderIntent};
|
||||
|
||||
@@ -7816,10 +7821,8 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
|
||||
// TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call
|
||||
// to CompositionEngine::present.
|
||||
ftl::SharedFuture<FenceResult> presentFuture;
|
||||
- if (FlagManager::getInstance().single_hop_screenshot()) {
|
||||
- presentFuture = mRenderEngine->isThreaded()
|
||||
- ? ftl::yield(present()).share()
|
||||
- : mScheduler->schedule(std::move(present)).share();
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot() && mRenderEngine->isThreaded()) {
|
||||
+ presentFuture = ftl::yield(present()).share();
|
||||
} else {
|
||||
presentFuture = mRenderEngine->isThreaded() ? ftl::defer(std::move(present)).share()
|
||||
: ftl::yield(present()).share();
|
||||
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
|
||||
index 835cb572b4..1df78acbf9 100644
|
||||
--- a/services/surfaceflinger/SurfaceFlinger.h
|
||||
+++ b/services/surfaceflinger/SurfaceFlinger.h
|
||||
@@ -861,14 +861,13 @@ private:
|
||||
void attachReleaseFenceFutureToLayer(Layer* layer, LayerFE* layerFE, ui::LayerStack layerStack);
|
||||
|
||||
// Checks if a protected layer exists in a list of layers.
|
||||
- bool layersHasProtectedLayer(const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const;
|
||||
+ bool layersHasProtectedLayer(const std::vector<sp<LayerFE>>& layers) const;
|
||||
|
||||
using OutputCompositionState = compositionengine::impl::OutputCompositionState;
|
||||
|
||||
std::optional<OutputCompositionState> getSnapshotsFromMainThread(
|
||||
RenderAreaBuilderVariant& renderAreaBuilder,
|
||||
- GetLayerSnapshotsFunction getLayerSnapshotsFn,
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>>& layers);
|
||||
+ GetLayerSnapshotsFunction getLayerSnapshotsFn, std::vector<sp<LayerFE>>& layerFEs);
|
||||
|
||||
void captureScreenCommon(RenderAreaBuilderVariant, GetLayerSnapshotsFunction,
|
||||
ui::Size bufferSize, ui::PixelFormat, bool allowProtected,
|
||||
@@ -877,13 +876,19 @@ private:
|
||||
std::optional<OutputCompositionState> getDisplayStateFromRenderAreaBuilder(
|
||||
RenderAreaBuilderVariant& renderAreaBuilder) REQUIRES(kMainThreadContext);
|
||||
|
||||
+ // Legacy layer raw pointer is not safe to access outside the main thread.
|
||||
+ // Creates a new vector consisting only of LayerFEs, which can be safely
|
||||
+ // accessed outside the main thread.
|
||||
+ std::vector<sp<LayerFE>> extractLayerFEs(
|
||||
+ const std::vector<std::pair<Layer*, sp<LayerFE>>>& layers) const;
|
||||
+
|
||||
ftl::SharedFuture<FenceResult> captureScreenshot(
|
||||
const RenderAreaBuilderVariant& renderAreaBuilder,
|
||||
const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling,
|
||||
bool grayscale, bool isProtected, bool attachGainmap,
|
||||
const sp<IScreenCaptureListener>& captureListener,
|
||||
std::optional<OutputCompositionState>& displayState,
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>>& layers);
|
||||
+ std::vector<sp<LayerFE>>& layerFEs);
|
||||
|
||||
ftl::SharedFuture<FenceResult> captureScreenshotLegacy(
|
||||
RenderAreaBuilderVariant, GetLayerSnapshotsFunction,
|
||||
@@ -895,7 +900,8 @@ private:
|
||||
const RenderArea*, const std::shared_ptr<renderengine::ExternalTexture>&,
|
||||
bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap,
|
||||
ScreenCaptureResults&, std::optional<OutputCompositionState>& displayState,
|
||||
- std::vector<std::pair<Layer*, sp<LayerFE>>>& layers);
|
||||
+ std::vector<std::pair<Layer*, sp<LayerFE>>>& layers,
|
||||
+ std::vector<sp<LayerFE>>& layerFEs);
|
||||
|
||||
void readPersistentProperties();
|
||||
|
||||
diff --git a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
|
||||
index fd8bc0d22d..2ba739b462 100644
|
||||
--- a/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
|
||||
+++ b/services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h
|
||||
@@ -472,11 +472,12 @@ public:
|
||||
ScreenCaptureResults captureResults;
|
||||
auto displayState = std::optional{display->getCompositionDisplay()->getState()};
|
||||
auto layers = getLayerSnapshotsFn();
|
||||
+ auto layerFEs = mFlinger->extractLayerFEs(layers);
|
||||
|
||||
return mFlinger->renderScreenImpl(renderArea.get(), buffer, regionSampling,
|
||||
false /* grayscale */, false /* isProtected */,
|
||||
false /* attachGainmap */, captureResults, displayState,
|
||||
- layers);
|
||||
+ layers, layerFEs);
|
||||
}
|
||||
|
||||
auto getLayerSnapshotsForScreenshotsFn(ui::LayerStack layerStack, uint32_t uid) {
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,755 +0,0 @@
|
|||
From c2edb476e76d96dc48ed0f5b46367d1b0137e8b7 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 13:24:30 -0400
|
||||
Subject: [PATCH 6/7] Revert "Remove release fence flags"
|
||||
|
||||
This reverts commit 0077fde3aba6f2bde4e878f88c0dd466350fc1b1.
|
||||
|
||||
Change-Id: I04eb5f0a45cc63e55b6b74f2327d182cd9f15098
|
||||
---
|
||||
.../src/CompositionEngine.cpp | 32 +++--
|
||||
.../CompositionEngine/src/Output.cpp | 15 +-
|
||||
.../tests/CompositionEngineTest.cpp | 5 +
|
||||
.../CompositionEngine/tests/OutputTest.cpp | 134 ++++++++++++++++++
|
||||
services/surfaceflinger/Layer.cpp | 59 +++++++-
|
||||
services/surfaceflinger/Layer.h | 16 +++
|
||||
services/surfaceflinger/LayerFE.cpp | 4 +-
|
||||
.../surfaceflinger/RegionSamplingThread.cpp | 2 +-
|
||||
services/surfaceflinger/SurfaceFlinger.cpp | 123 +++++++++++-----
|
||||
.../TransactionCallbackInvoker.cpp | 11 +-
|
||||
.../TransactionCallbackInvoker.h | 1 +
|
||||
.../surfaceflinger/common/FlagManager.cpp | 4 +
|
||||
.../common/include/common/FlagManager.h | 2 +
|
||||
.../tests/TransactionTestHarnesses.h | 15 +-
|
||||
14 files changed, 364 insertions(+), 59 deletions(-)
|
||||
|
||||
diff --git a/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp b/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
|
||||
index cfcce473a2..5c5d0cd74d 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
|
||||
+++ b/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
|
||||
@@ -198,23 +198,25 @@ void CompositionEngine::preComposition(CompositionRefreshArgs& args) {
|
||||
// these buffers and fire a NO_FENCE to release it. This ensures that all
|
||||
// promises for buffer releases are fulfilled at the end of composition.
|
||||
void CompositionEngine::postComposition(CompositionRefreshArgs& args) {
|
||||
- SFTRACE_CALL();
|
||||
- ALOGV(__FUNCTION__);
|
||||
-
|
||||
- for (auto& layerFE : args.layers) {
|
||||
- if (layerFE->getReleaseFencePromiseStatus() ==
|
||||
- LayerFE::ReleaseFencePromiseStatus::INITIALIZED) {
|
||||
- layerFE->setReleaseFence(Fence::NO_FENCE);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ SFTRACE_CALL();
|
||||
+ ALOGV(__FUNCTION__);
|
||||
+
|
||||
+ for (auto& layerFE : args.layers) {
|
||||
+ if (layerFE->getReleaseFencePromiseStatus() ==
|
||||
+ LayerFE::ReleaseFencePromiseStatus::INITIALIZED) {
|
||||
+ layerFE->setReleaseFence(Fence::NO_FENCE);
|
||||
+ }
|
||||
}
|
||||
- }
|
||||
|
||||
- // List of layersWithQueuedFrames does not necessarily overlap with
|
||||
- // list of layers, so those layersWithQueuedFrames also need any
|
||||
- // unfulfilled promises to be resolved for completeness.
|
||||
- for (auto& layerFE : args.layersWithQueuedFrames) {
|
||||
- if (layerFE->getReleaseFencePromiseStatus() ==
|
||||
- LayerFE::ReleaseFencePromiseStatus::INITIALIZED) {
|
||||
- layerFE->setReleaseFence(Fence::NO_FENCE);
|
||||
+ // List of layersWithQueuedFrames does not necessarily overlap with
|
||||
+ // list of layers, so those layersWithQueuedFrames also need any
|
||||
+ // unfulfilled promises to be resolved for completeness.
|
||||
+ for (auto& layerFE : args.layersWithQueuedFrames) {
|
||||
+ if (layerFE->getReleaseFencePromiseStatus() ==
|
||||
+ LayerFE::ReleaseFencePromiseStatus::INITIALIZED) {
|
||||
+ layerFE->setReleaseFence(Fence::NO_FENCE);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
|
||||
index f9ed92d1ee..34773de107 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
|
||||
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
|
||||
@@ -1664,7 +1664,13 @@ void Output::presentFrameAndReleaseLayers(bool flushEvenWhenDisabled) {
|
||||
releaseFence =
|
||||
Fence::merge("LayerRelease", releaseFence, frame.clientTargetAcquireFence);
|
||||
}
|
||||
- layer->getLayerFE().setReleaseFence(releaseFence);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ layer->getLayerFE().setReleaseFence(releaseFence);
|
||||
+ } else {
|
||||
+ layer->getLayerFE()
|
||||
+ .onLayerDisplayed(ftl::yield<FenceResult>(std::move(releaseFence)).share(),
|
||||
+ outputState.layerFilter.layerStack);
|
||||
+ }
|
||||
}
|
||||
|
||||
// We've got a list of layers needing fences, that are disjoint with
|
||||
@@ -1672,7 +1678,12 @@ void Output::presentFrameAndReleaseLayers(bool flushEvenWhenDisabled) {
|
||||
// supply them with the present fence.
|
||||
for (auto& weakLayer : mReleasedLayers) {
|
||||
if (const auto layer = weakLayer.promote()) {
|
||||
- layer->setReleaseFence(frame.presentFence);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ layer->setReleaseFence(frame.presentFence);
|
||||
+ } else {
|
||||
+ layer->onLayerDisplayed(ftl::yield<FenceResult>(frame.presentFence).share(),
|
||||
+ outputState.layerFilter.layerStack);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/services/surfaceflinger/CompositionEngine/tests/CompositionEngineTest.cpp b/services/surfaceflinger/CompositionEngine/tests/CompositionEngineTest.cpp
|
||||
index 3e0c390a5d..deb90deaf7 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/tests/CompositionEngineTest.cpp
|
||||
+++ b/services/surfaceflinger/CompositionEngine/tests/CompositionEngineTest.cpp
|
||||
@@ -29,6 +29,8 @@
|
||||
#include "TimeStats/TimeStats.h"
|
||||
#include "mock/DisplayHardware/MockHWComposer.h"
|
||||
|
||||
+#include <variant>
|
||||
+
|
||||
using namespace com::android::graphics::surfaceflinger;
|
||||
|
||||
namespace android::compositionengine {
|
||||
@@ -491,6 +493,9 @@ struct CompositionEnginePostCompositionTest : public CompositionEngineTest {
|
||||
};
|
||||
|
||||
TEST_F(CompositionEnginePostCompositionTest, postCompositionReleasesAllFences) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, true);
|
||||
+ ASSERT_TRUE(FlagManager::getInstance().ce_fence_promise());
|
||||
+
|
||||
EXPECT_CALL(*mLayer1FE, getReleaseFencePromiseStatus)
|
||||
.WillOnce(Return(LayerFE::ReleaseFencePromiseStatus::FULFILLED));
|
||||
EXPECT_CALL(*mLayer2FE, getReleaseFencePromiseStatus)
|
||||
diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
|
||||
index 442b603ca0..eb7f0ddc37 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
|
||||
+++ b/services/surfaceflinger/CompositionEngine/tests/OutputTest.cpp
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <ui/Rect.h>
|
||||
#include <ui/Region.h>
|
||||
|
||||
+#include <cmath>
|
||||
#include <cstdint>
|
||||
#include <variant>
|
||||
|
||||
@@ -3289,9 +3290,57 @@ TEST_F(OutputPostFramebufferTest, ifEnabledMustFlipThenPresentThenSendPresentCom
|
||||
mOutput.presentFrameAndReleaseLayers(kFlushEvenWhenDisabled);
|
||||
}
|
||||
|
||||
+TEST_F(OutputPostFramebufferTest, releaseFencesAreSentToLayerFE) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, false);
|
||||
+ ASSERT_FALSE(FlagManager::getInstance().ce_fence_promise());
|
||||
+ // Simulate getting release fences from each layer, and ensure they are passed to the
|
||||
+ // front-end layer interface for each layer correctly.
|
||||
+
|
||||
+ mOutput.mState.isEnabled = true;
|
||||
+
|
||||
+ // Create three unique fence instances
|
||||
+ sp<Fence> layer1Fence = sp<Fence>::make();
|
||||
+ sp<Fence> layer2Fence = sp<Fence>::make();
|
||||
+ sp<Fence> layer3Fence = sp<Fence>::make();
|
||||
+
|
||||
+ Output::FrameFences frameFences;
|
||||
+ frameFences.layerFences.emplace(&mLayer1.hwc2Layer, layer1Fence);
|
||||
+ frameFences.layerFences.emplace(&mLayer2.hwc2Layer, layer2Fence);
|
||||
+ frameFences.layerFences.emplace(&mLayer3.hwc2Layer, layer3Fence);
|
||||
+
|
||||
+ EXPECT_CALL(mOutput, presentFrame()).WillOnce(Return(frameFences));
|
||||
+ EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
|
||||
+
|
||||
+ // Compare the pointers values of each fence to make sure the correct ones
|
||||
+ // are passed. This happens to work with the current implementation, but
|
||||
+ // would not survive certain calls like Fence::merge() which would return a
|
||||
+ // new instance.
|
||||
+ EXPECT_CALL(*mLayer1.layerFE, onLayerDisplayed(_, _))
|
||||
+ .WillOnce([&layer1Fence](ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack) {
|
||||
+ EXPECT_EQ(FenceResult(layer1Fence), futureFenceResult.get());
|
||||
+ });
|
||||
+ EXPECT_CALL(*mLayer2.layerFE, onLayerDisplayed(_, _))
|
||||
+ .WillOnce([&layer2Fence](ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack) {
|
||||
+ EXPECT_EQ(FenceResult(layer2Fence), futureFenceResult.get());
|
||||
+ });
|
||||
+ EXPECT_CALL(*mLayer3.layerFE, onLayerDisplayed(_, _))
|
||||
+ .WillOnce([&layer3Fence](ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack) {
|
||||
+ EXPECT_EQ(FenceResult(layer3Fence), futureFenceResult.get());
|
||||
+ });
|
||||
+
|
||||
+ constexpr bool kFlushEvenWhenDisabled = false;
|
||||
+ mOutput.presentFrameAndReleaseLayers(kFlushEvenWhenDisabled);
|
||||
+}
|
||||
+
|
||||
TEST_F(OutputPostFramebufferTest, releaseFencesAreSetInLayerFE) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, true);
|
||||
+ ASSERT_TRUE(FlagManager::getInstance().ce_fence_promise());
|
||||
// Simulate getting release fences from each layer, and ensure they are passed to the
|
||||
// front-end layer interface for each layer correctly.
|
||||
+
|
||||
mOutput.mState.isEnabled = true;
|
||||
|
||||
// Create three unique fence instances
|
||||
@@ -3328,7 +3377,37 @@ TEST_F(OutputPostFramebufferTest, releaseFencesAreSetInLayerFE) {
|
||||
mOutput.presentFrameAndReleaseLayers(kFlushEvenWhenDisabled);
|
||||
}
|
||||
|
||||
+TEST_F(OutputPostFramebufferTest, releaseFencesIncludeClientTargetAcquireFence) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, false);
|
||||
+ ASSERT_FALSE(FlagManager::getInstance().ce_fence_promise());
|
||||
+
|
||||
+ mOutput.mState.isEnabled = true;
|
||||
+ mOutput.mState.usesClientComposition = true;
|
||||
+
|
||||
+ Output::FrameFences frameFences;
|
||||
+ frameFences.clientTargetAcquireFence = sp<Fence>::make();
|
||||
+ frameFences.layerFences.emplace(&mLayer1.hwc2Layer, sp<Fence>::make());
|
||||
+ frameFences.layerFences.emplace(&mLayer2.hwc2Layer, sp<Fence>::make());
|
||||
+ frameFences.layerFences.emplace(&mLayer3.hwc2Layer, sp<Fence>::make());
|
||||
+
|
||||
+ EXPECT_CALL(mOutput, presentFrame()).WillOnce(Return(frameFences));
|
||||
+ EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
|
||||
+
|
||||
+ // Fence::merge is called, and since none of the fences are actually valid,
|
||||
+ // Fence::NO_FENCE is returned and passed to each onLayerDisplayed() call.
|
||||
+ // This is the best we can do without creating a real kernel fence object.
|
||||
+ EXPECT_CALL(*mLayer1.layerFE, onLayerDisplayed).WillOnce(Return());
|
||||
+ EXPECT_CALL(*mLayer2.layerFE, onLayerDisplayed).WillOnce(Return());
|
||||
+ EXPECT_CALL(*mLayer3.layerFE, onLayerDisplayed).WillOnce(Return());
|
||||
+
|
||||
+ constexpr bool kFlushEvenWhenDisabled = false;
|
||||
+ mOutput.presentFrameAndReleaseLayers(kFlushEvenWhenDisabled);
|
||||
+}
|
||||
+
|
||||
TEST_F(OutputPostFramebufferTest, setReleaseFencesIncludeClientTargetAcquireFence) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, true);
|
||||
+ ASSERT_TRUE(FlagManager::getInstance().ce_fence_promise());
|
||||
+
|
||||
mOutput.mState.isEnabled = true;
|
||||
mOutput.mState.usesClientComposition = true;
|
||||
|
||||
@@ -3351,7 +3430,62 @@ TEST_F(OutputPostFramebufferTest, setReleaseFencesIncludeClientTargetAcquireFenc
|
||||
mOutput.presentFrameAndReleaseLayers(kFlushEvenWhenDisabled);
|
||||
}
|
||||
|
||||
+TEST_F(OutputPostFramebufferTest, releasedLayersSentPresentFence) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, false);
|
||||
+ ASSERT_FALSE(FlagManager::getInstance().ce_fence_promise());
|
||||
+
|
||||
+ mOutput.mState.isEnabled = true;
|
||||
+ mOutput.mState.usesClientComposition = true;
|
||||
+
|
||||
+ // This should happen even if there are no (current) output layers.
|
||||
+ EXPECT_CALL(mOutput, getOutputLayerCount()).WillOnce(Return(0u));
|
||||
+
|
||||
+ // Load up the released layers with some mock instances
|
||||
+ sp<StrictMock<mock::LayerFE>> releasedLayer1 = sp<StrictMock<mock::LayerFE>>::make();
|
||||
+ sp<StrictMock<mock::LayerFE>> releasedLayer2 = sp<StrictMock<mock::LayerFE>>::make();
|
||||
+ sp<StrictMock<mock::LayerFE>> releasedLayer3 = sp<StrictMock<mock::LayerFE>>::make();
|
||||
+ Output::ReleasedLayers layers;
|
||||
+ layers.push_back(releasedLayer1);
|
||||
+ layers.push_back(releasedLayer2);
|
||||
+ layers.push_back(releasedLayer3);
|
||||
+ mOutput.setReleasedLayers(std::move(layers));
|
||||
+
|
||||
+ // Set up a fake present fence
|
||||
+ sp<Fence> presentFence = sp<Fence>::make();
|
||||
+ Output::FrameFences frameFences;
|
||||
+ frameFences.presentFence = presentFence;
|
||||
+
|
||||
+ EXPECT_CALL(mOutput, presentFrame()).WillOnce(Return(frameFences));
|
||||
+ EXPECT_CALL(*mRenderSurface, onPresentDisplayCompleted());
|
||||
+
|
||||
+ // Each released layer should be given the presentFence.
|
||||
+ EXPECT_CALL(*releasedLayer1, onLayerDisplayed(_, _))
|
||||
+ .WillOnce([&presentFence](ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack) {
|
||||
+ EXPECT_EQ(FenceResult(presentFence), futureFenceResult.get());
|
||||
+ });
|
||||
+ EXPECT_CALL(*releasedLayer2, onLayerDisplayed(_, _))
|
||||
+ .WillOnce([&presentFence](ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack) {
|
||||
+ EXPECT_EQ(FenceResult(presentFence), futureFenceResult.get());
|
||||
+ });
|
||||
+ EXPECT_CALL(*releasedLayer3, onLayerDisplayed(_, _))
|
||||
+ .WillOnce([&presentFence](ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack) {
|
||||
+ EXPECT_EQ(FenceResult(presentFence), futureFenceResult.get());
|
||||
+ });
|
||||
+
|
||||
+ constexpr bool kFlushEvenWhenDisabled = false;
|
||||
+ mOutput.presentFrameAndReleaseLayers(kFlushEvenWhenDisabled);
|
||||
+
|
||||
+ // After the call the list of released layers should have been cleared.
|
||||
+ EXPECT_TRUE(mOutput.getReleasedLayersForTest().empty());
|
||||
+}
|
||||
+
|
||||
TEST_F(OutputPostFramebufferTest, setReleasedLayersSentPresentFence) {
|
||||
+ SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::ce_fence_promise, true);
|
||||
+ ASSERT_TRUE(FlagManager::getInstance().ce_fence_promise());
|
||||
+
|
||||
mOutput.mState.isEnabled = true;
|
||||
mOutput.mState.usesClientComposition = true;
|
||||
|
||||
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
|
||||
index 195461f47e..a8e60f1632 100644
|
||||
--- a/services/surfaceflinger/Layer.cpp
|
||||
+++ b/services/surfaceflinger/Layer.cpp
|
||||
@@ -805,6 +805,54 @@ void Layer::prepareReleaseCallbacks(ftl::Future<FenceResult> futureFenceResult,
|
||||
}
|
||||
}
|
||||
|
||||
+void Layer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack layerStack,
|
||||
+ std::function<FenceResult(FenceResult)>&& continuation) {
|
||||
+ sp<CallbackHandle> ch = findCallbackHandle();
|
||||
+
|
||||
+ if (!FlagManager::getInstance().screenshot_fence_preservation() && continuation) {
|
||||
+ futureFenceResult = ftl::Future(futureFenceResult).then(std::move(continuation)).share();
|
||||
+ }
|
||||
+
|
||||
+ if (ch != nullptr) {
|
||||
+ ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
|
||||
+ ch->previousSharedReleaseFences.emplace_back(std::move(futureFenceResult));
|
||||
+ ch->name = mName;
|
||||
+ } else if (FlagManager::getInstance().screenshot_fence_preservation()) {
|
||||
+ // If we didn't get a release callback yet, e.g. some scenarios when capturing screenshots
|
||||
+ // asynchronously, then make sure we don't drop the fence.
|
||||
+ mPreviousReleaseFenceAndContinuations.emplace_back(std::move(futureFenceResult),
|
||||
+ std::move(continuation));
|
||||
+ std::vector<FenceAndContinuation> mergedFences;
|
||||
+ sp<Fence> prevFence = nullptr;
|
||||
+ // For a layer that's frequently screenshotted, try to merge fences to make sure we don't
|
||||
+ // grow unbounded.
|
||||
+ for (const auto& futureAndContinuation : mPreviousReleaseFenceAndContinuations) {
|
||||
+ auto result = futureAndContinuation.future.wait_for(0s);
|
||||
+ if (result != std::future_status::ready) {
|
||||
+ mergedFences.emplace_back(futureAndContinuation);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ mergeFence(getDebugName(),
|
||||
+ futureAndContinuation.chain().get().value_or(Fence::NO_FENCE), prevFence);
|
||||
+ }
|
||||
+ if (prevFence != nullptr) {
|
||||
+ mergedFences.emplace_back(ftl::yield(FenceResult(std::move(prevFence))).share());
|
||||
+ }
|
||||
+
|
||||
+ mPreviousReleaseFenceAndContinuations.swap(mergedFences);
|
||||
+ }
|
||||
+
|
||||
+ if (mBufferInfo.mBuffer) {
|
||||
+ mPreviouslyPresentedLayerStacks.push_back(layerStack);
|
||||
+ }
|
||||
+
|
||||
+ if (mDrawingState.frameNumber > 0) {
|
||||
+ mDrawingState.previousFrameNumber = mDrawingState.frameNumber;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
|
||||
for (const auto& handle : mDrawingState.callbackHandles) {
|
||||
handle->bufferReleaseChannel = mBufferReleaseChannel;
|
||||
@@ -1117,13 +1165,22 @@ bool Layer::setTransactionCompletedListeners(const std::vector<sp<CallbackHandle
|
||||
handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence;
|
||||
handle->frameNumber = mDrawingState.frameNumber;
|
||||
handle->previousFrameNumber = mDrawingState.previousFrameNumber;
|
||||
- if (mPreviousReleaseBufferEndpoint == handle->listener) {
|
||||
+ if (FlagManager::getInstance().ce_fence_promise() &&
|
||||
+ mPreviousReleaseBufferEndpoint == handle->listener) {
|
||||
// Add fence from previous screenshot now so that it can be dispatched to the
|
||||
// client.
|
||||
for (auto& [_, future] : mAdditionalPreviousReleaseFences) {
|
||||
handle->previousReleaseFences.emplace_back(std::move(future));
|
||||
}
|
||||
mAdditionalPreviousReleaseFences.clear();
|
||||
+ } else if (FlagManager::getInstance().screenshot_fence_preservation() &&
|
||||
+ mPreviousReleaseBufferEndpoint == handle->listener) {
|
||||
+ // Add fences from previous screenshots now so that they can be dispatched to the
|
||||
+ // client.
|
||||
+ for (const auto& futureAndContinution : mPreviousReleaseFenceAndContinuations) {
|
||||
+ handle->previousSharedReleaseFences.emplace_back(futureAndContinution.chain());
|
||||
+ }
|
||||
+ mPreviousReleaseFenceAndContinuations.clear();
|
||||
}
|
||||
// Store so latched time and release fence can be set
|
||||
mDrawingState.callbackHandles.push_back(handle);
|
||||
diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h
|
||||
index c234a75693..c4ffe1ef2d 100644
|
||||
--- a/services/surfaceflinger/Layer.h
|
||||
+++ b/services/surfaceflinger/Layer.h
|
||||
@@ -261,6 +261,8 @@ public:
|
||||
|
||||
bool fenceHasSignaled() const;
|
||||
void onPreComposition(nsecs_t refreshStartTime);
|
||||
+ void onLayerDisplayed(ftl::SharedFuture<FenceResult>, ui::LayerStack layerStack,
|
||||
+ std::function<FenceResult(FenceResult)>&& continuation = nullptr);
|
||||
|
||||
// Tracks mLastClientCompositionFence and gets the callback handle for this layer.
|
||||
sp<CallbackHandle> findCallbackHandle();
|
||||
@@ -389,6 +391,20 @@ public:
|
||||
// from the layer.
|
||||
std::vector<ui::LayerStack> mPreviouslyPresentedLayerStacks;
|
||||
|
||||
+ struct FenceAndContinuation {
|
||||
+ ftl::SharedFuture<FenceResult> future;
|
||||
+ std::function<FenceResult(FenceResult)> continuation;
|
||||
+
|
||||
+ ftl::SharedFuture<FenceResult> chain() const {
|
||||
+ if (continuation) {
|
||||
+ return ftl::Future(future).then(continuation).share();
|
||||
+ } else {
|
||||
+ return future;
|
||||
+ }
|
||||
+ }
|
||||
+ };
|
||||
+ std::vector<FenceAndContinuation> mPreviousReleaseFenceAndContinuations;
|
||||
+
|
||||
// Release fences for buffers that have not yet received a release
|
||||
// callback. A release callback may not be given when capturing
|
||||
// screenshots asynchronously. There may be no buffer update for the
|
||||
diff --git a/services/surfaceflinger/LayerFE.cpp b/services/surfaceflinger/LayerFE.cpp
|
||||
index fea7671af2..de64b271f5 100644
|
||||
--- a/services/surfaceflinger/LayerFE.cpp
|
||||
+++ b/services/surfaceflinger/LayerFE.cpp
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include "LayerFE.h"
|
||||
#include "SurfaceFlinger.h"
|
||||
+#include "common/FlagManager.h"
|
||||
#include "ui/FenceResult.h"
|
||||
|
||||
namespace android {
|
||||
@@ -82,7 +83,8 @@ LayerFE::~LayerFE() {
|
||||
// Ensures that no promise is left unfulfilled before the LayerFE is destroyed.
|
||||
// An unfulfilled promise could occur when a screenshot is attempted, but the
|
||||
// render area is invalid and there is no memory for the capture result.
|
||||
- if (mReleaseFencePromiseStatus == ReleaseFencePromiseStatus::INITIALIZED) {
|
||||
+ if (FlagManager::getInstance().ce_fence_promise() &&
|
||||
+ mReleaseFencePromiseStatus == ReleaseFencePromiseStatus::INITIALIZED) {
|
||||
setReleaseFence(Fence::NO_FENCE);
|
||||
}
|
||||
}
|
||||
diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
index 011fd9e20a..06c2f26a6d 100644
|
||||
--- a/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
+++ b/services/surfaceflinger/RegionSamplingThread.cpp
|
||||
@@ -355,7 +355,7 @@ void RegionSamplingThread::captureSample() {
|
||||
|
||||
FenceResult fenceResult;
|
||||
if (FlagManager::getInstance().single_hop_screenshot() &&
|
||||
- mFlinger.mRenderEngine->isThreaded()) {
|
||||
+ FlagManager::getInstance().ce_fence_promise() && mFlinger.mRenderEngine->isThreaded()) {
|
||||
std::vector<sp<LayerFE>> layerFEs;
|
||||
auto displayState = mFlinger.getSnapshotsFromMainThread(renderAreaBuilder,
|
||||
getLayerSnapshotsFn, layerFEs);
|
||||
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
index 067a8bafe0..47a3c2c2bf 100644
|
||||
--- a/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
|
||||
@@ -2820,6 +2820,16 @@ CompositeResultsPerDisplay SurfaceFlinger::composite(
|
||||
compositionengine::Feature::kSnapshotLayerMetadata);
|
||||
|
||||
refreshArgs.bufferIdsToUncache = std::move(mBufferIdsToUncache);
|
||||
+
|
||||
+ if (!FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
|
||||
+ for (auto& [layer, _] : mLayersWithQueuedFrames) {
|
||||
+ if (const auto& layerFE = layer->getCompositionEngineLayerFE(
|
||||
+ {static_cast<uint32_t>(layer->sequence)}))
|
||||
+ refreshArgs.layersWithQueuedFrames.push_back(layerFE);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
refreshArgs.outputColorSetting = mDisplayColorSetting;
|
||||
refreshArgs.forceOutputColorMode = mForceColorMode;
|
||||
|
||||
@@ -2883,38 +2893,54 @@ CompositeResultsPerDisplay SurfaceFlinger::composite(
|
||||
layer->onPreComposition(refreshArgs.refreshStartTime);
|
||||
}
|
||||
|
||||
- for (auto& [layer, layerFE] : layers) {
|
||||
- attachReleaseFenceFutureToLayer(layer, layerFE,
|
||||
- layerFE->mSnapshot->outputFilter.layerStack);
|
||||
- }
|
||||
-
|
||||
- refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
|
||||
- for (auto& [layer, _] : mLayersWithQueuedFrames) {
|
||||
- if (const auto& layerFE =
|
||||
- layer->getCompositionEngineLayerFE({static_cast<uint32_t>(layer->sequence)})) {
|
||||
- refreshArgs.layersWithQueuedFrames.push_back(layerFE);
|
||||
- // Some layers are not displayed and do not yet have a future release fence
|
||||
- if (layerFE->getReleaseFencePromiseStatus() ==
|
||||
- LayerFE::ReleaseFencePromiseStatus::UNINITIALIZED ||
|
||||
- layerFE->getReleaseFencePromiseStatus() ==
|
||||
- LayerFE::ReleaseFencePromiseStatus::FULFILLED) {
|
||||
- // layerStack is invalid because layer is not on a display
|
||||
- attachReleaseFenceFutureToLayer(layer.get(), layerFE.get(),
|
||||
- ui::INVALID_LAYER_STACK);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ for (auto& [layer, layerFE] : layers) {
|
||||
+ attachReleaseFenceFutureToLayer(layer, layerFE,
|
||||
+ layerFE->mSnapshot->outputFilter.layerStack);
|
||||
+ }
|
||||
+
|
||||
+ refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
|
||||
+ for (auto& [layer, _] : mLayersWithQueuedFrames) {
|
||||
+ if (const auto& layerFE = layer->getCompositionEngineLayerFE(
|
||||
+ {static_cast<uint32_t>(layer->sequence)})) {
|
||||
+ refreshArgs.layersWithQueuedFrames.push_back(layerFE);
|
||||
+ // Some layers are not displayed and do not yet have a future release fence
|
||||
+ if (layerFE->getReleaseFencePromiseStatus() ==
|
||||
+ LayerFE::ReleaseFencePromiseStatus::UNINITIALIZED ||
|
||||
+ layerFE->getReleaseFencePromiseStatus() ==
|
||||
+ LayerFE::ReleaseFencePromiseStatus::FULFILLED) {
|
||||
+ // layerStack is invalid because layer is not on a display
|
||||
+ attachReleaseFenceFutureToLayer(layer.get(), layerFE.get(),
|
||||
+ ui::INVALID_LAYER_STACK);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
- }
|
||||
|
||||
- mCompositionEngine->present(refreshArgs);
|
||||
- moveSnapshotsFromCompositionArgs(refreshArgs, layers);
|
||||
+ mCompositionEngine->present(refreshArgs);
|
||||
+ moveSnapshotsFromCompositionArgs(refreshArgs, layers);
|
||||
|
||||
- for (auto& [layer, layerFE] : layers) {
|
||||
- CompositionResult compositionResult{layerFE->stealCompositionResult()};
|
||||
- if (compositionResult.lastClientCompositionFence) {
|
||||
- layer->setWasClientComposed(compositionResult.lastClientCompositionFence);
|
||||
+ for (auto& [layer, layerFE] : layers) {
|
||||
+ CompositionResult compositionResult{layerFE->stealCompositionResult()};
|
||||
+ if (compositionResult.lastClientCompositionFence) {
|
||||
+ layer->setWasClientComposed(compositionResult.lastClientCompositionFence);
|
||||
+ }
|
||||
}
|
||||
- if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
|
||||
- mActivePictureUpdater.onLayerComposed(*layer, *layerFE, compositionResult);
|
||||
+
|
||||
+ } else {
|
||||
+ mCompositionEngine->present(refreshArgs);
|
||||
+ moveSnapshotsFromCompositionArgs(refreshArgs, layers);
|
||||
+
|
||||
+ for (auto [layer, layerFE] : layers) {
|
||||
+ CompositionResult compositionResult{layerFE->stealCompositionResult()};
|
||||
+ for (auto& [releaseFence, layerStack] : compositionResult.releaseFences) {
|
||||
+ layer->onLayerDisplayed(std::move(releaseFence), layerStack);
|
||||
+ }
|
||||
+ if (compositionResult.lastClientCompositionFence) {
|
||||
+ layer->setWasClientComposed(compositionResult.lastClientCompositionFence);
|
||||
+ }
|
||||
+ if (com_android_graphics_libgui_flags_apply_picture_profiles()) {
|
||||
+ mActivePictureUpdater.onLayerComposed(*layer, *layerFE, compositionResult);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3196,8 +3222,13 @@ void SurfaceFlinger::onCompositionPresented(PhysicalDisplayId pacesetterId,
|
||||
auto optDisplay = layerStackToDisplay.get(layerStack);
|
||||
if (optDisplay && !optDisplay->get()->isVirtual()) {
|
||||
auto fence = getHwComposer().getPresentFence(optDisplay->get()->getPhysicalId());
|
||||
- layer->prepareReleaseCallbacks(ftl::yield<FenceResult>(fence),
|
||||
- ui::INVALID_LAYER_STACK);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ layer->prepareReleaseCallbacks(ftl::yield<FenceResult>(fence),
|
||||
+ ui::INVALID_LAYER_STACK);
|
||||
+ } else {
|
||||
+ layer->onLayerDisplayed(ftl::yield<FenceResult>(fence).share(),
|
||||
+ ui::INVALID_LAYER_STACK);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
layer->releasePendingBuffer(presentTime.ns());
|
||||
@@ -7382,7 +7413,8 @@ void SurfaceFlinger::captureScreenCommon(RenderAreaBuilderVariant renderAreaBuil
|
||||
return;
|
||||
}
|
||||
|
||||
- if (FlagManager::getInstance().single_hop_screenshot() && mRenderEngine->isThreaded()) {
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot() &&
|
||||
+ FlagManager::getInstance().ce_fence_promise() && mRenderEngine->isThreaded()) {
|
||||
std::vector<sp<LayerFE>> layerFEs;
|
||||
auto displayState =
|
||||
getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layerFEs);
|
||||
@@ -7623,8 +7655,10 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenshotLegacy(
|
||||
auto takeScreenshotFn = [=, this, renderAreaBuilder = std::move(renderAreaBuilder)]() REQUIRES(
|
||||
kMainThreadContext) mutable -> ftl::SharedFuture<FenceResult> {
|
||||
auto layers = getLayerSnapshotsFn();
|
||||
- for (auto& [layer, layerFE] : layers) {
|
||||
- attachReleaseFenceFutureToLayer(layer, layerFE.get(), ui::INVALID_LAYER_STACK);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ for (auto& [layer, layerFE] : layers) {
|
||||
+ attachReleaseFenceFutureToLayer(layer, layerFE.get(), ui::INVALID_LAYER_STACK);
|
||||
+ }
|
||||
}
|
||||
auto displayState = getDisplayStateFromRenderAreaBuilder(renderAreaBuilder);
|
||||
|
||||
@@ -7821,13 +7855,36 @@ ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
|
||||
// TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call
|
||||
// to CompositionEngine::present.
|
||||
ftl::SharedFuture<FenceResult> presentFuture;
|
||||
- if (FlagManager::getInstance().single_hop_screenshot() && mRenderEngine->isThreaded()) {
|
||||
+ if (FlagManager::getInstance().single_hop_screenshot() &&
|
||||
+ FlagManager::getInstance().ce_fence_promise() && mRenderEngine->isThreaded()) {
|
||||
presentFuture = ftl::yield(present()).share();
|
||||
} else {
|
||||
presentFuture = mRenderEngine->isThreaded() ? ftl::defer(std::move(present)).share()
|
||||
: ftl::yield(present()).share();
|
||||
}
|
||||
|
||||
+ if (!FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ for (auto& [layer, layerFE] : layers) {
|
||||
+ layer->onLayerDisplayed(presentFuture, ui::INVALID_LAYER_STACK,
|
||||
+ [layerFE = std::move(layerFE)](FenceResult) {
|
||||
+ if (FlagManager::getInstance()
|
||||
+ .screenshot_fence_preservation()) {
|
||||
+ const auto compositionResult =
|
||||
+ layerFE->stealCompositionResult();
|
||||
+ const auto& fences = compositionResult.releaseFences;
|
||||
+ // CompositionEngine may choose to cull layers that
|
||||
+ // aren't visible, so pass a non-fence.
|
||||
+ return fences.empty() ? Fence::NO_FENCE
|
||||
+ : fences.back().first.get();
|
||||
+ } else {
|
||||
+ return layerFE->stealCompositionResult()
|
||||
+ .releaseFences.back()
|
||||
+ .first.get();
|
||||
+ }
|
||||
+ });
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return presentFuture;
|
||||
}
|
||||
|
||||
diff --git a/services/surfaceflinger/TransactionCallbackInvoker.cpp b/services/surfaceflinger/TransactionCallbackInvoker.cpp
|
||||
index b22ec66819..cc79acbbf5 100644
|
||||
--- a/services/surfaceflinger/TransactionCallbackInvoker.cpp
|
||||
+++ b/services/surfaceflinger/TransactionCallbackInvoker.cpp
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "Utils/FenceUtils.h"
|
||||
|
||||
#include <binder/IInterface.h>
|
||||
+#include <common/FlagManager.h>
|
||||
#include <common/trace.h>
|
||||
#include <utils/RefBase.h>
|
||||
|
||||
@@ -126,8 +127,14 @@ status_t TransactionCallbackInvoker::addCallbackHandle(const sp<CallbackHandle>&
|
||||
if (surfaceControl) {
|
||||
sp<Fence> prevFence = nullptr;
|
||||
|
||||
- for (auto& future : handle->previousReleaseFences) {
|
||||
- mergeFence(handle->name.c_str(), future.get().value_or(Fence::NO_FENCE), prevFence);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ for (auto& future : handle->previousReleaseFences) {
|
||||
+ mergeFence(handle->name.c_str(), future.get().value_or(Fence::NO_FENCE), prevFence);
|
||||
+ }
|
||||
+ } else {
|
||||
+ for (const auto& future : handle->previousSharedReleaseFences) {
|
||||
+ mergeFence(handle->name.c_str(), future.get().value_or(Fence::NO_FENCE), prevFence);
|
||||
+ }
|
||||
}
|
||||
|
||||
handle->previousReleaseFence = prevFence;
|
||||
diff --git a/services/surfaceflinger/TransactionCallbackInvoker.h b/services/surfaceflinger/TransactionCallbackInvoker.h
|
||||
index 178ddbbe79..9c7bb0d588 100644
|
||||
--- a/services/surfaceflinger/TransactionCallbackInvoker.h
|
||||
+++ b/services/surfaceflinger/TransactionCallbackInvoker.h
|
||||
@@ -43,6 +43,7 @@ public:
|
||||
std::string name;
|
||||
sp<Fence> previousReleaseFence;
|
||||
std::vector<ftl::Future<FenceResult>> previousReleaseFences;
|
||||
+ std::vector<ftl::SharedFuture<FenceResult>> previousSharedReleaseFences;
|
||||
std::variant<nsecs_t, sp<Fence>> acquireTimeOrFence = -1;
|
||||
nsecs_t latchTime = -1;
|
||||
std::optional<uint32_t> transformHint = std::nullopt;
|
||||
diff --git a/services/surfaceflinger/common/FlagManager.cpp b/services/surfaceflinger/common/FlagManager.cpp
|
||||
index 5c417ba748..b86e815b57 100644
|
||||
--- a/services/surfaceflinger/common/FlagManager.cpp
|
||||
+++ b/services/surfaceflinger/common/FlagManager.cpp
|
||||
@@ -167,6 +167,8 @@ void FlagManager::dump(std::string& result) const {
|
||||
DUMP_ACONFIG_FLAG(begone_bright_hlg);
|
||||
DUMP_ACONFIG_FLAG(window_blur_kawase2);
|
||||
DUMP_ACONFIG_FLAG(single_hop_screenshot);
|
||||
+ DUMP_ACONFIG_FLAG(screenshot_fence_preservation);
|
||||
+ DUMP_ACONFIG_FLAG(ce_fence_promise);
|
||||
|
||||
#undef DUMP_ACONFIG_FLAG
|
||||
#undef DUMP_LEGACY_SERVER_FLAG
|
||||
@@ -268,6 +270,8 @@ FLAG_MANAGER_ACONFIG_FLAG(deprecate_frame_tracker, "");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(skip_invisible_windows_in_input, "");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(begone_bright_hlg, "debug.sf.begone_bright_hlg");
|
||||
FLAG_MANAGER_ACONFIG_FLAG(window_blur_kawase2, "");
|
||||
+FLAG_MANAGER_ACONFIG_FLAG(screenshot_fence_preservation, "debug.sf.screenshot_fence_preservation");
|
||||
+FLAG_MANAGER_ACONFIG_FLAG(ce_fence_promise, "");
|
||||
|
||||
/// Trunk stable server (R/W) flags ///
|
||||
FLAG_MANAGER_ACONFIG_FLAG(refresh_rate_overlay_on_external_display, "")
|
||||
diff --git a/services/surfaceflinger/common/include/common/FlagManager.h b/services/surfaceflinger/common/include/common/FlagManager.h
|
||||
index 15284ba0ee..4766f6be38 100644
|
||||
--- a/services/surfaceflinger/common/include/common/FlagManager.h
|
||||
+++ b/services/surfaceflinger/common/include/common/FlagManager.h
|
||||
@@ -74,6 +74,7 @@ public:
|
||||
bool fp16_client_target() const;
|
||||
bool game_default_frame_rate() const;
|
||||
bool enable_layer_command_batching() const;
|
||||
+ bool screenshot_fence_preservation() const;
|
||||
bool vulkan_renderengine() const;
|
||||
bool vrr_bugfix_24q4() const;
|
||||
bool vrr_bugfix_dropped_frame() const;
|
||||
@@ -82,6 +83,7 @@ public:
|
||||
bool dont_skip_on_early_ro() const;
|
||||
bool no_vsyncs_on_screen_off() const;
|
||||
bool protected_if_client() const;
|
||||
+ bool ce_fence_promise() const;
|
||||
bool idle_screen_refresh_rate_timeout() const;
|
||||
bool graphite_renderengine() const;
|
||||
bool filter_frames_before_trace_starts() const;
|
||||
diff --git a/services/surfaceflinger/tests/TransactionTestHarnesses.h b/services/surfaceflinger/tests/TransactionTestHarnesses.h
|
||||
index c95c875746..5899c7e8b6 100644
|
||||
--- a/services/surfaceflinger/tests/TransactionTestHarnesses.h
|
||||
+++ b/services/surfaceflinger/tests/TransactionTestHarnesses.h
|
||||
@@ -17,6 +17,7 @@
|
||||
#define ANDROID_TRANSACTION_TEST_HARNESSES
|
||||
|
||||
#include <com_android_graphics_libgui_flags.h>
|
||||
+#include <common/FlagManager.h>
|
||||
#include <ui/DisplayState.h>
|
||||
|
||||
#include "LayerTransactionTest.h"
|
||||
@@ -95,8 +96,12 @@ public:
|
||||
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
|
||||
t.setDisplayProjection(vDisplay, displayState.orientation,
|
||||
Rect(displayState.layerStackSpaceRect), Rect(resolution));
|
||||
- t.setDisplayLayerStack(vDisplay, layerStack);
|
||||
- t.setLayerStack(mirrorSc, layerStack);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ t.setDisplayLayerStack(vDisplay, layerStack);
|
||||
+ t.setLayerStack(mirrorSc, layerStack);
|
||||
+ } else {
|
||||
+ t.setDisplayLayerStack(vDisplay, ui::DEFAULT_LAYER_STACK);
|
||||
+ }
|
||||
t.apply();
|
||||
SurfaceComposerClient::Transaction().apply(true);
|
||||
|
||||
@@ -116,8 +121,10 @@ public:
|
||||
// CompositionEngine::present may attempt to be called on the same
|
||||
// display multiple times. The layerStack is set to invalid here so
|
||||
// that the display is ignored if that scenario occurs.
|
||||
- t.setLayerStack(mirrorSc, ui::INVALID_LAYER_STACK);
|
||||
- t.apply(true);
|
||||
+ if (FlagManager::getInstance().ce_fence_promise()) {
|
||||
+ t.setLayerStack(mirrorSc, ui::INVALID_LAYER_STACK);
|
||||
+ t.apply(true);
|
||||
+ }
|
||||
SurfaceComposerClient::destroyVirtualDisplay(vDisplay);
|
||||
return sc;
|
||||
}
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
From 76923ab930a6fee15aa477bea3638e09fe7b604a Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 13:25:10 -0400
|
||||
Subject: [PATCH 7/7] Revert "Remove dead code from LayerFE"
|
||||
|
||||
This reverts commit 330571240ff3d44fdbecbe513309d73ba82404e6.
|
||||
|
||||
Change-Id: If3af99ec76a8c595dcd1ea22965f2d126d74a315
|
||||
---
|
||||
.../CompositionEngine/include/compositionengine/LayerFE.h | 3 +++
|
||||
.../include/compositionengine/mock/LayerFE.h | 3 +++
|
||||
services/surfaceflinger/LayerFE.cpp | 6 ++++++
|
||||
services/surfaceflinger/LayerFE.h | 3 +++
|
||||
4 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h
|
||||
index cda4edc216..8199c929e5 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h
|
||||
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h
|
||||
@@ -148,6 +148,9 @@ public:
|
||||
virtual std::optional<LayerSettings> prepareClientComposition(
|
||||
ClientCompositionTargetSettings&) const = 0;
|
||||
|
||||
+ // Called after the layer is displayed to update the presentation fence
|
||||
+ virtual void onLayerDisplayed(ftl::SharedFuture<FenceResult>, ui::LayerStack layerStack) = 0;
|
||||
+
|
||||
// Initializes a promise for a buffer release fence and provides the future for that
|
||||
// fence. This should only be called when a promise has not yet been created, or
|
||||
// after the previous promise has already been fulfilled. Attempting to call this
|
||||
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h
|
||||
index 272fa3eef7..a236ebf180 100644
|
||||
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h
|
||||
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h
|
||||
@@ -50,6 +50,9 @@ public:
|
||||
std::optional<compositionengine::LayerFE::LayerSettings>(
|
||||
compositionengine::LayerFE::ClientCompositionTargetSettings&));
|
||||
|
||||
+ MOCK_METHOD(void, onLayerDisplayed, (ftl::SharedFuture<FenceResult>, ui::LayerStack),
|
||||
+ (override));
|
||||
+
|
||||
MOCK_METHOD0(createReleaseFenceFuture, ftl::Future<FenceResult>());
|
||||
MOCK_METHOD1(setReleaseFence, void(const FenceResult&));
|
||||
MOCK_METHOD0(getReleaseFencePromiseStatus, LayerFE::ReleaseFencePromiseStatus());
|
||||
diff --git a/services/surfaceflinger/LayerFE.cpp b/services/surfaceflinger/LayerFE.cpp
|
||||
index de64b271f5..012aa32c30 100644
|
||||
--- a/services/surfaceflinger/LayerFE.cpp
|
||||
+++ b/services/surfaceflinger/LayerFE.cpp
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "SurfaceFlinger.h"
|
||||
#include "common/FlagManager.h"
|
||||
#include "ui/FenceResult.h"
|
||||
+#include "ui/LayerStack.h"
|
||||
|
||||
namespace android {
|
||||
|
||||
@@ -355,6 +356,11 @@ CompositionResult LayerFE::stealCompositionResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
+void LayerFE::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult,
|
||||
+ ui::LayerStack layerStack) {
|
||||
+ mCompositionResult.releaseFences.emplace_back(std::move(futureFenceResult), layerStack);
|
||||
+}
|
||||
+
|
||||
const char* LayerFE::getDebugName() const {
|
||||
return mName.c_str();
|
||||
}
|
||||
diff --git a/services/surfaceflinger/LayerFE.h b/services/surfaceflinger/LayerFE.h
|
||||
index 9483aebafa..ce6d27a91a 100644
|
||||
--- a/services/surfaceflinger/LayerFE.h
|
||||
+++ b/services/surfaceflinger/LayerFE.h
|
||||
@@ -25,12 +25,14 @@
|
||||
#include "compositionengine/LayerFE.h"
|
||||
#include "compositionengine/LayerFECompositionState.h"
|
||||
#include "renderengine/LayerSettings.h"
|
||||
+#include "ui/LayerStack.h"
|
||||
|
||||
#include <ftl/future.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
struct CompositionResult {
|
||||
+ std::vector<std::pair<ftl::SharedFuture<FenceResult>, ui::LayerStack>> releaseFences;
|
||||
sp<Fence> lastClientCompositionFence = nullptr;
|
||||
bool wasPictureProfileCommitted = false;
|
||||
// TODO(b/337330263): Why does LayerFE coming from SF have a null composition state?
|
||||
@@ -46,6 +48,7 @@ public:
|
||||
// compositionengine::LayerFE overrides
|
||||
const compositionengine::LayerFECompositionState* getCompositionState() const override;
|
||||
bool onPreComposition(bool updatingOutputGeometryThisFrame) override;
|
||||
+ void onLayerDisplayed(ftl::SharedFuture<FenceResult>, ui::LayerStack) override;
|
||||
const char* getDebugName() const override;
|
||||
int32_t getSequence() const override;
|
||||
bool hasRoundedCorners() const override;
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
From 7fc0423bce6be78bf802dcd16e9c3cb2b417c19b Mon Sep 17 00:00:00 2001
|
||||
From 45ee12fd0ac92b5e6a07de927716b8b03c18f1fd 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
|
||||
|
@ -10,10 +10,10 @@ Change-Id: I3dd66d436629d37c8ec795df6569736195ae570e
|
|||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
|
||||
index 217a26f..b687e4b 100644
|
||||
index b5a1168b..547a3a16 100644
|
||||
--- a/src/java/com/android/ims/ImsManager.java
|
||||
+++ b/src/java/com/android/ims/ImsManager.java
|
||||
@@ -1679,6 +1679,14 @@ public class ImsManager implements FeatureUpdates {
|
||||
@@ -1666,6 +1666,14 @@ public class ImsManager implements FeatureUpdates {
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,5 +29,5 @@ index 217a26f..b687e4b 100644
|
|||
* Push configuration updates to the ImsService implementation.
|
||||
*/
|
||||
--
|
||||
2.44.0
|
||||
2.41.0
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
From b172f8039cd27e782a964dc905de2efc6f4d84e4 Mon Sep 17 00:00:00 2001
|
||||
From ab08eec99a802be5014b876823cab89c2d2e9ef6 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 1/4] Reintroduce 'public void
|
||||
|
@ -18,7 +18,7 @@ Co-authored-by: Sarah Vandomelen <sarah@sightworks.com>
|
|||
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 3fdbfe0..fb8011c 100644
|
||||
index 3fdbfe0ed7..fb8011c3df 100644
|
||||
--- a/src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java
|
||||
+++ b/src/java/com/android/internal/telephony/metrics/TelephonyMetrics.java
|
||||
@@ -2320,6 +2320,19 @@ public class TelephonyMetrics {
|
||||
|
@ -42,5 +42,5 @@ index 3fdbfe0..fb8011c 100644
|
|||
* Write Send SMS event using ImsService. Expecting response from
|
||||
* {@link #writeOnSmsSolicitedResponse}.
|
||||
--
|
||||
2.44.0
|
||||
2.43.1
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
From 7dde5cf40fdf6c8c1d968d8baa9af7cc105e3201 Mon Sep 17 00:00:00 2001
|
||||
From ca7d875358b275da98fcd55d583a9121bb68f309 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Mon, 6 Dec 2021 16:28:22 -0500
|
||||
Subject: [PATCH 2/4] Fix baseband being too long to fit into a 91 chars
|
||||
|
@ -10,10 +10,10 @@ Change-Id: I1762e4a8cc137626be89f350229d6be162bdaf57
|
|||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
|
||||
index 5d59327..b5f6509 100644
|
||||
index 620b8711e2..951ef23115 100644
|
||||
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
|
||||
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
|
||||
@@ -3448,7 +3448,7 @@ public class GsmCdmaPhone extends Phone {
|
||||
@@ -3373,7 +3373,7 @@ public class GsmCdmaPhone extends Phone {
|
||||
String version = (String)ar.result;
|
||||
if (version != null) {
|
||||
int length = version.length();
|
||||
|
@ -23,5 +23,5 @@ index 5d59327..b5f6509 100644
|
|||
length <= MAX_VERSION_LEN ? version
|
||||
: version.substring(length - MAX_VERSION_LEN, length));
|
||||
--
|
||||
2.44.0
|
||||
2.43.1
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From 0dd5ea9e9e05b4ef9e01d0c9c6a66a25b321791f Mon Sep 17 00:00:00 2001
|
||||
From 8a28ea8c3ecb378dba2aff1d93e87095d71df873 Mon Sep 17 00:00:00 2001
|
||||
From: ExactExampl <exactxmpl@pixelexperience.org>
|
||||
Date: Tue, 11 Oct 2022 12:38:00 +0300
|
||||
Subject: [PATCH 4/4] Conditionally revert "Block Binder thread until incoming
|
||||
Subject: [PATCH 3/4] Conditionally revert "Block Binder thread until incoming
|
||||
call process completes"
|
||||
|
||||
* Legacy IMS packages handling incoming calls in such a way that
|
||||
|
@ -17,7 +17,7 @@ Change-Id: I55a8f3bbca4a2b9a6bc7511e9fe2d0884a8818e5
|
|||
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
|
||||
index 26b6e18..c6b3355 100644
|
||||
index e95433c2ee..7e4fdf6b41 100644
|
||||
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
|
||||
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java
|
||||
@@ -70,6 +70,7 @@ import android.os.Registrant;
|
||||
|
@ -25,10 +25,10 @@ index 26b6e18..c6b3355 100644
|
|||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
+import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
@@ -390,7 +391,19 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
|
||||
import android.sysprop.TelephonyProperties;
|
||||
@@ -389,7 +390,19 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
|
||||
@Nullable
|
||||
public IImsCallSessionListener onIncomingCall(
|
||||
@NonNull IImsCallSession c, @Nullable String callId, @Nullable Bundle extras) {
|
||||
|
@ -50,5 +50,5 @@ index 26b6e18..c6b3355 100644
|
|||
|
||||
@Override
|
||||
--
|
||||
2.44.0
|
||||
2.43.1
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From f31cd295a7431bdb6c1cc126f32348d7fe84301a Mon Sep 17 00:00:00 2001
|
||||
From d7626b9015a9505c225254dcf36e5472f4c4e4a8 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Mon, 5 Sep 2022 14:02:37 -0400
|
||||
Subject: [PATCH 3/4] SubscriptionController: Do not override default calling
|
||||
Subject: [PATCH 4/4] SubscriptionController: Do not override default calling
|
||||
account from third-party apps
|
||||
|
||||
When the user has selected a calling account from a third-party app as
|
||||
|
@ -18,10 +18,10 @@ Change-Id: Iccab64e9b3b3ab4773bd8944d47c2006f229d472
|
|||
1 file changed, 17 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
|
||||
index 353493b..9857641 100644
|
||||
index a8d05a334b..42310ccc3f 100644
|
||||
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
|
||||
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
|
||||
@@ -86,6 +86,7 @@ import android.util.Base64;
|
||||
@@ -81,6 +81,7 @@ import android.util.Base64;
|
||||
import android.util.EventLog;
|
||||
import android.util.IndentingPrintWriter;
|
||||
import android.util.LocalLog;
|
||||
|
@ -29,7 +29,7 @@ index 353493b..9857641 100644
|
|||
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
@@ -3268,7 +3269,22 @@ public class SubscriptionManagerService extends ISub.Stub {
|
||||
@@ -3023,7 +3024,22 @@ public class SubscriptionManagerService extends ISub.Stub {
|
||||
|
||||
TelecomManager telecomManager = mContext.getSystemService(TelecomManager.class);
|
||||
if (telecomManager != null) {
|
||||
|
@ -54,5 +54,5 @@ index 353493b..9857641 100644
|
|||
|
||||
updateDefaultSubId();
|
||||
--
|
||||
2.44.0
|
||||
2.43.1
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
From 6acc862452fd91732f63afa4a3829d0e249355e0 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 13:55:53 -0400
|
||||
Subject: [PATCH 1/2] Stop using resource processor
|
||||
|
||||
---
|
||||
Android.bp | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 0b368c8e..a2dff379 100644
|
||||
--- a/Android.bp
|
||||
+++ b/Android.bp
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
android_app {
|
||||
name: "org.lineageos.platform-res",
|
||||
+ use_resource_processor: false,
|
||||
sdk_version: "core_platform",
|
||||
certificate: "platform",
|
||||
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
From 6cf57340bf1d906438a112942763c12eb35feb51 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 13:56:06 -0400
|
||||
Subject: [PATCH 2/2] Add spninfo / schema
|
||||
|
||||
---
|
||||
lib/SpnInfo.xsd | 47 +++++++++++++++++++++++++++++++++++++
|
||||
lib/schema/current.txt | 40 +++++++++++++++++++++++++++++++
|
||||
lib/schema/last_current.txt | 0
|
||||
lib/schema/last_removed.txt | 0
|
||||
lib/schema/removed.txt | 1 +
|
||||
5 files changed, 88 insertions(+)
|
||||
create mode 100644 lib/SpnInfo.xsd
|
||||
create mode 100644 lib/schema/current.txt
|
||||
create mode 100644 lib/schema/last_current.txt
|
||||
create mode 100644 lib/schema/last_removed.txt
|
||||
create mode 100644 lib/schema/removed.txt
|
||||
|
||||
diff --git a/lib/SpnInfo.xsd b/lib/SpnInfo.xsd
|
||||
new file mode 100644
|
||||
index 00000000..d30630dc
|
||||
--- /dev/null
|
||||
+++ b/lib/SpnInfo.xsd
|
||||
@@ -0,0 +1,47 @@
|
||||
+<?xml version="1.0" encoding="utf-8"?>
|
||||
+<!--
|
||||
+ ~ Copyright (C) 2021 The Android Open Source Project
|
||||
+ ~
|
||||
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
+ ~ you may not use this file except in compliance with the License.
|
||||
+ ~ You may obtain a copy of the License at
|
||||
+ ~
|
||||
+ ~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
+ ~
|
||||
+ ~ Unless required by applicable law or agreed to in writing, software
|
||||
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
+ ~ See the License for the specific language governing permissions and
|
||||
+ ~ limitations under the License.
|
||||
+ -->
|
||||
+<xs:schema version="2.0"
|
||||
+ elementFormDefault="qualified"
|
||||
+ attributeFormDefault="unqualified"
|
||||
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
+
|
||||
+ <xs:element name="sensitivePNS">
|
||||
+ <xs:complexType>
|
||||
+ <xs:sequence>
|
||||
+ <xs:element name="sensitivePN" maxOccurs="unbounded" type="sensitivePN" />
|
||||
+ </xs:sequence>
|
||||
+ </xs:complexType>
|
||||
+ </xs:element>
|
||||
+
|
||||
+ <xs:complexType name="sensitivePN">
|
||||
+ <xs:sequence>
|
||||
+ <xs:element name="item" maxOccurs="unbounded" type="item" />
|
||||
+ </xs:sequence>
|
||||
+ <xs:attribute name="network" type="xs:string" use="required" />
|
||||
+ </xs:complexType>
|
||||
+
|
||||
+ <xs:complexType name="item">
|
||||
+ <xs:sequence>
|
||||
+ <xs:element name="number" type="xs:string" />
|
||||
+ <xs:element name="name" minOccurs="0" type="xs:string" />
|
||||
+ <xs:element name="categories" minOccurs="0" type="xs:string" />
|
||||
+ <xs:element name="languages" minOccurs="0" type="xs:string" />
|
||||
+ <xs:element name="organization" minOccurs="0" type="xs:string" />
|
||||
+ <xs:element name="website" minOccurs="0" type="xs:anyURI" />
|
||||
+ </xs:sequence>
|
||||
+ </xs:complexType>
|
||||
+</xs:schema>
|
||||
diff --git a/lib/schema/current.txt b/lib/schema/current.txt
|
||||
new file mode 100644
|
||||
index 00000000..13e52c67
|
||||
--- /dev/null
|
||||
+++ b/lib/schema/current.txt
|
||||
@@ -0,0 +1,40 @@
|
||||
+// Signature format: 2.0
|
||||
+package org.lineageos.lib.phone.spn {
|
||||
+
|
||||
+ public class Item {
|
||||
+ ctor public Item();
|
||||
+ method public String getCategories();
|
||||
+ method public String getLanguages();
|
||||
+ method public String getName();
|
||||
+ method public String getNumber();
|
||||
+ method public String getOrganization();
|
||||
+ method public String getWebsite();
|
||||
+ method public void setCategories(String);
|
||||
+ method public void setLanguages(String);
|
||||
+ method public void setName(String);
|
||||
+ method public void setNumber(String);
|
||||
+ method public void setOrganization(String);
|
||||
+ method public void setWebsite(String);
|
||||
+ }
|
||||
+
|
||||
+ public class SensitivePN {
|
||||
+ ctor public SensitivePN();
|
||||
+ method public java.util.List<org.lineageos.lib.phone.spn.Item> getItem();
|
||||
+ method public String getNetwork();
|
||||
+ method public void setNetwork(String);
|
||||
+ }
|
||||
+
|
||||
+ public class SensitivePNS {
|
||||
+ ctor public SensitivePNS();
|
||||
+ method public java.util.List<org.lineageos.lib.phone.spn.SensitivePN> getSensitivePN();
|
||||
+ }
|
||||
+
|
||||
+ public class XmlParser {
|
||||
+ ctor public XmlParser();
|
||||
+ method public static org.lineageos.lib.phone.spn.SensitivePNS read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
|
||||
+ method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
|
||||
+ method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
+
|
||||
diff --git a/lib/schema/last_current.txt b/lib/schema/last_current.txt
|
||||
new file mode 100644
|
||||
index 00000000..e69de29b
|
||||
diff --git a/lib/schema/last_removed.txt b/lib/schema/last_removed.txt
|
||||
new file mode 100644
|
||||
index 00000000..e69de29b
|
||||
diff --git a/lib/schema/removed.txt b/lib/schema/removed.txt
|
||||
new file mode 100644
|
||||
index 00000000..d802177e
|
||||
--- /dev/null
|
||||
+++ b/lib/schema/removed.txt
|
||||
@@ -0,0 +1 @@
|
||||
+// Signature format: 2.0
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
From 4a576ac73698b2232c51a4b6b3c9a21845801136 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 6 Oct 2024 14:22:49 -0400
|
||||
Subject: [PATCH 1/3] Downgrade target_sdk_version to 34 for now
|
||||
|
||||
---
|
||||
Android.bp | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 388f4c00c..498e7c8f0 100644
|
||||
--- a/Android.bp
|
||||
+++ b/Android.bp
|
||||
@@ -207,6 +207,7 @@ android_app {
|
||||
"java/com/android/voicemail/impl/configui/res",
|
||||
"java/com/android/voicemail/impl/res",
|
||||
],
|
||||
+ target_sdk_version: "34",
|
||||
sdk_version: "system_current",
|
||||
srcs: [
|
||||
"java/**/I*.aidl",
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
From 080c04159988f202694f087f442e3e32f18d4625 Mon Sep 17 00:00:00 2001
|
||||
From: Jihoon Kang <jihoonkang@google.com>
|
||||
Date: Fri, 30 Aug 2024 00:29:34 +0000
|
||||
Subject: [PATCH 2/3] Make java_sdk_library dependencies explicit
|
||||
|
||||
modules should specify the submodule of java_sdk_library that the module
|
||||
actually depends on
|
||||
|
||||
Test: CI
|
||||
Bug: 358613520
|
||||
Change-Id: I23a22e9d3dc001a5b061177273d407b01bb77a50
|
||||
---
|
||||
Android.bp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 498e7c8f0..299c1a6e7 100644
|
||||
--- a/Android.bp
|
||||
+++ b/Android.bp
|
||||
@@ -102,7 +102,7 @@ android_app {
|
||||
exclude_srcs: ["java/com/android/dialer/rootcomponentgenerator/*.java"],
|
||||
libs: [
|
||||
"auto_value_annotations",
|
||||
- "org.apache.http.legacy",
|
||||
+ "org.apache.http.legacy.stubs.system",
|
||||
],
|
||||
optimize: {
|
||||
proguard_flags_files: [
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
From fa83fab06f1bd59551b926a224e0cf4cdfcb86da Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sun, 16 Mar 2025 13:51:15 -0400
|
||||
Subject: [PATCH 3/3] Opt-out from the resource processor (for now)
|
||||
|
||||
---
|
||||
Android.bp | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 299c1a6e7..b35b8913e 100644
|
||||
--- a/Android.bp
|
||||
+++ b/Android.bp
|
||||
@@ -9,6 +9,7 @@ package {
|
||||
|
||||
android_app {
|
||||
name: "Dialer",
|
||||
+ use_resource_processor: false,
|
||||
aaptflags: [
|
||||
"--auto-add-overlay",
|
||||
"--extra-packages com.android.contacts.common",
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
From 09d183a632ab5ba6ef0f1f76765fc94ef24035f4 Mon Sep 17 00:00:00 2001
|
||||
From ab27acf28b7e01c2fe9933849eaeb1622f5dfb6a Mon Sep 17 00:00:00 2001
|
||||
From: Danny Lin <danny@kdrag0n.dev>
|
||||
Date: Mon, 11 Oct 2021 20:48:44 -0700
|
||||
Subject: [PATCH 1/3] Expose themed icon setting in ThemePicker
|
||||
|
@ -10,7 +10,7 @@ Change-Id: I44e9288c3de13a3604b7a03857ec400753317d9a
|
|||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
|
||||
index 517bd6d..89291c1 100644
|
||||
index 4f580e0bd6..d5b14e5bb9 100644
|
||||
--- a/AndroidManifest.xml
|
||||
+++ b/AndroidManifest.xml
|
||||
@@ -67,6 +67,9 @@
|
||||
|
@ -24,7 +24,7 @@ index 517bd6d..89291c1 100644
|
|||
|
||||
</application>
|
||||
diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml
|
||||
index 80d8154..813ef75 100644
|
||||
index c6e2d8cb74..1d7405e345 100644
|
||||
--- a/quickstep/AndroidManifest-launcher.xml
|
||||
+++ b/quickstep/AndroidManifest-launcher.xml
|
||||
@@ -65,6 +65,9 @@
|
||||
|
@ -38,5 +38,5 @@ index 80d8154..813ef75 100644
|
|||
|
||||
</application>
|
||||
--
|
||||
2.48.1
|
||||
2.43.1
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From de7b698be0f1e01b337672d919854e3a28b8685f Mon Sep 17 00:00:00 2001
|
||||
From 910c5a085260dfd33a0a2377b03a3c0eeb647cc5 Mon Sep 17 00:00:00 2001
|
||||
From: Luca Stefani <luca.stefani.ge1@gmail.com>
|
||||
Date: Fri, 1 Nov 2019 23:17:59 +0100
|
||||
Subject: [PATCH 3/3] Properly expose GridCustomizationsProvider
|
||||
Subject: [PATCH 2/3] Properly expose GridCustomizationsProvider
|
||||
|
||||
Change-Id: I8268a215257ae0e399c56ac8b44cdfdff8cc92a0
|
||||
---
|
||||
|
@ -9,13 +9,13 @@ Change-Id: I8268a215257ae0e399c56ac8b44cdfdff8cc92a0
|
|||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml
|
||||
index 80d2eac..53bdfff 100644
|
||||
index 7e824ec15c..b87972e0ac 100644
|
||||
--- a/AndroidManifest-common.xml
|
||||
+++ b/AndroidManifest-common.xml
|
||||
@@ -138,7 +138,9 @@
|
||||
<provider
|
||||
android:name="com.android.launcher3.graphics.GridCustomizationsProvider"
|
||||
android:authorities="${applicationId}.grid_control"
|
||||
android:authorities="${packageName}.grid_control"
|
||||
- android:exported="true" />
|
||||
+ android:exported="true"
|
||||
+ android:writePermission="${packageName}.permission.WRITE_SETTINGS"
|
||||
|
@ -24,5 +24,5 @@ index 80d2eac..53bdfff 100644
|
|||
<!--
|
||||
The settings activity. To extend point settings_fragment_name to appropriate fragment class
|
||||
--
|
||||
2.48.1
|
||||
2.43.1
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From c2cafe53a8b6acf97dc9a634ada0d4ab53b5fd9f Mon Sep 17 00:00:00 2001
|
||||
From a87776a7970affcfbf86a8e22d9f109869d0163f Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Fri, 7 Jul 2023 18:13:32 -0400
|
||||
Subject: [PATCH 2/3] Disable QSB in BuildConfig
|
||||
Subject: [PATCH 3/3] Disable QSB in BuildConfig
|
||||
|
||||
Change-Id: I3150ef1d9b8c161ed2a6569d1ae75bba0060b36f
|
||||
---
|
||||
|
@ -9,7 +9,7 @@ Change-Id: I3150ef1d9b8c161ed2a6569d1ae75bba0060b36f
|
|||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src_build_config/com/android/launcher3/BuildConfig.java b/src_build_config/com/android/launcher3/BuildConfig.java
|
||||
index 6d4f56d..2630ec1 100644
|
||||
index 3841969e9d..ae151abe75 100644
|
||||
--- a/src_build_config/com/android/launcher3/BuildConfig.java
|
||||
+++ b/src_build_config/com/android/launcher3/BuildConfig.java
|
||||
@@ -24,7 +24,7 @@ public final class BuildConfig {
|
||||
|
@ -22,5 +22,5 @@ index 6d4f56d..2630ec1 100644
|
|||
/**
|
||||
* Flag to state if the widget on the top of the first screen should be shown.
|
||||
--
|
||||
2.48.1
|
||||
2.43.1
|
||||
|
|
@ -1,12 +1,13 @@
|
|||
From c8463140729b40cca3cb143561d652fa06c6d628 Mon Sep 17 00:00:00 2001
|
||||
From ef5e90c542a7cffcaabfbe76ffc3a6826587ede8 Mon Sep 17 00:00:00 2001
|
||||
From: Oliver Scott <olivercscott@gmail.com>
|
||||
Date: Thu, 8 Jul 2021 10:40:49 -0400
|
||||
Subject: [PATCH 2/2] Global VPN feature [2/2]
|
||||
Subject: [PATCH] Global VPN feature [2/2]
|
||||
|
||||
* Create a global VPN toggle for VPNs in the system user. It is only
|
||||
enabled when no VPN is active in any user.
|
||||
|
||||
Change-Id: If4a552b8f59bc15f53c324afa93a67e086b9c5a9
|
||||
Change-Id: Ic3b79beb635afe03642fce9473bc481239166566
|
||||
Signed-off-by: Mohammad Hasan Keramat J <ikeramat@protonmail.com>
|
||||
---
|
||||
res/values/strings.xml | 6 +++
|
||||
res/xml/vpn_app_management.xml | 6 +++
|
||||
|
@ -14,13 +15,13 @@ Change-Id: If4a552b8f59bc15f53c324afa93a67e086b9c5a9
|
|||
3 files changed, 59 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/res/values/strings.xml b/res/values/strings.xml
|
||||
index 730c258..0feb0f6 100644
|
||||
index ef93ba71132..a83c8de557e 100644
|
||||
--- a/res/values/strings.xml
|
||||
+++ b/res/values/strings.xml
|
||||
@@ -13910,4 +13910,10 @@
|
||||
<string name="search_gesture_feature_title">Circle to Search</string>
|
||||
<!-- Summary text for press and hold nav handle OR home button to invoke Circle to Search. [CHAR LIMIT=NONE] -->
|
||||
<string name="search_gesture_feature_summary">Touch and hold the Home button or the navigation handle to search using the content on your screen.</string>
|
||||
@@ -13017,4 +13017,10 @@
|
||||
|
||||
<!--Text for Stylus Pointer Icon preference -->
|
||||
<string name="show_stylus_pointer_icon">Show pointer while hovering</string>
|
||||
+
|
||||
+ <!-- VPN app management screen, global VPN -->
|
||||
+ <string name="global_vpn_title">Global VPN</string>
|
||||
|
@ -29,7 +30,7 @@ index 730c258..0feb0f6 100644
|
|||
+ <string name="global_vpn_summary_any_vpn_active">You need to disable all active VPN connections first to enable this</string>
|
||||
</resources>
|
||||
diff --git a/res/xml/vpn_app_management.xml b/res/xml/vpn_app_management.xml
|
||||
index dffbbbe..93df378 100644
|
||||
index dffbbbe3116..93df378fd76 100644
|
||||
--- a/res/xml/vpn_app_management.xml
|
||||
+++ b/res/xml/vpn_app_management.xml
|
||||
@@ -23,6 +23,12 @@
|
||||
|
@ -46,7 +47,7 @@ index dffbbbe..93df378 100644
|
|||
android:key="always_on_vpn"
|
||||
android:title="@string/vpn_menu_lockdown"
|
||||
diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java
|
||||
index 00c8f59..c4f447f 100644
|
||||
index 00c8f5994ce..c4f447f44fb 100644
|
||||
--- a/src/com/android/settings/vpn2/AppManagementFragment.java
|
||||
+++ b/src/com/android/settings/vpn2/AppManagementFragment.java
|
||||
@@ -27,10 +27,12 @@ import android.content.pm.ApplicationInfo;
|
||||
|
@ -176,5 +177,5 @@ index 00c8f59..c4f447f 100644
|
|||
private static final String TAG = "CannotConnect";
|
||||
private static final String ARG_VPN_LABEL = "label";
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
From bc50b3024c266f307ce804ef1887062cf1f34944 Mon Sep 17 00:00:00 2001
|
||||
From 51bbaa3c11244498aec37e305716eaaa08c9fa5f Mon Sep 17 00:00:00 2001
|
||||
From: Luca Stefani <luca.stefani.ge1@gmail.com>
|
||||
Date: Fri, 1 Nov 2019 21:14:29 +0100
|
||||
Subject: [PATCH 1/4] Add wallpaper privapp whitelist
|
||||
|
@ -11,10 +11,10 @@ Change-Id: I044b1d9201ac0b8780fc37a387f401f3dd0ddeac
|
|||
create mode 100644 privapp_whitelist_com.android.wallpaper.xml
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 58e6413..40e2241 100644
|
||||
index 8676f26c..a61ee790 100644
|
||||
--- a/Android.bp
|
||||
+++ b/Android.bp
|
||||
@@ -140,6 +140,15 @@ android_app {
|
||||
@@ -133,6 +133,15 @@ android_app {
|
||||
platform_apis: true,
|
||||
manifest: "AndroidManifest.xml",
|
||||
additional_manifests: [":WallpaperPicker2_Manifest"],
|
||||
|
@ -32,7 +32,7 @@ index 58e6413..40e2241 100644
|
|||
+}
|
||||
diff --git a/privapp_whitelist_com.android.wallpaper.xml b/privapp_whitelist_com.android.wallpaper.xml
|
||||
new file mode 100644
|
||||
index 0000000..e3f3b65
|
||||
index 00000000..e3f3b658
|
||||
--- /dev/null
|
||||
+++ b/privapp_whitelist_com.android.wallpaper.xml
|
||||
@@ -0,0 +1,24 @@
|
||||
|
@ -61,5 +61,5 @@ index 0000000..e3f3b65
|
|||
+ </privapp-permissions>
|
||||
+</permissions>
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
From b255f705538f7e55d445c60c1a12f60dd309df1d Mon Sep 17 00:00:00 2001
|
||||
From cc2bdac1523f69e04f4e9e919e6f9aa6056cfd01 Mon Sep 17 00:00:00 2001
|
||||
From: LuK1337 <priv.luk@gmail.com>
|
||||
Date: Tue, 15 Sep 2020 03:27:19 +0200
|
||||
Subject: [PATCH 2/4] Add wallpaper default permissions
|
||||
|
@ -11,10 +11,10 @@ Change-Id: If43a594da31fbab9280ce45b049737f6c534b620
|
|||
create mode 100644 default_permissions_com.android.wallpaper.xml
|
||||
|
||||
diff --git a/Android.bp b/Android.bp
|
||||
index 40e2241..614739a 100644
|
||||
index a61ee790..c07b2ee1 100644
|
||||
--- a/Android.bp
|
||||
+++ b/Android.bp
|
||||
@@ -140,7 +140,10 @@ android_app {
|
||||
@@ -133,7 +133,10 @@ android_app {
|
||||
platform_apis: true,
|
||||
manifest: "AndroidManifest.xml",
|
||||
additional_manifests: [":WallpaperPicker2_Manifest"],
|
||||
|
@ -26,7 +26,7 @@ index 40e2241..614739a 100644
|
|||
overrides: ["WallpaperPicker", "WallpaperPicker2"],
|
||||
static_libs: ["ThemePickerApplicationLib"],
|
||||
}
|
||||
@@ -152,3 +155,11 @@ prebuilt_etc_xml {
|
||||
@@ -145,3 +148,11 @@ prebuilt_etc_xml {
|
||||
filename_from_src: true,
|
||||
sub_dir: "permissions",
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ index 40e2241..614739a 100644
|
|||
+}
|
||||
diff --git a/default_permissions_com.android.wallpaper.xml b/default_permissions_com.android.wallpaper.xml
|
||||
new file mode 100644
|
||||
index 0000000..41b23ce
|
||||
index 00000000..41b23ce1
|
||||
--- /dev/null
|
||||
+++ b/default_permissions_com.android.wallpaper.xml
|
||||
@@ -0,0 +1,37 @@
|
||||
|
@ -82,5 +82,5 @@ index 0000000..41b23ce
|
|||
+ </exception>
|
||||
+</exceptions>
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
From 623014b94ae4bb08328684bb077b05973ab858eb Mon Sep 17 00:00:00 2001
|
||||
From c6f2fb731c84223bb5790241d5d901908f40f2ca Mon Sep 17 00:00:00 2001
|
||||
From: Luca Stefani <luca.stefani.ge1@gmail.com>
|
||||
Date: Fri, 1 Nov 2019 23:17:08 +0100
|
||||
Subject: [PATCH 3/4] Specify we read and write launcher settings
|
||||
|
@ -9,7 +9,7 @@ Change-Id: Ifc8196588443b007602118389ca76d34ab531f14
|
|||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
|
||||
index f89ff6e..95f5b0e 100755
|
||||
index 6e5844de..555d3b63 100755
|
||||
--- a/AndroidManifest.xml
|
||||
+++ b/AndroidManifest.xml
|
||||
@@ -60,6 +60,9 @@
|
||||
|
@ -23,5 +23,5 @@ index f89ff6e..95f5b0e 100755
|
|||
tools:replace="android:icon,android:name"
|
||||
android:extractNativeLibs="false"
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
From 5880006d7be5eeb3fff8a6d9154ae16e2e6ffac7 Mon Sep 17 00:00:00 2001
|
||||
From cb6fbb5ce4555504bb2bf317a694f52a1c2dcd6a Mon Sep 17 00:00:00 2001
|
||||
From: Danny Lin <danny@kdrag0n.dev>
|
||||
Date: Tue, 5 Oct 2021 22:40:58 -0700
|
||||
Subject: [PATCH 4/4] Add permission for launcher preview rendering
|
||||
|
@ -10,7 +10,7 @@ Change-Id: Ie707dcd98161e8f5993b0504295fddc3f395cd20
|
|||
2 files changed, 2 insertions(+)
|
||||
|
||||
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
|
||||
index 95f5b0e..8c55499 100755
|
||||
index 555d3b63..02fa70f1 100755
|
||||
--- a/AndroidManifest.xml
|
||||
+++ b/AndroidManifest.xml
|
||||
@@ -13,6 +13,7 @@
|
||||
|
@ -22,7 +22,7 @@ index 95f5b0e..8c55499 100755
|
|||
<uses-permission android:name="android.permission.MODIFY_DAY_NIGHT_MODE" />
|
||||
<uses-permission android:name="android.permission.CUSTOMIZE_SYSTEM_UI" />
|
||||
diff --git a/privapp_whitelist_com.android.wallpaper.xml b/privapp_whitelist_com.android.wallpaper.xml
|
||||
index e3f3b65..47133be 100644
|
||||
index e3f3b658..47133be8 100644
|
||||
--- a/privapp_whitelist_com.android.wallpaper.xml
|
||||
+++ b/privapp_whitelist_com.android.wallpaper.xml
|
||||
@@ -20,5 +20,6 @@
|
||||
|
@ -33,5 +33,5 @@ index e3f3b65..47133be 100644
|
|||
</privapp-permissions>
|
||||
</permissions>
|
||||
--
|
||||
2.48.1
|
||||
2.44.0
|
||||
|
||||
|
|
|
@ -1,192 +0,0 @@
|
|||
From 73a87c7bcc594cc3da4b9c2394cda066d36bb557 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Wed, 24 Aug 2022 15:45:18 -0400
|
||||
Subject: [PATCH 1/2] audio_hal_interface: Optionally use sysbta HAL
|
||||
|
||||
Required to support sysbta, our system-side bt audio implementation.
|
||||
|
||||
Change-Id: I59973e6ec84c5923be8a7c67b36b2e237f000860
|
||||
---
|
||||
.../aidl/a2dp/client_interface_aidl.cc | 8 ++++----
|
||||
.../aidl/a2dp/client_interface_aidl.h | 7 +++++++
|
||||
.../audio_hal_interface/aidl/client_interface_aidl.cc | 8 ++++----
|
||||
.../audio_hal_interface/aidl/client_interface_aidl.h | 7 +++++++
|
||||
system/audio_hal_interface/hal_version_manager.cc | 11 +++++++++--
|
||||
5 files changed, 31 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.cc b/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.cc
|
||||
index f022ec3ea2..283beb22fa 100644
|
||||
--- a/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.cc
|
||||
+++ b/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.cc
|
||||
@@ -58,7 +58,7 @@ BluetoothAudioClientInterface::~BluetoothAudioClientInterface() {
|
||||
bool BluetoothAudioClientInterface::IsValid() const { return provider_ != nullptr; }
|
||||
|
||||
bool BluetoothAudioClientInterface::is_aidl_available() {
|
||||
- return AServiceManager_isDeclared(kDefaultAudioProviderFactoryInterface.c_str());
|
||||
+ return AServiceManager_isDeclared(audioProviderFactoryInterface().c_str());
|
||||
}
|
||||
|
||||
std::vector<AudioCapabilities> BluetoothAudioClientInterface::GetAudioCapabilities() const {
|
||||
@@ -72,7 +72,7 @@ std::vector<AudioCapabilities> BluetoothAudioClientInterface::GetAudioCapabiliti
|
||||
return capabilities;
|
||||
}
|
||||
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
log::error("can't get capability from unknown factory");
|
||||
@@ -97,7 +97,7 @@ BluetoothAudioClientInterface::GetProviderInfo(
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
}
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
@@ -173,7 +173,7 @@ void BluetoothAudioClientInterface::FetchAudioProvider() {
|
||||
// re-registered, so we need to re-fetch the service.
|
||||
for (int retry_no = 0; retry_no < kFetchAudioProviderRetryNumber; ++retry_no) {
|
||||
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
log::error("can't get capability from unknown factory");
|
||||
diff --git a/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.h b/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.h
|
||||
index a45ff946f2..4c99832e1b 100644
|
||||
--- a/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.h
|
||||
+++ b/system/audio_hal_interface/aidl/a2dp/client_interface_aidl.h
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "bta/le_audio/broadcaster/broadcaster_types.h"
|
||||
#include "bta/le_audio/le_audio_types.h"
|
||||
#include "transport_instance.h"
|
||||
+#include "osi/include/properties.h"
|
||||
|
||||
// Keep after audio_aidl_interfaces.h because of <base/logging.h>
|
||||
// conflicting definitions.
|
||||
@@ -156,6 +157,12 @@ protected:
|
||||
// "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/aidl/client_interface_aidl.cc b/system/audio_hal_interface/aidl/client_interface_aidl.cc
|
||||
index 176b355eeb..9d8ddd2cac 100644
|
||||
--- a/system/audio_hal_interface/aidl/client_interface_aidl.cc
|
||||
+++ b/system/audio_hal_interface/aidl/client_interface_aidl.cc
|
||||
@@ -69,7 +69,7 @@ BluetoothAudioClientInterface::BluetoothAudioClientInterface(IBluetoothTransport
|
||||
bool BluetoothAudioClientInterface::IsValid() const { return provider_ != nullptr; }
|
||||
|
||||
bool BluetoothAudioClientInterface::is_aidl_available() {
|
||||
- return AServiceManager_isDeclared(kDefaultAudioProviderFactoryInterface.c_str());
|
||||
+ return AServiceManager_isDeclared(audioProviderFactoryInterface().c_str());
|
||||
}
|
||||
|
||||
std::vector<AudioCapabilities> BluetoothAudioClientInterface::GetAudioCapabilities() const {
|
||||
@@ -83,7 +83,7 @@ std::vector<AudioCapabilities> BluetoothAudioClientInterface::GetAudioCapabiliti
|
||||
return capabilities;
|
||||
}
|
||||
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
log::error("can't get capability from unknown factory");
|
||||
@@ -108,7 +108,7 @@ BluetoothAudioClientInterface::GetProviderInfo(
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
}
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
@@ -140,7 +140,7 @@ void BluetoothAudioClientInterface::FetchAudioProvider() {
|
||||
// re-registered, so we need to re-fetch the service.
|
||||
for (int retry_no = 0; retry_no < kFetchAudioProviderRetryNumber; ++retry_no) {
|
||||
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
log::error("can't get capability 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 a3c60384ab..ee5901e32a 100644
|
||||
--- a/system/audio_hal_interface/aidl/client_interface_aidl.h
|
||||
+++ b/system/audio_hal_interface/aidl/client_interface_aidl.h
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "bta/le_audio/broadcaster/broadcaster_types.h"
|
||||
#include "bta/le_audio/le_audio_types.h"
|
||||
#include "transport_instance.h"
|
||||
+#include "osi/include/properties.h"
|
||||
|
||||
namespace bluetooth {
|
||||
namespace audio {
|
||||
@@ -150,6 +151,12 @@ protected:
|
||||
// "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 f9843df858..3931bc6a8d 100644
|
||||
--- a/system/audio_hal_interface/hal_version_manager.cc
|
||||
+++ b/system/audio_hal_interface/hal_version_manager.cc
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <android/hidl/manager/1.2/IServiceManager.h>
|
||||
#include <bluetooth/log.h>
|
||||
#include <hidl/ServiceManagement.h>
|
||||
+#include "osi/include/properties.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
@@ -32,6 +33,12 @@ using ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProviderFactor
|
||||
|
||||
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::string toString(BluetoothAudioHalTransport transport) {
|
||||
switch (transport) {
|
||||
@@ -72,7 +79,7 @@ BluetoothAudioHalVersion GetAidlInterfaceVersion() {
|
||||
static auto aidl_version = []() -> BluetoothAudioHalVersion {
|
||||
int version = 0;
|
||||
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder(
|
||||
- AServiceManager_waitForService(kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ AServiceManager_waitForService(audioProviderFactoryInterface().c_str())));
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
log::error("getInterfaceVersion: Can't get aidl version from unknown factory");
|
||||
@@ -137,7 +144,7 @@ android::sp<IBluetoothAudioProvidersFactory_2_0> HalVersionManager::GetProviders
|
||||
|
||||
HalVersionManager::HalVersionManager() {
|
||||
hal_transport_ = BluetoothAudioHalTransport::UNKNOWN;
|
||||
- if (AServiceManager_checkService(kDefaultAudioProviderFactoryInterface.c_str()) != nullptr) {
|
||||
+ if (AServiceManager_checkService(audioProviderFactoryInterface().c_str()) != nullptr) {
|
||||
hal_version_ = GetAidlInterfaceVersion();
|
||||
hal_transport_ = BluetoothAudioHalTransport::AIDL;
|
||||
return;
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
From a4c4caca86ecfe7f0dfce67fc479f9777be26410 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Wed, 24 Aug 2022 10:41:29 -0400
|
||||
Subject: [PATCH 1/2] gd: hci: Ignore unexpected status events
|
||||
|
||||
For some reason, on some old devices, the controller will report a
|
||||
remote to support SNIFF_SUBRATING even when it does not. Just ignore the
|
||||
error here (the status event comes from the failure response).
|
||||
|
||||
Change-Id: Ifb9a65fd77f21d15a8dc1ced9240194d38218ef6
|
||||
---
|
||||
system/gd/hci/hci_layer.cc | 15 +++++++--------
|
||||
1 file changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/system/gd/hci/hci_layer.cc b/system/gd/hci/hci_layer.cc
|
||||
index 5ae661cb75..d91bb1480d 100644
|
||||
--- a/system/gd/hci/hci_layer.cc
|
||||
+++ b/system/gd/hci/hci_layer.cc
|
||||
@@ -218,14 +218,13 @@ struct HciLayer::impl {
|
||||
command_queue_.front().GetCallback<CommandCompleteView>()->Invoke(
|
||||
std::move(command_complete_view));
|
||||
} else {
|
||||
- ASSERT_LOG(
|
||||
- command_queue_.front().waiting_for_status_ == is_status,
|
||||
- "0x%02hx (%s) was not expecting %s event",
|
||||
- op_code,
|
||||
- OpCodeText(op_code).c_str(),
|
||||
- logging_id.c_str());
|
||||
-
|
||||
- command_queue_.front().GetCallback<TResponse>()->Invoke(std::move(response_view));
|
||||
+ if (command_queue_.front().waiting_for_status_ == is_status) {
|
||||
+ command_queue_.front().GetCallback<TResponse>()->Invoke(std::move(response_view));
|
||||
+ } else {
|
||||
+ CommandCompleteView command_complete_view = CommandCompleteView::Create(
|
||||
+ EventView::Create(PacketView<kLittleEndian>(std::make_shared<std::vector<uint8_t>>(std::vector<uint8_t>()))));
|
||||
+ command_queue_.front().GetCallback<CommandCompleteView>()->Invoke(std::move(command_complete_view));
|
||||
+ }
|
||||
}
|
||||
|
||||
#ifdef TARGET_FLOSS
|
||||
--
|
||||
2.44.0
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
From 29c09f59e76930a00cefd474c96eb40e63a475f5 Mon Sep 17 00:00:00 2001
|
||||
From: DerTeufel <dominik-kassel@gmx.de>
|
||||
Date: Wed, 4 Jan 2023 21:39:37 +0100
|
||||
Subject: [PATCH 2/2] Don't crash on status:UNSUPPORTED_REMOTE_OR_LMP_FEATURE
|
||||
|
||||
especially 'opcode:0x811 (SNIFF_SUBRATING)' which is the only one I had observed
|
||||
|
||||
Change-Id: Ic57d6631185370cbfdeafdac00801c6ca27fb755
|
||||
---
|
||||
system/gd/hci/hci_layer.cc | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/system/gd/hci/hci_layer.cc b/system/gd/hci/hci_layer.cc
|
||||
index 1311815633..7b913888b2 100644
|
||||
--- a/system/gd/hci/hci_layer.cc
|
||||
+++ b/system/gd/hci/hci_layer.cc
|
||||
@@ -238,8 +238,10 @@ struct HciLayer::impl {
|
||||
using WaitingFor = CommandQueueEntry::WaitingFor;
|
||||
WaitingFor waiting_for = command_queue_.front().waiting_for_;
|
||||
CommandStatusView status_view = CommandStatusView::Create(event);
|
||||
- if (is_vendor_specific && (is_status && waiting_for == WaitingFor::COMPLETE) &&
|
||||
- (status_view.IsValid() && status_view.GetStatus() == ErrorCode::UNKNOWN_HCI_COMMAND)) {
|
||||
+ if ((is_vendor_specific && (is_status && waiting_for == WaitingFor::COMPLETE) &&
|
||||
+ (status_view.IsValid() && status_view.GetStatus() == ErrorCode::UNKNOWN_HCI_COMMAND)) ||
|
||||
+ ((is_status && waiting_for == WaitingFor::COMPLETE) &&
|
||||
+ (status_view.IsValid() && status_view.GetStatus() == ErrorCode::UNSUPPORTED_REMOTE_OR_LMP_FEATURE))) {
|
||||
// If this is a command status of a vendor specific command, and command complete is expected,
|
||||
// we can't treat this as hard failure since we have no way of probing this lack of support at
|
||||
// earlier time. Instead we let the command complete handler handle a empty Command Complete
|
||||
--
|
||||
2.48.1
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
From 16e6571d11f6a2509a496e84e0d08ebae3b39254 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Wed, 24 Aug 2022 15:45:18 -0400
|
||||
Subject: [PATCH 2/2] audio_hal_interface: Optionally use sysbta HAL
|
||||
|
||||
Required to support sysbta, our system-side bt audio implementation.
|
||||
|
||||
Change-Id: I59973e6ec84c5923be8a7c67b36b2e237f000860
|
||||
---
|
||||
.../audio_hal_interface/aidl/client_interface_aidl.cc | 8 ++++----
|
||||
.../audio_hal_interface/aidl/client_interface_aidl.h | 7 +++++++
|
||||
system/audio_hal_interface/hal_version_manager.cc | 11 +++++++++--
|
||||
3 files changed, 20 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/system/audio_hal_interface/aidl/client_interface_aidl.cc b/system/audio_hal_interface/aidl/client_interface_aidl.cc
|
||||
index 76e8788d02..a990422993 100644
|
||||
--- a/system/audio_hal_interface/aidl/client_interface_aidl.cc
|
||||
+++ b/system/audio_hal_interface/aidl/client_interface_aidl.cc
|
||||
@@ -63,7 +63,7 @@ BluetoothAudioClientInterface::BluetoothAudioClientInterface(
|
||||
|
||||
bool BluetoothAudioClientInterface::is_aidl_available() {
|
||||
return AServiceManager_isDeclared(
|
||||
- kDefaultAudioProviderFactoryInterface.c_str());
|
||||
+ audioProviderFactoryInterface().c_str());
|
||||
}
|
||||
|
||||
std::vector<AudioCapabilities>
|
||||
@@ -79,7 +79,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";
|
||||
@@ -108,7 +108,7 @@ BluetoothAudioClientInterface::GetProviderInfo(
|
||||
if (provider_factory == nullptr) {
|
||||
provider_factory = IBluetoothAudioProviderFactory::fromBinder(
|
||||
::ndk::SpAIBinder(AServiceManager_waitForService(
|
||||
- kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ audioProviderFactoryInterface().c_str())));
|
||||
}
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
@@ -192,7 +192,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";
|
||||
diff --git a/system/audio_hal_interface/aidl/client_interface_aidl.h b/system/audio_hal_interface/aidl/client_interface_aidl.h
|
||||
index c191e4054e..99d5192376 100644
|
||||
--- a/system/audio_hal_interface/aidl/client_interface_aidl.h
|
||||
+++ b/system/audio_hal_interface/aidl/client_interface_aidl.h
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "audio_ctrl_ack.h"
|
||||
#include "bluetooth_audio_port_impl.h"
|
||||
#include "transport_instance.h"
|
||||
+#include "osi/include/properties.h"
|
||||
|
||||
#define BLUETOOTH_AUDIO_HAL_PROP_DISABLED \
|
||||
"persist.bluetooth.bluetooth_audio_hal.disabled"
|
||||
@@ -175,6 +176,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 36672cb32c..d2b75e7891 100644
|
||||
--- a/system/audio_hal_interface/hal_version_manager.cc
|
||||
+++ b/system/audio_hal_interface/hal_version_manager.cc
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "aidl/audio_aidl_interfaces.h"
|
||||
#include "include/check.h"
|
||||
#include "os/log.h"
|
||||
+#include "osi/include/properties.h"
|
||||
|
||||
namespace bluetooth {
|
||||
namespace audio {
|
||||
@@ -35,6 +36,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::string toString(BluetoothAudioHalTransport transport) {
|
||||
switch (transport) {
|
||||
@@ -76,7 +83,7 @@ BluetoothAudioHalVersion GetAidlInterfaceVersion() {
|
||||
int version = 0;
|
||||
auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(
|
||||
::ndk::SpAIBinder(AServiceManager_waitForService(
|
||||
- kDefaultAudioProviderFactoryInterface.c_str())));
|
||||
+ audioProviderFactoryInterface().c_str())));
|
||||
|
||||
if (provider_factory == nullptr) {
|
||||
LOG_ERROR(
|
||||
@@ -146,7 +153,7 @@ HalVersionManager::GetProvidersFactory_2_0() {
|
||||
HalVersionManager::HalVersionManager() {
|
||||
hal_transport_ = BluetoothAudioHalTransport::UNKNOWN;
|
||||
if (AServiceManager_checkService(
|
||||
- kDefaultAudioProviderFactoryInterface.c_str()) != nullptr) {
|
||||
+ audioProviderFactoryInterface().c_str()) != nullptr) {
|
||||
hal_version_ = GetAidlInterfaceVersion();
|
||||
hal_transport_ = BluetoothAudioHalTransport::AIDL;
|
||||
return;
|
||||
--
|
||||
2.44.0
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
From c632ab2581f8dbff4381aba8fd94979e71edc356 Mon Sep 17 00:00:00 2001
|
||||
From 7c61a53d73e8ac2903653d92fdd2aad8e38ffad3 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Cai <peter@typeblog.net>
|
||||
Date: Sat, 16 Mar 2024 15:27:27 -0400
|
||||
Subject: [PATCH] Revert "drop support for V gsi on pixel 5 R base kernel"
|
||||
|
@ -9,10 +9,10 @@ This reverts commit bbbd18a71368a80f689b924dcf82062c2ee351b2.
|
|||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
|
||||
index c0082bb..619f4a3 100644
|
||||
index c125bd6479..787ef8fd69 100644
|
||||
--- a/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
|
||||
+++ b/service/jni/com_android_server_connectivity_ClatCoordinator.cpp
|
||||
@@ -91,6 +91,11 @@ static void verifyPerms(const char * const path,
|
||||
@@ -90,6 +90,11 @@ static void verifyPerms(const char * const path,
|
||||
|
||||
#undef ALOGF
|
||||
|
||||
|
@ -24,7 +24,7 @@ index c0082bb..619f4a3 100644
|
|||
static const char* kClatdDir = "/apex/com.android.tethering/bin/for-system";
|
||||
static const char* kClatdBin = "/apex/com.android.tethering/bin/for-system/clatd";
|
||||
|
||||
@@ -132,6 +137,14 @@ static void verifyClatPerms() {
|
||||
@@ -130,6 +135,14 @@ static void verifyClatPerms() {
|
||||
|
||||
#undef V2
|
||||
|
||||
|
@ -40,5 +40,5 @@ index c0082bb..619f4a3 100644
|
|||
}
|
||||
|
||||
--
|
||||
2.44.0
|
||||
2.43.1
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
From f1bdfa28ee093ca4db697560ccd4b1e4b24be937 Mon Sep 17 00:00:00 2001
|
||||
From 5452f9228873c2e00897aeb74e8b453d939d2e4c Mon Sep 17 00:00:00 2001
|
||||
From: Isaac Chen <tingyi364@gmail.com>
|
||||
Date: Wed, 23 Jun 2021 13:07:30 +0800
|
||||
Subject: [PATCH 2/2] init: Do not start console service when debuggable
|
||||
Subject: [PATCH 1/2] 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.
|
||||
|
@ -13,19 +13,19 @@ Change-Id: I34cfd6b42d3b9aee4b3e63181480cfb8b1255f29
|
|||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/rootdir/init.rc b/rootdir/init.rc
|
||||
index 1acd637..c3d963f 100644
|
||||
index 8a2ed9fac..960534805 100644
|
||||
--- a/rootdir/init.rc
|
||||
+++ b/rootdir/init.rc
|
||||
@@ -1355,9 +1355,6 @@ on property:ro.debuggable=1
|
||||
@@ -1306,9 +1306,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
|
||||
-
|
||||
# Multi-Gen LRU Experiment
|
||||
on property:persist.device_config.mglru_native.lru_gen_config=none
|
||||
write /sys/kernel/mm/lru_gen/enabled 0
|
||||
on userspace-reboot-requested
|
||||
# TODO(b/135984674): reset all necessary properties here.
|
||||
setprop sys.boot_completed ""
|
||||
--
|
||||
2.44.0
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From bb84dbc1eafbe7604912a7cba72ae65417c2923d Mon Sep 17 00:00:00 2001
|
||||
From ddaa66e3cdc62f065143b1a8eb3f06bec65ff651 Mon Sep 17 00:00:00 2001
|
||||
From: Pierre-Hugues Husson <phh@phh.me>
|
||||
Date: Wed, 23 Feb 2022 17:37:47 -0500
|
||||
Subject: [PATCH 1/2] init: Override select system properties
|
||||
Subject: [PATCH 2/2] init: Override select system properties
|
||||
|
||||
* adb secure props and logd can be overridden from system.
|
||||
|
||||
|
@ -11,7 +11,7 @@ Change-Id: I94efa3f108ae97711026f099f367b6bea325629f
|
|||
1 file changed, 11 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/init/property_service.cpp b/init/property_service.cpp
|
||||
index f2606e3..d12fac1 100644
|
||||
index 157fc709c..7ec3c0b10 100644
|
||||
--- a/init/property_service.cpp
|
||||
+++ b/init/property_service.cpp
|
||||
@@ -797,13 +797,20 @@ static void LoadProperties(char* data, const char* filter, const char* filename,
|
Loading…
Add table
Reference in a new issue