From 489a84f1eeba8059f3b373f88a776313f72ab8b4 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 26 Jan 2025 09:24:11 -0500 Subject: [PATCH 1/2] Fix fw/b patches --- ...support-glob-matching-for-properties.patch | 2 +- ...PackageUtils-Add-glob-matching-suppo.patch | 2 +- .../base/0003-Global-VPN-feature-1-2.patch | 2 +- ...ze-boot-animation-to-match-screen-si.patch | 2 +- ...ateForSlotIndex-in-SubscriptionManag.patch | 2 +- ...CallingIdentity-variant-with-both-ex.patch | 2 +- ...spoofing-for-microG-Companion-Servic.patch | 138 ---------------- ...-and-AIDL-fingerprint-services-are-m.patch | 2 +- ...-and-AIDL-fingerprint-services-are-m.patch | 42 ----- ...d.version.incremental-to-signal-OTA-.patch | 2 +- ...k-before-setting-default-or-fallback.patch | 2 +- ...d.version.incremental-to-signal-OTA-.patch | 150 ------------------ ...treating-virtual-biometric-sensors-a.patch | 2 +- ...k-before-setting-default-or-fallback.patch | 134 ---------------- ...treating-virtual-biometric-sensors-a.patch | 49 ------ ...spoofing-for-microG-Companion-Servic.patch | 2 +- ...igningInfo-for-microG-Companion-Serv.patch | 2 +- 17 files changed, 12 insertions(+), 525 deletions(-) delete mode 100644 frameworks/base/0007-Allow-signature-spoofing-for-microG-Companion-Servic.patch delete mode 100644 frameworks/base/0008-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch delete mode 100644 frameworks/base/0009-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch delete mode 100644 frameworks/base/0010-WebView-Add-check-before-setting-default-or-fallback.patch delete mode 100644 frameworks/base/0011-Add-support-for-treating-virtual-biometric-sensors-a.patch diff --git a/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch b/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch index d1fb022..026685c 100644 --- a/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch +++ b/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch @@ -1,4 +1,4 @@ -From 2b9fc3684d24ff3276f18c4de93402cf7d92e5c3 Mon Sep 17 00:00:00 2001 +From c4c114b281293a309e3f6b071292cf15b9939140 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Tue, 12 Oct 2021 21:37:22 -0400 Subject: [PATCH 01/12] PackageParser: support glob matching for properties diff --git a/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch b/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch index 32e344b..1c2cdfe 100644 --- a/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch +++ b/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch @@ -1,4 +1,4 @@ -From 6de413c8d88d2d6f02e81a4247af47b506ea4451 Mon Sep 17 00:00:00 2001 +From dc8561a3246568896b4b318ef479795cfe3e2ab3 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Fri, 2 Sep 2022 21:36:06 -0400 Subject: [PATCH 02/12] FrameworkParsingPackageUtils: Add glob matching support diff --git a/frameworks/base/0003-Global-VPN-feature-1-2.patch b/frameworks/base/0003-Global-VPN-feature-1-2.patch index d3a52d6..b1999f3 100644 --- a/frameworks/base/0003-Global-VPN-feature-1-2.patch +++ b/frameworks/base/0003-Global-VPN-feature-1-2.patch @@ -1,4 +1,4 @@ -From a5c2cffdac5181c437437fee002526d43a080c51 Mon Sep 17 00:00:00 2001 +From 8d6c74e9e8b2fea7686d1b6f2988af42d5f155c1 Mon Sep 17 00:00:00 2001 From: Oliver Scott Date: Thu, 8 Jul 2021 10:41:43 -0400 Subject: [PATCH 03/12] Global VPN feature [1/2] diff --git a/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch b/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch index 3e9a45b..92e736d 100644 --- a/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch +++ b/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch @@ -1,4 +1,4 @@ -From 1357225dd52f3f2a6a1766c33eca32506b8f7ac2 Mon Sep 17 00:00:00 2001 +From eb8e7dd21a6ec1daa87f0e49d3f890b2074539e9 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Mon, 20 Dec 2021 15:01:41 -0500 Subject: [PATCH 04/12] Dynamically resize boot animation to match screen size diff --git a/frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch b/frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch index bdace07..494a15c 100644 --- a/frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch +++ b/frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch @@ -1,4 +1,4 @@ -From f89ddfd215de9269559afdd6b23e4eca56da8eef Mon Sep 17 00:00:00 2001 +From 255d90a95d3fb2c0b3b94e77fd787316b864a845 Mon Sep 17 00:00:00 2001 From: Andy CrossGate Yan Date: Wed, 2 Aug 2023 20:59:53 +0800 Subject: [PATCH 05/12] Restore getSimStateForSlotIndex in SubscriptionManager diff --git a/frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch b/frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch index 1c73094..59998b3 100644 --- a/frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch +++ b/frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch @@ -1,4 +1,4 @@ -From 6ed2fcbdc5aaadd1bb29f8bfd80cf9200515acb0 Mon Sep 17 00:00:00 2001 +From 23f602ae89883965cb8eee0b7b8000550104b535 Mon Sep 17 00:00:00 2001 From: Andy CrossGate Yan Date: Sat, 12 Aug 2023 20:11:17 +0800 Subject: [PATCH 06/12] Add runWithCleanCallingIdentity variant with both diff --git a/frameworks/base/0007-Allow-signature-spoofing-for-microG-Companion-Servic.patch b/frameworks/base/0007-Allow-signature-spoofing-for-microG-Companion-Servic.patch deleted file mode 100644 index 9cf9f0c..0000000 --- a/frameworks/base/0007-Allow-signature-spoofing-for-microG-Companion-Servic.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 33667f43e841a799a6e34c28fecfce5fb7f470ef Mon Sep 17 00:00:00 2001 -From: LuK1337 -Date: Mon, 19 Feb 2024 16:20:04 +0100 -Subject: [PATCH 07/11] Allow signature spoofing for microG Companion/Services - -This patch enables signature spoofing when the following conditions are -met: -* Build is debuggable (userdebug/eng) -* Package name is com.android.vending or com.google.android.gms -* Package is signed with microG release keys -* Fake signature is correct - -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 | 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 ---- 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; - import static com.android.server.pm.AppsFilterUtils.canQueryViaComponents; - import static com.android.server.pm.AppsFilterUtils.canQueryViaPackage; - import static com.android.server.pm.AppsFilterUtils.canQueryViaUsesLibrary; -+import static com.android.server.pm.ComputerEngine.isMicrogSigned; - - import android.annotation.NonNull; - import android.annotation.Nullable; -@@ -599,6 +600,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable, - newIsForceQueryable = mForceQueryable.contains(newPkgSetting.getAppId()) - /* shared user that is already force queryable */ - || newPkgSetting.isForceQueryableOverride() /* adb override */ -+ || (newPkg.isForceQueryable() && isMicrogSigned(newPkg)) - || (newPkgSetting.isSystem() && (mSystemAppsQueryable - || 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 4665a72b0..ff736f3d0 100644 ---- a/services/core/java/com/android/server/pm/ComputerEngine.java -+++ b/services/core/java/com/android/server/pm/ComputerEngine.java -@@ -102,6 +102,7 @@ import android.content.pm.UserPackage; - import android.content.pm.VersionedPackage; - import android.os.Binder; - import android.os.Build; -+import android.os.Bundle; - import android.os.IBinder; - import android.os.ParcelableException; - import android.os.PatternMatcher; -@@ -174,6 +175,7 @@ import java.util.Collections; - import java.util.Comparator; - import java.util.List; - import java.util.Objects; -+import java.util.Optional; - import java.util.Set; - import java.util.UUID; - -@@ -422,6 +424,10 @@ public class ComputerEngine implements Computer { - private final PackageManagerInternal.ExternalSourcesPolicy mExternalSourcesPolicy; - private final CrossProfileIntentResolverEngine mCrossProfileIntentResolverEngine; - -+ // Signatures used by microG -+ private static final Signature MICROG_FAKE_SIGNATURE = new Signature("308204433082032ba003020102020900c2e08746644a308d300d06092a864886f70d01010405003074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964301e170d3038303832313233313333345a170d3336303130373233313333345a3074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f696430820120300d06092a864886f70d01010105000382010d00308201080282010100ab562e00d83ba208ae0a966f124e29da11f2ab56d08f58e2cca91303e9b754d372f640a71b1dcb130967624e4656a7776a92193db2e5bfb724a91e77188b0e6a47a43b33d9609b77183145ccdf7b2e586674c9e1565b1f4c6a5955bff251a63dabf9c55c27222252e875e4f8154a645f897168c0b1bfc612eabf785769bb34aa7984dc7e2ea2764cae8307d8c17154d7ee5f64a51a44a602c249054157dc02cd5f5c0e55fbef8519fbe327f0b1511692c5a06f19d18385f5c4dbc2d6b93f68cc2979c70e18ab93866b3bd5db8999552a0e3b4c99df58fb918bedc182ba35e003c1b4b10dd244a8ee24fffd333872ab5221985edab0fc0d0b145b6aa192858e79020103a381d93081d6301d0603551d0e04160414c77d8cc2211756259a7fd382df6be398e4d786a53081a60603551d2304819e30819b8014c77d8cc2211756259a7fd382df6be398e4d786a5a178a4763074310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e205669657731143012060355040a130b476f6f676c6520496e632e3110300e060355040b1307416e64726f69643110300e06035504031307416e64726f6964820900c2e08746644a308d300c0603551d13040530030101ff300d06092a864886f70d010104050003820101006dd252ceef85302c360aaace939bcff2cca904bb5d7a1661f8ae46b2994204d0ff4a68c7ed1a531ec4595a623ce60763b167297a7ae35712c407f208f0cb109429124d7b106219c084ca3eb3f9ad5fb871ef92269a8be28bf16d44c8d9a08e6cb2f005bb3fe2cb96447e868e731076ad45b33f6009ea19c161e62641aa99271dfd5228c5c587875ddb7f452758d661f6cc0cccb7352e424cc4365c523532f7325137593c4ae341f4db41edda0d0b1071a7c440f0fe9ea01cb627ca674369d084bd2fd911ff06cdbf2cfa10dc0f893ae35762919048c7efc64c7144178342f70581c9de573af55b390dd7fdb9418631895d5f759f30112687ff621410c069308a"); -+ private static final Signature MICROG_REAL_SIGNATURE = new Signature("308202ed308201d5a003020102020426ffa009300d06092a864886f70d01010b05003027310b300906035504061302444531183016060355040a130f4e4f47415050532050726f6a656374301e170d3132313030363132303533325a170d3337303933303132303533325a3027310b300906035504061302444531183016060355040a130f4e4f47415050532050726f6a65637430820122300d06092a864886f70d01010105000382010f003082010a02820101009a8d2a5336b0eaaad89ce447828c7753b157459b79e3215dc962ca48f58c2cd7650df67d2dd7bda0880c682791f32b35c504e43e77b43c3e4e541f86e35a8293a54fb46e6b16af54d3a4eda458f1a7c8bc1b7479861ca7043337180e40079d9cdccb7e051ada9b6c88c9ec635541e2ebf0842521c3024c826f6fd6db6fd117c74e859d5af4db04448965ab5469b71ce719939a06ef30580f50febf96c474a7d265bb63f86a822ff7b643de6b76e966a18553c2858416cf3309dd24278374bdd82b4404ef6f7f122cec93859351fc6e5ea947e3ceb9d67374fe970e593e5cd05c905e1d24f5a5484f4aadef766e498adf64f7cf04bddd602ae8137b6eea40722d0203010001a321301f301d0603551d0e04160414110b7aa9ebc840b20399f69a431f4dba6ac42a64300d06092a864886f70d01010b0500038201010007c32ad893349cf86952fb5a49cfdc9b13f5e3c800aece77b2e7e0e9c83e34052f140f357ec7e6f4b432dc1ed542218a14835acd2df2deea7efd3fd5e8f1c34e1fb39ec6a427c6e6f4178b609b369040ac1f8844b789f3694dc640de06e44b247afed11637173f36f5886170fafd74954049858c6096308fc93c1bc4dd5685fa7a1f982a422f2a3b36baa8c9500474cf2af91c39cbec1bc898d10194d368aa5e91f1137ec115087c31962d8f76cd120d28c249cf76f4c70f5baa08c70a7234ce4123be080cee789477401965cfe537b924ef36747e8caca62dfefdd1a6288dcb1c4fd2aaa6131a7ad254e9742022cfd597d2ca5c660ce9e41ff537e5a4041e37"); -+ - // PackageManagerService attributes that are primitives are referenced through the - // pms object directly. Primitives are the only attributes so referenced. - protected final PackageManagerService mService; -@@ -1481,6 +1487,42 @@ public class ComputerEngine implements Computer { - return result; - } - -+ public static boolean isMicrogSigned(AndroidPackage p) { -+ // Allowlist the following apps: -+ // * com.android.vending - microG Companion -+ // * com.google.android.gms - microG Services -+ if (!p.getPackageName().equals("com.android.vending") && -+ !p.getPackageName().equals("com.google.android.gms")) { -+ return false; -+ } -+ return Signature.areExactMatch( -+ p.getSigningDetails(), new Signature[]{MICROG_REAL_SIGNATURE}); -+ } -+ -+ private static Optional generateFakeSignature(AndroidPackage p) { -+ if (!isMicrogSigned(p)) { -+ return Optional.empty(); -+ } -+ -+ Bundle metadata = p.getMetaData(); -+ if (metadata == null) { -+ return Optional.empty(); -+ } -+ -+ String fakeSignatureStr = metadata.getString("fake-signature"); -+ if (TextUtils.isEmpty(fakeSignatureStr)) { -+ return Optional.empty(); -+ } -+ -+ // Only MICROG_FAKE_SIGNATURE can be faked -+ Signature fakeSignature = new Signature(fakeSignatureStr); -+ if (!fakeSignature.equals(MICROG_FAKE_SIGNATURE)) { -+ return Optional.empty(); -+ } -+ -+ return Optional.of(fakeSignature); -+ } -+ - public final PackageInfo generatePackageInfo(PackageStateInternal ps, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - if (!mUserManager.exists(userId)) return null; -@@ -1529,6 +1571,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) { -@@ -1536,6 +1582,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)) { --- -2.44.0 - diff --git a/frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch b/frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch index 06830e5..919d948 100644 --- a/frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch +++ b/frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch @@ -1,4 +1,4 @@ -From 8eec006d00e012f02a33cea8f631af15bdd14498 Mon Sep 17 00:00:00 2001 +From e61dbcd51f88e10833a08a6b4ae909e783c39ebc Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 22 Sep 2024 22:53:01 -0400 Subject: [PATCH 07/12] AuthService: HIDL and AIDL fingerprint services are diff --git a/frameworks/base/0008-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch b/frameworks/base/0008-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch deleted file mode 100644 index a06acd7..0000000 --- a/frameworks/base/0008-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch +++ /dev/null @@ -1,42 +0,0 @@ -From ad608b13f93f9532e4f7abcaabc6a3f735ad87ba Mon Sep 17 00:00:00 2001 -From: Peter Cai -Date: Sun, 22 Sep 2024 22:53:01 -0400 -Subject: [PATCH 08/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.44.0 - diff --git a/frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch b/frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch index 80643ad..0381fd1 100644 --- a/frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch +++ b/frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch @@ -1,4 +1,4 @@ -From 0439e89b1442adc5d6bb2b876ca7bc87a0b0ebd1 Mon Sep 17 00:00:00 2001 +From 6dbbaaabb50bd674b52d8498d2583afe4a2ab8e9 Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Tue, 24 Nov 2015 01:53:47 -0500 Subject: [PATCH 08/12] fw/b: Use ro.build.version.incremental to signal OTA diff --git a/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch b/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch index 95e9bbb..a8b25ea 100644 --- a/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch +++ b/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch @@ -1,4 +1,4 @@ -From e9f37a43249f7816b78c4a8ce3a82f48db779567 Mon Sep 17 00:00:00 2001 +From 72405ae53c5e7c06045a7569bd58b3a4868d2803 Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Sat, 21 Sep 2024 13:44:09 +0530 Subject: [PATCH 09/12] WebView: Add check before setting default or fallback diff --git a/frameworks/base/0009-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch b/frameworks/base/0009-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch deleted file mode 100644 index 496282a..0000000 --- a/frameworks/base/0009-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 35527df5e9e87a4af86d51e3290e7679f5a5f4cc Mon Sep 17 00:00:00 2001 -From: dhacker29 -Date: Tue, 24 Nov 2015 01:53:47 -0500 -Subject: [PATCH 09/11] fw/b: Use ro.build.version.incremental to signal OTA - upgrades - -Co-authored-by: maxwen -Co-authored-by: Sam Mortimer -Co-authored-by: Wang Han <416810799@qq.com> -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(-) - -diff --git a/core/java/android/app/admin/SystemUpdateInfo.java b/core/java/android/app/admin/SystemUpdateInfo.java -index 9e6c91f4e..7459b0e05 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 { - out.startTag(null, tag); - out.attributeLong(null, ATTR_RECEIVED_TIME, mReceivedTime); - out.attributeInt(null, ATTR_SECURITY_PATCH_STATE, mSecurityPatchState); -- out.attribute(null, ATTR_ORIGINAL_BUILD , Build.FINGERPRINT); -+ out.attribute(null, ATTR_ORIGINAL_BUILD , Build.VERSION.INCREMENTAL); - out.endTag(null, tag); - } - -@@ -142,7 +142,7 @@ public final class SystemUpdateInfo implements Parcelable { - public static SystemUpdateInfo readFromXml(TypedXmlPullParser parser) { - // If an OTA has been applied (build fingerprint has changed), discard stale info. - final String buildFingerprint = parser.getAttributeValue(null, ATTR_ORIGINAL_BUILD ); -- if (!Build.FINGERPRINT.equals(buildFingerprint)) { -+ if (!Build.VERSION.INCREMENTAL.equals(buildFingerprint)) { - 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/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index 611e0d862..0e343e18a 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 - if (mIsUpgrade) { - PackageManagerServiceUtils.logCriticalInfo(Log.INFO, - "Upgrading from " + ver.fingerprint + " (" + ver.buildFingerprint + ") to " -- + PackagePartitions.FINGERPRINT + " (" + Build.FINGERPRINT + ")"); -+ + PackagePartitions.FINGERPRINT -+ + " (" + 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); - } - } -- ver.buildFingerprint = Build.FINGERPRINT; -+ ver.buildFingerprint = Build.VERSION.INCREMENTAL; - ver.fingerprint = PackagePartitions.FINGERPRINT; - } - -diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java -index 975758241..54527a6b0 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); - } -diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java -index 1f672a093..bef67a838 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() { - sdkVersion = Build.VERSION.SDK_INT; - databaseVersion = CURRENT_DATABASE_VERSION; -- buildFingerprint = Build.FINGERPRINT; -+ buildFingerprint = Build.VERSION.INCREMENTAL; - fingerprint = PackagePartitions.FINGERPRINT; - } - } -diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java -index 5518bfae8..e26eec659 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 { - - // Injection point. - String injectBuildFingerprint() { -- return Build.FINGERPRINT; -+ return Build.VERSION.INCREMENTAL; - } - - final void wtf(String message) { --- -2.44.0 - diff --git a/frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch b/frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch index 171abf4..a66e02e 100644 --- a/frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch +++ b/frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch @@ -1,4 +1,4 @@ -From 63814a8d4c25c343a7f3d3374ed4f085517fa8d0 Mon Sep 17 00:00:00 2001 +From 6b38f9bcf7c1d49d9737a2caf4a758726516b095 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sat, 21 Dec 2024 11:04:35 -0500 Subject: [PATCH 10/12] Add support for treating virtual biometric sensors as diff --git a/frameworks/base/0010-WebView-Add-check-before-setting-default-or-fallback.patch b/frameworks/base/0010-WebView-Add-check-before-setting-default-or-fallback.patch deleted file mode 100644 index 72d2b19..0000000 --- a/frameworks/base/0010-WebView-Add-check-before-setting-default-or-fallback.patch +++ /dev/null @@ -1,134 +0,0 @@ -From fb0c9ab82954cf41bb985957d3eddfd190ca2ca5 Mon Sep 17 00:00:00 2001 -From: Pranav Vashi -Date: Sat, 21 Sep 2024 13:44:09 +0530 -Subject: [PATCH 10/11] WebView: Add check before setting default or fallback - provider - -Signed-off-by: Pranav Vashi ---- - .../webkit/WebViewUpdateServiceImpl.java | 14 ++++++-- - .../webkit/WebViewUpdateServiceImpl2.java | 34 ++++++++++++++----- - 2 files changed, 38 insertions(+), 10 deletions(-) - -diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java -index b9be4a2de..e98196f9f 100644 ---- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java -+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.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; -@@ -396,7 +397,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { - @Override - public WebViewProviderInfo getDefaultWebViewPackage() { - for (WebViewProviderInfo provider : getWebViewPackages()) { -- if (provider.availableByDefault) { -+ if (provider.availableByDefault && isPackageAvailable(provider.packageName)) { - return provider; - } - } -@@ -406,6 +407,15 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { - throw new AndroidRuntimeException("No available by default WebView Provider."); - } - -+ private static boolean isPackageAvailable(String packageName) { -+ try { -+ AppGlobals.getInitialApplication().getPackageManager().getPackageInfo(packageName, 0); -+ return true; -+ } catch (NameNotFoundException e) { -+ return false; -+ } -+ } -+ - private static class ProviderAndPackageInfo { - public final WebViewProviderInfo provider; - public final PackageInfo packageInfo; -@@ -644,7 +654,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { - */ - private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) { - for (WebViewProviderInfo provider : webviewPackages) { -- if (provider.isFallback) { -+ if (provider.isFallback && isPackageAvailable(provider.packageName)) { - return provider; - } - } -diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java -index 307c15b72..26d1195dc 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; -@@ -112,7 +113,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { - - 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 implements WebViewUpdateServiceInterface { - } - } - -+ 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 implements WebViewUpdateServiceInterface { - } - 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); -+ } - } - - @Override -@@ -701,7 +719,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { - */ - private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) { - for (WebViewProviderInfo provider : webviewPackages) { -- if (provider.isFallback) { -+ if (provider.isFallback && isPackageAvailable(provider.packageName)) { - return provider; - } - } --- -2.44.0 - diff --git a/frameworks/base/0011-Add-support-for-treating-virtual-biometric-sensors-a.patch b/frameworks/base/0011-Add-support-for-treating-virtual-biometric-sensors-a.patch deleted file mode 100644 index fe53e4d..0000000 --- a/frameworks/base/0011-Add-support-for-treating-virtual-biometric-sensors-a.patch +++ /dev/null @@ -1,49 +0,0 @@ -From a6a02e1099bee7d8749525e5fc092527fd2b1818 Mon Sep 17 00:00:00 2001 -From: Peter Cai -Date: Sat, 21 Dec 2024 11:04:35 -0500 -Subject: [PATCH 11/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.44.0 - diff --git a/frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch b/frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch index a1b057a..946f917 100644 --- a/frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch +++ b/frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch @@ -1,4 +1,4 @@ -From 73a7c9dcfd0752557d08d0e5972aa1ec9cad766a Mon Sep 17 00:00:00 2001 +From 881fb29e6d4510f1691dd9a483fa89367cc32b64 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Mon, 19 Feb 2024 16:20:04 +0100 Subject: [PATCH 11/12] Allow signature spoofing for microG Companion/Services diff --git a/frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch b/frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch index 4d0258a..4f8baec 100644 --- a/frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch +++ b/frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch @@ -1,4 +1,4 @@ -From 125054a90b153342a08cebf025e8752fe0113b36 Mon Sep 17 00:00:00 2001 +From 0c60edf128cc549f20fba38b33984d55c63adc43 Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Thu, 12 Dec 2024 15:27:57 +0100 Subject: [PATCH 12/12] Allow spoofing signingInfo for microG From 9d9e775f06a7a8b41b76f743139f4dd69fe7be40 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 16 Mar 2025 13:56:35 -0400 Subject: [PATCH 2/2] Refresh patchset for AOSP 15 r20 --- ...m-to-fake-vendor-props-on-a-per-proc.patch | 4 +- ...orce-load-audio-policy-for-system-si.patch | 4 +- ...2DP-audio-ports-from-the-primary-HAL.patch | 4 +- ...gh-pitched-voice-on-Qualcomm-devices.patch | 4 +- .../0004-Fix-BT-in-call-on-CAF-devices.patch | 4 +- ...-Make-camera-IDs-filter-out-optional.patch | 10 +- ...and-Q-behavior-respectively-for-tele.patch | 30 +- ...support-glob-matching-for-properties.patch | 6 +- ...PackageUtils-Add-glob-matching-suppo.patch | 8 +- .../base/0003-Global-VPN-feature-1-2.patch | 12 +- ...ze-boot-animation-to-match-screen-si.patch | 46 -- ...teForSlotIndex-in-SubscriptionManag.patch} | 10 +- ...allingIdentity-variant-with-both-ex.patch} | 6 +- ...and-AIDL-fingerprint-services-are-m.patch} | 6 +- ....version.incremental-to-signal-OTA-.patch} | 14 +- ...reating-virtual-biometric-sensors-a.patch} | 6 +- ...k-before-setting-default-or-fallback.patch | 67 +- ...poofing-for-microG-Companion-Servic.patch} | 32 +- ...gningInfo-for-microG-Companion-Serv.patch} | 12 +- ...d-support-for-ignoring-broken-sensor.patch | 8 +- ...support-to-fix-broken-Mediatek-gpufr.patch | 10 +- ...Support-optionally-ignoring-vibrator.patch | 14 +- ...t-Remove-flag-single_hop_screenshots.patch | 348 ++++++++ ...elease-fence-attachment-for-non-thre.patch | 334 ++++++++ ...06-Revert-Remove-release-fence-flags.patch | 755 ++++++++++++++++++ ...Revert-Remove-dead-code-from-LayerFE.patch | 97 +++ .../0001-Stop-using-resource-processor.patch | 24 + lineage-sdk/0002-Add-spninfo-schema.patch | 133 +++ ...ade-target_sdk_version-to-34-for-now.patch | 6 +- ...va_sdk_library-dependencies-explicit.patch | 6 +- ...-from-the-resource-processor-for-now.patch | 24 + ...e-themed-icon-setting-in-ThemePicker.patch | 6 +- .../0002-Disable-QSB-in-BuildConfig.patch | 4 +- ...ly-expose-GridCustomizationsProvider.patch | 4 +- ...0001-Settings-Bring-in-the-new-icon.patch} | 6 +- ...atch => 0002-Global-VPN-feature-2-2.patch} | 16 +- ...0001-Add-wallpaper-privapp-whitelist.patch | 4 +- ...02-Add-wallpaper-default-permissions.patch | 4 +- ...-we-read-and-write-launcher-settings.patch | 4 +- ...ssion-for-launcher-preview-rendering.patch | 4 +- ...interface-Optionally-use-sysbta-HAL.patch} | 91 ++- ...atus-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch} | 20 +- 42 files changed, 1948 insertions(+), 259 deletions(-) delete mode 100644 frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch rename frameworks/base/{0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch => 0004-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch} (83%) rename frameworks/base/{0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch => 0005-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch} (94%) rename frameworks/base/{0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch => 0006-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch} (93%) rename frameworks/base/{0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch => 0007-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch} (96%) rename frameworks/base/{0010-Add-support-for-treating-virtual-biometric-sensors-a.patch => 0008-Add-support-for-treating-virtual-biometric-sensors-a.patch} (93%) rename frameworks/base/{0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch => 0010-Allow-signature-spoofing-for-microG-Companion-Servic.patch} (94%) rename frameworks/base/{0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch => 0011-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch} (86%) create mode 100644 frameworks/native/0004-Revert-Remove-flag-single_hop_screenshots.patch create mode 100644 frameworks/native/0005-Revert-Reorder-release-fence-attachment-for-non-thre.patch create mode 100644 frameworks/native/0006-Revert-Remove-release-fence-flags.patch create mode 100644 frameworks/native/0007-Revert-Remove-dead-code-from-LayerFE.patch create mode 100644 lineage-sdk/0001-Stop-using-resource-processor.patch create mode 100644 lineage-sdk/0002-Add-spninfo-schema.patch create mode 100644 packages/apps/Dialer/0003-Opt-out-from-the-resource-processor-for-now.patch rename packages/apps/Settings/{0002-Settings-Bring-in-the-new-icon.patch => 0001-Settings-Bring-in-the-new-icon.patch} (99%) rename packages/apps/Settings/{0001-Global-VPN-feature-2-2.patch => 0002-Global-VPN-feature-2-2.patch} (93%) rename packages/modules/Bluetooth/{0002-audio_hal_interface-Optionally-use-sysbta-HAL.patch => 0001-audio_hal_interface-Optionally-use-sysbta-HAL.patch} (57%) rename packages/modules/Bluetooth/{0001-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch => 0002-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch} (66%) diff --git a/bionic/0001-Add-new-mechanism-to-fake-vendor-props-on-a-per-proc.patch b/bionic/0001-Add-new-mechanism-to-fake-vendor-props-on-a-per-proc.patch index 7c00f25..342df54 100644 --- a/bionic/0001-Add-new-mechanism-to-fake-vendor-props-on-a-per-proc.patch +++ b/bionic/0001-Add-new-mechanism-to-fake-vendor-props-on-a-per-proc.patch @@ -1,4 +1,4 @@ -From e0e96a633b717830325cd6189fff23e57d7ee6f1 Mon Sep 17 00:00:00 2001 +From 9f770e862954f07e8a7cce36aedd4879b10641c6 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Sat, 19 Feb 2022 08:20:25 -0500 Subject: [PATCH] Add new mechanism to fake vendor props on a per-process basis @@ -132,5 +132,5 @@ index e0d38a8..4f54885 100644 static bool is_appcompat_override(const char* name) { -- -2.44.0 +2.48.1 diff --git a/frameworks/av/0001-APM-Optionally-force-load-audio-policy-for-system-si.patch b/frameworks/av/0001-APM-Optionally-force-load-audio-policy-for-system-si.patch index 990b7b1..4c060b8 100644 --- a/frameworks/av/0001-APM-Optionally-force-load-audio-policy-for-system-si.patch +++ b/frameworks/av/0001-APM-Optionally-force-load-audio-policy-for-system-si.patch @@ -1,4 +1,4 @@ -From 30492f22b249f2bd73085341f231da81ed290cf5 Mon Sep 17 00:00:00 2001 +From 875011b65d3839871b488b18d483fd56f2306a7b Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 24 Aug 2022 15:42:39 -0400 Subject: [PATCH 1/6] APM: Optionally force-load audio policy for system-side @@ -57,5 +57,5 @@ index 6f19a7a145..08836377b7 100644 // Global Configuration -- -2.44.0 +2.48.1 diff --git a/frameworks/av/0002-APM-Remove-A2DP-audio-ports-from-the-primary-HAL.patch b/frameworks/av/0002-APM-Remove-A2DP-audio-ports-from-the-primary-HAL.patch index 4aaaff7..2361724 100644 --- a/frameworks/av/0002-APM-Remove-A2DP-audio-ports-from-the-primary-HAL.patch +++ b/frameworks/av/0002-APM-Remove-A2DP-audio-ports-from-the-primary-HAL.patch @@ -1,4 +1,4 @@ -From 710bea3b445304ca1201b8923cdc3bf824d6a10e Mon Sep 17 00:00:00 2001 +From d24b962cb20fb0a3e807d05c534f43f8bd0ce350 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Thu, 25 Aug 2022 13:30:29 -0400 Subject: [PATCH 2/6] APM: Remove A2DP audio ports from the primary HAL @@ -75,5 +75,5 @@ index 08836377b7..0f7c903909 100644 RouteTraits::Collection routes; -- -2.44.0 +2.48.1 diff --git a/frameworks/av/0003-voip-Fix-high-pitched-voice-on-Qualcomm-devices.patch b/frameworks/av/0003-voip-Fix-high-pitched-voice-on-Qualcomm-devices.patch index 1588f95..5b5432c 100644 --- a/frameworks/av/0003-voip-Fix-high-pitched-voice-on-Qualcomm-devices.patch +++ b/frameworks/av/0003-voip-Fix-high-pitched-voice-on-Qualcomm-devices.patch @@ -1,4 +1,4 @@ -From d2fda04e8ad3ff0d3fda168fd41e493e9db54e7a Mon Sep 17 00:00:00 2001 +From b3bc05d8e2bb94c4992a12a943d16c27554fa54d Mon Sep 17 00:00:00 2001 From: ponces Date: Mon, 24 Oct 2022 09:38:34 +0100 Subject: [PATCH 3/6] voip: Fix high pitched voice on Qualcomm devices @@ -52,5 +52,5 @@ index 0f7c903909..c4474cf1c2 100644 ALOGE("%s: No %s found", __func__, Attributes::name); return BAD_VALUE; -- -2.44.0 +2.48.1 diff --git a/frameworks/av/0004-Fix-BT-in-call-on-CAF-devices.patch b/frameworks/av/0004-Fix-BT-in-call-on-CAF-devices.patch index f3492e0..5373354 100644 --- a/frameworks/av/0004-Fix-BT-in-call-on-CAF-devices.patch +++ b/frameworks/av/0004-Fix-BT-in-call-on-CAF-devices.patch @@ -1,4 +1,4 @@ -From 68b78f8122c2ba128a8314a8ea3e8a50afc4158b Mon Sep 17 00:00:00 2001 +From 88eee2c55fa4e85aeef0df59c9b788b2b7868c6b Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Mon, 5 Aug 2019 18:09:50 +0200 Subject: [PATCH 4/6] Fix BT in-call on CAF devices @@ -127,5 +127,5 @@ index c4474cf1c2..c1df8f278b 100644 for (const xmlNode *children = cur->xmlChildrenNode; children != NULL; -- -2.44.0 +2.48.1 diff --git a/frameworks/av/0005-Make-camera-IDs-filter-out-optional.patch b/frameworks/av/0005-Make-camera-IDs-filter-out-optional.patch index 4a56203..aade36f 100644 --- a/frameworks/av/0005-Make-camera-IDs-filter-out-optional.patch +++ b/frameworks/av/0005-Make-camera-IDs-filter-out-optional.patch @@ -1,4 +1,4 @@ -From a20df6bb1d38d2bb402c16fc64fcafd20464a757 Mon Sep 17 00:00:00 2001 +From 79a670c8e20a8eb68849be7e3f9b4c0421d92073 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Mon, 21 Dec 2020 20:19:11 +0100 Subject: [PATCH 5/6] Make camera IDs filter-out optional @@ -11,10 +11,10 @@ Add a property for that. 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp -index 51f06cb013..4892d80cfa 100644 +index a8d748028b..203a166a36 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.cpp +++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp -@@ -318,7 +318,9 @@ std::vector CameraProviderManager::getAPI1CompatibleCameraDeviceIds +@@ -324,7 +324,9 @@ std::vector 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. @@ -25,7 +25,7 @@ index 51f06cb013..4892d80cfa 100644 collectDeviceIdsLocked(providerDeviceIds, publicDeviceIds, systemDeviceIds); } auto sortFunc = -@@ -1102,10 +1104,12 @@ SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCame +@@ -1108,10 +1110,12 @@ SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCame // Go through the capabilities and check if it has // ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA @@ -43,5 +43,5 @@ index 51f06cb013..4892d80cfa 100644 } return SystemCameraKind::PUBLIC; -- -2.44.0 +2.48.1 diff --git a/frameworks/av/0006-APM-Restore-S-R-and-Q-behavior-respectively-for-tele.patch b/frameworks/av/0006-APM-Restore-S-R-and-Q-behavior-respectively-for-tele.patch index af01c1e..7a3e0d5 100644 --- a/frameworks/av/0006-APM-Restore-S-R-and-Q-behavior-respectively-for-tele.patch +++ b/frameworks/av/0006-APM-Restore-S-R-and-Q-behavior-respectively-for-tele.patch @@ -1,4 +1,4 @@ -From 5ce88c0c583ad228cb456d68543cebb5c23390a7 Mon Sep 17 00:00:00 2001 +From d483a03149f587b3078d81256ac356382aafdd6b Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Thu, 18 Aug 2022 15:44:46 -0400 Subject: [PATCH 6/6] APM: Restore S, R and Q behavior respectively for @@ -36,10 +36,10 @@ Change-Id: I56d36d2aef4319935cb88a3e4771b23c6d5b2145 2 files changed, 148 insertions(+), 61 deletions(-) diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp -index 1f8cedd290..cfac4a2090 100644 +index 73b574ccfa..4c44acb966 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp -@@ -726,6 +726,17 @@ status_t AudioPolicyManager::updateCallRoutingInternal( +@@ -746,6 +746,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 1f8cedd290..cfac4a2090 100644 auto telephonyRxModule = mHwModules.getModuleForDeviceType(AUDIO_DEVICE_IN_TELEPHONY_RX, AUDIO_FORMAT_DEFAULT); auto telephonyTxModule = -@@ -748,9 +759,20 @@ status_t AudioPolicyManager::updateCallRoutingInternal( +@@ -768,9 +779,20 @@ status_t AudioPolicyManager::updateCallRoutingInternal( ALOGE("%s() no telephony Tx and/or RX device", __func__); return INVALID_OPERATION; } @@ -81,7 +81,7 @@ index 1f8cedd290..cfac4a2090 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. -@@ -774,7 +796,14 @@ status_t AudioPolicyManager::updateCallRoutingInternal( +@@ -794,7 +816,14 @@ status_t AudioPolicyManager::updateCallRoutingInternal( } muteWaitMs = setOutputDevices(__func__, mPrimaryOutput, rxDevices, true, delayMs); } else { // create RX path audio patch @@ -97,7 +97,7 @@ index 1f8cedd290..cfac4a2090 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 -@@ -790,6 +819,13 @@ status_t AudioPolicyManager::updateCallRoutingInternal( +@@ -810,6 +839,13 @@ status_t AudioPolicyManager::updateCallRoutingInternal( } } connectTelephonyTxAudioSource(txSourceDevice, txSinkDevice, delayMs); @@ -111,7 +111,7 @@ index 1f8cedd290..cfac4a2090 100644 } else if (fix_call_audio_patch()) { disconnectTelephonyAudioSource(mCallTxSourceClient); } -@@ -799,6 +835,36 @@ status_t AudioPolicyManager::updateCallRoutingInternal( +@@ -819,6 +855,36 @@ status_t AudioPolicyManager::updateCallRoutingInternal( return NO_ERROR; } @@ -148,7 +148,7 @@ index 1f8cedd290..cfac4a2090 100644 bool AudioPolicyManager::isDeviceOfModule( const sp& devDesc, const char *moduleId) const { sp module = mHwModules.getModuleFromName(moduleId); -@@ -5513,83 +5579,101 @@ status_t AudioPolicyManager::createAudioPatchInternal(const struct audio_patch * +@@ -5636,83 +5702,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 outputDesc; @@ -166,14 +166,14 @@ index 1f8cedd290..cfac4a2090 100644 - : audio_channel_mask_in_to_out(sourceMask); - config.format = sourceDesc->config().format; - audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE; -- audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; +- DeviceIdVector selectedDeviceIds; - bool isRequestedDeviceForExclusiveUse = false; - output_type_t outputType; - bool isSpatialized; - bool isBitPerfect; - getOutputForAttrInt(&resultAttr, &output, AUDIO_SESSION_NONE, &attributes, - &stream, sourceDesc->uid(), &config, &flags, -- &selectedDeviceId, &isRequestedDeviceForExclusiveUse, +- &selectedDeviceIds, &isRequestedDeviceForExclusiveUse, - nullptr, &outputType, &isSpatialized, &isBitPerfect); - if (output == AUDIO_IO_HANDLE_NONE) { - ALOGV("%s no output for device %s", @@ -219,14 +219,14 @@ index 1f8cedd290..cfac4a2090 100644 + : audio_channel_mask_in_to_out(sourceMask); + config.format = sourceDesc->config().format; + audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE; -+ audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; ++ DeviceIdVector selectedDeviceIds; + bool isRequestedDeviceForExclusiveUse = false; + output_type_t outputType; + bool isSpatialized; + bool isBitPerfect; + getOutputForAttrInt(&resultAttr, &output, AUDIO_SESSION_NONE, &attributes, + &stream, sourceDesc->uid(), &config, &flags, -+ &selectedDeviceId, &isRequestedDeviceForExclusiveUse, ++ &selectedDeviceIds, &isRequestedDeviceForExclusiveUse, + nullptr, &outputType, &isSpatialized, &isBitPerfect); + if (output == AUDIO_IO_HANDLE_NONE) { + ALOGV("%s no output for device %s", @@ -308,10 +308,10 @@ index 1f8cedd290..cfac4a2090 100644 AUDIO_STREAM_PATCH; patchBuilder.addSource(srcMixPortConfig); diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h -index 84edf34da4..4b1093cb23 100644 +index 44863eedc2..e8024942fd 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.h +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h -@@ -1013,6 +1013,9 @@ protected: +@@ -1017,6 +1017,9 @@ protected: SoundTriggerSessionCollection mSoundTriggerSessions; @@ -322,5 +322,5 @@ index 84edf34da4..4b1093cb23 100644 SourceClientCollection mAudioSources; -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch b/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch index 026685c..64b9384 100644 --- a/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch +++ b/frameworks/base/0001-PackageParser-support-glob-matching-for-properties.patch @@ -1,7 +1,7 @@ -From c4c114b281293a309e3f6b071292cf15b9939140 Mon Sep 17 00:00:00 2001 +From 3c6a1bbffa88d93be209b41b911f192618a3b8e6 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Tue, 12 Oct 2021 21:37:22 -0400 -Subject: [PATCH 01/12] PackageParser: support glob matching for properties +Subject: [PATCH 01/11] PackageParser: support glob matching for properties Needed to make phh's vendor overlays work --- @@ -32,5 +32,5 @@ index 4b579e7db..8176cf8e8 100644 } return true; -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch b/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch index 1c2cdfe..1f254fa 100644 --- a/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch +++ b/frameworks/base/0002-FrameworkParsingPackageUtils-Add-glob-matching-suppo.patch @@ -1,7 +1,7 @@ -From dc8561a3246568896b4b318ef479795cfe3e2ab3 Mon Sep 17 00:00:00 2001 +From 6d3e460a5e0df0f6ac2f653d0577560a2c8f32d3 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Fri, 2 Sep 2022 21:36:06 -0400 -Subject: [PATCH 02/12] FrameworkParsingPackageUtils: Add glob matching support +Subject: [PATCH 02/11] 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 153dd9a93..900151440 100644 +index e30f871b6..a2979f695 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 153dd9a93..900151440 100644 } return true; -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0003-Global-VPN-feature-1-2.patch b/frameworks/base/0003-Global-VPN-feature-1-2.patch index b1999f3..95a91cc 100644 --- a/frameworks/base/0003-Global-VPN-feature-1-2.patch +++ b/frameworks/base/0003-Global-VPN-feature-1-2.patch @@ -1,7 +1,7 @@ -From 8d6c74e9e8b2fea7686d1b6f2988af42d5f155c1 Mon Sep 17 00:00:00 2001 +From 176fce488f4206d10e3d4873bce3a43a97540890 Mon Sep 17 00:00:00 2001 From: Oliver Scott Date: Thu, 8 Jul 2021 10:41:43 -0400 -Subject: [PATCH 03/12] Global VPN feature [1/2] +Subject: [PATCH 03/11] 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 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java -index ef8b3d738..b5014f24e 100644 +index 4acb6312f..dbc9845a8 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java -@@ -18029,6 +18029,12 @@ public final class Settings { +@@ -18232,6 +18232,12 @@ public final class Settings { CLOCKWORK_HOME_READY, }; @@ -72,7 +72,7 @@ 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 e1bb8a1a0..cf89eb842 100644 +index 4c5f65285..1c546be6f 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 { @@ -197,5 +197,5 @@ index e1bb8a1a0..cf89eb842 100644 // To stop the VPN profile, the caller must be the current prepared package and must be // running an Ikev2VpnProfile. -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch b/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch deleted file mode 100644 index 92e736d..0000000 --- a/frameworks/base/0004-Dynamically-resize-boot-animation-to-match-screen-si.patch +++ /dev/null @@ -1,46 +0,0 @@ -From eb8e7dd21a6ec1daa87f0e49d3f890b2074539e9 Mon Sep 17 00:00:00 2001 -From: Pierre-Hugues Husson -Date: Mon, 20 Dec 2021 15:01:41 -0500 -Subject: [PATCH 04/12] 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 c2f6e3072..7213f3058 100644 ---- a/cmds/bootanimation/BootAnimation.cpp -+++ b/cmds/bootanimation/BootAnimation.cpp -@@ -619,6 +619,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_. Four values are supported: ORIENTATION_0, - // ORIENTATION_90, ORIENTATION_180 and ORIENTATION_270. --- -2.44.0 - diff --git a/frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch b/frameworks/base/0004-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch similarity index 83% rename from frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch rename to frameworks/base/0004-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch index 494a15c..e3a0d7a 100644 --- a/frameworks/base/0005-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch +++ b/frameworks/base/0004-Restore-getSimStateForSlotIndex-in-SubscriptionManag.patch @@ -1,7 +1,7 @@ -From 255d90a95d3fb2c0b3b94e77fd787316b864a845 Mon Sep 17 00:00:00 2001 +From cca38c720efc73912913a59be2a3d261017c2863 Mon Sep 17 00:00:00 2001 From: Andy CrossGate Yan Date: Wed, 2 Aug 2023 20:59:53 +0800 -Subject: [PATCH 05/12] Restore getSimStateForSlotIndex in SubscriptionManager +Subject: [PATCH 04/11] 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 6faef7ecf..33e3b6a0d 100644 +index e0af22369..2175b3d96 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java -@@ -2916,6 +2916,20 @@ public class SubscriptionManager { +@@ -2913,6 +2913,20 @@ public class SubscriptionManager { return TelephonyManager.getDefault().isNetworkRoaming(subId); } @@ -36,5 +36,5 @@ index 6faef7ecf..33e3b6a0d 100644 * Set a field in the subscription database. Note not all fields are supported. * -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch b/frameworks/base/0005-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch similarity index 94% rename from frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch rename to frameworks/base/0005-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch index 59998b3..cf09852 100644 --- a/frameworks/base/0006-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch +++ b/frameworks/base/0005-Add-runWithCleanCallingIdentity-variant-with-both-ex.patch @@ -1,7 +1,7 @@ -From 23f602ae89883965cb8eee0b7b8000550104b535 Mon Sep 17 00:00:00 2001 +From f9a12ae1920588f2d75849462abf7d2ba9d0373b Mon Sep 17 00:00:00 2001 From: Andy CrossGate Yan Date: Sat, 12 Aug 2023 20:11:17 +0800 -Subject: [PATCH 06/12] Add runWithCleanCallingIdentity variant with both +Subject: [PATCH 05/11] Add runWithCleanCallingIdentity variant with both executor and return value This complements the fixup to ImsPhoneCallTracker (in fw/o/t) for U @@ -61,5 +61,5 @@ index 422433891..3bbecf0f2 100644 * Filter values in bundle to only basic types. */ -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch b/frameworks/base/0006-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch similarity index 93% rename from frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch rename to frameworks/base/0006-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch index 919d948..08ef74f 100644 --- a/frameworks/base/0007-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch +++ b/frameworks/base/0006-AuthService-HIDL-and-AIDL-fingerprint-services-are-m.patch @@ -1,7 +1,7 @@ -From e61dbcd51f88e10833a08a6b4ae909e783c39ebc Mon Sep 17 00:00:00 2001 +From 45736b5d760fdac0ec405f1620942ff9a7c023d9 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 22 Sep 2024 22:53:01 -0400 -Subject: [PATCH 07/12] AuthService: HIDL and AIDL fingerprint services are +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 @@ -38,5 +38,5 @@ index 2d802b21c..0730d634f 100644 if (fingerprintService != null) { -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch b/frameworks/base/0007-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch similarity index 96% rename from frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch rename to frameworks/base/0007-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch index 0381fd1..c0b7b56 100644 --- a/frameworks/base/0008-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch +++ b/frameworks/base/0007-fw-b-Use-ro.build.version.incremental-to-signal-OTA-.patch @@ -1,7 +1,7 @@ -From 6dbbaaabb50bd674b52d8498d2583afe4a2ab8e9 Mon Sep 17 00:00:00 2001 +From 6cd16322e3d44ea9d96c74af96a967e48fa88d44 Mon Sep 17 00:00:00 2001 From: dhacker29 Date: Tue, 24 Nov 2015 01:53:47 -0500 -Subject: [PATCH 08/12] fw/b: Use ro.build.version.incremental to signal OTA +Subject: [PATCH 07/11] fw/b: Use ro.build.version.incremental to signal OTA upgrades Co-authored-by: maxwen @@ -76,7 +76,7 @@ index ce9130ad5..737ecae1c 100644 } final AppWidgetProviderInfo info = new AppWidgetProviderInfo(); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index 611e0d862..0e343e18a 100644 +index aadf11227..8b0c4f42b 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 @@ -99,7 +99,7 @@ index 611e0d862..0e343e18a 100644 } diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java -index 975758241..54527a6b0 100644 +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 { @@ -120,7 +120,7 @@ index 975758241..54527a6b0 100644 cacheDir = FileUtils.createDir(cacheBaseDir, cacheName); } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java -index 1f672a093..bef67a838 100644 +index 485a28070..78086791a 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 @@ -133,7 +133,7 @@ index 1f672a093..bef67a838 100644 } } diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java -index 5518bfae8..e26eec659 100644 +index 1052c94d7..21481d216 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 { @@ -146,5 +146,5 @@ index 5518bfae8..e26eec659 100644 final void wtf(String message) { -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch b/frameworks/base/0008-Add-support-for-treating-virtual-biometric-sensors-a.patch similarity index 93% rename from frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch rename to frameworks/base/0008-Add-support-for-treating-virtual-biometric-sensors-a.patch index a66e02e..7f4f23a 100644 --- a/frameworks/base/0010-Add-support-for-treating-virtual-biometric-sensors-a.patch +++ b/frameworks/base/0008-Add-support-for-treating-virtual-biometric-sensors-a.patch @@ -1,7 +1,7 @@ -From 6b38f9bcf7c1d49d9737a2caf4a758726516b095 Mon Sep 17 00:00:00 2001 +From 8b3f59482cf7f27406d9a8c9ef717e6bc70cfb88 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sat, 21 Dec 2024 11:04:35 -0500 -Subject: [PATCH 10/12] Add support for treating virtual biometric sensors as +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 @@ -45,5 +45,5 @@ index 48c5887d8..bec56d9a6 100644 Slog.i(TAG, "getIFingerprint fqName is mapped: " + fqName + "->" + fqNameMapped); try { -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch b/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch index a8b25ea..0ec495f 100644 --- a/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch +++ b/frameworks/base/0009-WebView-Add-check-before-setting-default-or-fallback.patch @@ -1,63 +1,16 @@ -From 72405ae53c5e7c06045a7569bd58b3a4868d2803 Mon Sep 17 00:00:00 2001 +From 2f4c395069d1dfd7cce9a896f17868aa4aaf91c4 Mon Sep 17 00:00:00 2001 From: Pranav Vashi Date: Sat, 21 Sep 2024 13:44:09 +0530 -Subject: [PATCH 09/12] WebView: Add check before setting default or fallback +Subject: [PATCH 09/11] WebView: Add check before setting default or fallback provider Signed-off-by: Pranav Vashi --- - .../webkit/WebViewUpdateServiceImpl.java | 14 ++++++-- .../webkit/WebViewUpdateServiceImpl2.java | 34 ++++++++++++++----- - 2 files changed, 38 insertions(+), 10 deletions(-) + 1 file changed, 26 insertions(+), 8 deletions(-) -diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java -index b9be4a2de..e98196f9f 100644 ---- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java -+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.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; -@@ -396,7 +397,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { - @Override - public WebViewProviderInfo getDefaultWebViewPackage() { - for (WebViewProviderInfo provider : getWebViewPackages()) { -- if (provider.availableByDefault) { -+ if (provider.availableByDefault && isPackageAvailable(provider.packageName)) { - return provider; - } - } -@@ -406,6 +407,15 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { - throw new AndroidRuntimeException("No available by default WebView Provider."); - } - -+ private static boolean isPackageAvailable(String packageName) { -+ try { -+ AppGlobals.getInitialApplication().getPackageManager().getPackageInfo(packageName, 0); -+ return true; -+ } catch (NameNotFoundException e) { -+ return false; -+ } -+ } -+ - private static class ProviderAndPackageInfo { - public final WebViewProviderInfo provider; - public final PackageInfo packageInfo; -@@ -644,7 +654,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { - */ - private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) { - for (WebViewProviderInfo provider : webviewPackages) { -- if (provider.isFallback) { -+ if (provider.isFallback && isPackageAvailable(provider.packageName)) { - return provider; - } - } diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java -index 307c15b72..26d1195dc 100644 +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 @@ @@ -68,7 +21,7 @@ index 307c15b72..26d1195dc 100644 import android.annotation.Nullable; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; -@@ -112,7 +113,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { +@@ -113,7 +114,7 @@ class WebViewUpdateServiceImpl2 { WebViewProviderInfo defaultProvider = null; for (WebViewProviderInfo provider : webviewProviders) { @@ -77,7 +30,7 @@ index 307c15b72..26d1195dc 100644 defaultProvider = provider; break; } -@@ -182,6 +183,15 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { +@@ -182,6 +183,15 @@ class WebViewUpdateServiceImpl2 { } } @@ -93,7 +46,7 @@ index 307c15b72..26d1195dc 100644 private boolean shouldTriggerRepairLocked() { if (mAttemptedToRepairBefore) { return false; -@@ -208,12 +218,20 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { +@@ -208,12 +218,20 @@ class WebViewUpdateServiceImpl2 { } mAttemptedToRepairBefore = true; } @@ -119,8 +72,8 @@ index 307c15b72..26d1195dc 100644 + } } - @Override -@@ -701,7 +719,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { + public void prepareWebViewInSystemServer() { +@@ -691,7 +709,7 @@ class WebViewUpdateServiceImpl2 { */ private static WebViewProviderInfo getFallbackProvider(WebViewProviderInfo[] webviewPackages) { for (WebViewProviderInfo provider : webviewPackages) { @@ -130,5 +83,5 @@ index 307c15b72..26d1195dc 100644 } } -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch b/frameworks/base/0010-Allow-signature-spoofing-for-microG-Companion-Servic.patch similarity index 94% rename from frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch rename to frameworks/base/0010-Allow-signature-spoofing-for-microG-Companion-Servic.patch index 946f917..aa5d673 100644 --- a/frameworks/base/0011-Allow-signature-spoofing-for-microG-Companion-Servic.patch +++ b/frameworks/base/0010-Allow-signature-spoofing-for-microG-Companion-Servic.patch @@ -1,7 +1,7 @@ -From 881fb29e6d4510f1691dd9a483fa89367cc32b64 Mon Sep 17 00:00:00 2001 +From 30058cdf576d1496ca63560f878eacf940e36ea2 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Mon, 19 Feb 2024 16:20:04 +0100 -Subject: [PATCH 11/12] Allow signature spoofing for microG Companion/Services +Subject: [PATCH 10/11] Allow signature spoofing for microG Companion/Services This patch enables signature spoofing when the following conditions are met: @@ -43,10 +43,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 4665a72b0..2f73bb836 100644 +index be2f58dc2..3eb3df412 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java -@@ -102,6 +102,7 @@ import android.content.pm.UserPackage; +@@ -103,6 +103,7 @@ import android.content.pm.UserPackage; import android.content.pm.VersionedPackage; import android.os.Binder; import android.os.Build; @@ -54,7 +54,7 @@ index 4665a72b0..2f73bb836 100644 import android.os.IBinder; import android.os.ParcelableException; import android.os.PatternMatcher; -@@ -174,6 +175,7 @@ import java.util.Collections; +@@ -176,6 +177,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -62,7 +62,7 @@ index 4665a72b0..2f73bb836 100644 import java.util.Set; import java.util.UUID; -@@ -422,6 +424,10 @@ public class ComputerEngine implements Computer { +@@ -424,6 +426,10 @@ public class ComputerEngine implements Computer { private final PackageManagerInternal.ExternalSourcesPolicy mExternalSourcesPolicy; private final CrossProfileIntentResolverEngine mCrossProfileIntentResolverEngine; @@ -73,7 +73,7 @@ index 4665a72b0..2f73bb836 100644 // PackageManagerService attributes that are primitives are referenced through the // pms object directly. Primitives are the only attributes so referenced. protected final PackageManagerService mService; -@@ -1481,6 +1487,49 @@ public class ComputerEngine implements Computer { +@@ -1483,6 +1489,49 @@ public class ComputerEngine implements Computer { return result; } @@ -123,7 +123,7 @@ index 4665a72b0..2f73bb836 100644 public final PackageInfo generatePackageInfo(PackageStateInternal ps, @PackageManager.PackageInfoFlagsBits long flags, int userId) { if (!mUserManager.exists(userId)) return null; -@@ -1536,6 +1585,11 @@ public class ComputerEngine implements Computer { +@@ -1538,6 +1587,11 @@ public class ComputerEngine implements Computer { mApexManager.getActivePackageNameForApexModuleName(apexModuleName)); } } @@ -136,10 +136,10 @@ index 4665a72b0..2f73bb836 100644 } 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 a5085fc31..9a1d2bc2b 100644 +index 4c0cee404..a4d192c8e 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp -@@ -74,6 +74,7 @@ cc_library_static { +@@ -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", @@ -147,7 +147,7 @@ index a5085fc31..9a1d2bc2b 100644 "com_android_server_pm_PackageManagerShellCommandDataLoader.cpp", "com_android_server_sensor_SensorService.cpp", "com_android_server_wm_TaskFpsCallbackController.cpp", -@@ -97,6 +98,12 @@ cc_library_static { +@@ -94,6 +95,12 @@ cc_library_static { header_libs: [ "bionic_libc_platform_headers", ], @@ -205,11 +205,11 @@ index 000000000..bbe298097 + +} // namespace android diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp -index 3c55d1824..5fac851d9 100644 +index 09fd8d4ac..0d61a13d2 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp -@@ -59,6 +59,7 @@ int register_android_server_am_LowMemDetector(JNIEnv* env); - int register_android_server_utils_AnrTimer(JNIEnv *env); +@@ -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); @@ -217,7 +217,7 @@ index 3c55d1824..5fac851d9 100644 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_AnrTimer(env); + 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); @@ -225,5 +225,5 @@ index 3c55d1824..5fac851d9 100644 register_android_server_AdbDebuggingManager(env); register_android_server_FaceService(env); -- -2.44.0 +2.48.1 diff --git a/frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch b/frameworks/base/0011-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch similarity index 86% rename from frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch rename to frameworks/base/0011-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch index 4f8baec..3a40baf 100644 --- a/frameworks/base/0012-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch +++ b/frameworks/base/0011-Allow-spoofing-signingInfo-for-microG-Companion-Serv.patch @@ -1,7 +1,7 @@ -From 0c60edf128cc549f20fba38b33984d55c63adc43 Mon Sep 17 00:00:00 2001 +From 31cfef8a4245e49b99fc36cc8eaf7b0452ae9985 Mon Sep 17 00:00:00 2001 From: Jonathan Klee Date: Thu, 12 Dec 2024 15:27:57 +0100 -Subject: [PATCH 12/12] Allow spoofing signingInfo for microG +Subject: [PATCH 11/11] Allow spoofing signingInfo for microG Companion/Services - Spoof PackageInfo signingInfo + signatures so that @@ -14,10 +14,10 @@ Signed-off-by: althafvly 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 2f73bb836..4cf099aed 100644 +index 3eb3df412..6f5813065 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java -@@ -168,6 +168,7 @@ import java.io.FileOutputStream; +@@ -170,6 +170,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; @@ -25,7 +25,7 @@ index 2f73bb836..4cf099aed 100644 import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -@@ -1588,6 +1589,18 @@ public class ComputerEngine implements Computer { +@@ -1590,6 +1591,18 @@ public class ComputerEngine implements Computer { generateFakeSignature(p).ifPresent(fakeSignature -> { packageInfo.signatures = new Signature[]{fakeSignature}; @@ -45,5 +45,5 @@ index 2f73bb836..4cf099aed 100644 return packageInfo; -- -2.44.0 +2.48.1 diff --git a/frameworks/native/0001-sensorservice-Add-support-for-ignoring-broken-sensor.patch b/frameworks/native/0001-sensorservice-Add-support-for-ignoring-broken-sensor.patch index 930e02b..eba4188 100644 --- a/frameworks/native/0001-sensorservice-Add-support-for-ignoring-broken-sensor.patch +++ b/frameworks/native/0001-sensorservice-Add-support-for-ignoring-broken-sensor.patch @@ -1,7 +1,7 @@ -From ccd46a8a09baedf0fcad9648d75ac29468055a8f Mon Sep 17 00:00:00 2001 +From b02d33fe80bed126c8caeebb51ced31e9b0c710e Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 6 Oct 2024 09:06:48 -0400 -Subject: [PATCH 1/3] sensorservice: Add support for ignoring broken sensors +Subject: [PATCH 1/7] sensorservice: Add support for ignoring broken sensors This allows those sensors to be replaced by SensorFusion when possible. @@ -11,7 +11,7 @@ Change-Id: I5509ee1f54fdf4838f6e3b109819a689f483cfc4 1 file changed, 17 insertions(+) diff --git a/services/sensorservice/SensorDevice.cpp b/services/sensorservice/SensorDevice.cpp -index 9c4d1ac..5a95096 100644 +index 9c4d1ace15..5a95096fdb 100644 --- a/services/sensorservice/SensorDevice.cpp +++ b/services/sensorservice/SensorDevice.cpp @@ -17,6 +17,7 @@ @@ -57,5 +57,5 @@ index 9c4d1ac..5a95096 100644 if (sensor.type < DEVICE_PRIVATE_BASE) { sensor.resolution = SensorDeviceUtils::resolutionForSensor(sensor); -- -2.44.0 +2.48.1 diff --git a/frameworks/native/0002-Add-MTK-GED-KPI-support-to-fix-broken-Mediatek-gpufr.patch b/frameworks/native/0002-Add-MTK-GED-KPI-support-to-fix-broken-Mediatek-gpufr.patch index 3ff5f65..77948ac 100644 --- a/frameworks/native/0002-Add-MTK-GED-KPI-support-to-fix-broken-Mediatek-gpufr.patch +++ b/frameworks/native/0002-Add-MTK-GED-KPI-support-to-fix-broken-Mediatek-gpufr.patch @@ -1,7 +1,7 @@ -From 8dd1136bfd5a9dc403dc24839de2cbd1fe5cd273 Mon Sep 17 00:00:00 2001 +From 050301ed102cd6b41756adf114243a3cfa8b70a6 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Sat, 25 Nov 2023 08:15:28 -0500 -Subject: [PATCH 2/3] Add MTK GED KPI support to fix broken Mediatek gpufreq +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. @@ -24,7 +24,7 @@ Change-Id: Ic29a231ea8651efd598083611197aaa9e3c1fbbe 2 files changed, 205 insertions(+) diff --git a/libs/gui/Surface.cpp b/libs/gui/Surface.cpp -index 66e7ddd..32070fa 100644 +index e41f9bbf43..d6863467a3 100644 --- a/libs/gui/Surface.cpp +++ b/libs/gui/Surface.cpp @@ -26,6 +26,9 @@ @@ -279,7 +279,7 @@ index 66e7ddd..32070fa 100644 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 14a3513..e0843a8 100644 +index 14a351316d..e0843a8016 100644 --- a/libs/gui/include/gui/Surface.h +++ b/libs/gui/include/gui/Surface.h @@ -742,6 +742,9 @@ protected: @@ -293,5 +293,5 @@ index 14a3513..e0843a8 100644 } // namespace android -- -2.44.0 +2.48.1 diff --git a/frameworks/native/0003-vibratorservice-Support-optionally-ignoring-vibrator.patch b/frameworks/native/0003-vibratorservice-Support-optionally-ignoring-vibrator.patch index 884ad94..3987492 100644 --- a/frameworks/native/0003-vibratorservice-Support-optionally-ignoring-vibrator.patch +++ b/frameworks/native/0003-vibratorservice-Support-optionally-ignoring-vibrator.patch @@ -1,7 +1,7 @@ -From 399022e4c7686d24d6738ad6a1c939998c6ac801 Mon Sep 17 00:00:00 2001 +From 37580f1924099111b2995e910ed64bb4182b9c39 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Mon, 7 Oct 2024 22:07:58 -0400 -Subject: [PATCH 3/3] vibratorservice: Support optionally ignoring vibrator +Subject: [PATCH 3/7] vibratorservice: Support optionally ignoring vibrator effects On Unihertz Jelly Max the preloaded vibrator HAL is utterly broken. @@ -13,7 +13,7 @@ Change-Id: I308190a225932fba2a4aa1c830c03ab874d8032e 2 files changed, 32 insertions(+) diff --git a/services/vibratorservice/Android.bp b/services/vibratorservice/Android.bp -index 4735ae5..6263b05 100644 +index 4735ae5897..6263b0506f 100644 --- a/services/vibratorservice/Android.bp +++ b/services/vibratorservice/Android.bp @@ -41,6 +41,7 @@ cc_library_shared { @@ -25,7 +25,7 @@ index 4735ae5..6263b05 100644 "libhidlbase", "liblog", diff --git a/services/vibratorservice/VibratorHalWrapper.cpp b/services/vibratorservice/VibratorHalWrapper.cpp -index 4ac1618..ab027bd 100644 +index 3ddc4f2aca..11178659ff 100644 --- a/services/vibratorservice/VibratorHalWrapper.cpp +++ b/services/vibratorservice/VibratorHalWrapper.cpp @@ -17,6 +17,7 @@ @@ -78,7 +78,7 @@ index 4ac1618..ab027bd 100644 } if (mInfoCache.mSupportedBraking.isFailed()) { mInfoCache.mSupportedBraking = getSupportedBrakingInternal(); -@@ -295,6 +322,8 @@ HalResult AidlHalWrapper::alwaysOnDisable(int32_t id) { +@@ -305,6 +332,8 @@ HalResult AidlHalWrapper::alwaysOnDisable(int32_t id) { HalResult AidlHalWrapper::performEffect( Effect effect, EffectStrength strength, const std::function& completionCallback) { @@ -87,7 +87,7 @@ index 4ac1618..ab027bd 100644 HalResult capabilities = getCapabilities(); bool supportsCallback = capabilities.isOk() && static_cast(capabilities.value() & Capabilities::PERFORM_CALLBACK); -@@ -563,6 +592,8 @@ template +@@ -582,6 +611,8 @@ template HalResult HidlHalWrapper::performInternal( perform_fn performFn, sp handle, T effect, EffectStrength strength, const std::function& completionCallback) { @@ -97,5 +97,5 @@ index 4ac1618..ab027bd 100644 int32_t lengthMs; auto effectCallback = [&status, &lengthMs](V1_0::Status retStatus, uint32_t retLengthMs) { -- -2.44.0 +2.48.1 diff --git a/frameworks/native/0004-Revert-Remove-flag-single_hop_screenshots.patch b/frameworks/native/0004-Revert-Remove-flag-single_hop_screenshots.patch new file mode 100644 index 0000000..160c390 --- /dev/null +++ b/frameworks/native/0004-Revert-Remove-flag-single_hop_screenshots.patch @@ -0,0 +1,348 @@ +From b12faaf3064de58caf0f6bfaf7fcac5a47f5024d Mon Sep 17 00:00:00 2001 +From: Peter Cai +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>> 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>> 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>> 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 buffer = +- getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(), +- static_cast(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>> 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 buffer = ++ getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(), ++ static_cast(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 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 buffer = ++ getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(), ++ static_cast(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 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 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 +@@ -7489,7 +7527,7 @@ ftl::SharedFuture SurfaceFlinger::captureScreenshot( + + ftl::SharedFuture 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 SurfaceFlinger::captureScreenshot( + ScreenCaptureResults unusedResults; + ftl::SharedFuture 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 SurfaceFlinger::captureScreenshot( + return renderFuture; + } + ++ftl::SharedFuture SurfaceFlinger::captureScreenshotLegacy( ++ RenderAreaBuilderVariant renderAreaBuilder, GetLayerSnapshotsFunction getLayerSnapshotsFn, ++ const std::shared_ptr& buffer, bool regionSampling, ++ bool grayscale, bool isProtected, bool attachGainmap, ++ const sp& captureListener) { ++ SFTRACE_CALL(); ++ ++ auto takeScreenshotFn = [=, this, renderAreaBuilder = std::move(renderAreaBuilder)]() REQUIRES( ++ kMainThreadContext) mutable -> ftl::SharedFuture { ++ auto layers = getLayerSnapshotsFn(); ++ auto displayState = getDisplayStateFromRenderAreaBuilder(renderAreaBuilder); ++ ++ ScreenCaptureResults captureResults; ++ std::unique_ptr renderArea = ++ std::visit([](auto&& arg) -> std::unique_ptr { 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(base::unexpected(NO_ERROR)).share(); ++ } ++ ++ ftl::SharedFuture 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 future) { ++ return future; ++ }); ++ ++ return chain.share(); ++} ++ + ftl::SharedFuture SurfaceFlinger::renderScreenImpl( + const RenderArea* renderArea, const std::shared_ptr& buffer, +- bool regionSampling, bool grayscale, bool isProtected, ScreenCaptureResults& captureResults, +- std::optional& displayState, ++ bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap, ++ ScreenCaptureResults& captureResults, std::optional& displayState, + std::vector>>& layers) { + SFTRACE_CALL(); + +@@ -7719,9 +7815,15 @@ ftl::SharedFuture SurfaceFlinger::renderScreenImpl( + // + // TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call + // to CompositionEngine::present. +- ftl::SharedFuture presentFuture = mRenderEngine->isThreaded() +- ? ftl::yield(present()).share() +- : mScheduler->schedule(std::move(present)).share(); ++ ftl::SharedFuture 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& displayState, + std::vector>>& layers); + ++ ftl::SharedFuture captureScreenshotLegacy( ++ RenderAreaBuilderVariant, GetLayerSnapshotsFunction, ++ const std::shared_ptr&, bool regionSampling, ++ bool grayscale, bool isProtected, bool attachGainmap, ++ const sp&); ++ + ftl::SharedFuture renderScreenImpl( + const RenderArea*, const std::shared_ptr&, +- bool regionSampling, bool grayscale, bool isProtected, ScreenCaptureResults&, +- std::optional& displayState, ++ bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap, ++ ScreenCaptureResults&, std::optional& displayState, + std::vector>>& 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 + diff --git a/frameworks/native/0005-Revert-Reorder-release-fence-attachment-for-non-thre.patch b/frameworks/native/0005-Revert-Reorder-release-fence-attachment-for-non-thre.patch new file mode 100644 index 0000000..011881d --- /dev/null +++ b/frameworks/native/0005-Revert-Reorder-release-fence-attachment-for-non-thre.patch @@ -0,0 +1,334 @@ +From aa5e6f794b3e2c9f5bdbc40da702b14dd9a1764e Mon Sep 17 00:00:00 2001 +From: Peter Cai +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>> layers; +- auto displayState = +- mFlinger.getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layers); ++ if (FlagManager::getInstance().single_hop_screenshot() && ++ mFlinger.mRenderEngine->isThreaded()) { ++ std::vector> 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>>& layers) const { ++bool SurfaceFlinger::layersHasProtectedLayer(const std::vector>& 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::getSnapshotsFromMainThread( + RenderAreaBuilderVariant& renderAreaBuilder, GetLayerSnapshotsFunction getLayerSnapshotsFn, +- std::vector>>& layers) { ++ std::vector>& 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>> layers; ++ if (FlagManager::getInstance().single_hop_screenshot() && mRenderEngine->isThreaded()) { ++ std::vector> 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> SurfaceFlinger::extractLayerFEs( ++ const std::vector>>& layers) const { ++ std::vector> layerFEs; ++ layerFEs.reserve(layers.size()); ++ for (const auto& [_, layerFE] : layers) { ++ layerFEs.push_back(layerFE); ++ } ++ return layerFEs; ++} ++ + ftl::SharedFuture SurfaceFlinger::captureScreenshot( + const RenderAreaBuilderVariant& renderAreaBuilder, + const std::shared_ptr& buffer, bool regionSampling, + bool grayscale, bool isProtected, bool attachGainmap, + const sp& captureListener, +- std::optional& displayState, +- std::vector>>& layers) { ++ std::optional& displayState, std::vector>& layerFEs) { + SFTRACE_CALL(); + + ScreenCaptureResults captureResults; +@@ -7525,9 +7527,11 @@ ftl::SharedFuture SurfaceFlinger::captureScreenshot( + float displayBrightnessNits = displayState.value().displayBrightnessNits; + float sdrWhitePointNits = displayState.value().sdrWhitePointNits; + ++ // Empty vector needed to pass into renderScreenImpl for legacy path ++ std::vector>> layers; + ftl::SharedFuture 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 SurfaceFlinger::captureScreenshot( + ftl::SharedFuture 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 SurfaceFlinger::captureScreenshotLegacy( + auto takeScreenshotFn = [=, this, renderAreaBuilder = std::move(renderAreaBuilder)]() REQUIRES( + kMainThreadContext) mutable -> ftl::SharedFuture { + 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 SurfaceFlinger::captureScreenshotLegacy( + return ftl::yield(base::unexpected(NO_ERROR)).share(); + } + ++ auto layerFEs = extractLayerFEs(layers); + ftl::SharedFuture 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 SurfaceFlinger::renderScreenImpl( + const RenderArea* renderArea, const std::shared_ptr& buffer, + bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap, + ScreenCaptureResults& captureResults, std::optional& displayState, +- std::vector>>& layers) { ++ std::vector>>& layers, std::vector>& 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 SurfaceFlinger::renderScreenImpl( + captureResults.buffer = capturedBuffer->getBuffer(); + + ui::LayerStack layerStack{ui::DEFAULT_LAYER_STACK}; +- if (!layers.empty()) { +- const sp& layerFE = layers.back().second; ++ if (!layerFEs.empty()) { ++ const sp& layerFE = layerFEs.back(); + layerStack = layerFE->getCompositionState()->outputFilter.layerStack; + } + ++ auto copyLayerFEs = [&layerFEs]() { ++ std::vector> 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 = + mFactory.createCompositionEngine(); + compositionEngine->setRenderEngine(mRenderEngine.get()); + +- std::vector> 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 SurfaceFlinger::renderScreenImpl( + // TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call + // to CompositionEngine::present. + ftl::SharedFuture 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>>& layers) const; ++ bool layersHasProtectedLayer(const std::vector>& layers) const; + + using OutputCompositionState = compositionengine::impl::OutputCompositionState; + + std::optional getSnapshotsFromMainThread( + RenderAreaBuilderVariant& renderAreaBuilder, +- GetLayerSnapshotsFunction getLayerSnapshotsFn, +- std::vector>>& layers); ++ GetLayerSnapshotsFunction getLayerSnapshotsFn, std::vector>& layerFEs); + + void captureScreenCommon(RenderAreaBuilderVariant, GetLayerSnapshotsFunction, + ui::Size bufferSize, ui::PixelFormat, bool allowProtected, +@@ -877,13 +876,19 @@ private: + std::optional 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> extractLayerFEs( ++ const std::vector>>& layers) const; ++ + ftl::SharedFuture captureScreenshot( + const RenderAreaBuilderVariant& renderAreaBuilder, + const std::shared_ptr& buffer, bool regionSampling, + bool grayscale, bool isProtected, bool attachGainmap, + const sp& captureListener, + std::optional& displayState, +- std::vector>>& layers); ++ std::vector>& layerFEs); + + ftl::SharedFuture captureScreenshotLegacy( + RenderAreaBuilderVariant, GetLayerSnapshotsFunction, +@@ -895,7 +900,8 @@ private: + const RenderArea*, const std::shared_ptr&, + bool regionSampling, bool grayscale, bool isProtected, bool attachGainmap, + ScreenCaptureResults&, std::optional& displayState, +- std::vector>>& layers); ++ std::vector>>& layers, ++ std::vector>& 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 + diff --git a/frameworks/native/0006-Revert-Remove-release-fence-flags.patch b/frameworks/native/0006-Revert-Remove-release-fence-flags.patch new file mode 100644 index 0000000..4f4a188 --- /dev/null +++ b/frameworks/native/0006-Revert-Remove-release-fence-flags.patch @@ -0,0 +1,755 @@ +From c2edb476e76d96dc48ed0f5b46367d1b0137e8b7 Mon Sep 17 00:00:00 2001 +From: Peter Cai +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(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(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 ++ + 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 + #include + ++#include + #include + #include + +@@ -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 layer1Fence = sp::make(); ++ sp layer2Fence = sp::make(); ++ sp layer3Fence = sp::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 futureFenceResult, ++ ui::LayerStack) { ++ EXPECT_EQ(FenceResult(layer1Fence), futureFenceResult.get()); ++ }); ++ EXPECT_CALL(*mLayer2.layerFE, onLayerDisplayed(_, _)) ++ .WillOnce([&layer2Fence](ftl::SharedFuture futureFenceResult, ++ ui::LayerStack) { ++ EXPECT_EQ(FenceResult(layer2Fence), futureFenceResult.get()); ++ }); ++ EXPECT_CALL(*mLayer3.layerFE, onLayerDisplayed(_, _)) ++ .WillOnce([&layer3Fence](ftl::SharedFuture 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::make(); ++ frameFences.layerFences.emplace(&mLayer1.hwc2Layer, sp::make()); ++ frameFences.layerFences.emplace(&mLayer2.hwc2Layer, sp::make()); ++ frameFences.layerFences.emplace(&mLayer3.hwc2Layer, sp::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> releasedLayer1 = sp>::make(); ++ sp> releasedLayer2 = sp>::make(); ++ sp> releasedLayer3 = sp>::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 presentFence = sp::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 futureFenceResult, ++ ui::LayerStack) { ++ EXPECT_EQ(FenceResult(presentFence), futureFenceResult.get()); ++ }); ++ EXPECT_CALL(*releasedLayer2, onLayerDisplayed(_, _)) ++ .WillOnce([&presentFence](ftl::SharedFuture futureFenceResult, ++ ui::LayerStack) { ++ EXPECT_EQ(FenceResult(presentFence), futureFenceResult.get()); ++ }); ++ EXPECT_CALL(*releasedLayer3, onLayerDisplayed(_, _)) ++ .WillOnce([&presentFence](ftl::SharedFuture 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 futureFenceResult, + } + } + ++void Layer::onLayerDisplayed(ftl::SharedFuture futureFenceResult, ++ ui::LayerStack layerStack, ++ std::function&& continuation) { ++ sp 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 mergedFences; ++ sp 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::vectoracquireTimeOrFence = 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, ui::LayerStack layerStack, ++ std::function&& continuation = nullptr); + + // Tracks mLastClientCompositionFence and gets the callback handle for this layer. + sp findCallbackHandle(); +@@ -389,6 +391,20 @@ public: + // from the layer. + std::vector mPreviouslyPresentedLayerStacks; + ++ struct FenceAndContinuation { ++ ftl::SharedFuture future; ++ std::function continuation; ++ ++ ftl::SharedFuture chain() const { ++ if (continuation) { ++ return ftl::Future(future).then(continuation).share(); ++ } else { ++ return future; ++ } ++ } ++ }; ++ std::vector 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> 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(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(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(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(fence), +- ui::INVALID_LAYER_STACK); ++ if (FlagManager::getInstance().ce_fence_promise()) { ++ layer->prepareReleaseCallbacks(ftl::yield(fence), ++ ui::INVALID_LAYER_STACK); ++ } else { ++ layer->onLayerDisplayed(ftl::yield(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> layerFEs; + auto displayState = + getSnapshotsFromMainThread(renderAreaBuilder, getLayerSnapshotsFn, layerFEs); +@@ -7623,8 +7655,10 @@ ftl::SharedFuture SurfaceFlinger::captureScreenshotLegacy( + auto takeScreenshotFn = [=, this, renderAreaBuilder = std::move(renderAreaBuilder)]() REQUIRES( + kMainThreadContext) mutable -> ftl::SharedFuture { + 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 SurfaceFlinger::renderScreenImpl( + // TODO(b/196334700) Once we use RenderEngineThreaded everywhere we can always defer the call + // to CompositionEngine::present. + ftl::SharedFuture 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 ++#include + #include + #include + +@@ -126,8 +127,14 @@ status_t TransactionCallbackInvoker::addCallbackHandle(const sp& + if (surfaceControl) { + sp 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 previousReleaseFence; + std::vector> previousReleaseFences; ++ std::vector> previousSharedReleaseFences; + std::variant> acquireTimeOrFence = -1; + nsecs_t latchTime = -1; + std::optional 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 ++#include + #include + + #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 + diff --git a/frameworks/native/0007-Revert-Remove-dead-code-from-LayerFE.patch b/frameworks/native/0007-Revert-Remove-dead-code-from-LayerFE.patch new file mode 100644 index 0000000..d7849ef --- /dev/null +++ b/frameworks/native/0007-Revert-Remove-dead-code-from-LayerFE.patch @@ -0,0 +1,97 @@ +From 76923ab930a6fee15aa477bea3638e09fe7b604a Mon Sep 17 00:00:00 2001 +From: Peter Cai +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 prepareClientComposition( + ClientCompositionTargetSettings&) const = 0; + ++ // Called after the layer is displayed to update the presentation fence ++ virtual void onLayerDisplayed(ftl::SharedFuture, 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::ClientCompositionTargetSettings&)); + ++ MOCK_METHOD(void, onLayerDisplayed, (ftl::SharedFuture, ui::LayerStack), ++ (override)); ++ + MOCK_METHOD0(createReleaseFenceFuture, ftl::Future()); + 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 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 + + namespace android { + + struct CompositionResult { ++ std::vector, ui::LayerStack>> releaseFences; + sp 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, ui::LayerStack) override; + const char* getDebugName() const override; + int32_t getSequence() const override; + bool hasRoundedCorners() const override; +-- +2.48.1 + diff --git a/lineage-sdk/0001-Stop-using-resource-processor.patch b/lineage-sdk/0001-Stop-using-resource-processor.patch new file mode 100644 index 0000000..7e2ed2f --- /dev/null +++ b/lineage-sdk/0001-Stop-using-resource-processor.patch @@ -0,0 +1,24 @@ +From 6acc862452fd91732f63afa4a3829d0e249355e0 Mon Sep 17 00:00:00 2001 +From: Peter Cai +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 + diff --git a/lineage-sdk/0002-Add-spninfo-schema.patch b/lineage-sdk/0002-Add-spninfo-schema.patch new file mode 100644 index 0000000..3e7f7d4 --- /dev/null +++ b/lineage-sdk/0002-Add-spninfo-schema.patch @@ -0,0 +1,133 @@ +From 6cf57340bf1d906438a112942763c12eb35feb51 Mon Sep 17 00:00:00 2001 +From: Peter Cai +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 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +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 getItem(); ++ method public String getNetwork(); ++ method public void setNetwork(String); ++ } ++ ++ public class SensitivePNS { ++ ctor public SensitivePNS(); ++ method public java.util.List 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 + diff --git a/packages/apps/Dialer/0001-Downgrade-target_sdk_version-to-34-for-now.patch b/packages/apps/Dialer/0001-Downgrade-target_sdk_version-to-34-for-now.patch index c73ca22..d3eddbe 100644 --- a/packages/apps/Dialer/0001-Downgrade-target_sdk_version-to-34-for-now.patch +++ b/packages/apps/Dialer/0001-Downgrade-target_sdk_version-to-34-for-now.patch @@ -1,7 +1,7 @@ -From b60353d34c0eef8a6291c11e671a22298b3d6d99 Mon Sep 17 00:00:00 2001 +From 4a576ac73698b2232c51a4b6b3c9a21845801136 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 6 Oct 2024 14:22:49 -0400 -Subject: [PATCH 1/2] Downgrade target_sdk_version to 34 for now +Subject: [PATCH 1/3] Downgrade target_sdk_version to 34 for now --- Android.bp | 1 + @@ -20,5 +20,5 @@ index 388f4c00c..498e7c8f0 100644 srcs: [ "java/**/I*.aidl", -- -2.44.0 +2.48.1 diff --git a/packages/apps/Dialer/0002-Make-java_sdk_library-dependencies-explicit.patch b/packages/apps/Dialer/0002-Make-java_sdk_library-dependencies-explicit.patch index b4c41b2..20157f8 100644 --- a/packages/apps/Dialer/0002-Make-java_sdk_library-dependencies-explicit.patch +++ b/packages/apps/Dialer/0002-Make-java_sdk_library-dependencies-explicit.patch @@ -1,7 +1,7 @@ -From da7c7a335475dc61375b470b1aa6cb425ed54514 Mon Sep 17 00:00:00 2001 +From 080c04159988f202694f087f442e3e32f18d4625 Mon Sep 17 00:00:00 2001 From: Jihoon Kang Date: Fri, 30 Aug 2024 00:29:34 +0000 -Subject: [PATCH 2/2] Make java_sdk_library dependencies explicit +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 @@ -27,5 +27,5 @@ index 498e7c8f0..299c1a6e7 100644 optimize: { proguard_flags_files: [ -- -2.44.0 +2.48.1 diff --git a/packages/apps/Dialer/0003-Opt-out-from-the-resource-processor-for-now.patch b/packages/apps/Dialer/0003-Opt-out-from-the-resource-processor-for-now.patch new file mode 100644 index 0000000..679f9c3 --- /dev/null +++ b/packages/apps/Dialer/0003-Opt-out-from-the-resource-processor-for-now.patch @@ -0,0 +1,24 @@ +From fa83fab06f1bd59551b926a224e0cf4cdfcb86da Mon Sep 17 00:00:00 2001 +From: Peter Cai +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 + diff --git a/packages/apps/Launcher3/0001-Expose-themed-icon-setting-in-ThemePicker.patch b/packages/apps/Launcher3/0001-Expose-themed-icon-setting-in-ThemePicker.patch index ce9567d..486e8d4 100644 --- a/packages/apps/Launcher3/0001-Expose-themed-icon-setting-in-ThemePicker.patch +++ b/packages/apps/Launcher3/0001-Expose-themed-icon-setting-in-ThemePicker.patch @@ -1,4 +1,4 @@ -From 88275c8b0d207286b34284ad69090b29b705c4c1 Mon Sep 17 00:00:00 2001 +From 09d183a632ab5ba6ef0f1f76765fc94ef24035f4 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Mon, 11 Oct 2021 20:48:44 -0700 Subject: [PATCH 1/3] Expose themed icon setting in ThemePicker @@ -24,7 +24,7 @@ index 517bd6d..89291c1 100644 diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml -index c6e2d8c..1d7405e 100644 +index 80d8154..813ef75 100644 --- a/quickstep/AndroidManifest-launcher.xml +++ b/quickstep/AndroidManifest-launcher.xml @@ -65,6 +65,9 @@ @@ -38,5 +38,5 @@ index c6e2d8c..1d7405e 100644 -- -2.44.0 +2.48.1 diff --git a/packages/apps/Launcher3/0002-Disable-QSB-in-BuildConfig.patch b/packages/apps/Launcher3/0002-Disable-QSB-in-BuildConfig.patch index dfc0614..e509abe 100644 --- a/packages/apps/Launcher3/0002-Disable-QSB-in-BuildConfig.patch +++ b/packages/apps/Launcher3/0002-Disable-QSB-in-BuildConfig.patch @@ -1,4 +1,4 @@ -From 8f504046ec34c16fbd8a1d2da8294ab84e3817fa Mon Sep 17 00:00:00 2001 +From c2cafe53a8b6acf97dc9a634ada0d4ab53b5fd9f Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Fri, 7 Jul 2023 18:13:32 -0400 Subject: [PATCH 2/3] Disable QSB in 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.44.0 +2.48.1 diff --git a/packages/apps/Launcher3/0003-Properly-expose-GridCustomizationsProvider.patch b/packages/apps/Launcher3/0003-Properly-expose-GridCustomizationsProvider.patch index 5e9c25f..a139ad7 100644 --- a/packages/apps/Launcher3/0003-Properly-expose-GridCustomizationsProvider.patch +++ b/packages/apps/Launcher3/0003-Properly-expose-GridCustomizationsProvider.patch @@ -1,4 +1,4 @@ -From 38d5e4a3a7bc358e77e7f9e2e8d2f4d1dfaed0b5 Mon Sep 17 00:00:00 2001 +From de7b698be0f1e01b337672d919854e3a28b8685f Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Fri, 1 Nov 2019 23:17:59 +0100 Subject: [PATCH 3/3] Properly expose GridCustomizationsProvider @@ -24,5 +24,5 @@ index 80d2eac..53bdfff 100644 - Search Settings +@@ -13910,4 +13910,10 @@ + Circle to Search + + Touch and hold the Home button or the navigation handle to search using the content on your screen. + + + Global VPN @@ -176,5 +176,5 @@ index 00c8f59..c4f447f 100644 private static final String TAG = "CannotConnect"; private static final String ARG_VPN_LABEL = "label"; -- -2.44.0 +2.48.1 diff --git a/packages/apps/ThemePicker/0001-Add-wallpaper-privapp-whitelist.patch b/packages/apps/ThemePicker/0001-Add-wallpaper-privapp-whitelist.patch index 81d4696..bbd0589 100644 --- a/packages/apps/ThemePicker/0001-Add-wallpaper-privapp-whitelist.patch +++ b/packages/apps/ThemePicker/0001-Add-wallpaper-privapp-whitelist.patch @@ -1,4 +1,4 @@ -From 7ef009b2434c5cf9f7d4ec9f114336d6a43d888f Mon Sep 17 00:00:00 2001 +From bc50b3024c266f307ce804ef1887062cf1f34944 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Fri, 1 Nov 2019 21:14:29 +0100 Subject: [PATCH 1/4] Add wallpaper privapp whitelist @@ -61,5 +61,5 @@ index 0000000..e3f3b65 + + -- -2.44.0 +2.48.1 diff --git a/packages/apps/ThemePicker/0002-Add-wallpaper-default-permissions.patch b/packages/apps/ThemePicker/0002-Add-wallpaper-default-permissions.patch index 40a73d6..d8876d5 100644 --- a/packages/apps/ThemePicker/0002-Add-wallpaper-default-permissions.patch +++ b/packages/apps/ThemePicker/0002-Add-wallpaper-default-permissions.patch @@ -1,4 +1,4 @@ -From 0e064d23f1b0dc300651d9d680927ecb26aa9013 Mon Sep 17 00:00:00 2001 +From b255f705538f7e55d445c60c1a12f60dd309df1d Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Tue, 15 Sep 2020 03:27:19 +0200 Subject: [PATCH 2/4] Add wallpaper default permissions @@ -82,5 +82,5 @@ index 0000000..41b23ce + + -- -2.44.0 +2.48.1 diff --git a/packages/apps/ThemePicker/0003-Specify-we-read-and-write-launcher-settings.patch b/packages/apps/ThemePicker/0003-Specify-we-read-and-write-launcher-settings.patch index c041a3d..3ccf62b 100644 --- a/packages/apps/ThemePicker/0003-Specify-we-read-and-write-launcher-settings.patch +++ b/packages/apps/ThemePicker/0003-Specify-we-read-and-write-launcher-settings.patch @@ -1,4 +1,4 @@ -From 4c72c9bf019b1da8aa0888d1f4f22cc026aa87bf Mon Sep 17 00:00:00 2001 +From 623014b94ae4bb08328684bb077b05973ab858eb Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Fri, 1 Nov 2019 23:17:08 +0100 Subject: [PATCH 3/4] Specify we read and write launcher settings @@ -23,5 +23,5 @@ index f89ff6e..95f5b0e 100755 tools:replace="android:icon,android:name" android:extractNativeLibs="false" -- -2.44.0 +2.48.1 diff --git a/packages/apps/ThemePicker/0004-Add-permission-for-launcher-preview-rendering.patch b/packages/apps/ThemePicker/0004-Add-permission-for-launcher-preview-rendering.patch index 3d4373e..8734c72 100644 --- a/packages/apps/ThemePicker/0004-Add-permission-for-launcher-preview-rendering.patch +++ b/packages/apps/ThemePicker/0004-Add-permission-for-launcher-preview-rendering.patch @@ -1,4 +1,4 @@ -From 30d9a5682d8ae85d7f621b6509f7445fc70bae70 Mon Sep 17 00:00:00 2001 +From 5880006d7be5eeb3fff8a6d9154ae16e2e6ffac7 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Tue, 5 Oct 2021 22:40:58 -0700 Subject: [PATCH 4/4] Add permission for launcher preview rendering @@ -33,5 +33,5 @@ index e3f3b65..47133be 100644 -- -2.44.0 +2.48.1 diff --git a/packages/modules/Bluetooth/0002-audio_hal_interface-Optionally-use-sysbta-HAL.patch b/packages/modules/Bluetooth/0001-audio_hal_interface-Optionally-use-sysbta-HAL.patch similarity index 57% rename from packages/modules/Bluetooth/0002-audio_hal_interface-Optionally-use-sysbta-HAL.patch rename to packages/modules/Bluetooth/0001-audio_hal_interface-Optionally-use-sysbta-HAL.patch index e28853d..8cfbae3 100644 --- a/packages/modules/Bluetooth/0002-audio_hal_interface-Optionally-use-sysbta-HAL.patch +++ b/packages/modules/Bluetooth/0001-audio_hal_interface-Optionally-use-sysbta-HAL.patch @@ -1,19 +1,86 @@ -From 5949d86e40befe38ef57fc0fbbf18d2fe464332b Mon Sep 17 00:00:00 2001 +From 73a87c7bcc594cc3da4b9c2394cda066d36bb557 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 24 Aug 2022 15:45:18 -0400 -Subject: [PATCH 2/2] audio_hal_interface: Optionally use sysbta HAL +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 +++++++++-- - 3 files changed, 20 insertions(+), 6 deletions(-) + 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 BluetoothAudioClientInterface::GetAudioCapabilities() const { +@@ -72,7 +72,7 @@ std::vector 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 + // 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 15a20be5b9..412a1ab888 100644 +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 @@ -43,7 +110,7 @@ index 15a20be5b9..412a1ab888 100644 } if (provider_factory == nullptr) { -@@ -184,7 +184,7 @@ void BluetoothAudioClientInterface::FetchAudioProvider() { +@@ -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( @@ -53,7 +120,7 @@ index 15a20be5b9..412a1ab888 100644 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 b5bb309ab2..e73009ba69 100644 +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 @@ @@ -64,7 +131,7 @@ index b5bb309ab2..e73009ba69 100644 namespace bluetooth { namespace audio { -@@ -163,6 +164,12 @@ protected: +@@ -150,6 +151,12 @@ protected: // "android.hardware.bluetooth.audio.IBluetoothAudioProviderFactory/default"; static inline const std::string kDefaultAudioProviderFactoryInterface = std::string() + IBluetoothAudioProviderFactory::descriptor + "/default"; @@ -78,7 +145,7 @@ index b5bb309ab2..e73009ba69 100644 private: IBluetoothTransportInstance* transport_; diff --git a/system/audio_hal_interface/hal_version_manager.cc b/system/audio_hal_interface/hal_version_manager.cc -index 19c48c58da..b19da332c0 100644 +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 @@ @@ -89,7 +156,7 @@ index 19c48c58da..b19da332c0 100644 #include -@@ -33,6 +34,12 @@ using ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProviderFactor +@@ -32,6 +33,12 @@ using ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProviderFactor static const std::string kDefaultAudioProviderFactoryInterface = std::string() + IBluetoothAudioProviderFactory::descriptor + "/default"; @@ -102,7 +169,7 @@ index 19c48c58da..b19da332c0 100644 std::string toString(BluetoothAudioHalTransport transport) { switch (transport) { -@@ -73,7 +80,7 @@ BluetoothAudioHalVersion GetAidlInterfaceVersion() { +@@ -72,7 +79,7 @@ BluetoothAudioHalVersion GetAidlInterfaceVersion() { static auto aidl_version = []() -> BluetoothAudioHalVersion { int version = 0; auto provider_factory = IBluetoothAudioProviderFactory::fromBinder(::ndk::SpAIBinder( @@ -111,7 +178,7 @@ index 19c48c58da..b19da332c0 100644 if (provider_factory == nullptr) { log::error("getInterfaceVersion: Can't get aidl version from unknown factory"); -@@ -138,7 +145,7 @@ android::sp HalVersionManager::GetProviders +@@ -137,7 +144,7 @@ android::sp HalVersionManager::GetProviders HalVersionManager::HalVersionManager() { hal_transport_ = BluetoothAudioHalTransport::UNKNOWN; @@ -121,5 +188,5 @@ index 19c48c58da..b19da332c0 100644 hal_transport_ = BluetoothAudioHalTransport::AIDL; return; -- -2.44.0 +2.48.1 diff --git a/packages/modules/Bluetooth/0001-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch b/packages/modules/Bluetooth/0002-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch similarity index 66% rename from packages/modules/Bluetooth/0001-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch rename to packages/modules/Bluetooth/0002-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch index e763608..d03275d 100644 --- a/packages/modules/Bluetooth/0001-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch +++ b/packages/modules/Bluetooth/0002-Don-t-crash-on-status-UNSUPPORTED_REMOTE_OR_LMP_FEAT.patch @@ -1,7 +1,7 @@ -From 3aa174edd50a176986ab15f91bcb87b7cec160fa Mon Sep 17 00:00:00 2001 +From 29c09f59e76930a00cefd474c96eb40e63a475f5 Mon Sep 17 00:00:00 2001 From: DerTeufel Date: Wed, 4 Jan 2023 21:39:37 +0100 -Subject: [PATCH 1/2] Don't crash on status:UNSUPPORTED_REMOTE_OR_LMP_FEATURE +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 @@ -11,22 +11,22 @@ Change-Id: Ic57d6631185370cbfdeafdac00801c6ca27fb755 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/system/gd/hci/hci_layer.cc b/system/gd/hci/hci_layer.cc -index 70a5f43b56..07d5d25a5c 100644 +index 1311815633..7b913888b2 100644 --- a/system/gd/hci/hci_layer.cc +++ b/system/gd/hci/hci_layer.cc -@@ -216,8 +216,10 @@ struct HciLayer::impl { - - bool is_vendor_specific = static_cast(op_code) & (0x3f << 10); +@@ -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 && !command_queue_.front().waiting_for_status_) && +- 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 && !command_queue_.front().waiting_for_status_) && ++ if ((is_vendor_specific && (is_status && waiting_for == WaitingFor::COMPLETE) && + (status_view.IsValid() && status_view.GetStatus() == ErrorCode::UNKNOWN_HCI_COMMAND)) || -+ ((is_status && !command_queue_.front().waiting_for_status_) && ++ ((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.44.0 +2.48.1