From 41e2669884581ad0bb43ee57fe52fa261048ca0c Mon Sep 17 00:00:00 2001 From: Tad <tad@spotco.us> Date: Sat, 17 Jun 2023 14:22:37 -0400 Subject: [PATCH] 17.1: switch to flamefire's ASB topics This gets us ~9 extra patches Signed-off-by: Tad <tad@spotco.us> --- .../android_frameworks_av/358555.patch | 75 - .../351411-backport.patch | 47 - .../android_frameworks_base/351412.patch | 38 - .../351413-backport.patch | 528 -------- .../351414-backport.patch | 53 - .../android_frameworks_base/351415.patch | 41 - .../android_frameworks_base/351436.patch | 41 - .../android_frameworks_base/352555.patch | 140 -- .../android_frameworks_base/353117.patch | 82 -- .../android_frameworks_base/353944.patch | 76 -- .../android_frameworks_base/353945.patch | 33 - .../android_frameworks_base/353946.patch | 71 - .../android_frameworks_base/353947.patch | 34 - .../353948-backport.patch | 430 ------ .../353949-backport.patch | 152 --- .../353950-backport.patch | 134 -- .../353951-backport.patch | 241 ---- .../355763-backport.patch | 85 -- .../android_frameworks_base/355764.patch | 53 - .../355765-backport.patch | 81 -- .../355766-backport.patch | 138 -- .../android_frameworks_base/355767.patch | 74 - .../android_frameworks_base/358556.patch | 35 - .../android_frameworks_base/358557.patch | 106 -- .../android_frameworks_base/358560.patch | 167 --- .../358561-backport.patch | 79 -- .../358562-backport.patch | 231 ---- .../358564-backport.patch | 39 - .../358732-backport.patch | 85 -- .../353953-backport.patch | 138 -- .../android_frameworks_native/355772.patch | 35 - .../android_frameworks_native/355773.patch | 67 - .../android_frameworks_native/355774.patch | 71 - .../351437-backport.patch | 250 ---- .../358565-backport.patch | 28 - .../351439-backport.patch | 120 -- .../351440-backport.patch | 378 ------ .../351441.patch | 45 - .../353956.patch | 42 - .../358566.patch | 190 --- .../358567-backport.patch | 1204 ----------------- .../358568-backport.patch | 28 - .../358578.patch | 27 - .../353957-backport.patch | 47 - .../353958-backport.patch | 60 - .../353959.patch | 68 - .../355777-backport.patch | 443 ------ .../358579-backport.patch | 80 -- .../android_system_bt/351443.patch | 41 - .../android_system_bt/351444.patch | 39 - .../android_system_bt/351445.patch | 75 - .../android_system_bt/353960.patch | 54 - .../android_system_bt/353961.patch | 34 - .../android_system_bt/358580.patch | 107 -- .../android_system_bt/358581.patch | 141 -- .../android_system_bt/358582.patch | 82 -- .../android_system_nfc/353962.patch | 29 - .../353963.patch | 45 - .../353964.patch | 29 - .../351448.patch | 41 - .../351449.patch | 39 - .../351450.patch | 78 -- .../351451.patch | 100 -- .../353967.patch | 34 - .../353968.patch | 49 - .../358583.patch | 109 -- .../358584.patch | 139 -- .../358585.patch | 93 -- Scripts/LineageOS-14.1/Functions.sh | 2 +- Scripts/LineageOS-16.0/Functions.sh | 28 +- Scripts/LineageOS-17.1/Functions.sh | 6 +- Scripts/LineageOS-17.1/Patch.sh | 98 +- Scripts/LineageOS-18.1/Functions.sh | 3 +- Scripts/LineageOS-19.1/Functions.sh | 3 +- 74 files changed, 23 insertions(+), 8185 deletions(-) delete mode 100644 Patches/LineageOS-17.1/android_frameworks_av/358555.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/351411-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/351412.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/351413-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/351414-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/351415.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/351436.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/352555.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353117.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353944.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353945.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353946.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353947.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353948-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353949-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353950-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/353951-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/355763-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/355764.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/355765-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/355766-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/355767.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358556.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358557.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358560.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358561-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358562-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358564-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_base/358732-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_native/353953-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_native/355772.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_native/355773.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_native/355774.patch delete mode 100644 Patches/LineageOS-17.1/android_frameworks_opt_net_wifi/351437-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Car_Settings/358565-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_PermissionController/351439-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Settings/351440-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Settings/351441.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Settings/353956.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Settings/358566.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Settings/358567-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_Settings/358568-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_apps_TvSettings/358578.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_providers_MediaProvider/353957-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_services_Telecomm/353958-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_services_Telecomm/353959.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_services_Telecomm/355777-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_packages_services_Telecomm/358579-backport.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/351443.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/351444.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/351445.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/353960.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/353961.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/358580.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/358581.patch delete mode 100644 Patches/LineageOS-17.1/android_system_bt/358582.patch delete mode 100644 Patches/LineageOS-17.1/android_system_nfc/353962.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_nxp_opensource_commonsys_external_libnfc-nci/353963.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_nxp_opensource_pn5xx_halimpl/353964.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351448.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351449.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351450.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351451.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353967.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353968.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358583.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358584.patch delete mode 100644 Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358585.patch diff --git a/Patches/LineageOS-17.1/android_frameworks_av/358555.patch b/Patches/LineageOS-17.1/android_frameworks_av/358555.patch deleted file mode 100644 index cdbfef79..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_av/358555.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Ray Essick <essick@google.com> -Date: Mon, 27 Mar 2023 18:16:46 -0500 -Subject: [PATCH] Fix NuMediaExtractor::readSampleData buffer Handling - -readSampleData() did not initialize buffer before filling it, -leading to OOB memory references. Correct and clarify the book -keeping around output buffer management. - -Bug: 275418191 -Test: CtsMediaExtractorTestCases w/debug messages -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:943fc12219b21d2a98f0ddc070b9b316a6f5d412) -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:84c69bca81175feb2fd97ebb22e432ee41572786) -Merged-In: Ie744f118526f100d82a312c64f7c6fcf20773b6d -Change-Id: Ie744f118526f100d82a312c64f7c6fcf20773b6d ---- - media/libstagefright/NuMediaExtractor.cpp | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/media/libstagefright/NuMediaExtractor.cpp b/media/libstagefright/NuMediaExtractor.cpp -index 680d426d96..ddab6d3923 100644 ---- a/media/libstagefright/NuMediaExtractor.cpp -+++ b/media/libstagefright/NuMediaExtractor.cpp -@@ -595,9 +595,11 @@ status_t NuMediaExtractor::appendVorbisNumPageSamples( - numPageSamples = -1; - } - -+ // insert, including accounting for the space used. - memcpy((uint8_t *)buffer->data() + mbuf->range_length(), - &numPageSamples, - sizeof(numPageSamples)); -+ buffer->setRange(buffer->offset(), buffer->size() + sizeof(numPageSamples)); - - uint32_t type; - const void *data; -@@ -646,6 +648,8 @@ status_t NuMediaExtractor::readSampleData(const sp<ABuffer> &buffer) { - - ssize_t minIndex = fetchAllTrackSamples(); - -+ buffer->setRange(0, 0); // start with an empty buffer -+ - if (minIndex < 0) { - return ERROR_END_OF_STREAM; - } -@@ -661,25 +665,25 @@ status_t NuMediaExtractor::readSampleData(const sp<ABuffer> &buffer) { - sampleSize += sizeof(int32_t); - } - -+ // capacity() is ok since we cleared out the buffer - if (buffer->capacity() < sampleSize) { - return -ENOMEM; - } - -+ const size_t srclen = it->mBuffer->range_length(); - const uint8_t *src = - (const uint8_t *)it->mBuffer->data() - + it->mBuffer->range_offset(); - -- memcpy((uint8_t *)buffer->data(), src, it->mBuffer->range_length()); -+ memcpy((uint8_t *)buffer->data(), src, srclen); -+ buffer->setRange(0, srclen); - - status_t err = OK; - if (info->mTrackFlags & kIsVorbis) { -+ // adjusts range when it inserts the extra bits - err = appendVorbisNumPageSamples(it->mBuffer, buffer); - } - -- if (err == OK) { -- buffer->setRange(0, sampleSize); -- } -- - return err; - } - diff --git a/Patches/LineageOS-17.1/android_frameworks_base/351411-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/351411-backport.patch deleted file mode 100644 index a9aae95e..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/351411-backport.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Julia Reynolds <juliacr@google.com> -Date: Mon, 16 May 2022 15:28:24 -0400 -Subject: [PATCH] Move service initialization - -Occasionally ILockSettings can fail to be initialized otherwise -Fixes: 232714129 -Test: boot (and eventually bootstress/reboot-long) - -Change-Id: I2f9f9bdba37f4ebfaea56c1a6662f0474ae8a002 -Merged-In: I2f9f9bdba37f4ebfaea56c1a6662f0474ae8a002 -(cherry picked from commit 8e278543bd290d4b6c417758554d6dee93a4fe74) -(cherry picked from commit caa5a22ea0c401c4eef548fb8161820beda3ff13) -Merged-In: I2f9f9bdba37f4ebfaea56c1a6662f0474ae8a002 ---- - .../server/notification/NotificationManagerService.java | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java -index 347811d82862..c9831781b543 100755 ---- a/services/core/java/com/android/server/notification/NotificationManagerService.java -+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java -@@ -1567,7 +1567,6 @@ public class NotificationManagerService extends SystemService { - } - } - -- private LockPatternUtils mLockPatternUtils; - private StrongAuthTracker mStrongAuthTracker; - - public NotificationManagerService(Context context) { -@@ -1761,7 +1760,6 @@ public class NotificationManagerService extends SystemService { - - mHandler = new WorkerHandler(looper); - mRankingThread.start(); -- mLockPatternUtils = new LockPatternUtils(getContext()); - mStrongAuthTracker = new StrongAuthTracker(getContext()); - String[] extractorNames; - try { -@@ -2059,7 +2057,7 @@ public class NotificationManagerService extends SystemService { - mRoleObserver = new RoleObserver(getContext().getSystemService(RoleManager.class), - mPackageManager, getContext().getMainExecutor()); - mRoleObserver.init(); -- mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker); -+ new LockPatternUtils(getContext()).registerStrongAuthTracker(mStrongAuthTracker); - } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { - // This observer will force an update when observe is called, causing us to - // bind to listener services. diff --git a/Patches/LineageOS-17.1/android_frameworks_base/351412.patch b/Patches/LineageOS-17.1/android_frameworks_base/351412.patch deleted file mode 100644 index 9e85084d..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/351412.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alex Johnston <acjohnston@google.com> -Date: Tue, 5 Oct 2021 11:44:37 +0000 -Subject: [PATCH] Stop managed profile owner granting READ_SMS - -Reason: There is only one telephony stack shared -between the personal and work profile. - -Bug: 194382185 -Bug: 189942529 -Test: build -Change-Id: If0d27a317a7c0ee46af371b30208327e5636c7cf -(cherry picked from commit 87f37319bf7ee22c6e7c29432b6c9bbce0fdb591) -Merged-In: If0d27a317a7c0ee46af371b30208327e5636c7cf ---- - core/java/android/app/admin/DevicePolicyManager.java | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java -index 08e6ff318fbc..5e263b0d05b6 100644 ---- a/core/java/android/app/admin/DevicePolicyManager.java -+++ b/core/java/android/app/admin/DevicePolicyManager.java -@@ -8836,6 +8836,15 @@ public class DevicePolicyManager { - * {@link android.os.Build.VERSION_CODES#M} the app-op matching the permission is set to - * {@link android.app.AppOpsManager#MODE_IGNORED}, but the permission stays granted. - * -+ * Control over the following permissions are restricted for managed profile owners: -+ * <ul> -+ * <li>Manifest.permission.READ_SMS</li> -+ * </ul> -+ * <p> -+ * A managed profile owner may not grant these permissions (i.e. call this method with any of -+ * the permissions listed above and {@code grantState} of -+ * {@code #PERMISSION_GRANT_STATE_GRANTED}), but may deny them. -+ * - * @param admin Which profile or device owner this request is associated with. - * @param packageName The application to grant or revoke a permission to. - * @param permission The permission to grant or revoke. diff --git a/Patches/LineageOS-17.1/android_frameworks_base/351413-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/351413-backport.patch deleted file mode 100644 index 7e67aec0..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/351413-backport.patch +++ /dev/null @@ -1,528 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Wenhao Wang <wenhaowang@google.com> -Date: Tue, 30 Aug 2022 11:09:46 -0700 -Subject: [PATCH] Enable user graularity for lockdown mode -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The NotificationManagerService registers a LockPatternUtils.StrongAuthTracker -to observe the StrongAuth changes of every user. -More specifically, it’s the STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN flag. -Via this flag, NotificationManagerService can perform the following operations -when the user enter or exit lockdown mode: - -Enter lockdown: -1. Remove all the notifications belonging to the user. -2. Set the local flag to indicate the lockdown is on for the user. - The local flag will suppress the user's notifications on the - post, remove and update functions. - -Exit lockdown: -1. Clear the local flag to indicate the lockdown is off for the user. -2. Repost the user’s notifications (suppressed during lockdown mode). - -The CL also updates corresponding tests. - -Bug: 173721373 -Bug: 250743174 -Test: atest NotificationManagerServiceTest -Test: atest NotificationListenersTest -Ignore-AOSP-First: pending fix for a security issue. - -Change-Id: I4f30e56550729db7d673a92d2a1250509713f36d -Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d -(cherry picked from commit de3b12fca23178d8c821058261572449b67d5967) -(cherry picked from commit 5e40f39f5bd4ae769d79ce022a64f1345512b65d) -Merged-In: I4f30e56550729db7d673a92d2a1250509713f36d ---- - .../NotificationManagerService.java | 75 ++++++---- - .../NotificationListenersTest.java | 132 +++++++++++------- - .../NotificationManagerServiceTest.java | 72 ++++++++-- - 3 files changed, 191 insertions(+), 88 deletions(-) - -diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java -index c9831781b543..7ae80d927aaa 100755 ---- a/services/core/java/com/android/server/notification/NotificationManagerService.java -+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java -@@ -1535,34 +1535,39 @@ public class NotificationManagerService extends SystemService { - return (haystack & needle) != 0; - } - -- public boolean isInLockDownMode() { -- return mIsInLockDownMode; -+ // Return whether the user is in lockdown mode. -+ // If the flag is not set, we assume the user is not in lockdown. -+ public boolean isInLockDownMode(int userId) { -+ return mUserInLockDownMode.get(userId, false); - } - - @Override - public synchronized void onStrongAuthRequiredChanged(int userId) { - boolean userInLockDownModeNext = containsFlag(getStrongAuthForUser(userId), - STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); -- mUserInLockDownMode.put(userId, userInLockDownModeNext); -- boolean isInLockDownModeNext = mUserInLockDownMode.indexOfValue(true) != -1; - -- if (mIsInLockDownMode == isInLockDownModeNext) { -+ // Nothing happens if the lockdown mode of userId keeps the same. -+ if (userInLockDownModeNext == isInLockDownMode(userId)) { - return; - } - -- if (isInLockDownModeNext) { -- cancelNotificationsWhenEnterLockDownMode(); -+ // When the lockdown mode is changed, we perform the following steps. -+ // If the userInLockDownModeNext is true, all the function calls to -+ // notifyPostedLocked and notifyRemovedLocked will not be executed. -+ // The cancelNotificationsWhenEnterLockDownMode calls notifyRemovedLocked -+ // and postNotificationsWhenExitLockDownMode calls notifyPostedLocked. -+ // So we shall call cancelNotificationsWhenEnterLockDownMode before -+ // we set mUserInLockDownMode as true. -+ // On the other hand, if the userInLockDownModeNext is false, we shall call -+ // postNotificationsWhenExitLockDownMode after we put false into mUserInLockDownMode -+ if (userInLockDownModeNext) { -+ cancelNotificationsWhenEnterLockDownMode(userId); - } - -- // When the mIsInLockDownMode is true, both notifyPostedLocked and -- // notifyRemovedLocked will be dismissed. So we shall call -- // cancelNotificationsWhenEnterLockDownMode before we set mIsInLockDownMode -- // as true and call postNotificationsWhenExitLockDownMode after we set -- // mIsInLockDownMode as false. -- mIsInLockDownMode = isInLockDownModeNext; -+ mUserInLockDownMode.put(userId, userInLockDownModeNext); - -- if (!isInLockDownModeNext) { -- postNotificationsWhenExitLockDownMode(); -+ if (!userInLockDownModeNext) { -+ postNotificationsWhenExitLockDownMode(userId); - } - } - } -@@ -7579,11 +7584,14 @@ public class NotificationManagerService extends SystemService { - } - } - -- private void cancelNotificationsWhenEnterLockDownMode() { -+ private void cancelNotificationsWhenEnterLockDownMode(int userId) { - synchronized (mNotificationLock) { - int numNotifications = mNotificationList.size(); - for (int i = 0; i < numNotifications; i++) { - NotificationRecord rec = mNotificationList.get(i); -+ if (rec.getUser().getIdentifier() != userId) { -+ continue; -+ } - mListeners.notifyRemovedLocked(rec, REASON_CANCEL_ALL, - rec.getStats()); - } -@@ -7591,14 +7599,23 @@ public class NotificationManagerService extends SystemService { - } - } - -- private void postNotificationsWhenExitLockDownMode() { -+ private void postNotificationsWhenExitLockDownMode(int userId) { - synchronized (mNotificationLock) { - int numNotifications = mNotificationList.size(); -+ // Set the delay to spread out the burst of notifications. -+ long delay = 0; - for (int i = 0; i < numNotifications; i++) { - NotificationRecord rec = mNotificationList.get(i); -- mListeners.notifyPostedLocked(rec, rec); -+ if (rec.getUser().getIdentifier() != userId) { -+ continue; -+ } -+ mHandler.postDelayed(() -> { -+ synchronized (mNotificationLock) { -+ mListeners.notifyPostedLocked(rec, rec); -+ } -+ }, delay); -+ delay += 20; - } -- - } - } - -@@ -7777,12 +7794,15 @@ public class NotificationManagerService extends SystemService { - * notifications visible to the given listener. - */ - @GuardedBy("mNotificationLock") -- private NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { -+ NotificationRankingUpdate makeRankingUpdateLocked(ManagedServiceInfo info) { - final int N = mNotificationList.size(); - final ArrayList<NotificationListenerService.Ranking> rankings = new ArrayList<>(); - - for (int i = 0; i < N; i++) { - NotificationRecord record = mNotificationList.get(i); -+ if (isInLockDownMode(record.getUser().getIdentifier())) { -+ continue; -+ } - if (!isVisibleToListener(record.sbn, info)) { - continue; - } -@@ -7818,8 +7838,8 @@ public class NotificationManagerService extends SystemService { - rankings.toArray(new NotificationListenerService.Ranking[0])); - } - -- boolean isInLockDownMode() { -- return mStrongAuthTracker.isInLockDownMode(); -+ boolean isInLockDownMode(int userId) { -+ return mStrongAuthTracker.isInLockDownMode(userId); - } - - boolean hasCompanionDevice(ManagedServiceInfo info) { -@@ -7854,7 +7874,8 @@ public class NotificationManagerService extends SystemService { - ServiceManager.getService(Context.COMPANION_DEVICE_SERVICE)); - } - -- private boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { -+ @VisibleForTesting -+ boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { - if (!listener.enabledAndUserMatches(sbn.getUserId())) { - return false; - } -@@ -8454,7 +8475,7 @@ public class NotificationManagerService extends SystemService { - @GuardedBy("mNotificationLock") - void notifyPostedLocked(NotificationRecord r, NotificationRecord old, - boolean notifyAllListeners) { -- if (isInLockDownMode()) { -+ if (isInLockDownMode(r.getUser().getIdentifier())) { - return; - } - -@@ -8520,7 +8541,7 @@ public class NotificationManagerService extends SystemService { - @GuardedBy("mNotificationLock") - public void notifyRemovedLocked(NotificationRecord r, int reason, - NotificationStats notificationStats) { -- if (isInLockDownMode()) { -+ if (isInLockDownMode(r.getUser().getIdentifier())) { - return; - } - -@@ -8575,10 +8596,6 @@ public class NotificationManagerService extends SystemService { - */ - @GuardedBy("mNotificationLock") - public void notifyRankingUpdateLocked(List<NotificationRecord> changedHiddenNotifications) { -- if (isInLockDownMode()) { -- return; -- } -- - boolean isHiddenRankingUpdate = changedHiddenNotifications != null - && changedHiddenNotifications.size() > 0; - -diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java -index 793739bfe8f5..e04339fe5ee9 100644 ---- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java -+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java -@@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; - import android.app.INotificationManager; - import android.content.pm.IPackageManager; - import android.content.pm.PackageManager; -+import android.os.UserHandle; - import android.service.notification.NotificationStats; - import android.service.notification.StatusBarNotification; - import android.testing.TestableContext; -@@ -40,8 +41,6 @@ import org.mockito.Mock; - import org.mockito.MockitoAnnotations; - import org.mockito.internal.util.reflection.FieldSetter; - --import java.util.List; -- - public class NotificationListenersTest extends UiServiceTestCase { - - @Mock -@@ -70,46 +69,65 @@ public class NotificationListenersTest extends UiServiceTestCase { - - @Test - public void testNotifyPostedLockedInLockdownMode() { -- NotificationRecord r = mock(NotificationRecord.class); -- NotificationRecord old = mock(NotificationRecord.class); -- -- // before the lockdown mode -- when(mNm.isInLockDownMode()).thenReturn(false); -- mListeners.notifyPostedLocked(r, old, true); -- mListeners.notifyPostedLocked(r, old, false); -- verify(mListeners, times(2)).getServices(); -- -- // in the lockdown mode -- reset(r); -- reset(old); -- reset(mListeners); -- when(mNm.isInLockDownMode()).thenReturn(true); -- mListeners.notifyPostedLocked(r, old, true); -- mListeners.notifyPostedLocked(r, old, false); -- verify(mListeners, never()).getServices(); -- } -- -- @Test -- public void testnotifyRankingUpdateLockedInLockdownMode() { -- List chn = mock(List.class); -- -- // before the lockdown mode -- when(mNm.isInLockDownMode()).thenReturn(false); -- mListeners.notifyRankingUpdateLocked(chn); -- verify(chn, times(1)).size(); -- -- // in the lockdown mode -- reset(chn); -- when(mNm.isInLockDownMode()).thenReturn(true); -- mListeners.notifyRankingUpdateLocked(chn); -- verify(chn, never()).size(); -+ NotificationRecord r0 = mock(NotificationRecord.class); -+ NotificationRecord old0 = mock(NotificationRecord.class); -+ UserHandle uh0 = mock(UserHandle.class); -+ -+ NotificationRecord r1 = mock(NotificationRecord.class); -+ NotificationRecord old1 = mock(NotificationRecord.class); -+ UserHandle uh1 = mock(UserHandle.class); -+ -+ // Neither user0 and user1 is in the lockdown mode -+ when(r0.getUser()).thenReturn(uh0); -+ when(uh0.getIdentifier()).thenReturn(0); -+ when(mNm.isInLockDownMode(0)).thenReturn(false); -+ -+ when(r1.getUser()).thenReturn(uh1); -+ when(uh1.getIdentifier()).thenReturn(1); -+ when(mNm.isInLockDownMode(1)).thenReturn(false); -+ -+ mListeners.notifyPostedLocked(r0, old0, true); -+ mListeners.notifyPostedLocked(r0, old0, false); -+ verify(r0, atLeast(2)).getSbn(); -+ -+ mListeners.notifyPostedLocked(r1, old1, true); -+ mListeners.notifyPostedLocked(r1, old1, false); -+ verify(r1, atLeast(2)).getSbn(); -+ -+ // Reset -+ reset(r0); -+ reset(old0); -+ reset(r1); -+ reset(old1); -+ -+ // Only user 0 is in the lockdown mode -+ when(r0.getUser()).thenReturn(uh0); -+ when(uh0.getIdentifier()).thenReturn(0); -+ when(mNm.isInLockDownMode(0)).thenReturn(true); -+ -+ when(r1.getUser()).thenReturn(uh1); -+ when(uh1.getIdentifier()).thenReturn(1); -+ when(mNm.isInLockDownMode(1)).thenReturn(false); -+ -+ mListeners.notifyPostedLocked(r0, old0, true); -+ mListeners.notifyPostedLocked(r0, old0, false); -+ verify(r0, never()).getSbn(); -+ -+ mListeners.notifyPostedLocked(r1, old1, true); -+ mListeners.notifyPostedLocked(r1, old1, false); -+ verify(r1, atLeast(2)).getSbn(); - } - - @Test - public void testNotifyRemovedLockedInLockdownMode() throws NoSuchFieldException { - StatusBarNotification sbn = mock(StatusBarNotification.class); -- NotificationRecord r = mock(NotificationRecord.class); -- NotificationStats rs = mock(NotificationStats.class); -+ NotificationRecord r0 = mock(NotificationRecord.class); -+ NotificationStats rs0 = mock(NotificationStats.class); -+ UserHandle uh0 = mock(UserHandle.class); -+ -+ NotificationRecord r1 = mock(NotificationRecord.class); -+ NotificationStats rs1 = mock(NotificationStats.class); -+ UserHandle uh1 = mock(UserHandle.class); - FieldSetter.setField(r, - NotificationRecord.class.getDeclaredField("sbn"), - sbn); -@@ -117,19 +135,31 @@ public class NotificationListenersTest extends UiServiceTestCase { - NotificationManagerService.class.getDeclaredField("mHandler"), - mock(NotificationManagerService.WorkerHandler.class)); - -- // before the lockdown mode -- when(mNm.isInLockDownMode()).thenReturn(false); -- mListeners.notifyRemovedLocked(r, 0, rs); -- mListeners.notifyRemovedLocked(r, 0, rs); -- verify(sbn, times(2)).cloneLight(); -- -- // in the lockdown mode -- reset(sbn); -- reset(r); -- reset(rs); -- when(mNm.isInLockDownMode()).thenReturn(true); -- mListeners.notifyRemovedLocked(r, 0, rs); -- mListeners.notifyRemovedLocked(r, 0, rs); -- verify(sbn, never()).cloneLight(); -+ // Neither user0 and user1 is in the lockdown mode -+ when(r0.getUser()).thenReturn(uh0); -+ when(uh0.getIdentifier()).thenReturn(0); -+ when(mNm.isInLockDownMode(0)).thenReturn(false); -+ when(r0.getSbn()).thenReturn(sbn); -+ -+ when(r1.getUser()).thenReturn(uh1); -+ when(uh1.getIdentifier()).thenReturn(1); -+ when(mNm.isInLockDownMode(1)).thenReturn(false); -+ when(r1.getSbn()).thenReturn(sbn); -+ -+ mListeners.notifyRemovedLocked(r0, 0, rs0); -+ mListeners.notifyRemovedLocked(r0, 0, rs0); -+ verify(r0, atLeast(2)).getSbn(); -+ -+ mListeners.notifyRemovedLocked(r1, 0, rs1); -+ mListeners.notifyRemovedLocked(r1, 0, rs1); -+ verify(r1, atLeast(2)).getSbn(); -+ -+ // Reset -+ reset(r0); -+ reset(rs0); -+ reset(r1); -+ reset(rs1); -+ -+ // Only user 0 is in the lockdown mode - } - } -diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java -index 5030e124e4ce..7018b55b278d 100755 ---- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java -+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java -@@ -124,6 +124,7 @@ import android.provider.MediaStore; - import android.provider.Settings; - import android.service.notification.Adjustment; - import android.service.notification.NotificationListenerService; -+import android.service.notification.NotificationRankingUpdate; - import android.service.notification.NotificationStats; - import android.service.notification.StatusBarNotification; - import android.service.notification.ZenPolicy; -@@ -149,6 +150,7 @@ import com.android.server.SystemService; - import com.android.server.UiServiceTestCase; - import com.android.server.lights.Light; - import com.android.server.lights.LightsManager; -+import com.android.server.notification.ManagedServices.ManagedServiceInfo; - import com.android.server.notification.NotificationManagerService.NotificationAssistants; - import com.android.server.notification.NotificationManagerService.NotificationListeners; - import com.android.server.pm.PackageManagerService; -@@ -255,6 +257,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - @Mock - AlarmManager mAlarmManager; - -+ private NotificationManagerService.WorkerHandler mWorkerHandler; -+ - // Use a Testable subclass so we can simulate calls from the system without failing. - private static class TestableNotificationManagerService extends NotificationManagerService { - int countSystemChecks = 0; -@@ -264,6 +268,9 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - @Nullable - NotificationAssistantAccessGrantedCallback mNotificationAssistantAccessGrantedCallback; - -+ @Nullable -+ Boolean mIsVisibleToListenerReturnValue = null; -+ - TestableNotificationManagerService(Context context) { - super(context); - } -@@ -326,6 +333,18 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - void onGranted(ComponentName assistant, int userId, boolean granted); - } - -+ protected void setIsVisibleToListenerReturnValue(boolean value) { -+ mIsVisibleToListenerReturnValue = value; -+ } -+ -+ @Override -+ boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) { -+ if (mIsVisibleToListenerReturnValue != null) { -+ return mIsVisibleToListenerReturnValue; -+ } -+ return super.isVisibleToListener(sbn, listener); -+ } -+ - @Override - protected boolean canLaunchInActivityView(Context context, PendingIntent pendingIntent, - String packageName) { -@@ -429,7 +448,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - - -- mService.init(mTestableLooper.getLooper(), -+ mWorkerHandler = spy(mService.new WorkerHandler(mTestableLooper.getLooper())); -+ mService.init(mWorkerHandler, - mPackageManager, mPackageManagerClient, mockLightsManager, - mListeners, mAssistants, mConditionProviders, - mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, -@@ -459,6 +479,7 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - clearDeviceConfig(); - InstrumentationRegistry.getInstrumentation() - .getUiAutomation().dropShellPermissionIdentity(); -+ mWorkerHandler.removeCallbacksAndMessages(null); - } - - public void waitForIdle() { -@@ -5607,10 +5628,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - mStrongAuthTracker.setGetStrongAuthForUserReturnValue( - STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); -- assertTrue(mStrongAuthTracker.isInLockDownMode()); -- mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); -+ assertTrue(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); -+ mStrongAuthTracker.setGetStrongAuthForUserReturnValue(mContext.getUserId()); - mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); -- assertFalse(mStrongAuthTracker.isInLockDownMode()); -+ assertFalse(mStrongAuthTracker.isInLockDownMode(mContext.getUserId())); - } - - @Test -@@ -5626,8 +5647,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - // when entering the lockdown mode, cancel the 2 notifications. - mStrongAuthTracker.setGetStrongAuthForUserReturnValue( - STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); -- mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); -- assertTrue(mStrongAuthTracker.isInLockDownMode()); -+ mStrongAuthTracker.onStrongAuthRequiredChanged(0); -+ assertTrue(mStrongAuthTracker.isInLockDownMode(0)); - - // the notifyRemovedLocked function is called twice due to REASON_LOCKDOWN. - ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class); -@@ -5636,9 +5657,44 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { - - // exit lockdown mode. - mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); -- mStrongAuthTracker.onStrongAuthRequiredChanged(mContext.getUserId()); -+ mStrongAuthTracker.onStrongAuthRequiredChanged(0); -+ assertFalse(mStrongAuthTracker.isInLockDownMode(0)); - - // the notifyPostedLocked function is called twice. -- verify(mListeners, times(2)).notifyPostedLocked(any(), any()); -+ verify(mWorkerHandler, times(2)).postDelayed(any(Runnable.class), anyLong()); -+ } -+ -+ @Test -+ public void testMakeRankingUpdateLockedInLockDownMode() { -+ // post 2 notifications from a same package -+ NotificationRecord pkgA = new NotificationRecord(mContext, -+ generateSbn("a", 1000, 9, 0), mTestNotificationChannel); -+ mService.addNotification(pkgA); -+ NotificationRecord pkgB = new NotificationRecord(mContext, -+ generateSbn("a", 1000, 9, 1), mTestNotificationChannel); -+ mService.addNotification(pkgB); -+ -+ mService.setIsVisibleToListenerReturnValue(true); -+ NotificationRankingUpdate nru = mService.makeRankingUpdateLocked(null); -+ assertEquals(2, nru.getRankingMap().getOrderedKeys().length); -+ -+ // when only user 0 entering the lockdown mode, its notification will be suppressed. -+ mStrongAuthTracker.setGetStrongAuthForUserReturnValue( -+ STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN); -+ mStrongAuthTracker.onStrongAuthRequiredChanged(0); -+ assertTrue(mStrongAuthTracker.isInLockDownMode(0)); -+ assertFalse(mStrongAuthTracker.isInLockDownMode(1)); -+ -+ nru = mService.makeRankingUpdateLocked(null); -+ assertEquals(1, nru.getRankingMap().getOrderedKeys().length); -+ -+ // User 0 exits lockdown mode. Its notification will be resumed. -+ mStrongAuthTracker.setGetStrongAuthForUserReturnValue(0); -+ mStrongAuthTracker.onStrongAuthRequiredChanged(0); -+ assertFalse(mStrongAuthTracker.isInLockDownMode(0)); -+ assertFalse(mStrongAuthTracker.isInLockDownMode(1)); -+ -+ nru = mService.makeRankingUpdateLocked(null); -+ assertEquals(2, nru.getRankingMap().getOrderedKeys().length); - } - } diff --git a/Patches/LineageOS-17.1/android_frameworks_base/351414-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/351414-backport.patch deleted file mode 100644 index 9d7685f5..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/351414-backport.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Nate Myren <ntmyren@google.com> -Date: Fri, 2 Dec 2022 09:44:31 -0800 -Subject: [PATCH] RESTRICT AUTOMERGE Revoke dev perm if app is upgrading to - post 23 and perm has pre23 flag - -If a permission has the "pre23" flag, and an app is upgrading past api -23, then we should not assume that a "development" permission remains -granted - -Fixes: 259458532 -Test: atest RevokeSawPermissionTest -Change-Id: I214396f455c5ed9e8bac2e50b1525b86475c81c7 -(cherry picked from commit 2f30a63b11e59f9daf42f51eb85aa91c86f4baf4) -Merged-In: I214396f455c5ed9e8bac2e50b1525b86475c81c7 ---- - .../server/pm/permission/PermissionManagerService.java | 9 +++++++-- - 1 file changed, 7 insertions(+), 2 deletions(-) - -diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java -index 23af4e6c1c3e..ae10b28cd8bb 100644 ---- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java -+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java -@@ -671,7 +671,7 @@ public class PermissionManagerService { - } - final PackageSetting ps = (PackageSetting) newPackage.mExtras; - if (grantSignaturePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, newPackage, saw, -- ps.getPermissionsState())) { -+ ps.getPermissionsState(), true)) { - return; - } - for (int userId: mUserManagerInt.getUserIds()) { -@@ -1836,6 +1836,11 @@ public class PermissionManagerService { - - private boolean grantSignaturePermission(String perm, PackageParser.Package pkg, - BasePermission bp, PermissionsState origPermissions) { -+ return grantSignaturePermission(perm, pkg, bp, origPermissions, false); -+ } -+ -+ private boolean grantSignaturePermission(String perm, PackageParser.Package pkg, -+ BasePermission bp, PermissionsState origPermissions, boolean isApi23Upgrade) { - boolean oemPermission = bp.isOEM(); - boolean vendorPrivilegedPermission = bp.isVendorPrivileged(); - boolean privilegedPermission = bp.isPrivileged() || bp.isVendorPrivileged(); -@@ -2022,7 +2027,7 @@ public class PermissionManagerService { - // Any pre-installed system app is allowed to get this permission. - allowed = true; - } -- if (!allowed && bp.isDevelopment()) { -+ if (!allowed && bp.isDevelopment() && !(bp.isPre23() && isApi23Upgrade)) { - // For development permissions, a development permission - // is granted only if it was already granted. - allowed = origPermissions.hasInstallPermission(perm); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/351415.patch b/Patches/LineageOS-17.1/android_frameworks_base/351415.patch deleted file mode 100644 index 528849a9..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/351415.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Michael Wright <michaelwr@google.com> -Date: Mon, 26 Sep 2022 20:37:33 +0100 -Subject: [PATCH] Reconcile WorkSource parcel and unparcel code. - -Prior to this CL, WorkSources would Parcel their list of WorkChains as --1 if null, or the size of the list followed by the list itself if -non-null. When reading it back in, on the other hand, they would check -if the size was positive, and only then read the list from the Parcel. -This works for all cases except when the WorkSource has an empty but -non-null list of WorkChains as the list would get written to the parcel, -but then never read on the other side. - -If parceling a list was a no-op when empty this wouldn't be an issue, -but it must write at least its size into the parcel to know how many -elements to extract. In the empty list case, this single element is left -unread as the size is not positive which essentially corrupts any future -items read from that same parcelable. - -Bug: 220302519 -Test: atest android.security.cts.WorkSourceTest#testWorkChainParceling -Change-Id: I2fec40dfced420ca38e717059b0e95ee8ef9946a -(cherry picked from commit 266b3bddcf14d448c0972db64b42950f76c759e3) -Merged-In: I2fec40dfced420ca38e717059b0e95ee8ef9946a ---- - core/java/android/os/WorkSource.java | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java -index 0b4a56121038..4e7a280aa2c1 100644 ---- a/core/java/android/os/WorkSource.java -+++ b/core/java/android/os/WorkSource.java -@@ -114,7 +114,7 @@ public class WorkSource implements Parcelable { - mNames = in.createStringArray(); - - int numChains = in.readInt(); -- if (numChains > 0) { -+ if (numChains >= 0) { - mChains = new ArrayList<>(numChains); - in.readParcelableList(mChains, WorkChain.class.getClassLoader()); - } else { diff --git a/Patches/LineageOS-17.1/android_frameworks_base/351436.patch b/Patches/LineageOS-17.1/android_frameworks_base/351436.patch deleted file mode 100644 index bb24590d..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/351436.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Winson Chung <winsonc@google.com> -Date: Wed, 11 Jan 2023 18:58:41 +0000 -Subject: [PATCH] Revert "Ensure that only SysUI can override pending intent - launch flags" - -This reverts commit c4d3106e347922610f8c554de3ae238175ed393e. - -Reason for revert: b/264884187, b/264885689 - -Change-Id: I9fb0d66327f3f872a92e6b9d682d58489e81e6ba -(cherry picked from commit 7bb933f48ff15d8f08d2185005b7b3e212915276) -Merged-In: I9fb0d66327f3f872a92e6b9d682d58489e81e6ba ---- - .../com/android/server/am/PendingIntentRecord.java | 11 +++-------- - 1 file changed, 3 insertions(+), 8 deletions(-) - -diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java -index 44d67ed0d642..54504c3c1e24 100644 ---- a/services/core/java/com/android/server/am/PendingIntentRecord.java -+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java -@@ -317,16 +317,11 @@ public final class PendingIntentRecord extends IIntentSender.Stub { - resolvedType = key.requestResolvedType; - } - -- // Apply any launch flags from the ActivityOptions. This is used only by SystemUI -- // to ensure that we can launch the pending intent with a consistent launch mode even -- // if the provided PendingIntent is immutable (ie. to force an activity to launch into -- // a new task, or to launch multiple instances if supported by the app) -+ // Apply any launch flags from the ActivityOptions. This is to ensure that the caller -+ // can specify a consistent launch mode even if the PendingIntent is immutable - final ActivityOptions opts = ActivityOptions.fromBundle(options); - if (opts != null) { -- // TODO(b/254490217): Move this check into SafeActivityOptions -- if (controller.mAtmInternal.isCallerRecents(Binder.getCallingUid())) { -- finalIntent.addFlags(opts.getPendingIntentLaunchFlags()); -- } -+ finalIntent.addFlags(opts.getPendingIntentLaunchFlags()); - } - - // Extract options before clearing calling identity diff --git a/Patches/LineageOS-17.1/android_frameworks_base/352555.patch b/Patches/LineageOS-17.1/android_frameworks_base/352555.patch deleted file mode 100644 index 2933ca71..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/352555.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alexander Grund <flamefire89@gmail.com> -Date: Sun, 26 Mar 2023 17:36:03 +0200 -Subject: [PATCH] Revert "[RESTRICT AUTOMERGE] Trim the activity info of - another uid if no privilege" - -This reverts commit bff14ff38a014fc3059c6bfe8a16aec9f5447554. - -Reason for revert: apps crashed due to the top activity info trimmed - -Bug: 264269392 263434196 263438172 -Change-Id: I078080b14b7cf7c6e605739f22f40f86802d3950 -(cherry picked from commit 5caf2dde3d264966e1ba0dd3e18a0524858157ba) -Merged-In: I078080b14b7cf7c6e605739f22f40f86802d3950 ---- - .../com/android/server/wm/AppTaskImpl.java | 3 +- - .../com/android/server/wm/RecentTasks.java | 7 ++-- - .../com/android/server/wm/RunningTasks.java | 8 ++--- - .../com/android/server/wm/TaskRecord.java | 34 ------------------- - 4 files changed, 5 insertions(+), 47 deletions(-) - -diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java -index 900b59e0a8a2..1eb7455135c7 100644 ---- a/services/core/java/com/android/server/wm/AppTaskImpl.java -+++ b/services/core/java/com/android/server/wm/AppTaskImpl.java -@@ -84,8 +84,7 @@ class AppTaskImpl extends IAppTask.Stub { - if (tr == null) { - throw new IllegalArgumentException("Unable to find task ID " + mTaskId); - } -- return mService.getRecentTasks().createRecentTaskInfo(tr, -- true /* getTasksAllowed */); -+ return mService.getRecentTasks().createRecentTaskInfo(tr); - } finally { - Binder.restoreCallingIdentity(origId); - } -diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java -index 56367f42886d..541a8bbc8865 100644 ---- a/services/core/java/com/android/server/wm/RecentTasks.java -+++ b/services/core/java/com/android/server/wm/RecentTasks.java -@@ -944,7 +944,7 @@ class RecentTasks { - continue; - } - -- final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr, getTasksAllowed); -+ final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr); - if (!getDetailedTasks) { - rti.baseIntent.replaceExtras((Bundle) null); - } -@@ -1715,15 +1715,12 @@ class RecentTasks { - /** - * Creates a new RecentTaskInfo from a TaskRecord. - */ -- ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr, boolean getTasksAllowed) { -+ ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr) { - ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); - tr.fillTaskInfo(rti); - // Fill in some deprecated values - rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID; - rti.persistentId = rti.taskId; -- if (!getTasksAllowed) { -- TaskRecord.trimIneffectiveInfo(tr, rti); -- } - return rti; - } - -diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java -index 3c2e36cf245d..81a85476c53a 100644 ---- a/services/core/java/com/android/server/wm/RunningTasks.java -+++ b/services/core/java/com/android/server/wm/RunningTasks.java -@@ -69,7 +69,7 @@ class RunningTasks { - } - - final TaskRecord task = iter.next(); -- list.add(createRunningTaskInfo(task, allowed)); -+ list.add(createRunningTaskInfo(task)); - maxNum--; - } - } -@@ -77,15 +77,11 @@ class RunningTasks { - /** - * Constructs a {@link RunningTaskInfo} from a given {@param task}. - */ -- private RunningTaskInfo createRunningTaskInfo(TaskRecord task, boolean allowed) { -+ private RunningTaskInfo createRunningTaskInfo(TaskRecord task) { - final RunningTaskInfo rti = new RunningTaskInfo(); - task.fillTaskInfo(rti); - // Fill in some deprecated values - rti.id = rti.taskId; -- -- if (!allowed) { -- TaskRecord.trimIneffectiveInfo(task, rti); -- } - return rti; - } - } -diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java -index 9de4c8121e4d..361f66e3106a 100644 ---- a/services/core/java/com/android/server/wm/TaskRecord.java -+++ b/services/core/java/com/android/server/wm/TaskRecord.java -@@ -2436,40 +2436,6 @@ class TaskRecord extends ConfigurationContainer { - info.configuration.setTo(getConfiguration()); - } - -- /** -- * Removes the activity info if the activity belongs to a different uid, which is -- * different from the app that hosts the task. -- */ -- static void trimIneffectiveInfo(TaskRecord task, TaskInfo info) { -- int topActivityUid = task.effectiveUid; -- for (int i = task.mActivities.size() - 1; i >= 0; --i) { -- final ActivityRecord r = task.mActivities.get(i); -- if (r.finishing || r.isState(ActivityState.INITIALIZING)) { -- continue; -- } -- topActivityUid = r.info.applicationInfo.uid; -- break; -- } -- -- if (task.effectiveUid != topActivityUid) { -- info.topActivity = null; -- } -- -- int baseActivityUid = task.effectiveUid; -- for (int i = 0; i < task.mActivities.size(); ++i) { -- final ActivityRecord r = task.mActivities.get(i); -- if (r.finishing) { -- continue; -- } -- baseActivityUid = r.info.applicationInfo.uid; -- break; -- } -- -- if (task.effectiveUid != baseActivityUid) { -- info.baseActivity = null; -- } -- } -- - /** - * Returns a {@link TaskInfo} with information from this task. - */ diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353117.patch b/Patches/LineageOS-17.1/android_frameworks_base/353117.patch deleted file mode 100644 index 5e0c180e..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353117.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Liahav Eitan <liahav@google.com> -Date: Tue, 11 Oct 2022 13:20:52 +0000 -Subject: [PATCH] Fix sharing to another profile where an app has multiple - targets - -Moves the fixUris call from onTargetSelected directly to the intent -launch to ensure the intent which is actually started is updated with -userId specific URIs. - -This is a backport of ag/19657256 and ag/20063949. - -Bug:242165528 -Bug:244876518 -Bug:242605257 -Test: manually share image from personal profile to work gmail, -first with chat target then backing up and selecting the main target -Test: manually share image from work Photos app to personal WhatsApp's -frequent contact target. - -Change-Id: Id815984e691bf962e19e30a54f7247d16060b3b8 -Merged-In: Id815984e691bf962e19e30a54f7247d16060b3b8 -Merged-In: Ib41c8a3c46afcc2d62a4c1a924212bcd98bcfbe4 -Merged-In: Iabf5dcf2612fe718f2f0886e2e5e9b76f37af1e1 -(cherry picked from commit f50ced5f1e619d7fa7858748d6a9dbe861354f04) -Merged-In: Id815984e691bf962e19e30a54f7247d16060b3b8 -(cherry picked from commit 0b4cfaca78dfadd546adc47cbcbcdde5425cf17a) ---- - .../com/android/internal/app/ChooserActivity.java | 1 + - .../com/android/internal/app/ResolverActivity.java | 13 +++++++++++++ - 2 files changed, 14 insertions(+) - -diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java -index 4d71911921a8..f43ff17ed7d0 100644 ---- a/core/java/com/android/internal/app/ChooserActivity.java -+++ b/core/java/com/android/internal/app/ChooserActivity.java -@@ -2455,6 +2455,7 @@ public class ChooserActivity extends ResolverActivity { - } - intent.setComponent(mChooserTarget.getComponentName()); - intent.putExtras(mChooserTarget.getIntentExtras()); -+ TargetInfo.prepareIntentForCrossProfileLaunch(intent, userId); - - // Important: we will ignore the target security checks in ActivityManager - // if and only if the ChooserTarget's target package is the same package -diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java -index 070e3c101c8e..3de79838eaff 100644 ---- a/core/java/com/android/internal/app/ResolverActivity.java -+++ b/core/java/com/android/internal/app/ResolverActivity.java -@@ -1514,6 +1514,7 @@ public class ResolverActivity extends Activity { - if (mEnableChooserDelegate) { - return activity.startAsCallerImpl(mResolvedIntent, options, false, userId); - } else { -+ TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, userId); - activity.startActivityAsCaller(mResolvedIntent, options, null, false, userId); - return true; - } -@@ -1521,6 +1522,7 @@ public class ResolverActivity extends Activity { - - @Override - public boolean startAsUser(Activity activity, Bundle options, UserHandle user) { -+ TargetInfo.prepareIntentForCrossProfileLaunch(mResolvedIntent, user.getIdentifier()); - activity.startActivityAsUser(mResolvedIntent, options, user); - return false; - } -@@ -1642,6 +1644,17 @@ public class ResolverActivity extends Activity { - * @return true if this target should be pinned to the front by the request of the user - */ - boolean isPinned(); -+ -+ /** -+ * Fix the URIs in {@code intent} if cross-profile sharing is required. This should be called -+ * before launching the intent as another user. -+ */ -+ static void prepareIntentForCrossProfileLaunch(Intent intent, int targetUserId) { -+ final int currentUserId = UserHandle.myUserId(); -+ if (targetUserId != currentUserId) { -+ intent.fixUris(currentUserId); -+ } -+ } - } - - public class ResolveListAdapter extends BaseAdapter { diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353944.patch b/Patches/LineageOS-17.1/android_frameworks_base/353944.patch deleted file mode 100644 index a1ceb698..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353944.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jing Ji <jji@google.com> -Date: Thu, 4 Aug 2022 11:36:26 -0700 -Subject: [PATCH] DO NOT MERGE: Context#startInstrumentation could be started - from SHELL only now. - -Or, if an instrumentation starts another instrumentation and so on, -and the original instrumentation is started from SHELL, allow all -Context#startInstrumentation calls in this chain. - -Otherwise, it'll throw a SecurityException. - -Bug: 237766679 -Test: atest CtsAppTestCases:InstrumentationTest -Merged-In: Ia08f225c21a3933067d066a578ea4af9c23e7d4c -Merged-In: I1b76f61c5fd6c9f7e738978592260945a606f40c -Merged-In: I3ea7aa27bd776fec546908a37f667f680da9c892 -Change-Id: I7ca7345b064e8e74f7037b8fa3ed45bb6423e406 -(cherry picked from commit 8c90891a38ecb5047e115e13baf700a8b486a5d1) -Merged-In: I7ca7345b064e8e74f7037b8fa3ed45bb6423e406 ---- - .../server/am/ActivityManagerService.java | 34 +++++++++++++++++++ - 1 file changed, 34 insertions(+) - -diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java -index bb78408617b8..efbccb3b8f94 100644 ---- a/services/core/java/com/android/server/am/ActivityManagerService.java -+++ b/services/core/java/com/android/server/am/ActivityManagerService.java -@@ -15761,6 +15761,17 @@ public class ActivityManagerService extends IActivityManager.Stub - reportStartInstrumentationFailureLocked(watcher, className, msg); - throw new SecurityException(msg); - } -+ if (!Build.IS_DEBUGGABLE && callingUid != ROOT_UID && callingUid != SHELL_UID -+ && callingUid != SYSTEM_UID && !hasActiveInstrumentationLocked(callingPid)) { -+ // If it's not debug build and not called from root/shell/system uid, reject it. -+ final String msg = "Permission Denial: instrumentation test " -+ + className + " from pid=" + callingPid + ", uid=" + callingUid -+ + ", pkgName=" + getPackageNameByPid(callingPid) -+ + " not allowed because it's not started from SHELL"; -+ Slog.wtfQuiet(TAG, msg); -+ reportStartInstrumentationFailureLocked(watcher, className, msg); -+ throw new SecurityException(msg); -+ } - - ActiveInstrumentation activeInstr = new ActiveInstrumentation(this); - activeInstr.mClass = className; -@@ -15817,6 +15828,29 @@ public class ActivityManagerService extends IActivityManager.Stub - return true; - } - -+ @GuardedBy("this") -+ private boolean hasActiveInstrumentationLocked(int pid) { -+ if (pid == 0) { -+ return false; -+ } -+ synchronized (mPidsSelfLocked) { -+ ProcessRecord process = mPidsSelfLocked.get(pid); -+ return process != null && process.getActiveInstrumentation() != null; -+ } -+ } -+ -+ private String getPackageNameByPid(int pid) { -+ synchronized (mPidsSelfLocked) { -+ final ProcessRecord app = mPidsSelfLocked.get(pid); -+ -+ if (app != null && app.info != null) { -+ return app.info.packageName; -+ } -+ -+ return null; -+ } -+ } -+ - private boolean isCallerShell() { - final int callingUid = Binder.getCallingUid(); - return callingUid == SHELL_UID || callingUid == ROOT_UID; diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353945.patch b/Patches/LineageOS-17.1/android_frameworks_base/353945.patch deleted file mode 100644 index e8183dbd..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353945.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kunal Malhotra <malhk@google.com> -Date: Mon, 7 Nov 2022 23:33:55 +0000 -Subject: [PATCH] Checking if package belongs to UID before registering - broadcast receiver - -Test: manual testing done on device by installing test APK and checking if receiver can register -Bug: 242040055 -Change-Id: Ia525f218a46f8bf7fff660cec0d6432f09fdf24d -Merged-In: Ia525f218a46f8bf7fff660cec0d6432f09fdf24d -(cherry picked from commit 790a8d0dd329460bc60456681cb446accf2a27e0) -(cherry picked from commit 4f0dc37b896e06086391e71ce471e413215e1130) -Merged-In: Ia525f218a46f8bf7fff660cec0d6432f09fdf24d ---- - services/core/java/com/android/server/am/ActiveServices.java | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java -index 84702ddfe231..c6d94eb3b408 100644 ---- a/services/core/java/com/android/server/am/ActiveServices.java -+++ b/services/core/java/com/android/server/am/ActiveServices.java -@@ -2186,6 +2186,11 @@ public final class ActiveServices { - throw new SecurityException("BIND_EXTERNAL_SERVICE failed, " - + className + " is not an isolatedProcess"); - } -+ if (AppGlobals.getPackageManager().getPackageUid(callingPackage, -+ 0, userId) != callingUid) { -+ throw new SecurityException("BIND_EXTERNAL_SERVICE failed, " -+ + "calling package not owned by calling UID "); -+ } - // Run the service under the calling package's application. - ApplicationInfo aInfo = AppGlobals.getPackageManager().getApplicationInfo( - callingPackage, ActivityManagerService.STOCK_PM_FLAGS, userId); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353946.patch b/Patches/LineageOS-17.1/android_frameworks_base/353946.patch deleted file mode 100644 index 2c2c9098..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353946.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hao Ke <haok@google.com> -Date: Mon, 12 Dec 2022 15:49:16 +0000 -Subject: [PATCH] Fix checkKeyIntentParceledCorrectly's bypass - -The checkKeyIntentParceledCorrectly method was added in checkKeyIntent, which was originaly only invoked when AccountManagerService deserializes the KEY_INTENT value as not NULL. However, due to the self-changing bundle technique in Parcel mismatch problems, the Intent value can change after reparceling; hence would bypass the added checkKeyIntentParceledCorrectly call. - -This CL did the following: - -- Ensure the checkKeyIntent method is also called when result.getParcelable(AccountManager.KEY_INTENT) == null. - -Bug: 260567867 -Bug: 262230405 -Test: local test, see b/262230405 -Test: atest CtsAccountManagerTestCases -Merged-In: I7b528f52c41767ae12731838fdd36aa26a8f3477 -Change-Id: I7b528f52c41767ae12731838fdd36aa26a8f3477 -(cherry picked from commit 9f623983a8d4ec48d58b0eda56fa461fc6748981) -Merged-In: I7b528f52c41767ae12731838fdd36aa26a8f3477 ---- - .../server/accounts/AccountManagerService.java | 15 +++++++++------ - 1 file changed, 9 insertions(+), 6 deletions(-) - -diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java -index 58978a55a32a..b4edf94927b2 100644 ---- a/services/core/java/com/android/server/accounts/AccountManagerService.java -+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java -@@ -3434,8 +3434,7 @@ public class AccountManagerService - Bundle.setDefusable(result, true); - mNumResults++; - Intent intent = null; -- if (result != null -- && (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) { -+ if (result != null) { - if (!checkKeyIntent( - Binder.getCallingUid(), - result)) { -@@ -4800,8 +4799,10 @@ public class AccountManagerService - EventLog.writeEvent(0x534e4554, "250588548", authUid, ""); - return false; - } -- - Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); -+ if (intent == null) { -+ return true; -+ } - // Explicitly set an empty ClipData to ensure that we don't offer to - // promote any Uris contained inside for granting purposes - if (intent.getClipData() == null) { -@@ -4854,7 +4855,10 @@ public class AccountManagerService - p.recycle(); - Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); - Intent simulateIntent = simulateBundle.getParcelable(AccountManager.KEY_INTENT); -- return (intent.filterEquals(simulateIntent)); -+ if (intent == null) { -+ return (simulateIntent == null); -+ } -+ return intent.filterEquals(simulateIntent); - } - - private boolean isExportedSystemActivity(ActivityInfo activityInfo) { -@@ -4999,8 +5003,7 @@ public class AccountManagerService - } - } - } -- if (result != null -- && (intent = result.getParcelable(AccountManager.KEY_INTENT)) != null) { -+ if (result != null) { - if (!checkKeyIntent( - Binder.getCallingUid(), - result)) { diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353947.patch b/Patches/LineageOS-17.1/android_frameworks_base/353947.patch deleted file mode 100644 index 9908945c..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353947.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Winson Chiu <chiuwinson@google.com> -Date: Fri, 6 Jan 2023 21:26:24 +0000 -Subject: [PATCH] Encode Intent scheme when serializing to URI string RESTRICT - AUTOMERGE - -Avoids deserialization error when the scheme contains a -reserved character. - -Bug: 261858325 - -Test: atest android.content.cts.IntentTest#testEncoding - -Merged-In: Ic34b3f796b762763db5aa7b5d7c109ae70607470 -Change-Id: Ic34b3f796b762763db5aa7b5d7c109ae70607470 -(cherry picked from commit 43437b4ee6424933d4e403f0375ef8c1f07986f4) -Merged-In: Ic34b3f796b762763db5aa7b5d7c109ae70607470 ---- - core/java/android/content/Intent.java | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java -index d7898776965e..72e0fa615b09 100644 ---- a/core/java/android/content/Intent.java -+++ b/core/java/android/content/Intent.java -@@ -10393,7 +10393,7 @@ public class Intent implements Parcelable, Cloneable { - private void toUriInner(StringBuilder uri, String scheme, String defAction, - String defPackage, int flags) { - if (scheme != null) { -- uri.append("scheme=").append(scheme).append(';'); -+ uri.append("scheme=").append(Uri.encode(scheme)).append(';'); - } - if (mAction != null && !mAction.equals(defAction)) { - uri.append("action=").append(Uri.encode(mAction)).append(';'); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353948-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/353948-backport.patch deleted file mode 100644 index bd346f62..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353948-backport.patch +++ /dev/null @@ -1,430 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Christophe Pinelli <cpinelli@google.com> -Date: Tue, 27 Dec 2022 20:29:33 +0000 -Subject: [PATCH] Backport BAL restrictions from S to R, this blocks apps from - using Alarm Manager to bypass BAL restrictions. - -Test: atest BackgroundActivityLaunchTest -Bug: 195756028 -Change-Id: Ifa3f79bc74c10d0ac8322079f2e6e3e0ba476b0f -(cherry picked from commit 1d737c2fbdc71570bbcaca0f44da4ee132fa545f) -Merged-In: Ifa3f79bc74c10d0ac8322079f2e6e3e0ba476b0f ---- - core/java/android/app/ActivityOptions.java | 10 +-- - core/java/android/app/BroadcastOptions.java | 25 +++++- - core/java/android/app/ComponentOptions.java | 84 +++++++++++++++++++ - .../android/server/AlarmManagerService.java | 21 ++++- - .../server/am/PendingIntentRecord.java | 23 ++++- - .../android/server/wm/ActivityStarter.java | 22 +++-- - .../server/wm/ActivityTaskManagerService.java | 2 +- - .../com/android/server/wm/AppTaskImpl.java | 2 +- - 8 files changed, 169 insertions(+), 20 deletions(-) - create mode 100644 core/java/android/app/ComponentOptions.java - -diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java -index 926044bffdd0..36ab62aedc09 100644 ---- a/core/java/android/app/ActivityOptions.java -+++ b/core/java/android/app/ActivityOptions.java -@@ -59,7 +59,7 @@ import java.util.ArrayList; - * {@link android.content.Context#startActivity(android.content.Intent, android.os.Bundle) - * Context.startActivity(Intent, Bundle)} and related methods. - */ --public class ActivityOptions { -+public class ActivityOptions extends ComponentOptions { - private static final String TAG = "ActivityOptions"; - - /** -@@ -881,13 +881,12 @@ public class ActivityOptions { - } - - private ActivityOptions() { -+ super(); - } - - /** @hide */ - public ActivityOptions(Bundle opts) { -- // If the remote side sent us bad parcelables, they won't get the -- // results they want, which is their loss. -- opts.setDefusable(true); -+ super(opts); - - mPackageName = opts.getString(KEY_PACKAGE_NAME); - try { -@@ -1439,8 +1438,9 @@ public class ActivityOptions { - * object; you must not modify it, but can supply it to the startActivity - * methods that take an options Bundle. - */ -+ @Override - public Bundle toBundle() { -- Bundle b = new Bundle(); -+ Bundle b = super.toBundle(); - if (mPackageName != null) { - b.putString(KEY_PACKAGE_NAME, mPackageName); - } -diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java -index 161e2ad06ec0..8947fb44b07b 100644 ---- a/core/java/android/app/BroadcastOptions.java -+++ b/core/java/android/app/BroadcastOptions.java -@@ -28,7 +28,7 @@ import android.os.Bundle; - * {@hide} - */ - @SystemApi --public class BroadcastOptions { -+public class BroadcastOptions extends ComponentOptions { - private long mTemporaryAppWhitelistDuration; - private int mMinManifestReceiverApiLevel = 0; - private int mMaxManifestReceiverApiLevel = Build.VERSION_CODES.CUR_DEVELOPMENT; -@@ -72,10 +72,12 @@ public class BroadcastOptions { - } - - private BroadcastOptions() { -+ super(); - } - - /** @hide */ - public BroadcastOptions(Bundle opts) { -+ super(opts); - mTemporaryAppWhitelistDuration = opts.getLong(KEY_TEMPORARY_APP_WHITELIST_DURATION); - mMinManifestReceiverApiLevel = opts.getInt(KEY_MIN_MANIFEST_RECEIVER_API_LEVEL, 0); - mMaxManifestReceiverApiLevel = opts.getInt(KEY_MAX_MANIFEST_RECEIVER_API_LEVEL, -@@ -173,6 +175,24 @@ public class BroadcastOptions { - return mAllowBackgroundActivityStarts; - } - -+ /** -+ * Set PendingIntent activity is allowed to be started in the background if the caller -+ * can start background activities. -+ * @hide -+ */ -+ public void setPendingIntentBackgroundActivityLaunchAllowed(boolean allowed) { -+ super.setPendingIntentBackgroundActivityLaunchAllowed(allowed); -+ } -+ -+ /** -+ * Get PendingIntent activity is allowed to be started in the background if the caller -+ * can start background activities. -+ * @hide -+ */ -+ public boolean isPendingIntentBackgroundActivityLaunchAllowed() { -+ return super.isPendingIntentBackgroundActivityLaunchAllowed(); -+ } -+ - /** - * Returns the created options as a Bundle, which can be passed to - * {@link android.content.Context#sendBroadcast(android.content.Intent) -@@ -181,8 +201,9 @@ public class BroadcastOptions { - * object; you must not modify it, but can supply it to the sendBroadcast - * methods that take an options Bundle. - */ -+ @Override - public Bundle toBundle() { -- Bundle b = new Bundle(); -+ Bundle b = super.toBundle(); - if (mTemporaryAppWhitelistDuration > 0) { - b.putLong(KEY_TEMPORARY_APP_WHITELIST_DURATION, mTemporaryAppWhitelistDuration); - } -diff --git a/core/java/android/app/ComponentOptions.java b/core/java/android/app/ComponentOptions.java -new file mode 100644 -index 000000000000..34ee9138a364 ---- /dev/null -+++ b/core/java/android/app/ComponentOptions.java -@@ -0,0 +1,84 @@ -+/* -+ * Copyright (C) 2022 The Android Open Source Project -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ */ -+ -+package android.app; -+ -+import android.os.Bundle; -+ -+/** -+ * @hide -+ */ -+public class ComponentOptions { -+ -+ /** -+ * Default value for KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED. -+ * @hide -+ **/ -+ public static final boolean PENDING_INTENT_BAL_ALLOWED_DEFAULT = true; -+ -+ /** -+ * PendingIntent caller allows activity start even if PendingIntent creator is in background. -+ * This only works if the PendingIntent caller is allowed to start background activities, -+ * for example if it's in the foreground, or has BAL permission. -+ * @hide -+ */ -+ public static final String KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED = -+ "android.pendingIntent.backgroundActivityAllowed"; -+ -+ private boolean mPendingIntentBalAllowed = PENDING_INTENT_BAL_ALLOWED_DEFAULT; -+ -+ ComponentOptions() { -+ } -+ -+ ComponentOptions(Bundle opts) { -+ // If the remote side sent us bad parcelables, they won't get the -+ // results they want, which is their loss. -+ opts.setDefusable(true); -+ setPendingIntentBackgroundActivityLaunchAllowed( -+ opts.getBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, -+ PENDING_INTENT_BAL_ALLOWED_DEFAULT)); -+ } -+ -+ /** -+ * Set PendingIntent activity is allowed to be started in the background if the caller -+ * can start background activities. -+ * -+ * @hide -+ */ -+ public void setPendingIntentBackgroundActivityLaunchAllowed(boolean allowed) { -+ mPendingIntentBalAllowed = allowed; -+ } -+ -+ /** -+ * Get PendingIntent activity is allowed to be started in the background if the caller -+ * can start background activities. -+ * -+ * @hide -+ */ -+ public boolean isPendingIntentBackgroundActivityLaunchAllowed() { -+ return mPendingIntentBalAllowed; -+ } -+ -+ /** -+ * @hide -+ */ -+ public Bundle toBundle() { -+ Bundle bundle = new Bundle(); -+ bundle.putBoolean(KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, -+ mPendingIntentBalAllowed); -+ return bundle; -+ } -+} -diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java -index a65603cb4020..d82b435b4612 100644 ---- a/services/core/java/com/android/server/AlarmManagerService.java -+++ b/services/core/java/com/android/server/AlarmManagerService.java -@@ -26,6 +26,7 @@ import static android.app.AlarmManager.RTC_WAKEUP; - import android.annotation.UserIdInt; - import android.app.Activity; - import android.app.ActivityManager; -+import android.app.ActivityOptions; - import android.app.AlarmManager; - import android.app.AppOpsManager; - import android.app.BroadcastOptions; -@@ -272,6 +273,8 @@ class AlarmManagerService extends SystemService { - * Broadcast options to use for FLAG_ALLOW_WHILE_IDLE. - */ - Bundle mIdleOptions; -+ ActivityOptions mActivityOptsRestrictBal = ActivityOptions.makeBasic(); -+ BroadcastOptions mBroadcastOptsRestrictBal = BroadcastOptions.makeBasic(); - - private final SparseArray<AlarmManager.AlarmClockInfo> mNextAlarmClockForUser = - new SparseArray<>(); -@@ -497,6 +500,7 @@ class AlarmManagerService extends SystemService { - mLastAllowWhileIdleWhitelistDuration = ALLOW_WHILE_IDLE_WHITELIST_DURATION; - BroadcastOptions opts = BroadcastOptions.makeBasic(); - opts.setTemporaryAppWhitelistDuration(ALLOW_WHILE_IDLE_WHITELIST_DURATION); -+ opts.setPendingIntentBackgroundActivityLaunchAllowed(false); - mIdleOptions = opts.toBundle(); - } - } -@@ -1495,6 +1499,8 @@ class AlarmManagerService extends SystemService { - @Override - public void onStart() { - mInjector.init(); -+ mActivityOptsRestrictBal.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mBroadcastOptsRestrictBal.setPendingIntentBackgroundActivityLaunchAllowed(false); - - synchronized (mLock) { - mHandler = new AlarmHandler(); -@@ -4143,6 +4149,13 @@ class AlarmManagerService extends SystemService { - return alarm.creatorUid; - } - -+ private Bundle getAlarmOperationBundle(Alarm alarm) { -+ if (alarm.operation.isActivity()) { -+ return mActivityOptsRestrictBal.toBundle(); -+ } -+ return mBroadcastOptsRestrictBal.toBundle(); -+ } -+ - @VisibleForTesting - class AlarmHandler extends Handler { - public static final int ALARM_EVENT = 1; -@@ -4181,7 +4194,11 @@ class AlarmManagerService extends SystemService { - for (int i=0; i<triggerList.size(); i++) { - Alarm alarm = triggerList.get(i); - try { -- alarm.operation.send(); -+ // Disallow AlarmManager to start random background activity. -+ final Bundle bundle = getAlarmOperationBundle(alarm); -+ alarm.operation.send(/* context */ null, /* code */0, /* intent */ -+ null, /* onFinished */null, /* handler */ -+ null, /* requiredPermission */ null, bundle); - } catch (PendingIntent.CanceledException e) { - if (alarm.repeatInterval > 0) { - // This IntentSender is no longer valid, but this -@@ -4696,7 +4713,7 @@ class AlarmManagerService extends SystemService { - mBackgroundIntent.putExtra( - Intent.EXTRA_ALARM_COUNT, alarm.count), - mDeliveryTracker, mHandler, null, -- allowWhileIdle ? mIdleOptions : null); -+ allowWhileIdle ? mIdleOptions : getAlarmOperationBundle(alarm)); - } catch (PendingIntent.CanceledException e) { - if (alarm.repeatInterval > 0) { - // This IntentSender is no longer valid, but this -diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java -index 54504c3c1e24..20d87e6882ac 100644 ---- a/services/core/java/com/android/server/am/PendingIntentRecord.java -+++ b/services/core/java/com/android/server/am/PendingIntentRecord.java -@@ -20,6 +20,7 @@ import static android.app.ActivityManager.START_SUCCESS; - import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; - import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; - -+import android.annotation.Nullable; - import android.app.ActivityManager; - import android.app.ActivityOptions; - import android.content.IIntentSender; -@@ -277,6 +278,25 @@ public final class PendingIntentRecord extends IIntentSender.Stub { - requiredPermission, null, null, 0, 0, 0, options); - } - -+ /** -+ * Return true if the activity options allows PendingIntent to use caller's BAL permission. -+ */ -+ public static boolean isPendingIntentBalAllowedByCaller( -+ @Nullable ActivityOptions activityOptions) { -+ if (activityOptions == null) { -+ return ActivityOptions.PENDING_INTENT_BAL_ALLOWED_DEFAULT; -+ } -+ return isPendingIntentBalAllowedByCaller(activityOptions.toBundle()); -+ } -+ -+ private static boolean isPendingIntentBalAllowedByCaller(@Nullable Bundle options) { -+ if (options == null) { -+ return ActivityOptions.PENDING_INTENT_BAL_ALLOWED_DEFAULT; -+ } -+ return options.getBoolean(ActivityOptions.KEY_PENDING_INTENT_BACKGROUND_ACTIVITY_ALLOWED, -+ ActivityOptions.PENDING_INTENT_BAL_ALLOWED_DEFAULT); -+ } -+ - public int sendInner(int code, Intent intent, String resolvedType, IBinder whitelistToken, - IIntentReceiver finishedReceiver, String requiredPermission, IBinder resultTo, - String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle options) { -@@ -389,7 +409,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub { - // temporarily allow receivers and services to open activities from background if the - // PendingIntent.send() caller was foreground at the time of sendInner() call - final boolean allowTrampoline = uid != callingUid -- && controller.mAtmInternal.isUidForeground(callingUid); -+ && controller.mAtmInternal.isUidForeground(callingUid) -+ && isPendingIntentBalAllowedByCaller(options); - - // note: we on purpose don't pass in the information about the PendingIntent's creator, - // like pid or ProcessRecord, to the ActivityTaskManagerInternal calls below, because -diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java -index f37698de34d5..44fef5427cc3 100644 ---- a/services/core/java/com/android/server/wm/ActivityStarter.java -+++ b/services/core/java/com/android/server/wm/ActivityStarter.java -@@ -767,6 +767,10 @@ class ActivityStarter { - abort |= !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid, - callingPackage); - -+ // Merge the two options bundles, while realCallerOptions takes precedence. -+ ActivityOptions checkedOptions = options != null -+ ? options.getOptions(intent, aInfo, callerApp, mSupervisor) : null; -+ - boolean restrictedBgActivity = false; - if (!abort) { - try { -@@ -774,15 +778,12 @@ class ActivityStarter { - "shouldAbortBackgroundActivityStart"); - restrictedBgActivity = shouldAbortBackgroundActivityStart(callingUid, - callingPid, callingPackage, realCallingUid, realCallingPid, callerApp, -- originatingPendingIntent, allowBackgroundActivityStart, intent); -+ originatingPendingIntent, allowBackgroundActivityStart, intent, checkedOptions); - } finally { - Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); - } - } - -- // Merge the two options bundles, while realCallerOptions takes precedence. -- ActivityOptions checkedOptions = options != null -- ? options.getOptions(intent, aInfo, callerApp, mSupervisor) : null; - if (allowPendingRemoteAnimationRegistryLookup) { - checkedOptions = mService.getActivityStartController() - .getPendingRemoteAnimationRegistry() -@@ -941,7 +942,7 @@ class ActivityStarter { - boolean shouldAbortBackgroundActivityStart(int callingUid, int callingPid, - final String callingPackage, int realCallingUid, int realCallingPid, - WindowProcessController callerApp, PendingIntentRecord originatingPendingIntent, -- boolean allowBackgroundActivityStart, Intent intent) { -+ boolean allowBackgroundActivityStart, Intent intent, ActivityOptions checkedOptions) { - // don't abort for the most important UIDs - final int callingAppId = UserHandle.getAppId(callingUid); - if (callingUid == Process.ROOT_UID || callingAppId == Process.SYSTEM_UID -@@ -976,7 +977,11 @@ class ActivityStarter { - ? isCallingUidPersistentSystemProcess - : (realCallingAppId == Process.SYSTEM_UID) - || realCallingUidProcState <= ActivityManager.PROCESS_STATE_PERSISTENT_UI; -- if (realCallingUid != callingUid) { -+ // Legacy behavior allows to use caller foreground state to bypass BAL restriction. -+ final boolean balAllowedByPiSender = -+ PendingIntentRecord.isPendingIntentBalAllowedByCaller(checkedOptions); -+ -+ if (balAllowedByPiSender && realCallingUid != callingUid) { - // don't abort if the realCallingUid has a visible window - if (realCallingUidHasAnyVisibleWindow) { - return false; -@@ -1013,9 +1018,10 @@ class ActivityStarter { - // If we don't have callerApp at this point, no caller was provided to startActivity(). - // That's the case for PendingIntent-based starts, since the creator's process might not be - // up and alive. If that's the case, we retrieve the WindowProcessController for the send() -- // caller, so that we can make the decision based on its foreground/whitelisted state. -+ // caller if caller allows, so that we can make the decision -+ // based on its foreground/whitelisted state. - int callerAppUid = callingUid; -- if (callerApp == null) { -+ if (callerApp == null && balAllowedByPiSender) { - callerApp = mService.getProcessController(realCallingPid, realCallingUid); - callerAppUid = realCallingUid; - } -diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java -index 5e2626b9a7dd..d0dad0a23729 100644 ---- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java -+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java -@@ -2398,7 +2398,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { - final ActivityStarter starter = getActivityStartController().obtainStarter( - null /* intent */, "moveTaskToFront"); - if (starter.shouldAbortBackgroundActivityStart(callingUid, callingPid, callingPackage, -1, -- -1, callerApp, null, false, null)) { -+ -1, callerApp, null, false, null, null)) { - if (!isBackgroundActivityStartsEnabled()) { - return; - } -diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java -index 1eb7455135c7..f221c3a4573f 100644 ---- a/services/core/java/com/android/server/wm/AppTaskImpl.java -+++ b/services/core/java/com/android/server/wm/AppTaskImpl.java -@@ -117,7 +117,7 @@ class AppTaskImpl extends IAppTask.Stub { - final ActivityStarter starter = mService.getActivityStartController().obtainStarter( - null /* intent */, "moveToFront"); - if (starter.shouldAbortBackgroundActivityStart(callingUid, callingPid, -- callingPackage, -1, -1, callerApp, null, false, null)) { -+ callingPackage, -1, -1, callerApp, null, false, null, null)) { - if (!mService.isBackgroundActivityStartsEnabled()) { - return; - } diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353949-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/353949-backport.patch deleted file mode 100644 index 2998cd66..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353949-backport.patch +++ /dev/null @@ -1,152 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Louis Chang <louischang@google.com> -Date: Wed, 28 Sep 2022 06:46:29 +0000 -Subject: [PATCH] Strip part of the activity info of another uid if no - privilege - -The activity info could be from another uid which is different -from the app that hosts the task. The information should be -trimmed if the caller app doesn't have the privilege. - -However, removing the entire info may result in app compatibility -issues. So, only swiping the info that are sensitive to empty -string. - -Bug: 243130512 -Test: verified market app locally -Test: atest RecentTasksTest -Change-Id: I5b6775dd3c4e2ccdacd30741884d336b2eaa70da -Merged-In: I5b6775dd3c4e2ccdacd30741884d336b2eaa70da -(cherry picked from commit 5ba72200f6a66b5da48c9c3abd103a73aea1ef95) -(cherry picked from commit e534fa2a7119f39cb76f1d08557b7dcae3b6d94e) -(cherry picked from commit 20fc1c7244cdf840e4a6cbfa71904b4d608bb093) -Merged-In: I5b6775dd3c4e2ccdacd30741884d336b2eaa70da ---- - .../com/android/server/wm/AppTaskImpl.java | 3 +- - .../com/android/server/wm/RecentTasks.java | 8 +++-- - .../com/android/server/wm/RunningTasks.java | 7 ++++ - .../com/android/server/wm/TaskRecord.java | 34 +++++++++++++++++++ - 4 files changed, 49 insertions(+), 3 deletions(-) - -diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java -index f221c3a4573f..e12c8259d8a7 100644 ---- a/services/core/java/com/android/server/wm/AppTaskImpl.java -+++ b/services/core/java/com/android/server/wm/AppTaskImpl.java -@@ -84,7 +84,8 @@ class AppTaskImpl extends IAppTask.Stub { - if (tr == null) { - throw new IllegalArgumentException("Unable to find task ID " + mTaskId); - } -- return mService.getRecentTasks().createRecentTaskInfo(tr); -+ return mService.getRecentTasks().createRecentTaskInfo(tr, -+ true /* getTasksAllowed */); - } finally { - Binder.restoreCallingIdentity(origId); - } -diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java -index 541a8bbc8865..67fb4c28cf22 100644 ---- a/services/core/java/com/android/server/wm/RecentTasks.java -+++ b/services/core/java/com/android/server/wm/RecentTasks.java -@@ -944,7 +944,7 @@ class RecentTasks { - continue; - } - -- final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr); -+ final ActivityManager.RecentTaskInfo rti = createRecentTaskInfo(tr, getTasksAllowed); - if (!getDetailedTasks) { - rti.baseIntent.replaceExtras((Bundle) null); - } -@@ -1715,12 +1715,16 @@ class RecentTasks { - /** - * Creates a new RecentTaskInfo from a TaskRecord. - */ -- ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr) { -+ ActivityManager.RecentTaskInfo createRecentTaskInfo(TaskRecord tr, -+ boolean getTasksAllowed) { - ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo(); - tr.fillTaskInfo(rti); - // Fill in some deprecated values - rti.id = rti.isRunning ? rti.taskId : INVALID_TASK_ID; - rti.persistentId = rti.taskId; -+ if (!getTasksAllowed) { -+ TaskRecord.trimIneffectiveInfo(tr, rti); -+ } - return rti; - } - -diff --git a/services/core/java/com/android/server/wm/RunningTasks.java b/services/core/java/com/android/server/wm/RunningTasks.java -index 81a85476c53a..16d041a7a1c0 100644 ---- a/services/core/java/com/android/server/wm/RunningTasks.java -+++ b/services/core/java/com/android/server/wm/RunningTasks.java -@@ -39,6 +39,8 @@ class RunningTasks { - private final TreeSet<TaskRecord> mTmpSortedSet = new TreeSet<>(LAST_ACTIVE_TIME_COMPARATOR); - private final ArrayList<TaskRecord> mTmpStackTasks = new ArrayList<>(); - -+ private boolean mAllowed; -+ - void getTasks(int maxNum, List<RunningTaskInfo> list, @ActivityType int ignoreActivityType, - @WindowingMode int ignoreWindowingMode, ArrayList<ActivityDisplay> activityDisplays, - int callingUid, boolean allowed, boolean crossUser, ArraySet<Integer> profileIds) { -@@ -49,6 +51,7 @@ class RunningTasks { - - // Gather all of the tasks across all of the tasks, and add them to the sorted set - mTmpSortedSet.clear(); -+ mAllowed = allowed; - final int numDisplays = activityDisplays.size(); - for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - final ActivityDisplay display = activityDisplays.get(displayNdx); -@@ -82,6 +85,10 @@ class RunningTasks { - task.fillTaskInfo(rti); - // Fill in some deprecated values - rti.id = rti.taskId; -+ -+ if (!mAllowed) { -+ TaskRecord.trimIneffectiveInfo(task, rti); -+ } - return rti; - } - } -diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java -index 361f66e3106a..78d13e95df81 100644 ---- a/services/core/java/com/android/server/wm/TaskRecord.java -+++ b/services/core/java/com/android/server/wm/TaskRecord.java -@@ -2436,6 +2436,40 @@ class TaskRecord extends ConfigurationContainer { - info.configuration.setTo(getConfiguration()); - } - -+ /** -+ * Removes the activity info if the activity belongs to a different uid, which is -+ * different from the app that hosts the task. -+ */ -+ static void trimIneffectiveInfo(TaskRecord task, TaskInfo info) { -+ int topActivityUid = task.effectiveUid; -+ for (int i = task.mActivities.size() - 1; i >= 0; --i) { -+ final ActivityRecord r = task.mActivities.get(i); -+ if (r.finishing || r.isState(ActivityState.INITIALIZING)) { -+ continue; -+ } -+ topActivityUid = r.info.applicationInfo.uid; -+ break; -+ } -+ -+ if (task.effectiveUid != topActivityUid) { -+ info.topActivity = new ComponentName("", ""); -+ } -+ -+ int baseActivityUid = task.effectiveUid; -+ for (int i = 0; i < task.mActivities.size(); ++i) { -+ final ActivityRecord r = task.mActivities.get(i); -+ if (r.finishing) { -+ continue; -+ } -+ baseActivityUid = r.info.applicationInfo.uid; -+ break; -+ } -+ -+ if (task.effectiveUid != baseActivityUid) { -+ info.baseActivity = new ComponentName("", ""); -+ } -+ } -+ - /** - * Returns a {@link TaskInfo} with information from this task. - */ diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353950-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/353950-backport.patch deleted file mode 100644 index f65a8dc1..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353950-backport.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Julia Reynolds <juliacr@google.com> -Date: Tue, 18 Jan 2022 11:59:54 -0500 -Subject: [PATCH] Add a limit on channel group creation - -Same as exists for channels - -This is a backport of the fix in ag/16659457, including the adjustment from ag/20920023 (changed the max value from 50000 to 6000). - -Test: PreferencesHelperTest -Bug: 210114537 -Bug: 261723753 -Change-Id: Ic27efba4c54e22eebca16fc948879e652df4467b -(cherry picked from commit 37b3549807d15452ac334fae316e615c3b9b8e8b & I3f3a99765c161369e1b026686a0e5f0c83ed839e) -Merged-In: I3f3a99765c161369e1b026686a0e5f0c83ed839e -Merged-In: Ic27efba4c54e22eebca16fc948879e652df4467b -(cherry picked from commit 0f29716ab6fbf236e5d8f688bcdfdadf32429545) -Merged-In: Ic27efba4c54e22eebca16fc948879e652df4467b ---- - .../notification/PreferencesHelper.java | 16 ++++++- - .../notification/PreferencesHelperTest.java | 47 +++++++++++++++++++ - 2 files changed, 62 insertions(+), 1 deletion(-) - -diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java -index d4ba51cc3146..1a3779f7c607 100644 ---- a/services/core/java/com/android/server/notification/PreferencesHelper.java -+++ b/services/core/java/com/android/server/notification/PreferencesHelper.java -@@ -73,7 +73,9 @@ public class PreferencesHelper implements RankingConfig { - private static final String NON_BLOCKABLE_CHANNEL_DELIM = ":"; - - @VisibleForTesting -- static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 50000; -+ static final int NOTIFICATION_CHANNEL_COUNT_LIMIT = 5000; -+ @VisibleForTesting -+ static final int NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT = 6000; - - @VisibleForTesting - static final String TAG_RANKING = "ranking"; -@@ -184,6 +186,7 @@ public class PreferencesHelper implements RankingConfig { - } - } - boolean skipWarningLogged = false; -+ boolean skipGroupWarningLogged = false; - - PackagePreferences r = getOrCreatePackagePreferencesLocked(name, uid, - XmlUtils.readIntAttribute( -@@ -220,6 +223,14 @@ public class PreferencesHelper implements RankingConfig { - String tagName = parser.getName(); - // Channel groups - if (TAG_GROUP.equals(tagName)) { -+ if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { -+ if (!skipGroupWarningLogged) { -+ Slog.w(TAG, "Skipping further groups for " + r.pkg -+ + "; app has too many"); -+ skipGroupWarningLogged = true; -+ } -+ continue; -+ } - String id = parser.getAttributeValue(null, ATT_ID); - CharSequence groupName = parser.getAttributeValue(null, - ATT_NAME); -@@ -610,6 +621,9 @@ public class PreferencesHelper implements RankingConfig { - } - if (fromTargetApp) { - group.setBlocked(false); -+ if (r.groups.size() >= NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT) { -+ throw new IllegalStateException("Limit exceed; cannot create more groups"); -+ } - } - final NotificationChannelGroup oldGroup = r.groups.get(group.getId()); - if (!group.equals(oldGroup)) { -diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java -index 2cede07de257..dfb62999be5f 100644 ---- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java -+++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java -@@ -23,6 +23,7 @@ import static android.app.NotificationManager.IMPORTANCE_NONE; - import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; - - import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_COUNT_LIMIT; -+import static com.android.server.notification.PreferencesHelper.NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; - - import static junit.framework.Assert.assertNull; - import static junit.framework.Assert.fail; -@@ -2729,4 +2730,50 @@ public class PreferencesHelperTest extends UiServiceTestCase { - assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel, true)); - assertNull(mHelper.getNotificationChannel(PKG_O, UID_O, extraChannel1, true)); - } -+ -+ @Test -+ public void testTooManyGroups() { -+ for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { -+ NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), -+ String.valueOf(i)); -+ mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); -+ } -+ try { -+ NotificationChannelGroup group = new NotificationChannelGroup( -+ String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT), -+ String.valueOf(NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT)); -+ mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); -+ fail("Allowed to create too many notification channel groups"); -+ } catch (IllegalStateException e) { -+ // great -+ } -+ } -+ -+ @Test -+ public void testTooManyGroups_xml() throws Exception { -+ String extraGroup = "EXTRA"; -+ String extraGroup1 = "EXTRA1"; -+ -+ // create first... many... directly so we don't need a big xml blob in this test -+ for (int i = 0; i < NOTIFICATION_CHANNEL_GROUP_COUNT_LIMIT; i++) { -+ NotificationChannelGroup group = new NotificationChannelGroup(String.valueOf(i), -+ String.valueOf(i)); -+ mHelper.createNotificationChannelGroup(PKG_O, UID_O, group, true); -+ } -+ -+ final String xml = "<ranking version=\"1\">\n" -+ + "<package name=\"" + PKG_O + "\" uid=\"" + UID_O + "\" >\n" -+ + "<channelGroup id=\"" + extraGroup + "\" name=\"hi\"/>" -+ + "<channelGroup id=\"" + extraGroup1 + "\" name=\"hi2\"/>" -+ + "</package>" -+ + "</ranking>"; -+ XmlPullParser parser = Xml.newPullParser(); -+ parser.setInput(new BufferedInputStream(new ByteArrayInputStream(xml.getBytes())), -+ null); -+ parser.nextTag(); -+ mHelper.readXml(parser, false, UserHandle.USER_ALL); -+ -+ assertNull(mHelper.getNotificationChannelGroup(extraGroup, PKG_O, UID_O)); -+ assertNull(mHelper.getNotificationChannelGroup(extraGroup1, PKG_O, UID_O)); -+ } - } diff --git a/Patches/LineageOS-17.1/android_frameworks_base/353951-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/353951-backport.patch deleted file mode 100644 index 66dffafc..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/353951-backport.patch +++ /dev/null @@ -1,241 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Rhed Jao <rhedjao@google.com> -Date: Wed, 11 Jan 2023 16:02:27 +0800 -Subject: [PATCH] Fix bypass BG-FGS and BAL via package manager APIs - -Opt-in for BAL of PendingIntent for following APIs: - -* PackageInstaller.uninstall() -* PackageInstaller.installExistingPackage() -* PackageInstaller.uninstallExistingPackage() -* PackageInstaller.Session.commit() -* PackageInstaller.Session.commitTransferred() -* PackageManager.freeStorage() - -Bug: 230492955 -Bug: 243377226 -Test: atest android.security.cts.PackageInstallerTest -Test: atest CtsStagedInstallHostTestCases -Change-Id: I9b6f801d69ea6d2244a38dbe689e81afa4e798bf -(cherry picked from commit b0b1ddb4b4ba5db27f5616b02ae2cdca8b63496f) -Merged-In: I9b6f801d69ea6d2244a38dbe689e81afa4e798bf ---- - core/java/android/content/IntentSender.java | 42 ++++++++++++++++++- - .../server/pm/PackageInstallerService.java | 21 ++++++++-- - .../server/pm/PackageInstallerSession.java | 19 +++++++-- - .../server/pm/PackageManagerService.java | 10 ++++- - 4 files changed, 81 insertions(+), 11 deletions(-) - -diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java -index ec0bac486c65..0ef0a71fffe0 100644 ---- a/core/java/android/content/IntentSender.java -+++ b/core/java/android/content/IntentSender.java -@@ -16,8 +16,10 @@ - - package android.content; - -+import android.annotation.Nullable; - import android.annotation.UnsupportedAppUsage; - import android.app.ActivityManager; -+import android.app.ActivityOptions; - import android.os.Bundle; - import android.os.RemoteException; - import android.os.Handler; -@@ -154,7 +156,7 @@ public class IntentSender implements Parcelable { - */ - public void sendIntent(Context context, int code, Intent intent, - OnFinished onFinished, Handler handler) throws SendIntentException { -- sendIntent(context, code, intent, onFinished, handler, null); -+ sendIntent(context, code, intent, onFinished, handler, null, null /* options */); - } - - /** -@@ -186,6 +188,42 @@ public class IntentSender implements Parcelable { - public void sendIntent(Context context, int code, Intent intent, - OnFinished onFinished, Handler handler, String requiredPermission) - throws SendIntentException { -+ sendIntent(context, code, intent, onFinished, handler, requiredPermission, -+ null /* options */); -+ } -+ -+ /** -+ * Perform the operation associated with this IntentSender, allowing the -+ * caller to specify information about the Intent to use and be notified -+ * when the send has completed. -+ * -+ * @param context The Context of the caller. This may be null if -+ * <var>intent</var> is also null. -+ * @param code Result code to supply back to the IntentSender's target. -+ * @param intent Additional Intent data. See {@link Intent#fillIn -+ * Intent.fillIn()} for information on how this is applied to the -+ * original Intent. Use null to not modify the original Intent. -+ * @param onFinished The object to call back on when the send has -+ * completed, or null for no callback. -+ * @param handler Handler identifying the thread on which the callback -+ * should happen. If null, the callback will happen from the thread -+ * pool of the process. -+ * @param requiredPermission Name of permission that a recipient of the PendingIntent -+ * is required to hold. This is only valid for broadcast intents, and -+ * corresponds to the permission argument in -+ * {@link Context#sendBroadcast(Intent, String) Context.sendOrderedBroadcast(Intent, String)}. -+ * If null, no permission is required. -+ * @param options Additional options the caller would like to provide to modify the sending -+ * behavior. May be built from an {@link ActivityOptions} to apply to an activity start. -+ * -+ * @throws SendIntentException Throws CanceledIntentException if the IntentSender -+ * is no longer allowing more intents to be sent through it. -+ * @hide -+ */ -+ public void sendIntent(Context context, int code, Intent intent, -+ OnFinished onFinished, Handler handler, String requiredPermission, -+ @Nullable Bundle options) -+ throws SendIntentException { - try { - String resolvedType = intent != null ? - intent.resolveTypeIfNeeded(context.getContentResolver()) -@@ -195,7 +233,7 @@ public class IntentSender implements Parcelable { - onFinished != null - ? new FinishedDispatcher(this, onFinished, handler) - : null, -- requiredPermission, null); -+ requiredPermission, options); - if (res < 0) { - throw new SendIntentException(); - } -diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java -index c73f489cb143..ea144fd7c4d5 100644 ---- a/services/core/java/com/android/server/pm/PackageInstallerService.java -+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java -@@ -23,6 +23,7 @@ import android.Manifest; - import android.app.ActivityManager; - import android.app.AppGlobals; - import android.app.AppOpsManager; -+import android.app.BroadcastOptions; - import android.app.Notification; - import android.app.NotificationManager; - import android.app.PackageDeleteObserver; -@@ -1021,7 +1022,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements - PackageInstaller.STATUS_PENDING_USER_ACTION); - fillIn.putExtra(Intent.EXTRA_INTENT, intent); - try { -- mTarget.sendIntent(mContext, 0, fillIn, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, -+ null /* handler */, null /* requiredPermission */, options.toBundle()); - } catch (SendIntentException ignored) { - } - } -@@ -1046,7 +1050,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements - PackageManager.deleteStatusToString(returnCode, msg)); - fillIn.putExtra(PackageInstaller.EXTRA_LEGACY_STATUS, returnCode); - try { -- mTarget.sendIntent(mContext, 0, fillIn, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, -+ null /* handler */, null /* requiredPermission */, options.toBundle()); - } catch (SendIntentException ignored) { - } - } -@@ -1076,7 +1083,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements - PackageInstaller.STATUS_PENDING_USER_ACTION); - fillIn.putExtra(Intent.EXTRA_INTENT, intent); - try { -- mTarget.sendIntent(mContext, 0, fillIn, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, -+ null /* handler */, null /* requiredPermission */, options.toBundle()); - } catch (SendIntentException ignored) { - } - } -@@ -1116,7 +1126,10 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements - } - } - try { -- mTarget.sendIntent(mContext, 0, fillIn, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mTarget.sendIntent(mContext, 0, fillIn, null /* onFinished*/, -+ null /* handler */, null /* requiredPermission */, options.toBundle()); - } catch (SendIntentException ignored) { - } - } -diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java -index 5a880cb5fa52..71d06d8a2d03 100644 ---- a/services/core/java/com/android/server/pm/PackageInstallerSession.java -+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java -@@ -44,6 +44,7 @@ import static com.android.server.pm.PackageInstallerService.prepareStageDir; - import android.Manifest; - import android.annotation.NonNull; - import android.annotation.Nullable; -+import android.app.BroadcastOptions; - import android.app.admin.DevicePolicyEventLogger; - import android.app.admin.DevicePolicyManagerInternal; - import android.content.Context; -@@ -960,13 +961,21 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { - try { - intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, - PackageInstallerSession.this.sessionId); -- mStatusReceiver.sendIntent(mContext, 0, intent, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mStatusReceiver.sendIntent(mContext, 0, intent, -+ null /* onFinished*/, null /* handler */, -+ null /* requiredPermission */, options.toBundle()); - } catch (IntentSender.SendIntentException ignore) { - } - } - } else if (PackageInstaller.STATUS_PENDING_USER_ACTION == status) { - try { -- mStatusReceiver.sendIntent(mContext, 0, intent, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mStatusReceiver.sendIntent(mContext, 0, intent, -+ null /* onFinished*/, null /* handler */, -+ null /* requiredPermission */, options.toBundle()); - } catch (IntentSender.SendIntentException ignore) { - } - } else { -@@ -974,7 +983,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { - PackageInstallerSession.this.sessionId); - mChildSessionsRemaining.clear(); // we're done. Don't send any more. - try { -- mStatusReceiver.sendIntent(mContext, 0, intent, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ mStatusReceiver.sendIntent(mContext, 0, intent, -+ null /* onFinished*/, null /* handler */, -+ null /* requiredPermission */, options.toBundle()); - } catch (IntentSender.SendIntentException ignore) { - } - } -diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index 1bd1396c6d45..ef97d61d26d7 100644 ---- a/services/core/java/com/android/server/pm/PackageManagerService.java -+++ b/services/core/java/com/android/server/pm/PackageManagerService.java -@@ -4893,7 +4893,10 @@ public class PackageManagerService extends IPackageManager.Stub - } - if (pi != null) { - try { -- pi.sendIntent(null, success ? 1 : 0, null, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ pi.sendIntent(null, success ? 1 : 0, null /* intent */, null /* onFinished*/, -+ null /* handler */, null /* requiredPermission */, options.toBundle()); - } catch (SendIntentException e) { - Slog.w(TAG, e); - } -@@ -13738,7 +13741,10 @@ public class PackageManagerService extends IPackageManager.Stub - fillIn.putExtra(PackageInstaller.EXTRA_STATUS, - PackageManager.installStatusToPublicStatus(returnCode)); - try { -- target.sendIntent(context, 0, fillIn, null, null); -+ final BroadcastOptions options = BroadcastOptions.makeBasic(); -+ options.setPendingIntentBackgroundActivityLaunchAllowed(false); -+ target.sendIntent(context, 0, fillIn, null /* onFinished*/, -+ null /* handler */, null /* requiredPermission */, options.toBundle()); - } catch (SendIntentException ignored) { - } - } diff --git a/Patches/LineageOS-17.1/android_frameworks_base/355763-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/355763-backport.patch deleted file mode 100644 index d95ce34a..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/355763-backport.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Songchun Fan <schfan@google.com> -Date: Thu, 26 Jan 2023 17:43:24 -0800 -Subject: [PATCH] prevent system app downgrades of versions lower than preload - -Also remove misleading commandline output. - -BUG: 256202273 - -Test: manual -1. Install preload system app v90, reboot -2. (W/O data, W/ Flag, 90->80 NOK) adb install -d ~/Downloads/PrivApplication_80.apk -Performing Streamed Install -adb: failed to install /usr/local/google/home/schfan/Downloads/PrivApplication_80.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: System app: com.example.privapplication cannot be downgraded to older than its preloaded version on the system image. Update version code 80 is older than current 90] -3. (90->100) Install data app v100 -4. (W/ data, W/O Flag, 100->90 NOK) adb install ~/Downloads/PrivApplication_90.apk -Performing Streamed Install -adb: failed to install /usr/local/google/home/schfan/Downloads/PrivApplication_90.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Downgrade detected: Update version code 90 is older than current 100] -5. (W/ data, W/ Flag, 100->90 downgrade OK) adb install -d ~/Downloads/PrivApplication_90.apk -Performing Streamed Install -Success -6. (90->100) Install v100 -6. (W/data, W/ Flag, 100->80 NOK) adb install -d ~/Downloads/PrivApplication_80.apk -Performing Streamed Install -adb: failed to install /usr/local/google/home/schfan/Downloads/PrivApplication_80.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: System app: com.example.privapplication cannot be downgraded to older than its preloaded version on the system image. Update version code 80 is older than current 90] - -Change-Id: I5a8ee9e29a3a58f6e3fd188e0122355744b8b0ce -(cherry picked from commit a4484d7f1be1fa413258fe18644d61f85611f586) -(cherry picked from commit on googleplex-android-review.googlesource.com host: aec76152d65cfd5774f6c0dcf4cb6009ba48c1ee) -Merged-In: I5a8ee9e29a3a58f6e3fd188e0122355744b8b0ce ---- - .../server/pm/PackageManagerService.java | 26 ++++++++++++++++--- - 1 file changed, 23 insertions(+), 3 deletions(-) - -diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index ef97d61d26d7..068cb345d463 100644 ---- a/services/core/java/com/android/server/pm/PackageManagerService.java -+++ b/services/core/java/com/android/server/pm/PackageManagerService.java -@@ -15281,10 +15281,10 @@ public class PackageManagerService extends IPackageManager.Stub - // will be null whereas dataOwnerPkg will contain information about the package - // which was uninstalled while keeping its data. - PackageParser.Package dataOwnerPkg = installedPkg; -+ PackageSetting dataOwnerPs= mSettings.mPackages.get(packageName); - if (dataOwnerPkg == null) { -- PackageSetting ps = mSettings.mPackages.get(packageName); -- if (ps != null) { -- dataOwnerPkg = ps.pkg; -+ if (dataOwnerPs != null) { -+ dataOwnerPkg = dataOwnerPs.pkg; - } - } - -@@ -15308,12 +15308,32 @@ public class PackageManagerService extends IPackageManager.Stub - if (dataOwnerPkg != null) { - if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags, - dataOwnerPkg.applicationInfo.flags)) { -+ // Downgrade is not permitted; a lower version of the app will not be -+ // allowed - try { - checkDowngrade(dataOwnerPkg, pkgLite); - } catch (PackageManagerException e) { - Slog.w(TAG, "Downgrade detected: " + e.getMessage()); - return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; - } -+ } else if (dataOwnerPs.isSystem()) { -+ // Downgrade is permitted, but system apps can't be downgraded below -+ // the version preloaded onto the system image -+ final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr( -+ dataOwnerPs); -+ if (disabledPs != null) { -+ dataOwnerPkg = disabledPs.pkg; -+ } -+ try { -+ checkDowngrade(dataOwnerPkg, pkgLite); -+ } catch (PackageManagerException e) { -+ String errorMsg = "System app: " + packageName -+ + " cannot be downgraded to" -+ + " older than its preloaded version on the system image. " -+ + e.getMessage(); -+ Slog.w(TAG, errorMsg); -+ return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; -+ } - } - } - diff --git a/Patches/LineageOS-17.1/android_frameworks_base/355764.patch b/Patches/LineageOS-17.1/android_frameworks_base/355764.patch deleted file mode 100644 index 0f514d10..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/355764.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Songchun Fan <schfan@google.com> -Date: Thu, 2 Feb 2023 10:35:56 -0800 -Subject: [PATCH] [RESTRICT AUTOMERGE][pm] still allow debuggable for system - app downgrades - -Turns out we do have internal tests that downgrades system apps, so adding this exception to allow for that. - -BUG: 267232653 -BUG: 256202273 - -Test: manual -Change-Id: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e -(cherry picked from commit ceeca68b8c3f0ed8427b0212f63defe2f075146e) -(cherry picked from commit on googleplex-android-review.googlesource.com host: 341669af524058dd4c64a176ddc54ada589591e1) -Merged-In: Ie281bbdc8788ee64ff99a7c5150da7ce7926235e ---- - .../server/pm/PackageManagerService.java | 22 +++++++++++-------- - 1 file changed, 13 insertions(+), 9 deletions(-) - -diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java -index 37b85cf4fe79..27282c0a2dda 100644 ---- a/services/core/java/com/android/server/pm/PackageManagerService.java -+++ b/services/core/java/com/android/server/pm/PackageManagerService.java -@@ -15324,15 +15324,19 @@ private int installLocationPolicy(PackageInfoLite pkgLite) { - if (disabledPs != null) { - dataOwnerPkg = disabledPs.pkg; - } -- try { -- checkDowngrade(dataOwnerPkg, pkgLite); -- } catch (PackageManagerException e) { -- String errorMsg = "System app: " + packageName -- + " cannot be downgraded to" -- + " older than its preloaded version on the system image. " -- + e.getMessage(); -- Slog.w(TAG, errorMsg); -- return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; -+ if (!Build.IS_DEBUGGABLE && (dataOwnerPkg.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0) { -+ // Only restrict non-debuggable builds and non-debuggable version of -+ // the app -+ try { -+ checkDowngrade(dataOwnerPkg, pkgLite); -+ } catch (PackageManagerException e) { -+ String errorMsg = "System app: " + packageName -+ + " cannot be downgraded to" -+ + " older than its preloaded version on the system image. " -+ + e.getMessage(); -+ Slog.w(TAG, errorMsg); -+ return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; -+ } - } - } - } diff --git a/Patches/LineageOS-17.1/android_frameworks_base/355765-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/355765-backport.patch deleted file mode 100644 index e0ff4f55..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/355765-backport.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Daniel Norman <danielnorman@google.com> -Date: Thu, 9 Feb 2023 12:28:26 -0800 -Subject: [PATCH] Checks if AccessibilityServiceInfo is within parcelable size. - -- If too large when parsing service XMLs then skip this service. -- If too large when a service attempts to update its own info - then throw an error. - -Bug: 261589597 -Test: atest AccessibilityServiceInfoTest -Change-Id: Iffc0cd48cc713f7904d68059e141cb7de5a4b906 -Merged-In: Iffc0cd48cc713f7904d68059e141cb7de5a4b906 -(cherry picked from commit on googleplex-android-review.googlesource.com host: 553232c29079fbeab28f95307d025c1426aa7142) -Merged-In: Iffc0cd48cc713f7904d68059e141cb7de5a4b906 ---- - .../accessibilityservice/AccessibilityService.java | 4 ++++ - .../accessibilityservice/AccessibilityServiceInfo.java | 10 ++++++++++ - .../accessibility/AccessibilityManagerService.java | 6 ++++++ - 3 files changed, 20 insertions(+) - -diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java -index 90b80e73c323..5820dbee7e87 100644 ---- a/core/java/android/accessibilityservice/AccessibilityService.java -+++ b/core/java/android/accessibilityservice/AccessibilityService.java -@@ -1585,6 +1585,10 @@ public abstract class AccessibilityService extends Service { - IAccessibilityServiceConnection connection = - AccessibilityInteractionClient.getInstance().getConnection(mConnectionId); - if (mInfo != null && connection != null) { -+ if (!mInfo.isWithinParcelableSize()) { -+ throw new IllegalStateException( -+ "Cannot update service info: size is larger than safe parcelable limits."); -+ } - try { - connection.setServiceInfo(mInfo); - mInfo = null; -diff --git a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java -index cf24b8e1ffa6..3cb35a8723ab 100644 ---- a/core/java/android/accessibilityservice/AccessibilityServiceInfo.java -+++ b/core/java/android/accessibilityservice/AccessibilityServiceInfo.java -@@ -31,6 +31,7 @@ import android.content.res.Resources; - import android.content.res.TypedArray; - import android.content.res.XmlResourceParser; - import android.hardware.fingerprint.FingerprintManager; -+import android.os.IBinder; - import android.os.Parcel; - import android.os.Parcelable; - import android.util.AttributeSet; -@@ -850,6 +851,15 @@ public class AccessibilityServiceInfo implements Parcelable { - return 0; - } - -+ /** @hide */ -+ public final boolean isWithinParcelableSize() { -+ final Parcel parcel = Parcel.obtain(); -+ writeToParcel(parcel, 0); -+ final boolean result = parcel.dataSize() <= IBinder.MAX_IPC_SIZE; -+ parcel.recycle(); -+ return result; -+ } -+ - public void writeToParcel(Parcel parcel, int flagz) { - parcel.writeInt(eventTypes); - parcel.writeStringArray(packageNames); -diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java -index 457f27e679ef..194c90e125f9 100644 ---- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java -+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java -@@ -1371,6 +1371,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub - AccessibilityServiceInfo accessibilityServiceInfo; - try { - accessibilityServiceInfo = new AccessibilityServiceInfo(resolveInfo, mContext); -+ if (!accessibilityServiceInfo.isWithinParcelableSize()) { -+ Slog.e(LOG_TAG, "Skipping service " -+ + accessibilityServiceInfo.getResolveInfo().getComponentInfo() -+ + " because service info size is larger than safe parcelable limits."); -+ continue; -+ } - mTempAccessibilityServiceInfoList.add(accessibilityServiceInfo); - } catch (XmlPullParserException | IOException xppe) { - Slog.e(LOG_TAG, "Error while initializing AccessibilityServiceInfo", xppe); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/355766-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/355766-backport.patch deleted file mode 100644 index 96f71262..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/355766-backport.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Orion Hodson <oth@google.com> -Date: Thu, 7 Apr 2022 21:42:04 +0100 -Subject: [PATCH] Uri: check authority and scheme as part of determining URI - path - -The interpretation of the path depends on whether the scheme or -authority are specified and should be observed when unparcelling -URIs. - -Bug: 171966843 -Test: atest FrameworksCoreTests:android.net.UriTest -Test: atest com.android.devicehealthchecks.SystemAppCheck -Change-Id: I06981d1c6e387b16df792494523994518848db37 -Merged-In: I06981d1c6e387b16df792494523994518848db37 -(cherry picked from commit f37a94ae920fa5879c557603fc285942ec4b84b1) -(cherry picked from commit on googleplex-android-review.googlesource.com host: c87f0623be4042c39a9b73f7a6e02aa116925e50) -Merged-In: I06981d1c6e387b16df792494523994518848db37 ---- - core/java/android/net/Uri.java | 22 +++++--- - .../coretests/src/android/net/UriTest.java | 54 +++++++++++++++++++ - 2 files changed, 69 insertions(+), 7 deletions(-) - -diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java -index 8cf182b41566..33acef7f9506 100644 ---- a/core/java/android/net/Uri.java -+++ b/core/java/android/net/Uri.java -@@ -1194,13 +1194,16 @@ public abstract class Uri implements Parcelable, Comparable<Uri> { - } - - static Uri readFrom(Parcel parcel) { -- return new HierarchicalUri( -- parcel.readString(), -- Part.readFrom(parcel), -- PathPart.readFrom(parcel), -- Part.readFrom(parcel), -- Part.readFrom(parcel) -- ); -+ final String scheme = parcel.readString(); -+ final Part authority = Part.readFrom(parcel); -+ // In RFC3986 the path should be determined based on whether there is a scheme or -+ // authority present (https://www.rfc-editor.org/rfc/rfc3986.html#section-3.3). -+ final boolean hasSchemeOrAuthority = -+ (scheme != null && scheme.length() > 0) || !authority.isEmpty(); -+ final PathPart path = PathPart.readFrom(hasSchemeOrAuthority, parcel); -+ final Part query = Part.readFrom(parcel); -+ final Part fragment = Part.readFrom(parcel); -+ return new HierarchicalUri(scheme, authority, path, query, fragment); - } - - public int describeContents() { -@@ -2263,6 +2266,11 @@ public abstract class Uri implements Parcelable, Comparable<Uri> { - } - } - -+ static PathPart readFrom(boolean hasSchemeOrAuthority, Parcel parcel) { -+ final PathPart path = readFrom(parcel); -+ return hasSchemeOrAuthority ? makeAbsolute(path) : path; -+ } -+ - /** - * Creates a path from the encoded string. - * -diff --git a/core/tests/coretests/src/android/net/UriTest.java b/core/tests/coretests/src/android/net/UriTest.java -index f20220c4ab9b..73cfdc6d1e0f 100644 ---- a/core/tests/coretests/src/android/net/UriTest.java -+++ b/core/tests/coretests/src/android/net/UriTest.java -@@ -48,6 +48,7 @@ public class UriTest extends TestCase { - public void testParcelling() { - parcelAndUnparcel(Uri.parse("foo:bob%20lee")); - parcelAndUnparcel(Uri.fromParts("foo", "bob lee", "fragment")); -+ parcelAndUnparcel(Uri.fromParts("https", "www.google.com", null)); - parcelAndUnparcel(new Uri.Builder() - .scheme("http") - .authority("crazybob.org") -@@ -873,9 +874,62 @@ public class UriTest extends TestCase { - Throwable targetException = expected.getTargetException(); - // Check that the exception was thrown for the correct reason. - assertEquals("Unknown representation: 0", targetException.getMessage()); -+ } finally { -+ parcel.recycle(); - } - } - -+ private Uri buildUriFromRawParcel(boolean argumentsEncoded, -+ String scheme, -+ String authority, -+ String path, -+ String query, -+ String fragment) { -+ // Representation value (from AbstractPart.REPRESENTATION_{ENCODED,DECODED}). -+ final int representation = argumentsEncoded ? 1 : 2; -+ Parcel parcel = Parcel.obtain(); -+ try { -+ parcel.writeInt(3); // hierarchical -+ parcel.writeString(scheme); -+ parcel.writeInt(representation); -+ parcel.writeString(authority); -+ parcel.writeInt(representation); -+ parcel.writeString(path); -+ parcel.writeInt(representation); -+ parcel.writeString(query); -+ parcel.writeInt(representation); -+ parcel.writeString(fragment); -+ parcel.setDataPosition(0); -+ return Uri.CREATOR.createFromParcel(parcel); -+ } finally { -+ parcel.recycle(); -+ } -+ } -+ -+ public void testUnparcelMalformedPath() { -+ // Regression tests for b/171966843. -+ -+ // Test cases with arguments encoded (covering testing `scheme` * `authority` options). -+ Uri uri0 = buildUriFromRawParcel(true, "https", "google.com", "@evil.com", null, null); -+ assertEquals("https://google.com/@evil.com", uri0.toString()); -+ Uri uri1 = buildUriFromRawParcel(true, null, "google.com", "@evil.com", "name=spark", "x"); -+ assertEquals("//google.com/@evil.com?name=spark#x", uri1.toString()); -+ Uri uri2 = buildUriFromRawParcel(true, "http:", null, "@evil.com", null, null); -+ assertEquals("http::/@evil.com", uri2.toString()); -+ Uri uri3 = buildUriFromRawParcel(true, null, null, "@evil.com", null, null); -+ assertEquals("@evil.com", uri3.toString()); -+ -+ // Test cases with arguments not encoded (covering testing `scheme` * `authority` options). -+ Uri uriA = buildUriFromRawParcel(false, "https", "google.com", "@evil.com", null, null); -+ assertEquals("https://google.com/%40evil.com", uriA.toString()); -+ Uri uriB = buildUriFromRawParcel(false, null, "google.com", "@evil.com", null, null); -+ assertEquals("//google.com/%40evil.com", uriB.toString()); -+ Uri uriC = buildUriFromRawParcel(false, "http:", null, "@evil.com", null, null); -+ assertEquals("http::/%40evil.com", uriC.toString()); -+ Uri uriD = buildUriFromRawParcel(false, null, null, "@evil.com", "name=spark", "y"); -+ assertEquals("%40evil.com?name%3Dspark#y", uriD.toString()); -+ } -+ - public void testToSafeString() { - checkToSafeString("tel:xxxxxx", "tel:Google"); - checkToSafeString("tel:xxxxxxxxxx", "tel:1234567890"); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/355767.patch b/Patches/LineageOS-17.1/android_frameworks_base/355767.patch deleted file mode 100644 index 4ed784cb..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/355767.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Thomas Stuart <tjstuart@google.com> -Date: Mon, 21 Nov 2022 17:38:21 -0800 -Subject: [PATCH] enforce stricter rules when registering phoneAccounts - -- include disable accounts when looking up accounts for a package to - check if the limit is reached (10) -- put a new limit of 10 supported schemes -- put a new limit of 256 characters per scheme -- put a new limit of 256 characters per address -- ensure the Icon can write to memory w/o throwing an exception - -bug: 259064622 -bug: 256819769 -Test: cts + unit -Change-Id: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 -Merged-In: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 -(cherry picked from commit on googleplex-android-review.googlesource.com host: a66a3156e03fbd1c3a29015db9193d66f2709f98) -Merged-In: Ia7d8d00d9de0fb6694ded6a80c40bd55d7fdf7a7 ---- - .../java/android/telecom/PhoneAccount.java | 19 +++++++++++++++++++ - 1 file changed, 19 insertions(+) - -diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java -index 1b783b7beb7f..d0e9a40a1a15 100644 ---- a/telecomm/java/android/telecom/PhoneAccount.java -+++ b/telecomm/java/android/telecom/PhoneAccount.java -@@ -466,6 +466,11 @@ public final class PhoneAccount implements Parcelable { - - /** - * Sets the address. See {@link PhoneAccount#getAddress}. -+ * <p> -+ * Note: The entire URI value is limited to 256 characters. This check is -+ * enforced when registering the PhoneAccount via -+ * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} and will cause an -+ * {@link IllegalArgumentException} to be thrown if URI is over 256. - * - * @param value The address of the phone account. - * @return The builder. -@@ -499,6 +504,10 @@ public final class PhoneAccount implements Parcelable { - - /** - * Sets the icon. See {@link PhoneAccount#getIcon}. -+ * <p> -+ * Note: An {@link IllegalArgumentException} if the Icon cannot be written to memory. -+ * This check is enforced when registering the PhoneAccount via -+ * {@link TelecomManager#registerPhoneAccount(PhoneAccount)} - * - * @param icon The icon to set. - */ -@@ -532,6 +541,10 @@ public final class PhoneAccount implements Parcelable { - /** - * Specifies an additional URI scheme supported by the {@link PhoneAccount}. - * -+ * <p> -+ * Each URI scheme is limited to 256 characters. Adding a scheme over 256 characters will -+ * cause an {@link IllegalArgumentException} to be thrown when the account is registered. -+ * - * @param uriScheme The URI scheme. - * @return The builder. - */ -@@ -545,6 +558,12 @@ public final class PhoneAccount implements Parcelable { - /** - * Specifies the URI schemes supported by the {@link PhoneAccount}. - * -+ * <p> -+ * A max of 10 URI schemes can be added per account. Additionally, each URI scheme is -+ * limited to 256 characters. Adding more than 10 URI schemes or 256 characters on any -+ * scheme will cause an {@link IllegalArgumentException} to be thrown when the account -+ * is registered. -+ * - * @param uriSchemes The URI schemes. - * @return The builder. - */ diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358556.patch b/Patches/LineageOS-17.1/android_frameworks_base/358556.patch deleted file mode 100644 index 2bd7fa27..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358556.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hongwei Wang <hwwang@google.com> -Date: Thu, 23 Feb 2023 13:23:37 -0800 -Subject: [PATCH] Remove Activity if it enters PiP without window - -This is to prevent malicious app entering PiP without being visible -first, like blocking onResume from completion. Which in turn -leaves the PiP window in limbo and non-interactable. - -Bug: 265293293 -Test: atest PinnedStackTests -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:4fad1456409b79d6e649a29d5116a4fe3160bd21) -Merged-In: I458a9508662e72a1adb9d9818105f2e9d7096d44 -Change-Id: I458a9508662e72a1adb9d9818105f2e9d7096d44 ---- - .../core/java/com/android/server/wm/ActivityRecord.java | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java -index 55e8e19fd278..ffd27481a280 100644 ---- a/services/core/java/com/android/server/wm/ActivityRecord.java -+++ b/services/core/java/com/android/server/wm/ActivityRecord.java -@@ -781,6 +781,12 @@ final class ActivityRecord extends ConfigurationContainer { - } - schedulePictureInPictureModeChanged(newConfig); - scheduleMultiWindowModeChanged(newConfig); -+ if (inPictureInPictureMode && findMainWindow() == null) { -+ // Prevent malicious app entering PiP without valid WindowState, which can in turn -+ // result a non-touchable PiP window since the InputConsumer for PiP requires it. -+ EventLog.writeEvent(0x534e4554, "265293293", -1, ""); -+ removeImmediately(); -+ } - } - } - diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358557.patch b/Patches/LineageOS-17.1/android_frameworks_base/358557.patch deleted file mode 100644 index 9426ddc0..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358557.patch +++ /dev/null @@ -1,106 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mark Renouf <mrenouf@google.com> -Date: Wed, 22 Feb 2023 15:14:08 +0000 -Subject: [PATCH] Prevent sharesheet from previewing unowned URIs - -Bug: 261036568 -Test: manually via supplied tool (see bug) -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3062b80fb28014a7482d5fa8b2a5c852134a5845) -Merged-In: I21accf6f753d2f676f1602d6e1ce829c5ef29e9a -Change-Id: I21accf6f753d2f676f1602d6e1ce829c5ef29e9a ---- - .../android/internal/app/ChooserActivity.java | 36 +++++++++++++++++-- - 1 file changed, 34 insertions(+), 2 deletions(-) - -diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java -index f43ff17ed7d0..2e17dce90240 100644 ---- a/core/java/com/android/internal/app/ChooserActivity.java -+++ b/core/java/com/android/internal/app/ChooserActivity.java -@@ -16,6 +16,8 @@ - - package com.android.internal.app; - -+import static android.content.ContentProvider.getUserIdFromUri; -+ - import static java.lang.annotation.RetentionPolicy.SOURCE; - - import android.animation.Animator; -@@ -140,6 +142,7 @@ import java.util.HashSet; - import java.util.List; - import java.util.Map; - import java.util.Set; -+import java.util.stream.Collectors; - - /** - * The Chooser Activity handles intent resolution specifically for sharing intents - -@@ -1082,7 +1085,7 @@ public class ChooserActivity extends ResolverActivity { - - ImageView previewThumbnailView = contentPreviewLayout.findViewById( - R.id.content_preview_thumbnail); -- if (previewThumbnail == null) { -+ if (!validForContentPreview(previewThumbnail)) { - previewThumbnailView.setVisibility(View.GONE); - } else { - mPreviewCoord = new ContentPreviewCoordinator(contentPreviewLayout, false); -@@ -1109,6 +1112,10 @@ public class ChooserActivity extends ResolverActivity { - String action = targetIntent.getAction(); - if (Intent.ACTION_SEND.equals(action)) { - Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM); -+ if (!validForContentPreview(uri)) { -+ contentPreviewLayout.setVisibility(View.GONE); -+ return contentPreviewLayout; -+ } - mPreviewCoord.loadUriIntoView(R.id.content_preview_image_1_large, uri, 0); - } else { - ContentResolver resolver = getContentResolver(); -@@ -1116,7 +1123,7 @@ public class ChooserActivity extends ResolverActivity { - List<Uri> uris = targetIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); - List<Uri> imageUris = new ArrayList<>(); - for (Uri uri : uris) { -- if (isImageType(resolver.getType(uri))) { -+ if (validForContentPreview(uri) && isImageType(resolver.getType(uri))) { - imageUris.add(uri); - } - } -@@ -1222,9 +1229,16 @@ public class ChooserActivity extends ResolverActivity { - String action = targetIntent.getAction(); - if (Intent.ACTION_SEND.equals(action)) { - Uri uri = targetIntent.getParcelableExtra(Intent.EXTRA_STREAM); -+ if (!validForContentPreview(uri)) { -+ contentPreviewLayout.setVisibility(View.GONE); -+ return contentPreviewLayout; -+ } - loadFileUriIntoView(uri, contentPreviewLayout); - } else { - List<Uri> uris = targetIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); -+ uris = uris.stream() -+ .filter(ChooserActivity::validForContentPreview) -+ .collect(Collectors.toList()); - int uriCount = uris.size(); - - if (uriCount == 0) { -@@ -1278,6 +1292,24 @@ public class ChooserActivity extends ResolverActivity { - } - } - -+ /** -+ * Indicate if the incoming content URI should be allowed. -+ * -+ * @param uri the uri to test -+ * @return true if the URI is allowed for content preview -+ */ -+ private static boolean validForContentPreview(Uri uri) throws SecurityException { -+ if (uri == null) { -+ return false; -+ } -+ int userId = getUserIdFromUri(uri, UserHandle.USER_CURRENT); -+ if (userId != UserHandle.USER_CURRENT && userId != UserHandle.myUserId()) { -+ Log.e(TAG, "dropped invalid content URI belonging to user " + userId); -+ return false; -+ } -+ return true; -+ } -+ - @VisibleForTesting - protected boolean isImageType(String mimeType) { - return mimeType != null && mimeType.startsWith("image/"); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358560.patch b/Patches/LineageOS-17.1/android_frameworks_base/358560.patch deleted file mode 100644 index 83402d21..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358560.patch +++ /dev/null @@ -1,167 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Lee <brnlee@google.com> -Date: Fri, 17 Feb 2023 16:05:17 -0800 -Subject: [PATCH] Check key intent for selectors and prohibited flags - -Bug: 265015796 -Test: atest -FrameworksServicesTests: com.android.server.accounts.AccountManagerServiceTest -(cherry picked from commit e53a96304352e2965176c8d32ac1b504e52ef185) -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:92114886bdce8467c52c655c186f3e7ab1e134d8) -Merged-In: Ie16f8654337bd75eaad3156817470674b4f0cee3 -Change-Id: Ie16f8654337bd75eaad3156817470674b4f0cee3 ---- - .../accounts/AccountManagerService.java | 18 +++++++--- - .../accounts/AccountManagerServiceTest.java | 36 +++++++++++++++++++ - .../AccountManagerServiceTestFixtures.java | 5 ++- - .../TestAccountType1Authenticator.java | 5 +-- - 4 files changed, 54 insertions(+), 10 deletions(-) - -diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java -index b4edf94927b2..a9c7b0c6a3f1 100644 ---- a/services/core/java/com/android/server/accounts/AccountManagerService.java -+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java -@@ -4808,10 +4808,6 @@ public class AccountManagerService - if (intent.getClipData() == null) { - intent.setClipData(ClipData.newPlainText(null, null)); - } -- intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_READ_URI_PERMISSION -- | Intent.FLAG_GRANT_WRITE_URI_PERMISSION -- | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION -- | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION)); - long bid = Binder.clearCallingIdentity(); - try { - PackageManager pm = mContext.getPackageManager(); -@@ -4858,7 +4854,19 @@ public class AccountManagerService - if (intent == null) { - return (simulateIntent == null); - } -- return intent.filterEquals(simulateIntent); -+ if (!intent.filterEquals(simulateIntent)) { -+ return false; -+ } -+ -+ if (intent.getSelector() != simulateIntent.getSelector()) { -+ return false; -+ } -+ -+ int prohibitedFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION -+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION -+ | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION -+ | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; -+ return (simulateIntent.getFlags() & prohibitedFlags) == 0; - } - - private boolean isExportedSystemActivity(ActivityInfo activityInfo) { -diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java -index 215f1e8e2a9e..d379e8131268 100644 ---- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java -+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java -@@ -18,6 +18,7 @@ package com.android.server.accounts; - - import static android.database.sqlite.SQLiteDatabase.deleteDatabase; - -+import static org.mockito.ArgumentMatchers.contains; - import static org.mockito.Matchers.any; - import static org.mockito.Matchers.anyBoolean; - import static org.mockito.Matchers.anyInt; -@@ -686,6 +687,41 @@ public class AccountManagerServiceTest extends AndroidTestCase { - assertNotNull(intent.getParcelableExtra(AccountManagerServiceTestFixtures.KEY_CALLBACK)); - } - -+ @SmallTest -+ public void testStartAddAccountSessionWhereAuthenticatorReturnsIntentWithProhibitedFlags() -+ throws Exception { -+ unlockSystemUser(); -+ ResolveInfo resolveInfo = new ResolveInfo(); -+ resolveInfo.activityInfo = new ActivityInfo(); -+ resolveInfo.activityInfo.applicationInfo = new ApplicationInfo(); -+ when(mMockPackageManager.resolveActivityAsUser( -+ any(Intent.class), anyInt(), anyInt())).thenReturn(resolveInfo); -+ when(mMockPackageManager.checkSignatures( -+ anyInt(), anyInt())).thenReturn(PackageManager.SIGNATURE_MATCH); -+ -+ final CountDownLatch latch = new CountDownLatch(1); -+ Response response = new Response(latch, mMockAccountManagerResponse); -+ Bundle options = createOptionsWithAccountName( -+ AccountManagerServiceTestFixtures.ACCOUNT_NAME_INTERVENE); -+ int prohibitedFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION -+ | Intent.FLAG_GRANT_WRITE_URI_PERMISSION -+ | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION -+ | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION; -+ options.putInt(AccountManagerServiceTestFixtures.KEY_INTENT_FLAGS, prohibitedFlags); -+ -+ mAms.startAddAccountSession( -+ response, // response -+ AccountManagerServiceTestFixtures.ACCOUNT_TYPE_1, // accountType -+ "authTokenType", -+ null, // requiredFeatures -+ true, // expectActivityLaunch -+ options); // optionsIn -+ waitForLatch(latch); -+ -+ verify(mMockAccountManagerResponse).onError( -+ eq(AccountManager.ERROR_CODE_INVALID_RESPONSE), contains("invalid intent")); -+ } -+ - @SmallTest - public void testStartAddAccountSessionError() throws Exception { - unlockSystemUser(); -diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTestFixtures.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTestFixtures.java -index 73f30d9f9e79..b98a6a891d55 100644 ---- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTestFixtures.java -+++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTestFixtures.java -@@ -17,9 +17,6 @@ package com.android.server.accounts; - - import android.accounts.Account; - --import java.util.ArrayList; --import java.util.List; -- - /** - * Constants shared between test AccountAuthenticators and AccountManagerServiceTest. - */ -@@ -31,6 +28,8 @@ public final class AccountManagerServiceTestFixtures { - "account_manager_service_test:account_status_token_key"; - public static final String KEY_ACCOUNT_PASSWORD = - "account_manager_service_test:account_password_key"; -+ public static final String KEY_INTENT_FLAGS = -+ "account_manager_service_test:intent_flags_key"; - public static final String KEY_OPTIONS_BUNDLE = - "account_manager_service_test:option_bundle_key"; - public static final String ACCOUNT_NAME_SUCCESS = "success_on_return@fixture.com"; -diff --git a/services/tests/servicestests/src/com/android/server/accounts/TestAccountType1Authenticator.java b/services/tests/servicestests/src/com/android/server/accounts/TestAccountType1Authenticator.java -index 8106364477d9..924443e9d5cf 100644 ---- a/services/tests/servicestests/src/com/android/server/accounts/TestAccountType1Authenticator.java -+++ b/services/tests/servicestests/src/com/android/server/accounts/TestAccountType1Authenticator.java -@@ -24,8 +24,6 @@ import android.content.Context; - import android.content.Intent; - import android.os.Bundle; - --import com.android.frameworks.servicestests.R; -- - import java.util.concurrent.atomic.AtomicInteger; - - /** -@@ -270,11 +268,13 @@ public class TestAccountType1Authenticator extends AbstractAccountAuthenticator - String accountName = null; - Bundle sessionBundle = null; - String password = null; -+ int intentFlags = 0; - if (options != null) { - accountName = options.getString(AccountManagerServiceTestFixtures.KEY_ACCOUNT_NAME); - sessionBundle = options.getBundle( - AccountManagerServiceTestFixtures.KEY_ACCOUNT_SESSION_BUNDLE); - password = options.getString(AccountManagerServiceTestFixtures.KEY_ACCOUNT_PASSWORD); -+ intentFlags = options.getInt(AccountManagerServiceTestFixtures.KEY_INTENT_FLAGS, 0); - } - - Bundle result = new Bundle(); -@@ -302,6 +302,7 @@ public class TestAccountType1Authenticator extends AbstractAccountAuthenticator - intent.putExtra(AccountManagerServiceTestFixtures.KEY_RESULT, - eventualActivityResultData); - intent.putExtra(AccountManagerServiceTestFixtures.KEY_CALLBACK, response); -+ intent.setFlags(intentFlags); - - result.putParcelable(AccountManager.KEY_INTENT, intent); - } else { diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358561-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/358561-backport.patch deleted file mode 100644 index 45d42e8c..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358561-backport.patch +++ /dev/null @@ -1,79 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Kweku Adams <kwekua@google.com> -Date: Wed, 21 Sep 2022 22:13:01 +0000 -Subject: [PATCH] Handle invalid data during job loading. - -Catch exceptions that may be thrown if invalid data ended up in the -persisted job file. - -Bug: 246541702 -Bug: 246542132 -Bug: 246542285 -Bug: 246542330 -Test: install test app with invalid job config, start app to schedule job, then reboot device -(cherry picked from commit c98fb42b480b3beedc2d94de6110f50212c4aa0b) -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:df1ba00dd9f64a3ae9a9e05979dfae6a15c7e203) -Merged-In: Id0ceba345942baf21177f687b8dd85ef001c0a9e -Change-Id: Id0ceba345942baf21177f687b8dd85ef001c0a9e ---- - .../java/com/android/server/job/JobStore.java | 26 ++++++++++++++++--- - 1 file changed, 23 insertions(+), 3 deletions(-) - -diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java -index 4ef37a2e484d..1f2772571e71 100644 ---- a/services/core/java/com/android/server/job/JobStore.java -+++ b/services/core/java/com/android/server/job/JobStore.java -@@ -677,6 +677,10 @@ public final class JobStore { - } - } catch (XmlPullParserException | IOException e) { - Slog.wtf(TAG, "Error jobstore xml.", e); -+ } catch (Exception e) { -+ // Crashing at this point would result in a boot loop, so live with a general -+ // Exception for system stability's sake. -+ Slog.wtf(TAG, "Unexpected exception", e); - } finally { - if (mPersistInfo.countAllJobsLoaded < 0) { // Only set them once. - mPersistInfo.countAllJobsLoaded = numJobs; -@@ -807,6 +811,15 @@ public final class JobStore { - } catch (NumberFormatException e) { - Slog.d(TAG, "Error reading constraints, skipping."); - return null; -+ } catch (XmlPullParserException e) { -+ Slog.d(TAG, "Error Parser Exception.", e); -+ return null; -+ } catch (IOException e) { -+ Slog.d(TAG, "Error I/O Exception.", e); -+ return null; -+ } catch (IllegalArgumentException e) { -+ Slog.e(TAG, "Constraints contained invalid data", e); -+ return null; - } - parser.next(); // Consume </constraints> - -@@ -902,8 +915,14 @@ public final class JobStore { - return null; - } - -- PersistableBundle extras = PersistableBundle.restoreFromXml(parser); -- jobBuilder.setExtras(extras); -+ final PersistableBundle extras; -+ try { -+ extras = PersistableBundle.restoreFromXml(parser); -+ jobBuilder.setExtras(extras); -+ } catch (IllegalArgumentException e) { -+ Slog.e(TAG, "Persisted extras contained invalid data", e); -+ return null; -+ } - parser.nextTag(); // Consume </extras> - - final JobInfo builtJob; -@@ -950,7 +969,8 @@ public final class JobStore { - return new JobInfo.Builder(jobId, cname); - } - -- private void buildConstraintsFromXml(JobInfo.Builder jobBuilder, XmlPullParser parser) { -+ private void buildConstraintsFromXml(JobInfo.Builder jobBuilder, XmlPullParser parser) -+ throws XmlPullParserException, IOException { - String val; - - final String netCapabilities = parser.getAttributeValue(null, "net-capabilities"); diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358562-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/358562-backport.patch deleted file mode 100644 index 36f89da4..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358562-backport.patch +++ /dev/null @@ -1,231 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Julia Reynolds <juliacr@google.com> -Date: Tue, 7 Mar 2023 15:44:49 -0500 -Subject: [PATCH] Allow filtering of services - -Test: ServiceListingTest -Bug: 260570119 -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:44dcb8351e61f4b3a63ec68fa5d8490501e8a823) -Merged-In: Ib4740ba401667de62fa1a33334c2c1fbee25b760 -Change-Id: Ib4740ba401667de62fa1a33334c2c1fbee25b760 ---- - .../applications/ServiceListing.java | 19 +++- - .../applications/ServiceListingTest.java | 98 ++++++++++++++++++- - 2 files changed, 113 insertions(+), 4 deletions(-) - -diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java -index 454d1dce0b2f..6ed7b5065175 100644 ---- a/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java -+++ b/packages/SettingsLib/src/com/android/settingslib/applications/ServiceListing.java -@@ -35,6 +35,7 @@ import android.util.Slog; - import java.util.ArrayList; - import java.util.HashSet; - import java.util.List; -+import java.util.function.Predicate; - - /** - * Class for managing services matching a given intent and requesting a given permission. -@@ -50,11 +51,13 @@ public class ServiceListing { - private final HashSet<ComponentName> mEnabledServices = new HashSet<>(); - private final List<ServiceInfo> mServices = new ArrayList<>(); - private final List<Callback> mCallbacks = new ArrayList<>(); -+ private final Predicate mValidator; - - private boolean mListening; - - private ServiceListing(Context context, String tag, -- String setting, String intentAction, String permission, String noun) { -+ String setting, String intentAction, String permission, String noun, -+ Predicate validator) { - mContentResolver = context.getContentResolver(); - mContext = context; - mTag = tag; -@@ -62,6 +65,7 @@ public class ServiceListing { - mIntentAction = intentAction; - mPermission = permission; - mNoun = noun; -+ mValidator = validator; - } - - public void addCallback(Callback callback) { -@@ -130,7 +134,6 @@ public class ServiceListing { - new Intent(mIntentAction), - PackageManager.GET_SERVICES | PackageManager.GET_META_DATA, - user); -- - for (ResolveInfo resolveInfo : installedServices) { - ServiceInfo info = resolveInfo.serviceInfo; - -@@ -141,6 +144,9 @@ public class ServiceListing { - + mPermission); - continue; - } -+ if (mValidator != null && !mValidator.test(info)) { -+ continue; -+ } - mServices.add(info); - } - for (Callback callback : mCallbacks) { -@@ -186,6 +192,7 @@ public class ServiceListing { - private String mIntentAction; - private String mPermission; - private String mNoun; -+ private Predicate mValidator; - - public Builder(Context context) { - mContext = context; -@@ -216,8 +223,14 @@ public class ServiceListing { - return this; - } - -+ public Builder setValidator(Predicate<ServiceInfo> validator) { -+ mValidator = validator; -+ return this; -+ } -+ - public ServiceListing build() { -- return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun); -+ return new ServiceListing(mContext, mTag, mSetting, mIntentAction, mPermission, mNoun, -+ mValidator); - } - } - } -diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java -index f7fd25b9fb7d..7ff0988c494d 100644 ---- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java -+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/ServiceListingTest.java -@@ -18,20 +18,35 @@ package com.android.settingslib.applications; - - import static com.google.common.truth.Truth.assertThat; - -+import static org.mockito.ArgumentMatchers.any; -+import static org.mockito.ArgumentMatchers.anyInt; - import static org.mockito.ArgumentMatchers.anyList; - import static org.mockito.Mockito.mock; -+import static org.mockito.Mockito.spy; - import static org.mockito.Mockito.times; - import static org.mockito.Mockito.verify; -+import static org.mockito.Mockito.when; - - import android.content.ComponentName; -+import android.content.Context; -+import android.content.pm.PackageManager; -+import android.content.pm.ResolveInfo; -+import android.content.pm.ServiceInfo; - import android.provider.Settings; - -+import androidx.test.core.app.ApplicationProvider; -+ -+import com.google.common.collect.ImmutableList; -+ - import org.junit.Before; - import org.junit.Test; - import org.junit.runner.RunWith; -+import org.mockito.ArgumentCaptor; - import org.robolectric.RobolectricTestRunner; - import org.robolectric.RuntimeEnvironment; - -+import java.util.List; -+ - @RunWith(RobolectricTestRunner.class) - public class ServiceListingTest { - -@@ -39,16 +54,97 @@ public class ServiceListingTest { - private static final String TEST_INTENT = "com.example.intent"; - - private ServiceListing mServiceListing; -+ private Context mContext; -+ private PackageManager mPm; - - @Before - public void setUp() { -- mServiceListing = new ServiceListing.Builder(RuntimeEnvironment.application) -+ mPm = mock(PackageManager.class); -+ mContext = spy(ApplicationProvider.getApplicationContext()); -+ when(mContext.getPackageManager()).thenReturn(mPm); -+ -+ mServiceListing = new ServiceListing.Builder(mContext) -+ .setTag("testTag") -+ .setSetting(TEST_SETTING) -+ .setNoun("testNoun") -+ .setIntentAction(TEST_INTENT) -+ .setPermission("testPermission") -+ .build(); -+ } -+ -+ @Test -+ public void testValidator() { -+ ServiceInfo s1 = new ServiceInfo(); -+ s1.permission = "testPermission"; -+ s1.packageName = "pkg"; -+ ServiceInfo s2 = new ServiceInfo(); -+ s2.permission = "testPermission"; -+ s2.packageName = "pkg2"; -+ ResolveInfo r1 = new ResolveInfo(); -+ r1.serviceInfo = s1; -+ ResolveInfo r2 = new ResolveInfo(); -+ r2.serviceInfo = s2; -+ -+ when(mPm.queryIntentServicesAsUser(any(), anyInt(), anyInt())).thenReturn( -+ ImmutableList.of(r1, r2)); -+ -+ mServiceListing = new ServiceListing.Builder(mContext) -+ .setTag("testTag") -+ .setSetting(TEST_SETTING) -+ .setNoun("testNoun") -+ .setIntentAction(TEST_INTENT) -+ .setValidator(info -> { -+ if (info.packageName.equals("pkg")) { -+ return true; -+ } -+ return false; -+ }) -+ .setPermission("testPermission") -+ .build(); -+ ServiceListing.Callback callback = mock(ServiceListing.Callback.class); -+ mServiceListing.addCallback(callback); -+ mServiceListing.reload(); -+ -+ verify(mPm).queryIntentServicesAsUser(any(), anyInt(), anyInt()); -+ ArgumentCaptor<List<ServiceInfo>> captor = ArgumentCaptor.forClass(List.class); -+ verify(callback, times(1)).onServicesReloaded(captor.capture()); -+ -+ assertThat(captor.getValue().size()).isEqualTo(1); -+ assertThat(captor.getValue().get(0)).isEqualTo(s1); -+ } -+ -+ @Test -+ public void testNoValidator() { -+ ServiceInfo s1 = new ServiceInfo(); -+ s1.permission = "testPermission"; -+ s1.packageName = "pkg"; -+ ServiceInfo s2 = new ServiceInfo(); -+ s2.permission = "testPermission"; -+ s2.packageName = "pkg2"; -+ ResolveInfo r1 = new ResolveInfo(); -+ r1.serviceInfo = s1; -+ ResolveInfo r2 = new ResolveInfo(); -+ r2.serviceInfo = s2; -+ -+ when(mPm.queryIntentServicesAsUser(any(), anyInt(), anyInt())).thenReturn( -+ ImmutableList.of(r1, r2)); -+ -+ mServiceListing = new ServiceListing.Builder(mContext) - .setTag("testTag") - .setSetting(TEST_SETTING) - .setNoun("testNoun") - .setIntentAction(TEST_INTENT) - .setPermission("testPermission") - .build(); -+ ServiceListing.Callback callback = mock(ServiceListing.Callback.class); -+ mServiceListing.addCallback(callback); -+ mServiceListing.reload(); -+ -+ verify(mPm).queryIntentServicesAsUser(any(), anyInt(), anyInt()); -+ ArgumentCaptor<List<ServiceInfo>> captor = ArgumentCaptor.forClass(List.class); -+ verify(callback, times(1)).onServicesReloaded(captor.capture()); -+ -+ assertThat(captor.getValue().size()).isEqualTo(2); - } - - @Test diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358564-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/358564-backport.patch deleted file mode 100644 index 30411350..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358564-backport.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jeff DeCew <jeffdq@google.com> -Date: Fri, 24 Mar 2023 16:15:24 +0000 -Subject: [PATCH] Add BubbleMetadata detection to block FSI - -Bug: 274759612 -Test: atest NotificationInterruptStateProviderImplTest -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c60e264a551df9f880fd73683321b7e821429da7) -Merged-In: I40e1aa6377b8a60d91cb2f4189df1e9a4a4578a2 -Change-Id: I40e1aa6377b8a60d91cb2f4189df1e9a4a4578a2 ---- - .../NotificationInterruptionStateProvider.java | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java -index ff71db4dc3b5..336c65b3c7d4 100644 ---- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java -+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInterruptionStateProvider.java -@@ -461,6 +461,20 @@ public class NotificationInterruptionStateProvider { - return false; - } - -+ // If the notification has suppressive BubbleMetadata, block FSI and warn. -+ Notification.BubbleMetadata bubbleMetadata = sbn.getNotification().getBubbleMetadata(); -+ if (bubbleMetadata != null && bubbleMetadata.isNotificationSuppressed()) { -+ // b/274759612: Detect and report an event when a notification has both an FSI and a -+ // suppressive BubbleMetadata, and now correctly block the FSI from firing. -+ final int uid = entry.getSbn().getUid(); -+ android.util.EventLog.writeEvent(0x534e4554, "274759612", uid, "bubbleMetadata"); -+ if (DEBUG) { -+ Log.w(TAG, "No FullScreenIntent: WARNING: BubbleMetadata may prevent HUN: " -+ + entry.getKey()); -+ } -+ return false; -+ } -+ - // If the screen is off, then launch the FullScreenIntent - if (!mPowerManager.isInteractive()) { - if (DEBUG) { diff --git a/Patches/LineageOS-17.1/android_frameworks_base/358732-backport.patch b/Patches/LineageOS-17.1/android_frameworks_base/358732-backport.patch deleted file mode 100644 index 0c8319d4..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_base/358732-backport.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Valentin Iftime <valiiftime@google.com> -Date: Wed, 22 Feb 2023 09:38:55 +0100 -Subject: [PATCH] Prevent RemoteViews crashing SystemUi - - Catch canvas drawing exceptions caused by unsuported image sizes. - -Test: 1. Post a custom view notification with a layout - containing an ImageView that references a 5k x 5k image -2. Add an App Widget to the home screen with that has the - layout mentioned above as preview/initial layout. - -Bug: 268193777 -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:cfc0b34432ab54e3fa472db5c43e620293f64a5d) -Merged-In: Ib3bda769c499b4069b49c566b1b227f98f707a8a -Change-Id: Ib3bda769c499b4069b49c566b1b227f98f707a8a ---- - .../android/appwidget/AppWidgetHostView.java | 39 ++++++++++++++----- - 1 file changed, 29 insertions(+), 10 deletions(-) - -diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java -index 85f0e2342412..eafb631216e5 100644 ---- a/core/java/android/appwidget/AppWidgetHostView.java -+++ b/core/java/android/appwidget/AppWidgetHostView.java -@@ -28,6 +28,7 @@ import android.content.pm.LauncherActivityInfo; - import android.content.pm.LauncherApps; - import android.content.pm.PackageManager.NameNotFoundException; - import android.content.res.Resources; -+import android.graphics.Canvas; - import android.graphics.Color; - import android.graphics.Rect; - import android.os.Bundle; -@@ -250,19 +251,26 @@ public class AppWidgetHostView extends FrameLayout { - super.onLayout(changed, left, top, right, bottom); - } catch (final RuntimeException e) { - Log.e(TAG, "Remote provider threw runtime exception, using error view instead.", e); -- removeViewInLayout(mView); -- View child = getErrorView(); -- prepareView(child); -- addViewInLayout(child, 0, child.getLayoutParams()); -- measureChild(child, MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), -- MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); -- child.layout(0, 0, child.getMeasuredWidth() + mPaddingLeft + mPaddingRight, -- child.getMeasuredHeight() + mPaddingTop + mPaddingBottom); -- mView = child; -- mViewMode = VIEW_MODE_ERROR; -+ handleViewError(); - } - } - -+ /** -+ * Remove bad view and replace with error message view -+ */ -+ private void handleViewError() { -+ removeViewInLayout(mView); -+ View child = getErrorView(); -+ prepareView(child); -+ addViewInLayout(child, 0, child.getLayoutParams()); -+ measureChild(child, MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY), -+ MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY)); -+ child.layout(0, 0, child.getMeasuredWidth() + mPaddingLeft + mPaddingRight, -+ child.getMeasuredHeight() + mPaddingTop + mPaddingBottom); -+ mView = child; -+ mViewMode = VIEW_MODE_ERROR; -+ } -+ - /** - * Provide guidance about the size of this widget to the AppWidgetManager. The widths and - * heights should correspond to the full area the AppWidgetHostView is given. Padding added by -@@ -711,4 +719,15 @@ public class AppWidgetHostView extends FrameLayout { - } - return null; - } -+ -+ @Override -+ protected void dispatchDraw(Canvas canvas) { -+ try { -+ super.dispatchDraw(canvas); -+ } catch (Exception e) { -+ // Catch draw exceptions that may be caused by RemoteViews -+ Log.e(TAG, "Drawing view failed: " + e); -+ post(this::handleViewError); -+ } -+ } - } diff --git a/Patches/LineageOS-17.1/android_frameworks_native/353953-backport.patch b/Patches/LineageOS-17.1/android_frameworks_native/353953-backport.patch deleted file mode 100644 index 0fb70ca6..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_native/353953-backport.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Sally Qi <sallyqi@google.com> -Date: Wed, 5 Oct 2022 11:42:30 -0700 -Subject: [PATCH] Mitigate the security vulnerability by sanitizing the - transaction flags. - -- This is part of fix of commit - Id9d9012d4ede9c8330f0ce1096bcb78e51b7c5df for backporting. -- Part of commit Id9d9012d4ede9c8330f0ce1096bcb78e51b7c5df which - sanitizes the transaction flags from DisplayState instead. -- In rvc, we only have ACCESS_SURFACE_FLINGER permission check passed as - `privileged` argument in SF::applyTransactionState. We can directly - utilize it for sanitization in DiaplyState. -- In rvc code base, SF::setTransactionState pass a const array of - displayState objects and then call SF::applyTransactionState. To - successfully sanitize the flags for each displayState object, we - convert this const array into non-const one before calling - SF::applyTransactionState. - -Bug: 248031255 -Test: test using displaytoken app manually on the phone, test shell -screenrecord during using displaytoken; atest -android.hardware.camera2.cts.FastBasicsTest - -Change-Id: Id9d9012d4ede9c8330f0ce1096bcb78e51b7c5df -Merged-In: Id9d9012d4ede9c8330f0ce1096bcb78e51b7c5df -(cherry picked from commit 03d4458ea0cb00c28f695d99aae5e4c6b15fc237) -Merged-In: Id9d9012d4ede9c8330f0ce1096bcb78e51b7c5df ---- - libs/gui/LayerState.cpp | 21 +++++++++++++++++++++ - libs/gui/include/gui/LayerState.h | 1 + - services/surfaceflinger/SurfaceFlinger.cpp | 14 ++++++++++---- - services/surfaceflinger/SurfaceFlinger.h | 5 ++--- - 4 files changed, 34 insertions(+), 7 deletions(-) - -diff --git a/libs/gui/LayerState.cpp b/libs/gui/LayerState.cpp -index 6066421faf..293f042de2 100644 ---- a/libs/gui/LayerState.cpp -+++ b/libs/gui/LayerState.cpp -@@ -237,6 +237,27 @@ void DisplayState::merge(const DisplayState& other) { - } - } - -+void DisplayState::sanitize(bool privileged) { -+ if (what & DisplayState::eLayerStackChanged) { -+ if (!privileged) { -+ what &= ~DisplayState::eLayerStackChanged; -+ ALOGE("Stripped attempt to set eLayerStackChanged in sanitize"); -+ } -+ } -+ if (what & DisplayState::eDisplayProjectionChanged) { -+ if (!privileged) { -+ what &= ~DisplayState::eDisplayProjectionChanged; -+ ALOGE("Stripped attempt to set eDisplayProjectionChanged in sanitize"); -+ } -+ } -+ if (what & DisplayState::eSurfaceChanged) { -+ if (!privileged) { -+ what &= ~DisplayState::eSurfaceChanged; -+ ALOGE("Stripped attempt to set eSurfaceChanged in sanitize"); -+ } -+ } -+} -+ - void layer_state_t::merge(const layer_state_t& other) { - if (other.what & ePositionChanged) { - what |= ePositionChanged; -diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h -index f438eb3d01..8a07602e41 100644 ---- a/libs/gui/include/gui/LayerState.h -+++ b/libs/gui/include/gui/LayerState.h -@@ -231,6 +231,7 @@ struct DisplayState { - - DisplayState(); - void merge(const DisplayState& other); -+ void sanitize(bool privileged); - - uint32_t what; - sp<IBinder> token; -diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp -index db26808cc2..21e9e8eb96 100644 ---- a/services/surfaceflinger/SurfaceFlinger.cpp -+++ b/services/surfaceflinger/SurfaceFlinger.cpp -@@ -3675,7 +3675,7 @@ bool SurfaceFlinger::flushTransactionQueues() { - auto& [applyToken, transactionQueue] = *it; - - while (!transactionQueue.empty()) { -- const auto& transaction = transactionQueue.front(); -+ auto& transaction = transactionQueue.front(); - if (!transactionIsReadyToBeApplied(transaction.desiredPresentTime, - transaction.states)) { - setTransactionFlags(eTransactionFlushNeeded); -@@ -3794,12 +3794,17 @@ void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& states, - return; - } - -- applyTransactionState(states, displays, flags, inputWindowCommands, desiredPresentTime, -+ Vector<DisplayState> displaysList; -+ for (auto& d : displays) { -+ displaysList.add(d); -+ } -+ -+ applyTransactionState(states, displaysList, flags, inputWindowCommands, desiredPresentTime, - uncacheBuffer, listenerCallbacks, postTime, privileged); - } - - void SurfaceFlinger::applyTransactionState(const Vector<ComposerState>& states, -- const Vector<DisplayState>& displays, uint32_t flags, -+ Vector<DisplayState>& displays, uint32_t flags, - const InputWindowCommands& inputWindowCommands, - const int64_t desiredPresentTime, - const client_cache_t& uncacheBuffer, -@@ -3824,7 +3829,8 @@ void SurfaceFlinger::applyTransactionState(const Vector<ComposerState>& states, - } - } - -- for (const DisplayState& display : displays) { -+ for (DisplayState& display : displays) { -+ display.sanitize(privileged); - transactionFlags |= setDisplayStateLocked(display); - } - -diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h -index e58caa63b3..c4578d0dbb 100644 ---- a/services/surfaceflinger/SurfaceFlinger.h -+++ b/services/surfaceflinger/SurfaceFlinger.h -@@ -568,9 +568,8 @@ private: - /* ------------------------------------------------------------------------ - * Transactions - */ -- void applyTransactionState(const Vector<ComposerState>& state, -- const Vector<DisplayState>& displays, uint32_t flags, -- const InputWindowCommands& inputWindowCommands, -+ void applyTransactionState(const Vector<ComposerState>& state, Vector<DisplayState>& displays, -+ uint32_t flags, const InputWindowCommands& inputWindowCommands, - const int64_t desiredPresentTime, - const client_cache_t& uncacheBuffer, - const std::vector<ListenerCallbacks>& listenerCallbacks, diff --git a/Patches/LineageOS-17.1/android_frameworks_native/355772.patch b/Patches/LineageOS-17.1/android_frameworks_native/355772.patch deleted file mode 100644 index d8e256cc..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_native/355772.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Devin Moore <devinmoore@google.com> -Date: Fri, 17 Feb 2023 17:12:46 +0000 -Subject: [PATCH] Check for malformed Sensor Flattenable - -Test: libsensorserviceaidl_fuzzer with testcase from bug -Bug: 269014004 -Merged-In: I0e255c64243c38876fb657cbf942fc1613363216 -Change-Id: I0e255c64243c38876fb657cbf942fc1613363216 -(cherry picked from commit aeec1802f7befc8fbb18313ad3ac0969c3811870) -Merged-In: I0e255c64243c38876fb657cbf942fc1613363216 -(cherry picked from commit on googleplex-android-review.googlesource.com host: f1aa5fb53437ec2fabc9be00099af836da5f07f2) -Merged-In: I0e255c64243c38876fb657cbf942fc1613363216 ---- - libs/sensor/Sensor.cpp | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/libs/sensor/Sensor.cpp b/libs/sensor/Sensor.cpp -index abc910302c..9d8c6c34e3 100644 ---- a/libs/sensor/Sensor.cpp -+++ b/libs/sensor/Sensor.cpp -@@ -591,7 +591,13 @@ bool Sensor::unflattenString8(void const*& buffer, size_t& size, String8& output - return false; - } - outputString8.setTo(static_cast<char const*>(buffer), len); -+ -+ if (size < FlattenableUtils::align<4>(len)) { -+ ALOGE("Malformed Sensor String8 field. Should be in a 4-byte aligned buffer but is not."); -+ return false; -+ } - FlattenableUtils::advance(buffer, size, FlattenableUtils::align<4>(len)); -+ - return true; - } - diff --git a/Patches/LineageOS-17.1/android_frameworks_native/355773.patch b/Patches/LineageOS-17.1/android_frameworks_native/355773.patch deleted file mode 100644 index 10961030..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_native/355773.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Devin Moore <devinmoore@google.com> -Date: Fri, 17 Feb 2023 19:35:25 +0000 -Subject: [PATCH] Remove some new memory leaks from SensorManager - -After catching an error in Sensor::unflatten, there are memory leaks -caught by the fuzzer in the same test case. - -Test: libsensorserviceaidl_fuzzer with testcase from bug -Bug: 269014004 -Merged-In: I509cceb41f56ca117d9475f6f6674244560fe582 -Change-Id: I509cceb41f56ca117d9475f6f6674244560fe582 -(cherry picked from commit c95fa0f0e7c7b73746ff850b85a79fc5f92b784e) -Merged-In: I509cceb41f56ca117d9475f6f6674244560fe582 -(cherry picked from commit on googleplex-android-review.googlesource.com host: ceb0d52273256c6a5c5622bf81b0ac4ba106faa1) -Merged-In: I509cceb41f56ca117d9475f6f6674244560fe582 ---- - libs/sensor/ISensorServer.cpp | 12 ++++++++++-- - libs/sensor/SensorManager.cpp | 5 +++++ - 2 files changed, 15 insertions(+), 2 deletions(-) - -diff --git a/libs/sensor/ISensorServer.cpp b/libs/sensor/ISensorServer.cpp -index 5200545a53..b2f1ba2507 100644 ---- a/libs/sensor/ISensorServer.cpp -+++ b/libs/sensor/ISensorServer.cpp -@@ -66,7 +66,11 @@ public: - v.setCapacity(n); - while (n) { - n--; -- reply.read(s); -+ if(reply.read(s) != OK) { -+ ALOGE("Failed to read reply from getSensorList"); -+ v.clear(); -+ break; -+ } - v.add(s); - } - return v; -@@ -84,7 +88,11 @@ public: - v.setCapacity(n); - while (n) { - n--; -- reply.read(s); -+ if(reply.read(s) != OK) { -+ ALOGE("Failed to read reply from getDynamicSensorList"); -+ v.clear(); -+ break; -+ } - v.add(s); - } - return v; -diff --git a/libs/sensor/SensorManager.cpp b/libs/sensor/SensorManager.cpp -index 96d5eb9d1f..e09672c9a4 100644 ---- a/libs/sensor/SensorManager.cpp -+++ b/libs/sensor/SensorManager.cpp -@@ -162,6 +162,11 @@ status_t SensorManager::assertStateLocked() { - - mSensors = mSensorServer->getSensorList(mOpPackageName); - size_t count = mSensors.size(); -+ if (count == 0) { -+ ALOGE("Failed to get Sensor list"); -+ mSensorServer.clear(); -+ return UNKNOWN_ERROR; -+ } - mSensorList = - static_cast<Sensor const**>(malloc(count * sizeof(Sensor*))); - LOG_ALWAYS_FATAL_IF(mSensorList == nullptr, "mSensorList NULL"); diff --git a/Patches/LineageOS-17.1/android_frameworks_native/355774.patch b/Patches/LineageOS-17.1/android_frameworks_native/355774.patch deleted file mode 100644 index ce58bea4..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_native/355774.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Anthony Stange <stange@google.com> -Date: Tue, 21 Feb 2023 17:57:38 +0000 -Subject: [PATCH] Add removeInstanceForPackageMethod to SensorManager - -In order to ensure that clients don't leak their sensor manager -instance that we currently store in a static map, they need to be able -to remove their instance. Otherwise, this instance is never removed from -the list and will hang around until our SensorManage instance is -destroyed. - -Bug: 269014004 -Test: Run ./libsensorserviceaidl_fuzzer -Change-Id: I52185f74ae8d28b379440235ca6f03c5089081f5 -(cherry picked from commit 9532f7c682fdd4b1e6e553cd6f61fc0cf2555902) -Merged-In: I52185f74ae8d28b379440235ca6f03c5089081f5 -(cherry picked from commit on googleplex-android-review.googlesource.com host: 4521fbf8095439a1c1681b5c709b306a5dc1d1e3) -Merged-In: I52185f74ae8d28b379440235ca6f03c5089081f5 ---- - libs/sensor/SensorManager.cpp | 10 ++++++++++ - libs/sensor/include/sensor/SensorManager.h | 1 + - services/sensorservice/hidl/SensorManager.cpp | 3 +++ - 3 files changed, 14 insertions(+) - -diff --git a/libs/sensor/SensorManager.cpp b/libs/sensor/SensorManager.cpp -index e09672c9a4..180a0ebd85 100644 ---- a/libs/sensor/SensorManager.cpp -+++ b/libs/sensor/SensorManager.cpp -@@ -92,6 +92,16 @@ SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) - return *sensorManager; - } - -+void SensorManager::removeInstanceForPackage(const String16& packageName) { -+ Mutex::Autolock _l(sLock); -+ auto iterator = sPackageInstances.find(packageName); -+ if (iterator != sPackageInstances.end()) { -+ SensorManager* sensorManager = iterator->second; -+ delete sensorManager; -+ sPackageInstances.erase(iterator); -+ } -+} -+ - SensorManager::SensorManager(const String16& opPackageName) - : mSensorList(nullptr), mOpPackageName(opPackageName), mDirectConnectionHandle(1) { - Mutex::Autolock _l(mLock); -diff --git a/libs/sensor/include/sensor/SensorManager.h b/libs/sensor/include/sensor/SensorManager.h -index f09c9c67b4..127f74f4b2 100644 ---- a/libs/sensor/include/sensor/SensorManager.h -+++ b/libs/sensor/include/sensor/SensorManager.h -@@ -54,6 +54,7 @@ class SensorManager : public ASensorManager - { - public: - static SensorManager& getInstanceForPackage(const String16& packageName); -+ static void removeInstanceForPackage(const String16& packageName); - ~SensorManager(); - - ssize_t getSensorList(Sensor const* const** list); -diff --git a/services/sensorservice/hidl/SensorManager.cpp b/services/sensorservice/hidl/SensorManager.cpp -index 938060063f..0a4e68412d 100644 ---- a/services/sensorservice/hidl/SensorManager.cpp -+++ b/services/sensorservice/hidl/SensorManager.cpp -@@ -60,6 +60,9 @@ SensorManager::~SensorManager() { - if (mPollThread.joinable()) { - mPollThread.join(); - } -+ -+ ::android::SensorManager::removeInstanceForPackage( -+ String16(ISensorManager::descriptor)); - } - - // Methods from ::android::frameworks::sensorservice::V1_0::ISensorManager follow. diff --git a/Patches/LineageOS-17.1/android_frameworks_opt_net_wifi/351437-backport.patch b/Patches/LineageOS-17.1/android_frameworks_opt_net_wifi/351437-backport.patch deleted file mode 100644 index d8dfda0a..00000000 --- a/Patches/LineageOS-17.1/android_frameworks_opt_net_wifi/351437-backport.patch +++ /dev/null @@ -1,250 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Tad <tad@spotco.us> -Date: Tue, 21 Mar 2023 13:01:30 -0400 -Subject: [PATCH] Revert "[DO NOT MERGE] wifi: remove certificates for network - factory reset" - -This reverts commit 5aa2d76b9d820ebe175a5f4c416a873352000c71. - -Change-Id: I3ae8d2ae65006560bd2b5b44a6075ba207707e1b ---- - .../server/wifi/WifiConfigManager.java | 2 +- - .../com/android/server/wifi/WifiKeyStore.java | 7 ++--- - .../wifi/WifiNetworkSuggestionsManager.java | 2 +- - .../android/server/wifi/WifiServiceImpl.java | 6 ---- - .../server/wifi/WifiConfigManagerTest.java | 6 ++-- - .../android/server/wifi/WifiKeyStoreTest.java | 28 +++---------------- - .../WifiNetworkSuggestionsManagerTest.java | 2 +- - .../server/wifi/WifiServiceImplTest.java | 16 ++++------- - 8 files changed, 18 insertions(+), 51 deletions(-) - -diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java -index fce5758e1..393a5c395 100644 ---- a/service/java/com/android/server/wifi/WifiConfigManager.java -+++ b/service/java/com/android/server/wifi/WifiConfigManager.java -@@ -1359,7 +1359,7 @@ public class WifiConfigManager { - // will remove the enterprise keys when provider is uninstalled. Suggestion enterprise - // networks will remove the enterprise keys when suggestion is removed. - if (!config.isPasspoint() && !config.fromWifiNetworkSuggestion && config.isEnterprise()) { -- mWifiKeyStore.removeKeys(config.enterpriseConfig, false); -+ mWifiKeyStore.removeKeys(config.enterpriseConfig); - } - - removeConnectChoiceFromAllNetworks(config.configKey()); -diff --git a/service/java/com/android/server/wifi/WifiKeyStore.java b/service/java/com/android/server/wifi/WifiKeyStore.java -index 8e82f4720..c1706a20d 100644 ---- a/service/java/com/android/server/wifi/WifiKeyStore.java -+++ b/service/java/com/android/server/wifi/WifiKeyStore.java -@@ -221,11 +221,10 @@ public class WifiKeyStore { - * Remove enterprise keys from the network config. - * - * @param config Config corresponding to the network. -- * @param forceRemove remove keys regardless of the key installer. - */ -- public void removeKeys(WifiEnterpriseConfig config, boolean forceRemove) { -+ public void removeKeys(WifiEnterpriseConfig config) { - // Do not remove keys that were manually installed by the user -- if (forceRemove || config.isAppInstalledDeviceKeyAndCert()) { -+ if (config.isAppInstalledDeviceKeyAndCert()) { - String client = config.getClientCertificateAlias(); - // a valid client certificate is configured - if (!TextUtils.isEmpty(client)) { -@@ -238,7 +237,7 @@ public class WifiKeyStore { - } - - // Do not remove CA certs that were manually installed by the user -- if (forceRemove || config.isAppInstalledCaCert()) { -+ if (config.isAppInstalledCaCert()) { - String[] aliases = config.getCaCertificateAliases(); - // a valid ca certificate is configured - if (aliases != null) { -diff --git a/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java b/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java -index ae7892cd2..031aec603 100644 ---- a/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java -+++ b/service/java/com/android/server/wifi/WifiNetworkSuggestionsManager.java -@@ -668,7 +668,7 @@ public class WifiNetworkSuggestionsManager { - if (!config.isEnterprise()) { - continue; - } -- mWifiKeyStore.removeKeys(config.enterpriseConfig, false); -+ mWifiKeyStore.removeKeys(config.enterpriseConfig); - } - // Clear the scan cache. - removeFromScanResultMatchInfoMap(removingSuggestions); -diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java -index 0d6732dd7..d375ba4c8 100644 ---- a/service/java/com/android/server/wifi/WifiServiceImpl.java -+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java -@@ -3002,13 +3002,7 @@ public class WifiServiceImpl extends BaseWifiService { - List<WifiConfiguration> networks = mClientModeImpl.syncGetConfiguredNetworks( - Binder.getCallingUid(), mClientModeImplChannel, Process.WIFI_UID); - if (networks != null) { -- EventLog.writeEvent(0x534e4554, "231985227", -1, -- "Remove certs for factory reset"); - for (WifiConfiguration config : networks) { -- if (config.isEnterprise()) { -- mWifiInjector.getWifiKeyStore().removeKeys( -- config.enterpriseConfig, true); -- } - removeNetwork(config.networkId, packageName); - } - } -diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java -index 71d06fb7e..f5ad049dd 100644 ---- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java -+++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java -@@ -703,7 +703,7 @@ public class WifiConfigManagerTest { - verify(mWcmListener, never()).onSavedNetworkAdded(suggestionNetwork.networkId); - assertTrue(mWifiConfigManager - .removeNetwork(suggestionNetwork.networkId, TEST_CREATOR_UID)); -- verify(mWifiKeyStore, never()).removeKeys(any(), eq(false)); -+ verify(mWifiKeyStore, never()).removeKeys(any()); - } - - /** -@@ -947,7 +947,7 @@ public class WifiConfigManagerTest { - assertTrue(mWifiConfigManager.removeNetwork(passpointNetwork.networkId, Process.WIFI_UID)); - - // Verify keys are not being removed. -- verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class), eq(false)); -+ verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class)); - verifyNetworkRemoveBroadcast(passpointNetwork); - // Ensure that the write was not invoked for Passpoint network remove. - mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); -@@ -5169,7 +5169,7 @@ public class WifiConfigManagerTest { - assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID)); - - // Verify keys are not being removed. -- verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class), eq(false)); -+ verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class)); - verifyNetworkRemoveBroadcast(configuration); - // Ensure that the write was not invoked for Passpoint network remove. - mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean()); -diff --git a/tests/wifitests/src/com/android/server/wifi/WifiKeyStoreTest.java b/tests/wifitests/src/com/android/server/wifi/WifiKeyStoreTest.java -index 3f54c3f85..7649d1ba4 100644 ---- a/tests/wifitests/src/com/android/server/wifi/WifiKeyStoreTest.java -+++ b/tests/wifitests/src/com/android/server/wifi/WifiKeyStoreTest.java -@@ -96,7 +96,7 @@ public class WifiKeyStoreTest { - public void testRemoveKeysForAppInstalledCerts() { - when(mWifiEnterpriseConfig.isAppInstalledDeviceKeyAndCert()).thenReturn(true); - when(mWifiEnterpriseConfig.isAppInstalledCaCert()).thenReturn(true); -- mWifiKeyStore.removeKeys(mWifiEnterpriseConfig, false); -+ mWifiKeyStore.removeKeys(mWifiEnterpriseConfig); - - // Method calls the KeyStore#delete method 4 times, user key, user cert, and 2 CA cert - verify(mKeyStore).delete(Credentials.USER_PRIVATE_KEY + USER_CERT_ALIAS, Process.WIFI_UID); -@@ -115,7 +115,7 @@ public class WifiKeyStoreTest { - public void testRemoveKeysForMixedInstalledCerts1() { - when(mWifiEnterpriseConfig.isAppInstalledDeviceKeyAndCert()).thenReturn(true); - when(mWifiEnterpriseConfig.isAppInstalledCaCert()).thenReturn(false); -- mWifiKeyStore.removeKeys(mWifiEnterpriseConfig, false); -+ mWifiKeyStore.removeKeys(mWifiEnterpriseConfig); - - // Method calls the KeyStore#delete method 2 times: user key and user cert - verify(mKeyStore).delete(Credentials.USER_PRIVATE_KEY + USER_CERT_ALIAS, Process.WIFI_UID); -@@ -131,7 +131,7 @@ public class WifiKeyStoreTest { - public void testRemoveKeysForMixedInstalledCerts2() { - when(mWifiEnterpriseConfig.isAppInstalledDeviceKeyAndCert()).thenReturn(false); - when(mWifiEnterpriseConfig.isAppInstalledCaCert()).thenReturn(true); -- mWifiKeyStore.removeKeys(mWifiEnterpriseConfig, false); -+ mWifiKeyStore.removeKeys(mWifiEnterpriseConfig); - - // Method calls the KeyStore#delete method 2 times: 2 CA certs - verify(mKeyStore).delete(Credentials.CA_CERTIFICATE + USER_CA_CERT_ALIAS[0], -@@ -148,27 +148,7 @@ public class WifiKeyStoreTest { - public void testRemoveKeysForUserInstalledCerts() { - when(mWifiEnterpriseConfig.isAppInstalledDeviceKeyAndCert()).thenReturn(false); - when(mWifiEnterpriseConfig.isAppInstalledCaCert()).thenReturn(false); -- mWifiKeyStore.removeKeys(mWifiEnterpriseConfig, false); -- verifyNoMoreInteractions(mKeyStore); -- } -- -- /** -- * Verifies that keys and certs are removed when they were not installed by the user -- * when forceRemove is true. -- */ -- @Test -- public void testForceRemoveKeysForUserInstalledCerts() throws Exception { -- when(mWifiEnterpriseConfig.isAppInstalledDeviceKeyAndCert()).thenReturn(false); -- when(mWifiEnterpriseConfig.isAppInstalledCaCert()).thenReturn(false); -- mWifiKeyStore.removeKeys(mWifiEnterpriseConfig, true); -- -- // KeyStore#delete() is called three time for user cert, user key, and 2 CA cert. -- verify(mKeyStore).delete(Credentials.USER_PRIVATE_KEY + USER_CERT_ALIAS, Process.WIFI_UID); -- verify(mKeyStore).delete(Credentials.USER_CERTIFICATE + USER_CERT_ALIAS, Process.WIFI_UID); -- verify(mKeyStore).delete(Credentials.CA_CERTIFICATE + USER_CA_CERT_ALIAS[0], -- Process.WIFI_UID); -- verify(mKeyStore).delete(Credentials.CA_CERTIFICATE + USER_CA_CERT_ALIAS[1], -- Process.WIFI_UID); -+ mWifiKeyStore.removeKeys(mWifiEnterpriseConfig); - verifyNoMoreInteractions(mKeyStore); - } - -diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java -index 60dcf153c..ed5bb39ab 100644 ---- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java -+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSuggestionsManagerTest.java -@@ -344,7 +344,7 @@ public class WifiNetworkSuggestionsManagerTest { - assertEquals(WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS, - mWifiNetworkSuggestionsManager.remove(new ArrayList<>(), - TEST_UID_1, TEST_PACKAGE_1)); -- verify(mWifiKeyStore).removeKeys(any(), eq(false)); -+ verify(mWifiKeyStore).removeKeys(any()); - } - /** - * Verify successful replace (add,remove, add) of network suggestions. -diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java -index 53d6d7815..fab326858 100644 ---- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java -+++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java -@@ -260,7 +260,6 @@ public class WifiServiceImplTest { - @Mock WifiScoreCard mWifiScoreCard; - @Mock PasspointManager mPasspointManager; - @Mock IDppCallback mDppCallback; -- @Mock WifiKeyStore mWifiKeyStore; - - @Spy FakeWifiLog mLog; - -@@ -402,7 +401,6 @@ public class WifiServiceImplTest { - when(mContext.checkPermission(eq(android.Manifest.permission.NETWORK_MANAGED_PROVISIONING), - anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_DENIED); - when(mScanRequestProxy.startScan(anyInt(), anyString())).thenReturn(true); -- when(mWifiInjector.getWifiKeyStore()).thenReturn(mWifiKeyStore); - - ArgumentCaptor<SoftApCallback> softApCallbackCaptor = - ArgumentCaptor.forClass(SoftApCallback.class); -@@ -3643,11 +3641,7 @@ public class WifiServiceImplTest { - anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED); - when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true); - final String fqdn = "example.com"; -- WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(); -- openNetwork.networkId = TEST_NETWORK_ID; -- WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork( -- WifiEnterpriseConfig.Eap.TLS, WifiEnterpriseConfig.Phase2.NONE); -- eapNetwork.networkId = TEST_NETWORK_ID + 1; -+ WifiConfiguration network = WifiConfigurationTestUtil.createOpenNetwork(); - PasspointConfiguration config = new PasspointConfiguration(); - HomeSp homeSp = new HomeSp(); - homeSp.setFqdn(fqdn); -@@ -3655,17 +3649,17 @@ public class WifiServiceImplTest { - - mWifiServiceImpl.mClientModeImplChannel = mAsyncChannel; - when(mClientModeImpl.syncGetConfiguredNetworks(anyInt(), any(), anyInt())) -- .thenReturn(Arrays.asList(openNetwork, eapNetwork)); -+ .thenReturn(Arrays.asList(network)); - when(mClientModeImpl.syncGetPasspointConfigs(any(), anyBoolean())) - .thenReturn(Arrays.asList(config)); - -+ when(mClientModeImpl.syncGetPasspointConfigs(any())).thenReturn(Arrays.asList(config)); -+ - mWifiServiceImpl.factoryReset(TEST_PACKAGE_NAME); - mLooper.dispatchAll(); - - verify(mWifiApConfigStore).setApConfiguration(null); -- verify(mClientModeImpl).syncRemoveNetwork(mAsyncChannel, openNetwork.networkId); -- verify(mClientModeImpl).syncRemoveNetwork(mAsyncChannel, eapNetwork.networkId); -- verify(mWifiKeyStore).removeKeys(eapNetwork.enterpriseConfig, true); -+ verify(mClientModeImpl).syncRemoveNetwork(mAsyncChannel, network.networkId); - verify(mClientModeImpl).syncRemovePasspointConfig(mAsyncChannel, true, fqdn); - verify(mWifiConfigManager).clearDeletedEphemeralNetworks(); - verify(mClientModeImpl).clearNetworkRequestUserApprovedAccessPoints(); diff --git a/Patches/LineageOS-17.1/android_packages_apps_Car_Settings/358565-backport.patch b/Patches/LineageOS-17.1/android_packages_apps_Car_Settings/358565-backport.patch deleted file mode 100644 index de378d2f..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Car_Settings/358565-backport.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Dmitry Dementyev <dementyev@google.com> -Date: Tue, 7 Mar 2023 10:59:38 -0800 -Subject: [PATCH] Convert argument to Intent in car settings - AddAccountActivity. - -Bug: 265798353 -Test: manual -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3195c559667939b458445b7e133fb4a7c76aaead) -Merged-In: I4b035fd370197b7f4838af5fb6e4d0ce27a5f3e7 -Change-Id: I4b035fd370197b7f4838af5fb6e4d0ce27a5f3e7 ---- - src/com/android/car/settings/accounts/AddAccountActivity.java | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/com/android/car/settings/accounts/AddAccountActivity.java b/src/com/android/car/settings/accounts/AddAccountActivity.java -index d5ce57142..69ada037f 100644 ---- a/src/com/android/car/settings/accounts/AddAccountActivity.java -+++ b/src/com/android/car/settings/accounts/AddAccountActivity.java -@@ -94,7 +94,7 @@ public class AddAccountActivity extends Activity { - intent.putExtras(addAccountOptions); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivityForResultAsUser( -- intent, ADD_ACCOUNT_REQUEST, mUserHandle); -+ new Intent(intent), ADD_ACCOUNT_REQUEST, mUserHandle); - LOG.v("account added: " + result); - } catch (OperationCanceledException | IOException | AuthenticatorException e) { - LOG.v("addAccount error: " + e); diff --git a/Patches/LineageOS-17.1/android_packages_apps_PermissionController/351439-backport.patch b/Patches/LineageOS-17.1/android_packages_apps_PermissionController/351439-backport.patch deleted file mode 100644 index 6751848c..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_PermissionController/351439-backport.patch +++ /dev/null @@ -1,120 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alex Johnston <acjohnston@google.com> -Date: Wed, 14 Sep 2022 08:02:27 +0000 -Subject: [PATCH] DO NOT MERGE Stop managed profile owner granting READ_SMS - -Reason: There is only one telephony stack shared -between the personal and work profile. - -This change is a partial cherry-pick of ag/15371816. -DPM.canAdminGrantSensorsPermissions did not exist pre-S. Pre-S, -the admin was always able to grant permissions incl sensor permissions. The change here will continue to allow granting of permissions unless the admin is on a managed profile and the permission is READ_SMS. - -Bug: 194382185 -Bug: 189942529 -Test: manual testing with TestDPC -Change-Id: Icc1e59a18c4786635cbc651aefc2561fbbddfdb1 -(cherry picked from commit 7cd8e7f00cf2d921a2d9b2999cfc85a148c781b9) -Merged-In: Icc1e59a18c4786635cbc651aefc2561fbbddfdb1 ---- - .../PermissionControllerServiceImpl.java | 14 +++++- - .../AdminRestrictedPermissionsUtils.java | 44 +++++++++++++++++++ - 2 files changed, 56 insertions(+), 2 deletions(-) - create mode 100644 src/com/android/packageinstaller/permission/utils/AdminRestrictedPermissionsUtils.java - -diff --git a/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java b/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java -index 57f399275..2121d6e5d 100644 ---- a/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java -+++ b/src/com/android/packageinstaller/permission/service/PermissionControllerServiceImpl.java -@@ -35,6 +35,7 @@ import android.content.pm.PackageInfo; - import android.content.pm.PackageManager; - import android.os.AsyncTask; - import android.os.UserHandle; -+import android.os.UserManager; - import android.permission.PermissionControllerService; - import android.permission.PermissionManager; - import android.permission.RuntimePermissionPresentationInfo; -@@ -52,6 +53,7 @@ import com.android.packageinstaller.permission.model.AppPermissionUsage.GroupUsa - import com.android.packageinstaller.permission.model.AppPermissions; - import com.android.packageinstaller.permission.model.Permission; - import com.android.packageinstaller.permission.model.PermissionUsages; -+import com.android.packageinstaller.permission.utils.AdminRestrictedPermissionsUtils; - import com.android.packageinstaller.permission.utils.Utils; - - import org.xmlpull.v1.XmlPullParser; -@@ -576,6 +578,8 @@ public final class PermissionControllerServiceImpl extends PermissionControllerS - - AppPermissions app = new AppPermissions(this, pkgInfo, false, true, null); - -+ final boolean isManagedProfile = getSystemService(UserManager.class).isManagedProfile(); -+ - int numPerms = expandedPermissions.size(); - for (int i = 0; i < numPerms; i++) { - String permName = expandedPermissions.get(i); -@@ -591,8 +595,14 @@ public final class PermissionControllerServiceImpl extends PermissionControllerS - - switch (grantState) { - case PERMISSION_GRANT_STATE_GRANTED: -- perm.setPolicyFixed(true); -- group.grantRuntimePermissions(false, new String[]{permName}); -+ if (AdminRestrictedPermissionsUtils.mayAdminGrantPermission(perm.getName(), -+ isManagedProfile)) { -+ perm.setPolicyFixed(true); -+ group.grantRuntimePermissions(false, new String[]{permName}); -+ } else { -+ // similar to PERMISSION_GRANT_STATE_DEFAULT -+ perm.setPolicyFixed(false); -+ } - break; - case PERMISSION_GRANT_STATE_DENIED: - perm.setPolicyFixed(true); -diff --git a/src/com/android/packageinstaller/permission/utils/AdminRestrictedPermissionsUtils.java b/src/com/android/packageinstaller/permission/utils/AdminRestrictedPermissionsUtils.java -new file mode 100644 -index 000000000..5bbb37837 ---- /dev/null -+++ b/src/com/android/packageinstaller/permission/utils/AdminRestrictedPermissionsUtils.java -@@ -0,0 +1,44 @@ -+/* -+ * Copyright (C) 2022 The Android Open Source Project -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ */ -+ -+package com.android.packageinstaller.permission.utils; -+ -+import android.Manifest; -+import android.util.ArraySet; -+ -+/** -+ * A class for dealing with permissions that the admin may not grant in certain configurations. -+ */ -+public final class AdminRestrictedPermissionsUtils { -+ -+ /** -+ * A set of permissions that the managed Profile Owner cannot grant. -+ */ -+ private static final ArraySet<String> MANAGED_PROFILE_OWNER_RESTRICTED_PERMISSIONS = -+ new ArraySet<>(); -+ -+ static { -+ MANAGED_PROFILE_OWNER_RESTRICTED_PERMISSIONS.add(Manifest.permission.READ_SMS); -+ } -+ -+ /** -+ * Returns true if the admin may grant this permission, false otherwise. -+ */ -+ public static boolean mayAdminGrantPermission(String permission, boolean isManagedProfile) { -+ return !isManagedProfile -+ || !MANAGED_PROFILE_OWNER_RESTRICTED_PERMISSIONS.contains(permission); -+ } -+} diff --git a/Patches/LineageOS-17.1/android_packages_apps_Settings/351440-backport.patch b/Patches/LineageOS-17.1/android_packages_apps_Settings/351440-backport.patch deleted file mode 100644 index 5b908f5e..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Settings/351440-backport.patch +++ /dev/null @@ -1,378 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Tsung-Mao Fang <tmfang@google.com> -Date: Mon, 3 Jan 2022 18:25:04 +0800 -Subject: [PATCH] FRP bypass defense in the settings app - -Over the last few years, there have been a number of -Factory Reset Protection bypass bugs in the SUW flow. -It's unlikely to defense all points from individual apps. - -Therefore, we decide to block some critical pages when -user doesn't complete the SUW flow. - -Test: Can't open the certain pages in the suw flow. -Bug: 258422561 -Fix: 200746457 -Bug: 202975040 -Fix: 213091525 -Fix: 213090835 -Fix: 201561699 -Fix: 213090827 -Fix: 213090875 -Change-Id: Ia18f367109df5af7da0a5acad7702898a459d32e -Merged-In: Ia18f367109df5af7da0a5acad7702898a459d32e -(cherry picked from commit ff5bfb40c8b09ab477efaae6a0199911a0d703dd) -Merged-In: Ia18f367109df5af7da0a5acad7702898a459d32e ---- - .../settings/SettingsPreferenceFragment.java | 23 +++++- - .../accounts/AccountDashboardFragment.java | 5 ++ - .../appinfo/AppInfoDashboardFragment.java | 5 ++ - .../DevelopmentSettingsDashboardFragment.java | 5 ++ - .../system/ResetDashboardFragment.java | 5 ++ - .../SettingsPreferenceFragmentTest.java | 74 +++++++++++++++++++ - .../AccountDashboardFragmentTest.java | 5 ++ - .../appinfo/AppInfoDashboardFragmentTest.java | 5 ++ - ...elopmentSettingsDashboardFragmentTest.java | 5 ++ - .../system/ResetDashboardFragmentTest.java | 40 ++++++++++ - 10 files changed, 171 insertions(+), 1 deletion(-) - create mode 100644 tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java - -diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java -index 6b29b2e1e4..0c537534df 100644 ---- a/src/com/android/settings/SettingsPreferenceFragment.java -+++ b/src/com/android/settings/SettingsPreferenceFragment.java -@@ -56,6 +56,8 @@ import com.android.settingslib.core.instrumentation.Instrumentable; - import com.android.settingslib.widget.FooterPreferenceMixinCompat; - import com.android.settingslib.widget.LayoutPreference; - -+import com.google.android.setupcompat.util.WizardManagerHelper; -+ - import java.util.UUID; - - /** -@@ -64,7 +66,7 @@ import java.util.UUID; - public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceFragment - implements DialogCreatable, HelpResourceProvider, Indexable { - -- private static final String TAG = "SettingsPreference"; -+ private static final String TAG = "SettingsPreferenceFragment"; - - private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted"; - -@@ -128,6 +130,15 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF - @VisibleForTesting - public boolean mPreferenceHighlighted = false; - -+ @Override -+ public void onAttach(Context context) { -+ if (shouldSkipForInitialSUW() && !WizardManagerHelper.isDeviceProvisioned(getContext())) { -+ Log.w(TAG, "Skip " + getClass().getSimpleName() + " before SUW completed."); -+ finish(); -+ } -+ super.onAttach(context); -+ } -+ - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); -@@ -264,6 +275,16 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF - return 0; - } - -+ /** -+ * Whether UI should be skipped in the initial SUW flow. -+ * -+ * @return {@code true} when UI should be skipped in the initial SUW flow. -+ * {@code false} when UI should not be skipped in the initial SUW flow. -+ */ -+ protected boolean shouldSkipForInitialSUW() { -+ return false; -+ } -+ - protected void onDataSetChanged() { - highlightPreferenceIfNeeded(); - updateEmptyView(); -diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java -index 515008af59..627a3177d2 100644 ---- a/src/com/android/settings/accounts/AccountDashboardFragment.java -+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java -@@ -67,6 +67,11 @@ public class AccountDashboardFragment extends DashboardFragment { - return buildPreferenceControllers(context, this /* parent */, authorities); - } - -+ @Override -+ protected boolean shouldSkipForInitialSUW() { -+ return true; -+ } -+ - private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, - SettingsPreferenceFragment parent, String[] authorities) { - final List<AbstractPreferenceController> controllers = new ArrayList<>(); -diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java -index 9917d352e8..b757380c5d 100755 ---- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java -+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java -@@ -473,6 +473,11 @@ public class AppInfoDashboardFragment extends DashboardFragment - return true; - } - -+ @Override -+ protected boolean shouldSkipForInitialSUW() { -+ return true; -+ } -+ - private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { - stopListeningToPackageRemove(); - // Create new intent to launch Uninstaller activity -diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java -index f18225e8fb..ca46b24a31 100644 ---- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java -+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java -@@ -181,6 +181,11 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra - } - } - -+ @Override -+ protected boolean shouldSkipForInitialSUW() { -+ return true; -+ } -+ - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { -diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java -index 5243d6a393..aa06691d67 100644 ---- a/src/com/android/settings/system/ResetDashboardFragment.java -+++ b/src/com/android/settings/system/ResetDashboardFragment.java -@@ -58,6 +58,11 @@ public class ResetDashboardFragment extends DashboardFragment { - return buildPreferenceControllers(context, getSettingsLifecycle()); - } - -+ @Override -+ protected boolean shouldSkipForInitialSUW() { -+ return true; -+ } -+ - private static List<AbstractPreferenceController> buildPreferenceControllers(Context context, - Lifecycle lifecycle) { - final List<AbstractPreferenceController> controllers = new ArrayList<>(); -diff --git a/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java -index cce01550a7..71c531a4c9 100644 ---- a/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java -+++ b/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java -@@ -23,11 +23,13 @@ import static org.mockito.Mockito.doReturn; - import static org.mockito.Mockito.mock; - import static org.mockito.Mockito.never; - import static org.mockito.Mockito.spy; -+import static org.mockito.Mockito.times; - import static org.mockito.Mockito.verify; - import static org.mockito.Mockito.when; - - import android.content.Context; - import android.os.Bundle; -+import android.provider.Settings; - import android.view.View; - - import androidx.fragment.app.FragmentActivity; -@@ -39,6 +41,7 @@ import androidx.preference.PreferenceScreen; - import com.android.settings.testutils.FakeFeatureFactory; - import com.android.settings.widget.WorkOnlyCategory; - -+import org.junit.After; - import org.junit.Before; - import org.junit.Test; - import org.junit.runner.RunWith; -@@ -61,7 +64,9 @@ public class SettingsPreferenceFragmentTest { - private PreferenceScreen mPreferenceScreen; - private Context mContext; - private TestFragment mFragment; -+ private TestFragment2 mFragment2; - private View mEmptyView; -+ private int mInitDeviceProvisionedValue; - - @Before - public void setUp() { -@@ -69,13 +74,24 @@ public class SettingsPreferenceFragmentTest { - FakeFeatureFactory.setupForTest(); - mContext = RuntimeEnvironment.application; - mFragment = spy(new TestFragment()); -+ mFragment2 = spy(new TestFragment2()); - doReturn(mActivity).when(mFragment).getActivity(); - when(mFragment.getContext()).thenReturn(mContext); -+ when(mFragment2.getContext()).thenReturn(mContext); - - mEmptyView = new View(mContext); - ReflectionHelpers.setField(mFragment, "mEmptyView", mEmptyView); - - doReturn(ITEM_COUNT).when(mPreferenceScreen).getPreferenceCount(); -+ -+ mInitDeviceProvisionedValue = Settings.Global.getInt(mContext.getContentResolver(), -+ Settings.Global.DEVICE_PROVISIONED, 0); -+ } -+ -+ @After -+ public void tearDown() { -+ Settings.Global.putInt(mContext.getContentResolver(), -+ Settings.Global.DEVICE_PROVISIONED, mInitDeviceProvisionedValue); - } - - @Test -@@ -187,8 +203,66 @@ public class SettingsPreferenceFragmentTest { - verify(workOnlyCategory).setVisible(false); - } - -+ @Test -+ public void onAttach_shouldNotSkipForSUWAndDeviceIsProvisioned_notCallFinish() { -+ Settings.Global.putInt(mContext.getContentResolver(), -+ Settings.Global.DEVICE_PROVISIONED, 1); -+ -+ mFragment.onAttach(mContext); -+ -+ verify(mFragment, never()).finish(); -+ } -+ -+ @Test -+ public void onAttach_shouldNotSkipForSUWAndDeviceIsNotProvisioned_notCallFinish() { -+ Settings.Global.putInt(mContext.getContentResolver(), -+ Settings.Global.DEVICE_PROVISIONED, 0); -+ -+ mFragment.onAttach(mContext); -+ -+ verify(mFragment, never()).finish(); -+ } -+ -+ @Test -+ public void onAttach_shouldSkipForSUWAndDeviceIsDeviceProvisioned_notCallFinish() { -+ Settings.Global.putInt(mContext.getContentResolver(), -+ Settings.Global.DEVICE_PROVISIONED, 1); -+ -+ mFragment2.onAttach(mContext); -+ -+ verify(mFragment2, never()).finish(); -+ } -+ -+ @Test -+ public void onAttach_shouldSkipForSUWAndDeviceProvisioned_notCallFinish() { -+ Settings.Global.putInt(mContext.getContentResolver(), -+ Settings.Global.DEVICE_PROVISIONED, 0); -+ -+ mFragment2.onAttach(mContext); -+ -+ verify(mFragment2, times(1)).finish(); -+ } -+ - public static class TestFragment extends SettingsPreferenceFragment { - -+ @Override -+ protected boolean shouldSkipForInitialSUW() { -+ return false; -+ } -+ -+ @Override -+ public int getMetricsCategory() { -+ return 0; -+ } -+ } -+ -+ public static class TestFragment2 extends SettingsPreferenceFragment { -+ -+ @Override -+ protected boolean shouldSkipForInitialSUW() { -+ return true; -+ } -+ - @Override - public int getMetricsCategory() { - return 0; -diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java -index 006087516c..b04d5c7637 100644 ---- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java -+++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java -@@ -53,4 +53,9 @@ public class AccountDashboardFragmentTest { - assertThat(indexRes).isNotNull(); - assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId()); - } -+ -+ @Test -+ public void shouldSkipForInitialSUW_returnTrue() { -+ assertThat(mFragment.shouldSkipForInitialSUW()).isTrue(); -+ } - } -diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java -index e46cd06afe..5292c60f86 100644 ---- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java -+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java -@@ -384,6 +384,11 @@ public final class AppInfoDashboardFragmentTest { - .isTrue(); - } - -+ @Test -+ public void shouldSkipForInitialSUW_returnTrue() { -+ assertThat(mFragment.shouldSkipForInitialSUW()).isTrue(); -+ } -+ - @Implements(AppUtils.class) - public static class ShadowAppUtils { - -diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java -index 83a4880968..d460d13e9e 100644 ---- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java -+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java -@@ -275,6 +275,11 @@ public class DevelopmentSettingsDashboardFragmentTest { - verify(controller).onDisableLogPersistDialogRejected(); - } - -+ @Test -+ public void shouldSkipForInitialSUW_returnTrue() { -+ assertThat(mDashboard.shouldSkipForInitialSUW()).isTrue(); -+ } -+ - @Implements(EnableDevelopmentSettingWarningDialog.class) - public static class ShadowEnableDevelopmentSettingWarningDialog { - -diff --git a/tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java -new file mode 100644 -index 0000000000..c1d47887a7 ---- /dev/null -+++ b/tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java -@@ -0,0 +1,40 @@ -+/* -+ * Copyright (C) 2022 The Android Open Source Project -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ */ -+ -+package com.android.settings.system; -+ -+import static com.google.common.truth.Truth.assertThat; -+ -+import org.junit.Before; -+import org.junit.Test; -+import org.junit.runner.RunWith; -+import org.robolectric.RobolectricTestRunner; -+ -+@RunWith(RobolectricTestRunner.class) -+public class ResetDashboardFragmentTest { -+ -+ private ResetDashboardFragment mFragment; -+ -+ @Before -+ public void setup() { -+ mFragment = new ResetDashboardFragment(); -+ } -+ -+ @Test -+ public void shouldSkipForInitialSUW_returnTrue() { -+ assertThat(mFragment.shouldSkipForInitialSUW()).isTrue(); -+ } -+} diff --git a/Patches/LineageOS-17.1/android_packages_apps_Settings/351441.patch b/Patches/LineageOS-17.1/android_packages_apps_Settings/351441.patch deleted file mode 100644 index c5ff57c3..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Settings/351441.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Yanting Yang <yantingyang@google.com> -Date: Wed, 4 Jan 2023 09:40:38 +0000 -Subject: [PATCH] Add DISALLOW_APPS_CONTROL check into uninstall app for all - users - -Settings App info page supports a "Uninstall for all users" function -when multiple users are enabled. It bypasses the restriction of -DISALLOW_APPS_CONTROL which breaks the user isolation guideline. - -To fix this vulnerability, we should check the DISALLOW_APPS_CONTROL -restriction to provide the "Uninstall for all users" function. - -Bug: 258653813 -Test: manual & robotests -Change-Id: I5d3bbcbaac439c4f7a1e6a9ade7775ff4f2f2ec6 -Merged-In: I5d3bbcbaac439c4f7a1e6a9ade7775ff4f2f2ec6 -(cherry picked from commit 86914bedc84474c152e4536fb3cfa2fb488030b8) -Merged-In: I5d3bbcbaac439c4f7a1e6a9ade7775ff4f2f2ec6 ---- - .../applications/appinfo/AppInfoDashboardFragment.java | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - mode change 100755 => 100644 src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java - -diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java -old mode 100755 -new mode 100644 -index b757380c5d..bbbb7113d5 ---- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java -+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java -@@ -355,7 +355,13 @@ public class AppInfoDashboardFragment extends DashboardFragment - return; - } - super.onPrepareOptionsMenu(menu); -- menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(shouldShowUninstallForAll(mAppEntry)); -+ final MenuItem uninstallAllUsersItem = menu.findItem(UNINSTALL_ALL_USERS_MENU); -+ uninstallAllUsersItem.setVisible( -+ shouldShowUninstallForAll(mAppEntry) && !mAppsControlDisallowedBySystem); -+ if (uninstallAllUsersItem.isVisible()) { -+ RestrictedLockUtilsInternal.setMenuItemAsDisabledByAdmin(getActivity(), -+ uninstallAllUsersItem, mAppsControlDisallowedAdmin); -+ } - mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; - final MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES); - final boolean uninstallUpdateDisabled = getContext().getResources().getBoolean( diff --git a/Patches/LineageOS-17.1/android_packages_apps_Settings/353956.patch b/Patches/LineageOS-17.1/android_packages_apps_Settings/353956.patch deleted file mode 100644 index f133290e..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Settings/353956.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jack Yu <jackcwyu@google.com> -Date: Thu, 28 Jul 2022 19:42:27 +0800 -Subject: [PATCH] Only primary user is allowed to control secure nfc - -Bug: 238298970 -Test: manual -Merged-In: I945490ef1e62af479a732c9a260ed94bdd8bc313 -Change-Id: I945490ef1e62af479a732c9a260ed94bdd8bc313 -(cherry picked from commit 0e57ff90cdae3575c243d21d490e2b6384d33397) -Merged-In: I945490ef1e62af479a732c9a260ed94bdd8bc313 ---- - src/com/android/settings/nfc/SecureNfcEnabler.java | 2 +- - src/com/android/settings/nfc/SecureNfcPreferenceController.java | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/com/android/settings/nfc/SecureNfcEnabler.java b/src/com/android/settings/nfc/SecureNfcEnabler.java -index f31a382a57..ad5c4ab7e8 100644 ---- a/src/com/android/settings/nfc/SecureNfcEnabler.java -+++ b/src/com/android/settings/nfc/SecureNfcEnabler.java -@@ -61,7 +61,7 @@ public class SecureNfcEnabler extends BaseNfcEnabler { - } - - private boolean isToggleable() { -- if (mUserManager.isGuestUser()) { -+ if (!mUserManager.isPrimaryUser()) { - return false; - } - return true; -diff --git a/src/com/android/settings/nfc/SecureNfcPreferenceController.java b/src/com/android/settings/nfc/SecureNfcPreferenceController.java -index 2ff685e5a0..ab87ddba34 100644 ---- a/src/com/android/settings/nfc/SecureNfcPreferenceController.java -+++ b/src/com/android/settings/nfc/SecureNfcPreferenceController.java -@@ -104,7 +104,7 @@ public class SecureNfcPreferenceController extends TogglePreferenceController - } - - private boolean isToggleable() { -- if (mUserManager.isGuestUser()) { -+ if (!mUserManager.isPrimaryUser()) { - return false; - } - return true; diff --git a/Patches/LineageOS-17.1/android_packages_apps_Settings/358566.patch b/Patches/LineageOS-17.1/android_packages_apps_Settings/358566.patch deleted file mode 100644 index 789f694f..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Settings/358566.patch +++ /dev/null @@ -1,190 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Bonian Chen <bonianchen@google.com> -Date: Thu, 18 Nov 2021 10:27:34 +0800 -Subject: [PATCH] Move display of VPN version into summary text - -Move the display of version text within VPN into summary part of the -display, and limit the height of summary area. - -Bug: 205460459 -Test: install apk from b/205460459#comment3 and verify -(cherry picked from commit 144f295d7aa66bae8556ba030553a49615eab0b2) -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:dddd74a491a206178feb10d5ef983d5cd273504d) -Merged-In: I666b9db356feeebf04e3be688897c2d9110a5275 -Change-Id: I666b9db356feeebf04e3be688897c2d9110a5275 ---- - res/values/strings.xml | 2 +- - res/values/styles.xml | 10 ++++ - res/xml/vpn_app_management.xml | 14 ++++- - .../settings/vpn2/AppManagementFragment.java | 51 +++++++++++++++++-- - 4 files changed, 71 insertions(+), 6 deletions(-) - -diff --git a/res/values/strings.xml b/res/values/strings.xml -index 2180ea45f6..f6e3b0f62d 100644 ---- a/res/values/strings.xml -+++ b/res/values/strings.xml -@@ -6613,7 +6613,7 @@ - <!-- Button label to disconnect from a VPN profile. [CHAR LIMIT=40] --> - <string name="vpn_disconnect">Disconnect</string> - <!-- Field label to show the version number for a VPN app. [CHAR LIMIT=40] --> -- <string name="vpn_version">Version <xliff:g id="version" example="3.3.0">%s</xliff:g></string> -+ <string name="vpn_version">Version</string> - <!-- Button label to forget a VPN profile [CHAR LIMIT=40] --> - <string name="vpn_forget_long">Forget VPN</string> - <!-- Dialog message title to set another VPN app to be always-on [CHAR LIMIT=40] --> -diff --git a/res/values/styles.xml b/res/values/styles.xml -index d3d3199f62..ec66bc8d1b 100644 ---- a/res/values/styles.xml -+++ b/res/values/styles.xml -@@ -197,6 +197,16 @@ - <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item> - </style> - -+ <style name="vpn_app_management_version_title"> -+ <item name="android:textAppearance">?android:attr/textAppearanceListItem</item> -+ <item name="android:textColor">?android:attr/textColorPrimary</item> -+ </style> -+ -+ <style name="vpn_app_management_version_summary"> -+ <item name="android:textAppearance">?android:attr/textAppearanceListItemSecondary</item> -+ <item name="android:textColor">?android:attr/textColorSecondary</item> -+ </style> -+ - <style name="TextAppearance" parent="android:TextAppearance.DeviceDefault"/> - - <style name="TextAppearance.info_label"> -diff --git a/res/xml/vpn_app_management.xml b/res/xml/vpn_app_management.xml -index bcaa6b0a62..adc441d846 100644 ---- a/res/xml/vpn_app_management.xml -+++ b/res/xml/vpn_app_management.xml -@@ -15,14 +15,24 @@ - --> - - <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" -- xmlns:settings="http://schemas.android.com/apk/res-auto"> -+ xmlns:settings="http://schemas.android.com/apk/res-auto" -+ orderingFromXml="false" -+ > -+ -+ <!-- To limit the size (in height) of version Preference displayed here, -+ maximum height of TextView need to be set programmingly. -+ Therefore, this Preference got removed from here and will be added -+ dynamically through source code. - - <Preference -+ android:order="0" - android:key="version" - android:textColor="?android:attr/textColorSecondary" - android:selectable="false"/> -+ --> - - <com.android.settingslib.RestrictedSwitchPreference -+ android:order="10" - android:key="always_on_vpn" - android:title="@string/vpn_menu_lockdown" - android:defaultValue="false" -@@ -32,6 +42,7 @@ - settings:restrictedSwitchSummary="@string/disabled_by_admin_summary_text" /> - - <com.android.settingslib.RestrictedSwitchPreference -+ android:order="20" - android:key="lockdown_vpn" - android:title="@string/vpn_require_connection" - android:defaultValue="false" -@@ -41,6 +52,7 @@ - settings:restrictedSwitchSummary="@string/disabled_by_admin_summary_text" /> - - <com.android.settingslib.RestrictedPreference -+ android:order="30" - android:key="forget_vpn" - android:title="@string/vpn_forget_long" - android:icon="@drawable/ic_delete" -diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java -index 5f4644614c..805ffb2854 100644 ---- a/src/com/android/settings/vpn2/AppManagementFragment.java -+++ b/src/com/android/settings/vpn2/AppManagementFragment.java -@@ -35,11 +35,13 @@ import android.os.UserHandle; - import android.os.UserManager; - import android.text.TextUtils; - import android.util.Log; -+import android.widget.TextView; - - import androidx.annotation.VisibleForTesting; - import androidx.appcompat.app.AlertDialog; - import androidx.fragment.app.DialogFragment; - import androidx.preference.Preference; -+import androidx.preference.PreferenceViewHolder; - - import com.android.internal.net.VpnConfig; - import com.android.internal.util.ArrayUtils; -@@ -76,7 +78,6 @@ public class AppManagementFragment extends SettingsPreferenceFragment - private String mVpnLabel; - - // UI preference -- private Preference mPreferenceVersion; - private RestrictedSwitchPreference mPreferenceAlwaysOn; - private RestrictedSwitchPreference mPreferenceLockdown; - private RestrictedPreference mPreferenceForget; -@@ -122,7 +123,6 @@ public class AppManagementFragment extends SettingsPreferenceFragment - mConnectivityService = IConnectivityManager.Stub - .asInterface(ServiceManager.getService(Context.CONNECTIVITY_SERVICE)); - -- mPreferenceVersion = findPreference(KEY_VERSION); - mPreferenceAlwaysOn = (RestrictedSwitchPreference) findPreference(KEY_ALWAYS_ON_VPN); - mPreferenceLockdown = (RestrictedSwitchPreference) findPreference(KEY_LOCKDOWN_VPN); - mPreferenceForget = (RestrictedPreference) findPreference(KEY_FORGET_VPN); -@@ -138,9 +138,52 @@ public class AppManagementFragment extends SettingsPreferenceFragment - - boolean isInfoLoaded = loadInfo(); - if (isInfoLoaded) { -- mPreferenceVersion.setTitle( -- getPrefContext().getString(R.string.vpn_version, mPackageInfo.versionName)); - updateUI(); -+ -+ Preference version = getPreferenceScreen().findPreference(KEY_VERSION); -+ if (version != null) { -+ // Version field has been added. -+ return; -+ } -+ -+ /** -+ * Create version field at runtime, and set max height on the display area. -+ * -+ * When long length of text given within version field, a large text area -+ * might be created and inconvenient to the user (User need to scroll -+ * for a long time in order to get to the Preferences after this field.) -+ */ -+ version = new Preference(getPrefContext()) { -+ @Override -+ public void onBindViewHolder(PreferenceViewHolder holder) { -+ super.onBindViewHolder(holder); -+ -+ TextView titleView = -+ (TextView) holder.findViewById(android.R.id.title); -+ if (titleView != null) { -+ titleView.setTextAppearance(R.style.vpn_app_management_version_title); -+ } -+ -+ TextView summaryView = -+ (TextView) holder.findViewById(android.R.id.summary); -+ if (summaryView != null) { -+ summaryView.setTextAppearance(R.style.vpn_app_management_version_summary); -+ -+ // Set max height in summary area. -+ int versionMaxHeight = getListView().getHeight(); -+ summaryView.setMaxHeight(versionMaxHeight); -+ summaryView.setVerticalScrollBarEnabled(false); -+ summaryView.setHorizontallyScrolling(false); -+ } -+ } -+ }; -+ version.setOrder(0); // Set order to 0 in order to be placed -+ // in front of other Preference(s). -+ version.setKey(KEY_VERSION); // Set key to avoid from creating multi instance. -+ version.setTitle(R.string.vpn_version); -+ version.setSummary(mPackageInfo.versionName); -+ version.setSelectable(false); -+ getPreferenceScreen().addPreference(version); - } else { - finish(); - } diff --git a/Patches/LineageOS-17.1/android_packages_apps_Settings/358567-backport.patch b/Patches/LineageOS-17.1/android_packages_apps_Settings/358567-backport.patch deleted file mode 100644 index 926d368f..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Settings/358567-backport.patch +++ /dev/null @@ -1,1204 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Bill Yi <byi@google.com> -Date: Thu, 28 Apr 2022 18:39:25 +0000 -Subject: [PATCH] Import translations. DO NOT MERGE ANYWHERE - -BUG:205460459 - -Auto-generated-cl: translation import -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ac6b0bdef68e99e0a34656a2148483d7cb77159e) -Merged-In: I669099ad00ba7d90013836e3d456d530ae725b2f -Change-Id: I669099ad00ba7d90013836e3d456d530ae725b2f ---- - res/values-af/strings.xml | 2 +- - res/values-am/strings.xml | 2 +- - res/values-ar/strings.xml | 2 +- - res/values-as/strings.xml | 2 +- - res/values-az/strings.xml | 2 +- - res/values-b+sr+Latn/strings.xml | 2 +- - res/values-be/strings.xml | 2 +- - res/values-bg/strings.xml | 2 +- - res/values-bn/strings.xml | 2 +- - res/values-bs/strings.xml | 2 +- - res/values-ca/strings.xml | 2 +- - res/values-cs/strings.xml | 2 +- - res/values-da/strings.xml | 2 +- - res/values-de/strings.xml | 2 +- - res/values-el/strings.xml | 2 +- - res/values-en-rAU/strings.xml | 2 +- - res/values-en-rCA/strings.xml | 2 +- - res/values-en-rGB/strings.xml | 2 +- - res/values-en-rIN/strings.xml | 2 +- - res/values-en-rXC/strings.xml | 2 +- - res/values-es-rUS/strings.xml | 2 +- - res/values-es/strings.xml | 2 +- - res/values-et/strings.xml | 2 +- - res/values-eu/strings.xml | 2 +- - res/values-fa/strings.xml | 2 +- - res/values-fi/strings.xml | 2 +- - res/values-fr-rCA/strings.xml | 2 +- - res/values-fr/strings.xml | 2 +- - res/values-gl/strings.xml | 2 +- - res/values-gu/strings.xml | 2 +- - res/values-hi/strings.xml | 2 +- - res/values-hr/strings.xml | 2 +- - res/values-hu/strings.xml | 2 +- - res/values-hy/strings.xml | 2 +- - res/values-in/strings.xml | 2 +- - res/values-is/strings.xml | 2 +- - res/values-it/strings.xml | 2 +- - res/values-iw/strings.xml | 2 +- - res/values-ja/strings.xml | 2 +- - res/values-ka/strings.xml | 2 +- - res/values-kk/strings.xml | 2 +- - res/values-km/strings.xml | 2 +- - res/values-kn/strings.xml | 2 +- - res/values-ko/strings.xml | 2 +- - res/values-ky/strings.xml | 2 +- - res/values-lo/strings.xml | 2 +- - res/values-lt/strings.xml | 2 +- - res/values-lv/strings.xml | 2 +- - res/values-mk/strings.xml | 2 +- - res/values-ml/strings.xml | 2 +- - res/values-mn/strings.xml | 2 +- - res/values-mr/strings.xml | 2 +- - res/values-ms/strings.xml | 2 +- - res/values-my/strings.xml | 2 +- - res/values-nb/strings.xml | 2 +- - res/values-ne/strings.xml | 2 +- - res/values-nl/strings.xml | 2 +- - res/values-or/strings.xml | 2 +- - res/values-pa/strings.xml | 2 +- - res/values-pl/strings.xml | 2 +- - res/values-pt-rBR/strings.xml | 2 +- - res/values-pt-rPT/strings.xml | 2 +- - res/values-pt/strings.xml | 2 +- - res/values-ro/strings.xml | 2 +- - res/values-ru/strings.xml | 2 +- - res/values-si/strings.xml | 2 +- - res/values-sk/strings.xml | 2 +- - res/values-sl/strings.xml | 2 +- - res/values-sq/strings.xml | 2 +- - res/values-sr/strings.xml | 2 +- - res/values-sv/strings.xml | 2 +- - res/values-sw/strings.xml | 2 +- - res/values-ta/strings.xml | 2 +- - res/values-te/strings.xml | 2 +- - res/values-th/strings.xml | 2 +- - res/values-tl/strings.xml | 2 +- - res/values-tr/strings.xml | 2 +- - res/values-uk/strings.xml | 2 +- - res/values-ur/strings.xml | 2 +- - res/values-uz/strings.xml | 2 +- - res/values-vi/strings.xml | 2 +- - res/values-zh-rCN/strings.xml | 2 +- - res/values-zh-rHK/strings.xml | 2 +- - res/values-zh-rTW/strings.xml | 2 +- - res/values-zu/strings.xml | 2 +- - 85 files changed, 85 insertions(+), 85 deletions(-) - -diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml -index 4b5a26e7b4..579125667a 100644 ---- a/res/values-af/strings.xml -+++ b/res/values-af/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Koppel aan <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Ontkoppel hierdie VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Ontkoppel"</string> -- <string name="vpn_version" msgid="41856553718304367">"Weergawe <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Weergawe"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Vergeet VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Vervang bestaande VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Stel altyd-aan VPN?"</string> -diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml -index 592dd27ca4..a5851166f6 100644 ---- a/res/values-am/strings.xml -+++ b/res/values-am/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"ከ<xliff:g id="PROFILE">%s</xliff:g> ጋር ተገናኝ"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"የዚህ ቪፒኤን ግንኙነት ይቋረጥ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ግንኙነት አቋርጥ"</string> -- <string name="vpn_version" msgid="41856553718304367">"ሥሪት <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ስሪት"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPNን እርሳ"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"አሁን ያለው VPN ይተካ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ሁልጊዜ-የበራ VPN ይቀናበር?"</string> -diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml -index fec53643bd..c738f103c9 100644 ---- a/res/values-ar/strings.xml -+++ b/res/values-ar/strings.xml -@@ -2996,7 +2996,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"الاتصال بـ <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"هل تريد قطع الاتصال بهذه الشبكة الافتراضية الخاصة (VPN)؟"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"قطع الاتصال"</string> -- <string name="vpn_version" msgid="41856553718304367">"الإصدار <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"الإصدار"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"نسيان الشبكة الافتراضية الخاصة"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"هل تريد استبدال الشبكة الافتراضية الخاصة الحالية؟"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"هل تريد تشغيل الشبكة الافتراضية الخاصة باستمرار؟"</string> -diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml -index 29e3c2835e..458c05c56e 100644 ---- a/res/values-as/strings.xml -+++ b/res/values-as/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g>ৰ সৈতে সংযোগ কৰক"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"এই ভিপিএনটোৰ সৈতে সংযোগ বিচ্ছিন্ন কৰিবনে?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"সংযোগ বিচ্ছিন্ন কৰক"</string> -- <string name="vpn_version" msgid="41856553718304367">"সংস্কৰণ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"সংস্কৰণ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"ভিপিএন পাহৰক"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"পূৰ্বৰ ভিপিএনটো সলনি কৰেনে?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ভিপিএনক যিকোনো সময়ত অন থকা অবস্থাত ছেট কৰিবনে?"</string> -diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml -index fb874c1bc3..fbb73a174a 100644 ---- a/res/values-az/strings.xml -+++ b/res/values-az/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> profilinə qoşulun"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Bu VPN bağlantısı kəsilsin?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Bağlantını kəsin"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versiya <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versiya"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN\'i unudun"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Mövcud VPN əvəz edilsin?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Hər zaman aktiv VPN quraşdırılsın?"</string> -diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml -index 0693b625af..a2351c604f 100644 ---- a/res/values-b+sr+Latn/strings.xml -+++ b/res/values-b+sr+Latn/strings.xml -@@ -2885,7 +2885,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Povezivanje na profil <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Želite li da prekinete vezu sa ovim VPN-om?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Prekini vezu"</string> -- <string name="vpn_version" msgid="41856553718304367">"Verzija <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Verzija"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Zaboravi VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Želite li da zamenite postojeći VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Želite li da podesite uvek uključeni VPN?"</string> -diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml -index c65cfe996e..30b4f0dc1c 100644 ---- a/res/values-be/strings.xml -+++ b/res/values-be/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Падключэнне да профiлю <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Адключыць гэту VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Адключыць"</string> -- <string name="vpn_version" msgid="41856553718304367">"Версія <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Версія"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Забыць VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Замяніць існуючую VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Наладзіць заўсёды ўключаную VPN?"</string> -diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml -index 0e01c761e5..ba1d9360eb 100644 ---- a/res/values-bg/strings.xml -+++ b/res/values-bg/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Свързване със: <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Да се прекрати ли връзката с тази виртуална частна мрежа (VPN)?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Прекратяване на връзката"</string> -- <string name="vpn_version" msgid="41856553718304367">"Версия <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Версия"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Забравяне на вирт. частна мрежа (VPN)"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Да се замени ли съществуващата VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Да се зададе ли винаги включена виртуална частна мрежа (VPN)?"</string> -diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml -index 8e3925870b..7465cad219 100644 ---- a/res/values-bn/strings.xml -+++ b/res/values-bn/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> এতে কানেক্ট করুন"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"এই VPN থেকে ডিসকানেক্ট করবেন?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ডিসকানেক্ট করুন"</string> -- <string name="vpn_version" msgid="41856553718304367">"ভার্সন<xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ভার্সন"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN সরিয়ে দিন"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"বিদ্যমান VPN প্রতিস্থাপন করতে চান?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"সর্বদা-চালু VPN সেট করতে চান?"</string> -diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml -index e0eb3bb1d1..0998d5cbac 100644 ---- a/res/values-bs/strings.xml -+++ b/res/values-bs/strings.xml -@@ -2885,7 +2885,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Poveži se na <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Želite li prekinuti vezu s ovim VPN-om?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Prekini vezu"</string> -- <string name="vpn_version" msgid="41856553718304367">"Verzija <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Verzija"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Zaboravi VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Želite li zamijeniti postojeći VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Želite li postaviti uvijek uključen VPN?"</string> -diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml -index a276b75467..edb9d53e01 100644 ---- a/res/values-ca/strings.xml -+++ b/res/values-ca/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connexió amb <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Vols desconnectar aquesta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desconnecta"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versió <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versió"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Oblida la VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Vols substituir la VPN actual?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Vols definir la VPN sempre activa?"</string> -diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml -index 7a46f53c4b..1c808cc19e 100644 ---- a/res/values-cs/strings.xml -+++ b/res/values-cs/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Připojit k profilu <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Odpojit tuto síť VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Odpojit"</string> -- <string name="vpn_version" msgid="41856553718304367">"Verze <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Verze"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Zapomenout VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Nahradit stávající síť VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Nastavit trvalou síť VPN?"</string> -diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml -index 52d9416ae5..a6614fa459 100644 ---- a/res/values-da/strings.xml -+++ b/res/values-da/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Opret forbindelse til <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Vil du afbryde dette VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Afbryd"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Glem VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Erstat det eksisterende VPN-netværk?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Vil du konfigurere konstant VPN?"</string> -diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml -index e0b5bebaec..4fbc64b83e 100644 ---- a/res/values-de/strings.xml -+++ b/res/values-de/strings.xml -@@ -2849,7 +2849,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Mit <xliff:g id="PROFILE">%s</xliff:g> verbinden"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Verbindung zu diesem VPN trennen?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Verbindung trennen"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN entfernen"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Aktuelles VPN ersetzen?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Durchgehend aktives VPN aktivieren?"</string> -diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml -index 6ce0b8c485..65c727d53c 100644 ---- a/res/values-el/strings.xml -+++ b/res/values-el/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Σύνδεση στο προφίλ <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Να αποσυνδεθεί αυτό το VPN;"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Αποσύνδεση"</string> -- <string name="vpn_version" msgid="41856553718304367">"Έκδοση <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Έκδοση"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Διαγραφή VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Αντικατάσταση υπάρχοντος VPN;"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Ενεργοποίηση του μονίμως ενεργού VPN;"</string> -diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml -index 8ebc0c989d..c1136d930b 100644 ---- a/res/values-en-rAU/strings.xml -+++ b/res/values-en-rAU/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connect to <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Disconnect this VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Disconnect"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Forget VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Replace existing VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Set always-on VPN?"</string> -diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml -index f5aedb406e..3c196931d2 100644 ---- a/res/values-en-rCA/strings.xml -+++ b/res/values-en-rCA/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connect to <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Disconnect this VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Disconnect"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Forget VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Replace existing VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Set always-on VPN?"</string> -diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml -index 8ebc0c989d..c1136d930b 100644 ---- a/res/values-en-rGB/strings.xml -+++ b/res/values-en-rGB/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connect to <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Disconnect this VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Disconnect"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Forget VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Replace existing VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Set always-on VPN?"</string> -diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml -index 30e311a859..fc1785a09e 100644 ---- a/res/values-en-rIN/strings.xml -+++ b/res/values-en-rIN/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connect to <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Disconnect this VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Disconnect"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Forget VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Replace existing VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Set always-on VPN?"</string> -diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml -index 863ea021cd..2cd3296588 100644 ---- a/res/values-en-rXC/strings.xml -+++ b/res/values-en-rXC/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connect to <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Disconnect this VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Disconnect"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Forget VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Replace existing VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Set always-on VPN?"</string> -diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml -index e54a92c783..a9fa502daa 100644 ---- a/res/values-es-rUS/strings.xml -+++ b/res/values-es-rUS/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Conectar a <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"¿Deseas desconectar esta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desconectar"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versión <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versión"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Borrar VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"¿Reemplazar VPN existente?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"¿Configurar la VPN siempre activa?"</string> -diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml -index 02d75882f6..b768441110 100644 ---- a/res/values-es/strings.xml -+++ b/res/values-es/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Conectar a <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"¿Desconectar esta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desconectar"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versión <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versión"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Borrar VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"¿Sustituir VPN actual?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"¿Configurar el modo de VPN siempre activada?"</string> -diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml -index 9ca32f1bfa..a2b8e88fa7 100644 ---- a/res/values-et/strings.xml -+++ b/res/values-et/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Profiiliga <xliff:g id="PROFILE">%s</xliff:g> ühendamine"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Kas soovite katkestada ühenduse selle VPN-iga?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Katkesta ühendus"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versioon <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versioon"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Unusta VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Kas asendada olemasolev VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Kas määrata alati sisselülitatud VPN?"</string> -diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml -index a0734d9206..15e2eb57bd 100644 ---- a/res/values-eu/strings.xml -+++ b/res/values-eu/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Konektatu <xliff:g id="PROFILE">%s</xliff:g> profilera"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"VPN saretik deskonektatu nahi duzu?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Deskonektatu"</string> -- <string name="vpn_version" msgid="41856553718304367">"<xliff:g id="VERSION">%s</xliff:g> bertsioa"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Bertsioa"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Ahaztu VPN konexioa"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Dagoen VPN konexioa ordeztu nahi duzu?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"VPNa beti aktibatuta egoteko aukera ezarri nahi duzu?"</string> -diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml -index 5fd5813b93..fca1792800 100644 ---- a/res/values-fa/strings.xml -+++ b/res/values-fa/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"اتصال به <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"اتصال به این VPN.قطع شود؟"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"قطع ارتباط"</string> -- <string name="vpn_version" msgid="41856553718304367">"نسخه <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"نسخه"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"فراموش کردن VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"VPN موجود جایگزین شود؟"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"VPN همیشه روشن تنظیم شود؟"</string> -diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml -index 453bf21ce4..bc1736fe15 100644 ---- a/res/values-fi/strings.xml -+++ b/res/values-fi/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Yhdistä profiiliin <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Katkaistaanko VPN-yhteys?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Katkaise yhteys"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versio <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versio"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Unohda VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Korvataanko nykyinen VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Määritetäänkö aina käytössä oleva VPN?"</string> -diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml -index 2eb74cf926..5fd574cc3d 100644 ---- a/res/values-fr-rCA/strings.xml -+++ b/res/values-fr-rCA/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Se connecter à <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Déconnecter ce RPV?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Déconnecter"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Oublier le profil RPV"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Remplacer le RPV existant?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Définir le RPV permanent?"</string> -diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml -index fe92e77035..d58b81e95d 100644 ---- a/res/values-fr/strings.xml -+++ b/res/values-fr/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Se connecter à <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Déconnecter ce VPN ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Déconnecter"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Supprimer le VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Remplacer le VPN existant ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Définir le VPN permanent ?"</string> -diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml -index 662a6922bb..ec47f9186b 100644 ---- a/res/values-gl/strings.xml -+++ b/res/values-gl/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Conectar con <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Queres desconectar esta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desconectar"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versión <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versión"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Esquecer perfil da VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Queres substituír a VPN existente?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Queres definir a VPN como sempre activa?"</string> -diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml -index 299322392a..17016646ed 100644 ---- a/res/values-gu/strings.xml -+++ b/res/values-gu/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> સાથે કનેક્ટ કરો"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"આ VPNને ડિસ્કનેક્ટ કરીએ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ડિસ્કનેક્ટ કરો"</string> -- <string name="vpn_version" msgid="41856553718304367">"સંસ્કરણ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"સંસ્કરણ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN ભૂલી ગયાં"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"અસ્તિત્વમાંની VPN ને બદલીએ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"હંમેશાં ચાલુ VPN સેટ કરીએ?"</string> -diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml -index d0617150b7..bc636bff03 100644 ---- a/res/values-hi/strings.xml -+++ b/res/values-hi/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">" <xliff:g id="PROFILE">%s</xliff:g> से कनेक्ट करें"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"इस VPN को डिसकनेक्ट करना चाहते हैं?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"डिसकनेक्ट करें"</string> -- <string name="vpn_version" msgid="41856553718304367">"वर्शन <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"वर्शन"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN भूल जाएं"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"मौजूदा VPN को बदलें?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"हमेशा-चालू VPN सेट करें?"</string> -diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml -index fb9c1f09e8..74bb5db2df 100644 ---- a/res/values-hr/strings.xml -+++ b/res/values-hr/strings.xml -@@ -2885,7 +2885,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Povezivanje s profilom <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Prekinuti vezu s VPN-om?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Prekini vezu"</string> -- <string name="vpn_version" msgid="41856553718304367">"Verzija <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Verzija"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Zaboravi VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Želite li zamijeniti dosadašnji VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Želite li postaviti uvijek uključeni VPN?"</string> -diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml -index ff703cf609..32e7fdad69 100644 ---- a/res/values-hu/strings.xml -+++ b/res/values-hu/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Csatlakozás a következőhöz: <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Leválasztja a VPN-t?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Leválasztás"</string> -- <string name="vpn_version" msgid="41856553718304367">"Verzió: <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Verzió"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN elfelejtése"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Lecseréli a meglévő VPN-t?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Beállítja a mindig bekapcsolt VPN-t?"</string> -diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml -index e731b9480f..49b1807365 100644 ---- a/res/values-hy/strings.xml -+++ b/res/values-hy/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Միանալ <xliff:g id="PROFILE">%s</xliff:g>-ին"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Անջատե՞լ այս VPN-ը:"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Անջատել"</string> -- <string name="vpn_version" msgid="41856553718304367">"Տարբերակ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Տարբերակ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Մոռանալ VPN-ը"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Փոխարինե՞լ ընթացիկ VPN-ը:"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Սահմանե՞լ որպես «միշտ միացված» VPN:"</string> -diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml -index d2c21cd7c9..15b3d1b308 100644 ---- a/res/values-in/strings.xml -+++ b/res/values-in/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Menyambung ke <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Putuskan sambungan VPN ini?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Putuskan sambungan"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versi <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versi"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Lupakan VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Ganti VPN yang sudah ada?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Setel VPN selalu aktif?"</string> -diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml -index 3d9a0e8c29..ce546c518d 100644 ---- a/res/values-is/strings.xml -+++ b/res/values-is/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Tengjast <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Aftengja þessa VPN-tengingu?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Aftengja"</string> -- <string name="vpn_version" msgid="41856553718304367">"Útgáfa <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Útgáfa"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Gleyma VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Skipta út núverandi VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Velja VPN sem alltaf er kveikt á?"</string> -diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml -index 5f3fc03050..b95c77e751 100644 ---- a/res/values-it/strings.xml -+++ b/res/values-it/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Connessione a <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Disconnettere questa VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Disconnetti"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versione <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versione"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Rimuovi VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Sostituire la rete VPN esistente?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Impostare la rete VPN sempre attiva?"</string> -diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml -index 273dfe64d0..2629b98572 100644 ---- a/res/values-iw/strings.xml -+++ b/res/values-iw/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"התחברות אל <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"האם לנתק את ה-VPN הזה?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"נתק"</string> -- <string name="vpn_version" msgid="41856553718304367">"גרסה <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"גרסה"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"שכח VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"האם להחליף רשת VPN קיימת?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"האם להגדיר את רשת ה-VPN בחיבור תמידי?"</string> -diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml -index f953d4f89e..f538342edc 100644 ---- a/res/values-ja/strings.xml -+++ b/res/values-ja/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g>に接続"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"この VPN の接続を解除しますか?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"接続を解除"</string> -- <string name="vpn_version" msgid="41856553718304367">"バージョン<xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"バージョン"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN を削除"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"既存の VPN を置き換えますか?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"常時接続 VPN を設定しますか?"</string> -diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml -index 8628e7492a..537e39358e 100644 ---- a/res/values-ka/strings.xml -+++ b/res/values-ka/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"დაკავშირებულია <xliff:g id="PROFILE">%s</xliff:g>-თან"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"გსურთ ამ VPN-თან კავშირის გაწყვეტა?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"კავშირის გაწყვეტა"</string> -- <string name="vpn_version" msgid="41856553718304367">"ვერსია <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ვერსია"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN-ის დავიწყება"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"გსურთ არსებული VPN-ის ჩანაცვლება?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"გსურთ ყოველთვის ჩართული VPN-ის დაყენება?"</string> -diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml -index 99a6f481e2..e6c089179b 100644 ---- a/res/values-kk/strings.xml -+++ b/res/values-kk/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> профайлына жалғау"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Осы VPN желісі ажыратылсын ба?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Ажырату"</string> -- <string name="vpn_version" msgid="41856553718304367">"Нұсқасы: <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Нұсқа"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN ұмыту"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Бар VPN қолданбасын ауыстыру керек пе?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Әрқашан қосулы VPN режимін орнату"</string> -diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml -index 16e3219d1f..340ca7ac5f 100644 ---- a/res/values-km/strings.xml -+++ b/res/values-km/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"តភ្ជាប់ <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ផ្តាច់ VPN នេះ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ផ្ដាច់"</string> -- <string name="vpn_version" msgid="41856553718304367">"កំណែ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"កំណែ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"បំភ្លេច VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ជំនួស VPN ដែលមានស្រាប់ឬ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"កំណត់ VPN ឲ្យបើកជានិច្ចឬ?"</string> -diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml -index dc05b17376..101a33baeb 100644 ---- a/res/values-kn/strings.xml -+++ b/res/values-kn/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಿಸಿ"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ಈ VPN ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸುವುದೇ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string> -- <string name="vpn_version" msgid="41856553718304367">"<xliff:g id="VERSION">%s</xliff:g> ಆವೃತ್ತಿ"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ಆವೃತ್ತಿ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN ಮರೆತುಬಿಡು"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಸ್ಥಾನಾಂತರಿಸುವುದೇ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"VPN ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವಂತೆ ಹೊಂದಿಸುವುದೇ?"</string> -diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml -index f970fba05a..d54b394dc3 100644 ---- a/res/values-ko/strings.xml -+++ b/res/values-ko/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g>에 연결"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"이 VPN을 연결 해제하시겠습니까?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"연결 해제"</string> -- <string name="vpn_version" msgid="41856553718304367">"버전 <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"버전"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN 삭제"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"기존 VPN을 교체하시겠습니까?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"연결 유지 VPN을 설정하시겠습니까?"</string> -diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml -index a093c850c0..4b1b9e061e 100644 ---- a/res/values-ky/strings.xml -+++ b/res/values-ky/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> менен байланышуу"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Бул VPN ажыратылсынбы?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Ажыратуу"</string> -- <string name="vpn_version" msgid="41856553718304367">"<xliff:g id="VERSION">%s</xliff:g> версиясы"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Версия"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN профили унутулсун"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Учурдагы VPN алмаштырылсынбы?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Туруктуу VPN\'ди жөндөйсүзбү?"</string> -diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml -index 30f30a9723..16b7e0b4a5 100644 ---- a/res/values-lo/strings.xml -+++ b/res/values-lo/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"ເຊື່ອມຕໍ່ຫາ <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ຕັດການເຊື່ອມຕໍ່ VPN ນີ້ບໍ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ຕັດການເຊື່ອມຕໍ່"</string> -- <string name="vpn_version" msgid="41856553718304367">"ເວີຊັນ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ເວີຊັນ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"ລືມ VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ຂຽນທັບ VPN ທີ່ມີຢູ່ກ່ອນແລ້ວຂອງທ່ານບໍ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Set always-on VPN?"</string> -diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml -index 7b268c00de..1a1e77d897 100644 ---- a/res/values-lt/strings.xml -+++ b/res/values-lt/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Prisijungti prie <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Atsijungti nuo šio VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Atsijungti"</string> -- <string name="vpn_version" msgid="41856553718304367">"<xliff:g id="VERSION">%s</xliff:g> versija"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versija"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Pamiršti VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Pakeisti esamą VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Nustatyti visada įjungtą VPN?"</string> -diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml -index a430a45b17..ea44da0627 100644 ---- a/res/values-lv/strings.xml -+++ b/res/values-lv/strings.xml -@@ -2885,7 +2885,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Savienojuma izveide ar <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Vai pārtraukt šo VPN savienojumu?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Pārtraukt savienojumu"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versija <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versija"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Aizmirst VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Vai aizstāt esošo VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Vai iestatīt vienmēr ieslēgtu VPN?"</string> -diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml -index a379267171..7875da2457 100644 ---- a/res/values-mk/strings.xml -+++ b/res/values-mk/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Поврзи се со <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Да се исклучи оваа VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Исклучи"</string> -- <string name="vpn_version" msgid="41856553718304367">"Верзија <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Верзија"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Заборави VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Да се замени постојната VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Да се постави „секогаш вклучена“ VPN?"</string> -diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml -index 0741939f74..491befa629 100644 ---- a/res/values-ml/strings.xml -+++ b/res/values-ml/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്യുക"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ഈ VPN വിച്ഛേദിക്കണോ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"വിച്ഛേദിക്കുക"</string> -- <string name="vpn_version" msgid="41856553718304367">"പതിപ്പ് <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"പതിപ്പ്"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN മറക്കുക"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"നിലവിലുള്ള VPN-ന് പകരം പുതിയതാക്കണോ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"\'എല്ലായ്പ്പോഴും ഓൺ\' VPN സജ്ജമാക്കണോ?"</string> -diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml -index c5af3fabbb..b3ba03a4de 100644 ---- a/res/values-mn/strings.xml -+++ b/res/values-mn/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> руу холбогдох"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Энэ VPN-г салгах уу?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Салгах"</string> -- <string name="vpn_version" msgid="41856553718304367">"Хувилбар <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Хувилбар"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN мартсан"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Энэ VPN-г солих уу?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"VPN-г тогтмол асаалттайгаар тохируулах уу?"</string> -diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml -index db14d4b5ad..5db3d9a795 100644 ---- a/res/values-mr/strings.xml -+++ b/res/values-mr/strings.xml -@@ -2849,7 +2849,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> शी कनेक्ट करा"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"हे VPN डिस्कनेक्ट करायचे?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"डिस्कनेक्ट करा"</string> -- <string name="vpn_version" msgid="41856553718304367">"आवृत्ती <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"आवृत्ती"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN विसरा"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"विद्यमान VPN पुनर्स्थित करायचे?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"नेहमी-चालू VPN सेट करायचे?"</string> -diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml -index bc21575833..648f09b110 100644 ---- a/res/values-ms/strings.xml -+++ b/res/values-ms/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Sambung ke <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Putuskan sambungan VPN ini?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Putuskan sambungan"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versi <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versi"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Lupakan VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Gantikan VPN yang sedia ada?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Tetapkan VPN sentiasa hidup?"</string> -diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml -index 086961ae66..5a1b48ca49 100644 ---- a/res/values-my/strings.xml -+++ b/res/values-my/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> နှင့် ချိတ်ဆက်ခြင်း"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ဤ VPN အား ချိတ်ဆက်မှု ဖြုတ်လိုပါသလား။"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ဆက်သွယ်မှု ဖြတ်ရန်"</string> -- <string name="vpn_version" msgid="41856553718304367">"ဗားရှင်း <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ဗားရှင်း"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN ကိုမေ့လိုက်ပါ"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ရှိပြီးသား VPN ကိုအစားထိုးမလား။"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"VPN ကို အမြဲတမ်းဖွင့်ထားရန် သတ်မှတ်မလား။"</string> -diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml -index 63ccdab2e0..b6f7dce4ab 100644 ---- a/res/values-nb/strings.xml -+++ b/res/values-nb/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Koble til <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Vil du koble fra dette VPN-et?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Koble fra"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versjon <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versjon"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Glem VPN-profilen"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Vil du erstatte det nåværende VPN-et?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Vil du angi alltid på-VPN?"</string> -diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml -index 258a4e297f..af7103dbf3 100644 ---- a/res/values-ne/strings.xml -+++ b/res/values-ne/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> मा जोड्नुहोस्"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"यो VPN को जडान विच्छेद गर्ने हो?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"विच्छेदन गर्नुहोस्"</string> -- <string name="vpn_version" msgid="41856553718304367">"संस्करण <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"संस्करण"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN लाई बिर्सनुहोस्"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"विद्यमान VPN लाई बदल्ने हो?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"सधैँ-सक्रिय VPN लाई सेट गर्ने हो?"</string> -diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml -index bb95a1c94a..b98e18dda9 100644 ---- a/res/values-nl/strings.xml -+++ b/res/values-nl/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Verbinding maken met <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Verbinding met dit VPN verbreken?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Verbinding verbreken"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versie <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versie"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN vergeten"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Bestaande VPN vervangen?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Always-on VPN instellen?"</string> -diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml -index 2660400d9e..8ead9e4d01 100644 ---- a/res/values-or/strings.xml -+++ b/res/values-or/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> ସହ ସଂଯୋଗ କରନ୍ତୁ"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ଏହି VPNକୁ ବିଚ୍ଛିନ୍ନ କରିବେ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string> -- <string name="vpn_version" msgid="41856553718304367">"ସଂସ୍କରଣ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ସଂସ୍କରଣ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPNକୁ ଭୁଲିଯାଅ"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ପୂର୍ବରୁ ଥିବା VPNକୁ ବଦଳାଇବେ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ସର୍ବଦା-ଅନ୍ ଥିବା VPN ସେଟ୍ କରିବେ?"</string> -diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml -index 9523fc8e82..33acf54f83 100644 ---- a/res/values-pa/strings.xml -+++ b/res/values-pa/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ਇਹ VPN ਡਿਸਕਨੈਕਟ ਕਰੀਏ?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ਡਿਸਕਨੈਕਟ ਕਰੋ"</string> -- <string name="vpn_version" msgid="41856553718304367">"ਵਰਜਨ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ਵਰਜਨ"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN ਨੂੰ ਛੱਡੋ"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ਕੀ ਮੌਜੂਦਾ VPN ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ ਹੈ?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ਕੀ ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN ਨੂੰ ਸੈੱਟ ਕਰਨਾ ਹੈ?"</string> -diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml -index 2f3b3111d4..64509c3224 100644 ---- a/res/values-pl/strings.xml -+++ b/res/values-pl/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Połącz z: <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Odłączyć tę sieć VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Odłącz"</string> -- <string name="vpn_version" msgid="41856553718304367">"Wersja <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Wersja"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Zapomnij VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Zastąpić obecną sieć VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Ustawić stały VPN?"</string> -diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml -index 54f2fbdc75..4929813f59 100644 ---- a/res/values-pt-rBR/strings.xml -+++ b/res/values-pt-rBR/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Conectar a <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Desconectar esta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desconectar"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versão <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versão"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Esquecer VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Substituir VPN já existente?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Configurar VPN sempre ativa?"</string> -diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml -index 4d8fbb2649..3ac7d1a3b4 100644 ---- a/res/values-pt-rPT/strings.xml -+++ b/res/values-pt-rPT/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Ligar a <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Pretende desligar esta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desligar"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versão <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versão"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Esquecer VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Pretende substituir a VPN existente?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Pretende definir a VPN como sempre ativa?"</string> -diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml -index 54f2fbdc75..4929813f59 100644 ---- a/res/values-pt/strings.xml -+++ b/res/values-pt/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Conectar a <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Desconectar esta VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Desconectar"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versão <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versão"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Esquecer VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Substituir VPN já existente?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Configurar VPN sempre ativa?"</string> -diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml -index 5d29fb99d6..4e6760f1a6 100644 ---- a/res/values-ro/strings.xml -+++ b/res/values-ro/strings.xml -@@ -2885,7 +2885,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Conectați-vă la <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Doriți să vă deconectați de la această rețea VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Deconectați-vă"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versiunea <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versiune"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Eliminați profilul VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Înlocuiți rețeaua VPN existentă?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Setați rețeaua VPN ca activată permanent?"</string> -diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml -index 5f2bbdadec..d4d38b3a04 100644 ---- a/res/values-ru/strings.xml -+++ b/res/values-ru/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Подключение к <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Отключиться от VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Да"</string> -- <string name="vpn_version" msgid="41856553718304367">"Версия <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Версия"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Удалить VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Сменить текущую VPN-сеть?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Настроить постоянную VPN-сеть?"</string> -diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml -index 84eb74c21f..080891875d 100644 ---- a/res/values-si/strings.xml -+++ b/res/values-si/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> වෙත සම්බන්ධ කරන්න"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"මෙම VPN එක විසන්ධි කරන්නද?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"විසන්ධි කරන්න"</string> -- <string name="vpn_version" msgid="41856553718304367">"අනුවාදය <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"අනුවාදය"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN අමතක කරන්න"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"පවතින VPN ප්රතිස්ථාපනය කරන්නද?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"සැම විට ක්රියාත්මක VPN සකසන්නද?"</string> -diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml -index bf1bce0292..7bc15a95fb 100644 ---- a/res/values-sk/strings.xml -+++ b/res/values-sk/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Pripojiť k profilu <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Odpojiť tento profil VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Odpojiť"</string> -- <string name="vpn_version" msgid="41856553718304367">"Verzia <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Verzia"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Zabudnúť profil VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Nahradiť existujúcu sieť VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Nastaviť sieť VPN, ktorá je vždy zapnutá?"</string> -diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml -index 90459d9682..6e96754a32 100644 ---- a/res/values-sl/strings.xml -+++ b/res/values-sl/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Povezovanje z <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Prekinitev povezave s tem omrežjem VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Prekini povezavo"</string> -- <string name="vpn_version" msgid="41856553718304367">"Različica <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Različica"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Pozabi omrežje VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Želite zamenjati obstoječe omrežje VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Ali želite, da je omrežje VPN stalno vklopljeno?"</string> -diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml -index 6ac7a9989c..c0da91fec2 100644 ---- a/res/values-sq/strings.xml -+++ b/res/values-sq/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Lidhu me <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Shkëpute këtë rrjet VPN"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Shkëpute"</string> -- <string name="vpn_version" msgid="41856553718304367">"Versioni <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versioni"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Harroje rrjetin VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Të zëvendësohet rrjeti ekzistues VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Të caktohet rrjeti VPN gjithmonë aktiv?"</string> -diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml -index 0bf4de633c..88c21cc703 100644 ---- a/res/values-sr/strings.xml -+++ b/res/values-sr/strings.xml -@@ -2885,7 +2885,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Повезивање на профил <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Желите ли да прекинете везу са овим VPN-ом?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Прекини везу"</string> -- <string name="vpn_version" msgid="41856553718304367">"Верзија <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Верзија"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Заборави VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Желите ли да замените постојећи VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Желите ли да подесите увек укључени VPN?"</string> -diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml -index 1bf227c63c..d3724488f2 100644 ---- a/res/values-sv/strings.xml -+++ b/res/values-sv/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Anslut till <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Vill du koppla från VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Koppla från"</string> -- <string name="vpn_version" msgid="41856553718304367">"Version <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Version"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Glöm VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Vill du byta ut befintligt VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Vill du ange Always-on VPN?"</string> -diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml -index 4876b513e0..22ec957b3c 100644 ---- a/res/values-sw/strings.xml -+++ b/res/values-sw/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Unganisha kwa <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Ungependa kuondoa VPN hii?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Kata muungnisho"</string> -- <string name="vpn_version" msgid="41856553718304367">"Toleo la <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Toleo"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Ondoa VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Ungependa kubadilisha VPN iliyopo?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Ungependa kuweka VPN iliyowashwa kila mara?"</string> -diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml -index 8438d8131d..3791d4130f 100644 ---- a/res/values-ta/strings.xml -+++ b/res/values-ta/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> உடன் இணை"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"VPNஐத் துண்டிக்கவா?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"தொடர்பைத் துண்டி"</string> -- <string name="vpn_version" msgid="41856553718304367">"பதிப்பு <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"பதிப்பு"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPNஐ நீக்கு"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"தற்போதுள்ள VPNஐ மாற்றியமைக்கவா?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"எப்போதும் இயங்கும் VPNஐ அமைக்கவா?"</string> -diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml -index a3e54662b2..198d3ee464 100644 ---- a/res/values-te/strings.xml -+++ b/res/values-te/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g>కి కనెక్ట్ చేయండి"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ఈ VPNను డిస్కనెక్ట్ చేయాలా?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"డిస్కనెక్ట్ చేయి"</string> -- <string name="vpn_version" msgid="41856553718304367">"వెర్షన్ <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"వెర్షన్"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPNని విస్మరించు"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"ఇప్పటికే ఉన్న VPNని భర్తీ చేయాలా?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ఎల్లప్పుడూ ఆన్లో ఉండే VPNని సెట్ చేయాలా?"</string> -diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml -index a3ea84372f..15b096a6a4 100644 ---- a/res/values-th/strings.xml -+++ b/res/values-th/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"เชื่อมต่อกับ <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"ยกเลิกการเชื่อมต่อ VPN นี้ไหม"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"ยกเลิกการเชื่อมต่อ"</string> -- <string name="vpn_version" msgid="41856553718304367">"เวอร์ชัน <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"รุ่น"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"ลืม VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"แทนที่ VPN ที่มีอยู่หรือไม่"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ตั้งค่า VPN แบบเปิดตลอดเวลาหรือไม่"</string> -diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml -index f405a94496..b1d0de6d7d 100644 ---- a/res/values-tl/strings.xml -+++ b/res/values-tl/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Kumonekta sa <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Putulin ang koneksyon ng VPN na ito?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Putulin ang koneksyon"</string> -- <string name="vpn_version" msgid="41856553718304367">"Bersyon <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Bersyon"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Kalimutan ang VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Gusto mo bang palitan ang dati nang VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Gusto mo bang itakda ang VPN na palaging naka-on?"</string> -diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml -index 5da530a0a9..843c5de2f1 100644 ---- a/res/values-tr/strings.xml -+++ b/res/values-tr/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> profiline bağlan"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Bu VPN\'nin bağlantısı kesilsin mi?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Bağlantıyı kes"</string> -- <string name="vpn_version" msgid="41856553718304367">"Sürüm <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Sürüm"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN\'yi unut"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Mevcut VPN değiştirilsin mi?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Her zaman açık VPN ayarlansın mı?"</string> -diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml -index dedac46511..7f3c1f3580 100644 ---- a/res/values-uk/strings.xml -+++ b/res/values-uk/strings.xml -@@ -2922,7 +2922,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Під’єднатися до профілю <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Відключити цю мережу VPN?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Відключити"</string> -- <string name="vpn_version" msgid="41856553718304367">"Версія <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Версія"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Забути мережу VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Замінити наявну мережу VPN?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Увімкнути постійну мережу VPN?"</string> -diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml -index 0d2a474381..aeefec22f5 100644 ---- a/res/values-ur/strings.xml -+++ b/res/values-ur/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> سے مربوط کریں"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"اس VPN سے غیر منسلک کریں؟"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"غیر منسلک کریں"</string> -- <string name="vpn_version" msgid="41856553718304367">"ورژن <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"ورژن"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPN بھول جائیں"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"موجودہ VPN بدلیں؟"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"ہمیشہ آن VPN سیٹ کریں؟"</string> -diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml -index db3adfe2b8..01b553ec89 100644 ---- a/res/values-uz/strings.xml -+++ b/res/values-uz/strings.xml -@@ -2858,7 +2858,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"<xliff:g id="PROFILE">%s</xliff:g> tarmog‘iga ulanish"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Bu VPN bilan aloqa uzilsinmi?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Aloqani uzish"</string> -- <string name="vpn_version" msgid="41856553718304367">"<xliff:g id="VERSION">%s</xliff:g> versiya"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Versiya"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"VPNni o‘chirish"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Mavjud VPN tarmog‘i almashtirilsinmi?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Doimiy VPN o‘rnatilsinmi?"</string> -diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml -index b2948c9833..ccd6c4a55e 100644 ---- a/res/values-vi/strings.xml -+++ b/res/values-vi/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Kết nối với <xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Ngắt kết nối VPN này?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Ngắt kết nối"</string> -- <string name="vpn_version" msgid="41856553718304367">"Phiên bản <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Phiên bản"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Xóa VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Thay thế VPN hiện có?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Đặt VPN luôn bật?"</string> -diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml -index 18b56078e0..be0f83491d 100644 ---- a/res/values-zh-rCN/strings.xml -+++ b/res/values-zh-rCN/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"连接到<xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"要断开与此 VPN 的连接吗?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"断开连接"</string> -- <string name="vpn_version" msgid="41856553718304367">"版本 <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"版本"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"取消保存 VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"要替换现有 VPN 吗?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"要设置始终开启的 VPN 吗?"</string> -diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml -index cc64e5cb38..c4816d8d78 100644 ---- a/res/values-zh-rHK/strings.xml -+++ b/res/values-zh-rHK/strings.xml -@@ -2849,7 +2849,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"連接「<xliff:g id="PROFILE">%s</xliff:g>」"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"要解除連結此 VPN 嗎?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"中斷連線"</string> -- <string name="vpn_version" msgid="41856553718304367">"版本為:<xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"版本"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"刪除 VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"要取代目前的 VPN 嗎?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"要設定保持開啟的 VPN 嗎?"</string> -diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml -index e8b3cd54a9..afce39db08 100644 ---- a/res/values-zh-rTW/strings.xml -+++ b/res/values-zh-rTW/strings.xml -@@ -2848,7 +2848,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"連線到「<xliff:g id="PROFILE">%s</xliff:g>」"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"要中斷這個 VPN 連線嗎?"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"中斷連線"</string> -- <string name="vpn_version" msgid="41856553718304367">"版本 <xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"版本"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"清除 VPN 設定檔"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"要取代現有的 VPN 嗎?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"要設定永久連線的 VPN 嗎?"</string> -diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml -index a8de0116fa..775d795abb 100644 ---- a/res/values-zu/strings.xml -+++ b/res/values-zu/strings.xml -@@ -2849,7 +2849,7 @@ - <string name="vpn_connect_to" msgid="216709261691085594">"Xhuma ku-<xliff:g id="PROFILE">%s</xliff:g>"</string> - <string name="vpn_disconnect_confirm" msgid="6356789348816854539">"Nqamula le-VPN"</string> - <string name="vpn_disconnect" msgid="7753808961085867345">"Nqamula"</string> -- <string name="vpn_version" msgid="41856553718304367">"Inguqulo engu-<xliff:g id="VERSION">%s</xliff:g>"</string> -+ <string name="vpn_version" msgid="6344167191984400976">"Uhlobo"</string> - <string name="vpn_forget_long" msgid="729132269203870205">"Khohlwa i-VPN"</string> - <string name="vpn_replace_vpn_title" msgid="3994226561866340280">"Shintshanisa i-VPN ekhona?"</string> - <string name="vpn_set_vpn_title" msgid="1667539483005810682">"Setha i-VPN ehlala ivuliwe?"</string> diff --git a/Patches/LineageOS-17.1/android_packages_apps_Settings/358568-backport.patch b/Patches/LineageOS-17.1/android_packages_apps_Settings/358568-backport.patch deleted file mode 100644 index b7b43e6d..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_Settings/358568-backport.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Dmitry Dementyev <dementyev@google.com> -Date: Tue, 7 Mar 2023 10:36:41 -0800 -Subject: [PATCH] Convert argument to intent in AddAccountSettings. - -Bug: 265798353 -Test: manual -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c7e8052b527434ed8660e3babdab718f7f3cd7da) -Merged-In: I0051e5d5fc9fd3691504cb5fbb959f701e0bce6a -Change-Id: I0051e5d5fc9fd3691504cb5fbb959f701e0bce6a ---- - src/com/android/settings/accounts/AddAccountSettings.java | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java -index cca15c96d3..2e23e93124 100644 ---- a/src/com/android/settings/accounts/AddAccountSettings.java -+++ b/src/com/android/settings/accounts/AddAccountSettings.java -@@ -102,7 +102,8 @@ public class AddAccountSettings extends Activity { - addAccountOptions.putParcelable(EXTRA_USER, mUserHandle); - intent.putExtras(addAccountOptions); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -- startActivityForResultAsUser(intent, ADD_ACCOUNT_REQUEST, mUserHandle); -+ startActivityForResultAsUser( -+ new Intent(intent), ADD_ACCOUNT_REQUEST, mUserHandle); - } else { - setResult(RESULT_OK); - if (mPendingIntent != null) { diff --git a/Patches/LineageOS-17.1/android_packages_apps_TvSettings/358578.patch b/Patches/LineageOS-17.1/android_packages_apps_TvSettings/358578.patch deleted file mode 100644 index 01bf6bab..00000000 --- a/Patches/LineageOS-17.1/android_packages_apps_TvSettings/358578.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Dmitry Dementyev <dementyev@google.com> -Date: Tue, 7 Mar 2023 10:55:07 -0800 -Subject: [PATCH] Convert argument to intent in addAccount TvSettings. - -Bug: 265798353 -Test: manual -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:706edcb7532d74788f899968016b7a6273bfbcac) -Merged-In: I06a63078f55ee8169123b1dfcf1811e682e0776e -Change-Id: I06a63078f55ee8169123b1dfcf1811e682e0776e ---- - .../tv/settings/accounts/AddAccountWithTypeActivity.java | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java b/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java -index a608bc4fa..ff71ac93b 100644 ---- a/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java -+++ b/Settings/src/com/android/tv/settings/accounts/AddAccountWithTypeActivity.java -@@ -52,7 +52,7 @@ public class AddAccountWithTypeActivity extends Activity { - Log.e(TAG, "Failed to retrieve add account intent from authenticator"); - setResultAndFinish(Activity.RESULT_CANCELED); - } else { -- startActivityForResult(addAccountIntent, REQUEST_ADD_ACCOUNT); -+ startActivityForResult(new Intent(addAccountIntent), REQUEST_ADD_ACCOUNT); - } - } catch (IOException|AuthenticatorException|OperationCanceledException e) { - Log.e(TAG, "Failed to get add account intent: ", e); diff --git a/Patches/LineageOS-17.1/android_packages_providers_MediaProvider/353957-backport.patch b/Patches/LineageOS-17.1/android_packages_providers_MediaProvider/353957-backport.patch deleted file mode 100644 index ec7c81f5..00000000 --- a/Patches/LineageOS-17.1/android_packages_providers_MediaProvider/353957-backport.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Abhijeet Kaur <abkaur@google.com> -Date: Wed, 23 Nov 2022 08:47:27 +0000 -Subject: [PATCH] Canonicalise path before extracting relative path - -This helps us make accurate access checks on the given path. - -Bug: 228833816 -Bug: 228450832 -Test: atest FileUtilsTest -Test: atest LegacyStorageHostTest -Change-Id: Id620644ffdfe20e9281773e2e23851c56732dd11 -Merged-In: Id620644ffdfe20e9281773e2e23851c56732dd11 -(cherry picked from commit 93f5186e4b4a044e00a168c55e05fd3835033221) -(cherry picked from commit 0f59f42685f186fd207355c01c580038436713ba) -Merged-In: Id620644ffdfe20e9281773e2e23851c56732dd11 ---- - src/com/android/providers/media/MediaProvider.java | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/src/com/android/providers/media/MediaProvider.java b/src/com/android/providers/media/MediaProvider.java -index 9032644e7..f9ea135fd 100644 ---- a/src/com/android/providers/media/MediaProvider.java -+++ b/src/com/android/providers/media/MediaProvider.java -@@ -2308,8 +2308,22 @@ public class MediaProvider extends ContentProvider { - } - } - -+ @Nullable -+ private static String getCanonicalPath(@Nullable String path) { -+ if (path == null) return null; -+ -+ try { -+ return new File(path).getCanonicalPath(); -+ } catch (IOException e) { -+ Log.d(TAG, "Unable to get canonical path from invalid data path: " + path, e); -+ return null; -+ } -+ } -+ - private static @Nullable String extractRelativePath(@Nullable String data) { -+ data = getCanonicalPath(data); - if (data == null) return null; -+ - final Matcher matcher = PATTERN_RELATIVE_PATH.matcher(data); - if (matcher.find()) { - final int lastSlash = data.lastIndexOf('/'); diff --git a/Patches/LineageOS-17.1/android_packages_services_Telecomm/353958-backport.patch b/Patches/LineageOS-17.1/android_packages_services_Telecomm/353958-backport.patch deleted file mode 100644 index 0fc5b001..00000000 --- a/Patches/LineageOS-17.1/android_packages_services_Telecomm/353958-backport.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Pranav Madapurmath <pmadapurmath@google.com> -Date: Wed, 1 Feb 2023 21:33:16 +0000 -Subject: [PATCH] Ensure service unbind when receiving a null call screening - service in onBind. - -Currently, we do not unbind the call screening service when a null -service is returned from onBind when placing MO calls. -CallScreeningServiceHelper (MO) now overrides onNullBinding to ensure -future completion and that we unbind the service after. Similarly, we -need to unbind the service in onServiceDisconnected. -CallScreeningServiceFilter (MT) has also been updated to ensure we -unbind in places when we know that the connection should not exist. - -Also, there is a timeout in CallScreeningServiceHelper. This does not -require a call to unbind the service because CallScreeningAdapter also -places a call to unbind the service in onScreeningResponse. We would -risk having duplicate calls to unbind the service, which would cause a -fatal exception. This is demonstrated by the existing CTS tests, namely, -ThirdPartyCallScreeningServiceTest.java. - -Bug: 252762941 -Test: Manual (no breakage in existing flow), CTS for MO/MT cases -Change-Id: Ia5b62bb93dc666b6b8b8daccb8ef41eb55dde7ea -Merged-In: Ia5b62bb93dc666b6b8b8daccb8ef41eb55dde7ea -(cherry picked from commit 14927c6f0b4154ee31dc4e339ea4a692f73ad2e0) -(cherry picked from commit 60f4ee794adbac4950ab22b44c4630edf7239e12) -Merged-In: Ia5b62bb93dc666b6b8b8daccb8ef41eb55dde7ea ---- - .../telecom/CallScreeningServiceHelper.java | 17 +++++++++++++++++ - 1 file changed, 17 insertions(+) - -diff --git a/src/com/android/server/telecom/CallScreeningServiceHelper.java b/src/com/android/server/telecom/CallScreeningServiceHelper.java -index a9341ab82..89778e43a 100644 ---- a/src/com/android/server/telecom/CallScreeningServiceHelper.java -+++ b/src/com/android/server/telecom/CallScreeningServiceHelper.java -@@ -146,6 +146,23 @@ public class CallScreeningServiceHelper { - "Cancelling outgoing call screen due to service disconnect."); - } - mFuture.complete(null); -+ mContext.unbindService(this); -+ } finally { -+ Log.endSession(); -+ } -+ } -+ -+ @Override -+ public void onNullBinding(ComponentName name) { -+ // No locking needed -- CompletableFuture only lets one thread call complete. -+ Log.continueSession(mLoggingSession, "CSSH.oNB"); -+ try { -+ if (!mFuture.isDone()) { -+ Log.w(CallScreeningServiceHelper.this, -+ "Cancelling outgoing call screen due to null binding."); -+ } -+ mFuture.complete(null); -+ mContext.unbindService(this); - } finally { - Log.endSession(); - } diff --git a/Patches/LineageOS-17.1/android_packages_services_Telecomm/353959.patch b/Patches/LineageOS-17.1/android_packages_services_Telecomm/353959.patch deleted file mode 100644 index 9b2f6913..00000000 --- a/Patches/LineageOS-17.1/android_packages_services_Telecomm/353959.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Chinmay Dhodapkar <chinmayd@google.com> -Date: Sun, 4 Dec 2022 09:46:34 -0800 -Subject: [PATCH] DO NOT MERGE do not process content uri in call Intents - -Add checks in Telecom so content uris are not processed - -Bug: 257030107 -Test: atest NewOutgoingCallIntentBroadcasterTest -Test: adb shell am start -a android.intent.action.CALL -d tel:xxx -Change-Id: Ic2c3014cecfd5db84dc2023b4c247d96ad1c3414 -Merged-In: Ic2c3014cecfd5db84dc2023b4c247d96ad1c3414 -(cherry picked from commit 9636518478fb887dd1834c0433eb3a71eb72faaf) -Merged-In: Ic2c3014cecfd5db84dc2023b4c247d96ad1c3414 ---- - .../telecom/NewOutgoingCallIntentBroadcaster.java | 14 ++++++++++++-- - .../NewOutgoingCallIntentBroadcasterTest.java | 13 +++++++++++++ - 2 files changed, 25 insertions(+), 2 deletions(-) - -diff --git a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java -index 7a641af3c..960be80a3 100644 ---- a/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java -+++ b/src/com/android/server/telecom/NewOutgoingCallIntentBroadcaster.java -@@ -313,8 +313,18 @@ public class NewOutgoingCallIntentBroadcaster { - } - - private String getNumberFromCallIntent(Intent intent) { -- String number; -- number = mPhoneNumberUtilsAdapter.getNumberFromIntent(intent, mContext); -+ String number = null; -+ -+ Uri uri = intent.getData(); -+ if (uri != null) { -+ String scheme = uri.getScheme(); -+ if (scheme != null) { -+ if (scheme.equals("tel") || scheme.equals("sip")) { -+ number = uri.getSchemeSpecificPart(); -+ } -+ } -+ } -+ - if (TextUtils.isEmpty(number)) { - Log.w(this, "Empty number obtained from the call intent."); - return null; -diff --git a/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java b/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java -index 81b43265f..b618bba1e 100644 ---- a/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java -+++ b/tests/src/com/android/server/telecom/tests/NewOutgoingCallIntentBroadcasterTest.java -@@ -186,6 +186,19 @@ public class NewOutgoingCallIntentBroadcasterTest extends TelecomTestCase { - verifyNoCallPlaced(); - } - -+ @Test -+ public void testNoCallsPlacedWithContentUri() { -+ Uri handle = Uri.parse("content://com.android.contacts/data/1"); -+ Intent intent = new Intent(Intent.ACTION_CALL, handle); -+ -+ int result = processIntent(intent, true).disconnectCause; -+ -+ assertEquals(DisconnectCause.NO_PHONE_NUMBER_SUPPLIED, result); -+ verify(mContext, never()).getContentResolver(); -+ verifyNoBroadcastSent(); -+ verifyNoCallPlaced(); -+ } -+ - @SmallTest - @Test - public void testEmergencyCallWithNonDefaultDialer() { diff --git a/Patches/LineageOS-17.1/android_packages_services_Telecomm/355777-backport.patch b/Patches/LineageOS-17.1/android_packages_services_Telecomm/355777-backport.patch deleted file mode 100644 index d1db29d1..00000000 --- a/Patches/LineageOS-17.1/android_packages_services_Telecomm/355777-backport.patch +++ /dev/null @@ -1,443 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Thomas Stuart <tjstuart@google.com> -Date: Mon, 21 Nov 2022 17:36:52 -0800 -Subject: [PATCH] enforce stricter rules when registering phoneAccounts - -- include disable accounts when looking up accounts for a package to - check if the limit is reached (10) -- put a new limit of 10 supported schemes -- put a new limit of 256 characters per scheme -- put a new limit of 256 characters per address -- ensure the Icon can write to memory w/o an exception - -bug: 259064622 -bug: 256819769 -Test: cts + unit -Change-Id: I5eb2a127a44d5ec725d0ba39cb0ef478b12013de -Merged-In: I5eb2a127a44d5ec725d0ba39cb0ef478b12013de -(cherry picked from commit on googleplex-android-review.googlesource.com host: 56ef9e15506f71ae555a4535d5c0ac9bd3f587f1) -Merged-In: I5eb2a127a44d5ec725d0ba39cb0ef478b12013de ---- - .../server/telecom/PhoneAccountRegistrar.java | 183 ++++++++++++++++-- - .../server/telecom/TelecomServiceImpl.java | 4 +- - .../tests/PhoneAccountRegistrarTest.java | 101 ++++++++++ - .../telecom/tests/TelecomServiceImplTest.java | 2 +- - 4 files changed, 274 insertions(+), 16 deletions(-) - -diff --git a/src/com/android/server/telecom/PhoneAccountRegistrar.java b/src/com/android/server/telecom/PhoneAccountRegistrar.java -index 13b176c25..219de7d03 100644 ---- a/src/com/android/server/telecom/PhoneAccountRegistrar.java -+++ b/src/com/android/server/telecom/PhoneAccountRegistrar.java -@@ -29,6 +29,7 @@ import android.graphics.Bitmap; - import android.graphics.BitmapFactory; - import android.graphics.drawable.Icon; - import android.net.Uri; -+import android.os.Binder; - import android.os.Bundle; - import android.os.AsyncTask; - import android.os.PersistableBundle; -@@ -140,9 +141,14 @@ public class PhoneAccountRegistrar { - } - - public static final String FILE_NAME = "phone-account-registrar-state.xml"; -+ public static final String ICON_ERROR_MSG = -+ "Icon cannot be written to memory. Try compressing or downsizing"; - @VisibleForTesting - public static final int EXPECTED_STATE_VERSION = 9; - public static final int MAX_PHONE_ACCOUNT_REGISTRATIONS = 10; -+ public static final int MAX_PHONE_ACCOUNT_EXTRAS_KEY_PAIR_LIMIT = 100; -+ public static final int MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT = 256; -+ public static final int MAX_SCHEMES_PER_ACCOUNT = 10; - - /** Keep in sync with the same in SipSettings.java */ - private static final String SIP_SHARED_PREFERENCES = "SIP_PREFERENCES"; -@@ -722,6 +728,15 @@ public class PhoneAccountRegistrar { - return getPhoneAccountHandles(0, null, packageName, false, userHandle); - } - -+ -+ /** -+ * includes disabled, includes crossUserAccess -+ */ -+ public List<PhoneAccountHandle> getAllPhoneAccountHandlesForPackage(UserHandle userHandle, -+ String packageName) { -+ return getPhoneAccountHandles(0, null, packageName, true /* includeDisabled */, userHandle); -+ } -+ - /** - * Determines if a {@link PhoneAccountHandle} is for a self-managed {@link ConnectionService}. - * @param handle The handle. -@@ -741,8 +756,11 @@ public class PhoneAccountRegistrar { - * Performs checks before calling addOrReplacePhoneAccount(PhoneAccount) - * - * @param account The {@code PhoneAccount} to add or replace. -- * @throws SecurityException if package does not have BIND_TELECOM_CONNECTION_SERVICE permission -+ * @throws SecurityException if package does not have BIND_TELECOM_CONNECTION_SERVICE -+ * permission - * @throws IllegalArgumentException if MAX_PHONE_ACCOUNT_REGISTRATIONS are reached -+ * @throws IllegalArgumentException if MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT is reached -+ * @throws IllegalArgumentException if writing the Icon to memory will cause an Exception - */ - public void registerPhoneAccount(PhoneAccount account) { - // Enforce the requirement that a connection service for a phone account has the correct -@@ -754,21 +772,155 @@ public class PhoneAccountRegistrar { - throw new SecurityException("PhoneAccount connection service requires " - + "BIND_TELECOM_CONNECTION_SERVICE permission."); - } -- //Enforce an upper bound on the number of PhoneAccount's a package can register. -- // Most apps should only require 1-2. -- if (getPhoneAccountsForPackage( -- account.getAccountHandle().getComponentName().getPackageName(), -- account.getAccountHandle().getUserHandle()).size() -+ enforceCharacterLimit(account); -+ enforceIconSizeLimit(account); -+ enforceMaxPhoneAccountLimit(account); -+ addOrReplacePhoneAccount(account); -+ } -+ -+ /** -+ * Enforce an upper bound on the number of PhoneAccount's a package can register. -+ * Most apps should only require 1-2. * Include disabled accounts. -+ * -+ * @param account to enforce check on -+ * @throws IllegalArgumentException if MAX_PHONE_ACCOUNT_REGISTRATIONS are reached -+ */ -+ private void enforceMaxPhoneAccountLimit(@NonNull PhoneAccount account) { -+ final PhoneAccountHandle accountHandle = account.getAccountHandle(); -+ final UserHandle user = accountHandle.getUserHandle(); -+ final ComponentName componentName = accountHandle.getComponentName(); -+ -+ if (getPhoneAccountHandles(0, null, componentName.getPackageName(), -+ true /* includeDisabled */, user).size() - >= MAX_PHONE_ACCOUNT_REGISTRATIONS) { -- Log.w(this, "Phone account %s reached max registration limit for package", -- account.getAccountHandle()); -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceMaxPhoneAccountLimit"); - throw new IllegalArgumentException( - "Error, cannot register phone account " + account.getAccountHandle() - + " because the limit, " + MAX_PHONE_ACCOUNT_REGISTRATIONS - + ", has been reached"); - } -+ } -+ /** -+ * determine if there will be an issue writing the icon to memory -+ * -+ * @param account to enforce check on -+ * @throws IllegalArgumentException if writing the Icon to memory will cause an Exception -+ */ -+ @VisibleForTesting -+ public void enforceIconSizeLimit(PhoneAccount account) { -+ if (account.getIcon() == null) { -+ return; -+ } -+ String text = ""; -+ // convert the icon into a Base64 String -+ try { -+ text = XmlSerialization.writeIconToBase64String(account.getIcon()); -+ } catch (IOException e) { -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceIconSizeLimit"); -+ throw new IllegalArgumentException(ICON_ERROR_MSG); -+ } -+ } - -- addOrReplacePhoneAccount(account); -+ /** -+ * All {@link PhoneAccount} and{@link PhoneAccountHandle} String and Char-Sequence fields -+ * should be restricted to character limit of MAX_PHONE_ACCOUNT_CHAR_LIMIT to prevent exceptions -+ * when writing large character streams to XML-Serializer. -+ * -+ * @param account to enforce character limit checks on -+ * @throws IllegalArgumentException if MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT reached -+ */ -+ public void enforceCharacterLimit(PhoneAccount account) { -+ if (account == null) { -+ return; -+ } -+ PhoneAccountHandle handle = account.getAccountHandle(); -+ -+ String[] fields = -+ {"Package Name", "Class Name", "PhoneAccountHandle Id", "Label", "ShortDescription", -+ "GroupId", "Address", "SubscriptionAddress"}; -+ CharSequence[] args = {handle.getComponentName().getPackageName(), -+ handle.getComponentName().getClassName(), handle.getId(), account.getLabel(), -+ account.getShortDescription(), account.getGroupId(), -+ (account.getAddress() != null ? account.getAddress().toString() : ""), -+ (account.getSubscriptionAddress() != null ? -+ account.getSubscriptionAddress().toString() : "")}; -+ -+ for (int i = 0; i < fields.length; i++) { -+ if (args[i] != null && args[i].length() > MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT) { -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceCharacterLimit"); -+ throw new IllegalArgumentException("The PhoneAccount or PhoneAccountHandle" -+ + fields[i] + " field has an invalid character count. PhoneAccount and " -+ + "PhoneAccountHandle String and Char-Sequence fields are limited to " -+ + MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT + " characters."); -+ } -+ } -+ -+ // Enforce limits on the URI Schemes provided -+ enforceLimitsOnSchemes(account); -+ -+ // Enforce limit on the PhoneAccount#mExtras -+ Bundle extras = account.getExtras(); -+ if (extras != null) { -+ if (extras.keySet().size() > MAX_PHONE_ACCOUNT_EXTRAS_KEY_PAIR_LIMIT) { -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceCharacterLimit"); -+ throw new IllegalArgumentException("The PhoneAccount#mExtras is limited to " + -+ MAX_PHONE_ACCOUNT_EXTRAS_KEY_PAIR_LIMIT + " (key,value) pairs."); -+ } -+ -+ for (String key : extras.keySet()) { -+ Object value = extras.get(key); -+ -+ if ((key != null && key.length() > MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT) || -+ (value instanceof String && -+ ((String) value).length() > MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT)) { -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceCharacterLimit"); -+ throw new IllegalArgumentException("The PhoneAccount#mExtras contains a String" -+ + " key or value that has an invalid character count. PhoneAccount and " -+ + "PhoneAccountHandle String and Char-Sequence fields are limited to " -+ + MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT + " characters."); -+ } -+ } -+ } -+ } -+ -+ /** -+ * Enforce a character limit on all PA and PAH string or char-sequence fields. -+ * -+ * @param account to enforce check on -+ * @throws IllegalArgumentException if MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT reached -+ */ -+ @VisibleForTesting -+ public void enforceLimitsOnSchemes(@NonNull PhoneAccount account) { -+ List<String> schemes = account.getSupportedUriSchemes(); -+ -+ if (schemes == null) { -+ return; -+ } -+ -+ if (schemes.size() > MAX_SCHEMES_PER_ACCOUNT) { -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceLimitsOnSchemes"); -+ throw new IllegalArgumentException( -+ "Error, cannot register phone account " + account.getAccountHandle() -+ + " because the URI scheme limit of " -+ + MAX_SCHEMES_PER_ACCOUNT + " has been reached"); -+ } -+ -+ for (String scheme : schemes) { -+ if (scheme.length() > MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT) { -+ EventLog.writeEvent(0x534e4554, "259064622", Binder.getCallingUid(), -+ "enforceLimitsOnSchemes"); -+ throw new IllegalArgumentException( -+ "Error, cannot register phone account " + account.getAccountHandle() -+ + " because the max scheme limit of " -+ + MAX_PHONE_ACCOUNT_FIELD_CHAR_LIMIT + " has been reached"); -+ } -+ } - } - - /** -@@ -1489,17 +1641,20 @@ public class PhoneAccountRegistrar { - protected void writeIconIfNonNull(String tagName, Icon value, XmlSerializer serializer) - throws IOException { - if (value != null) { -- ByteArrayOutputStream stream = new ByteArrayOutputStream(); -- value.writeToStream(stream); -- byte[] iconByteArray = stream.toByteArray(); -- String text = Base64.encodeToString(iconByteArray, 0, iconByteArray.length, 0); -- -+ String text = writeIconToBase64String(value); - serializer.startTag(null, tagName); - serializer.text(text); - serializer.endTag(null, tagName); - } - } - -+ public static String writeIconToBase64String(Icon icon) throws IOException { -+ ByteArrayOutputStream stream = new ByteArrayOutputStream(); -+ icon.writeToStream(stream); -+ byte[] iconByteArray = stream.toByteArray(); -+ return Base64.encodeToString(iconByteArray, 0, iconByteArray.length, 0); -+ } -+ - protected void writeLong(String tagName, long value, XmlSerializer serializer) - throws IOException { - serializer.startTag(null, tagName); -diff --git a/src/com/android/server/telecom/TelecomServiceImpl.java b/src/com/android/server/telecom/TelecomServiceImpl.java -index d3bbab232..8c498fc55 100644 ---- a/src/com/android/server/telecom/TelecomServiceImpl.java -+++ b/src/com/android/server/telecom/TelecomServiceImpl.java -@@ -63,7 +63,9 @@ import com.android.server.telecom.settings.BlockedNumbersActivity; - import java.io.FileDescriptor; - import java.io.PrintWriter; - import java.util.Collections; -+import java.util.HashSet; - import java.util.List; -+import java.util.Set; - - // TODO: Needed for move to system service: import com.android.internal.R; - -@@ -292,7 +294,7 @@ public class TelecomServiceImpl { - try { - Log.startSession("TSI.gPAFP"); - return new ParceledListSlice<>(mPhoneAccountRegistrar -- .getPhoneAccountsForPackage(packageName, callingUserHandle)); -+ .getAllPhoneAccountHandlesForPackage(callingUserHandle, packageName)); - } catch (Exception e) { - Log.e(this, e, "getPhoneAccountsForPackage %s", packageName); - throw e; -diff --git a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java -index a978cfd24..f14a3f74e 100644 ---- a/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java -+++ b/tests/src/com/android/server/telecom/tests/PhoneAccountRegistrarTest.java -@@ -22,8 +22,18 @@ import static org.junit.Assert.assertNotNull; - import static org.junit.Assert.assertNull; - import static org.junit.Assert.assertTrue; - import static org.junit.Assert.fail; -+import static org.mockito.ArgumentMatchers.any; -+import static org.mockito.ArgumentMatchers.anyObject; -+import static org.mockito.ArgumentMatchers.isA; - import static org.mockito.Matchers.anyInt; - import static org.mockito.Matchers.anyString; -+import static org.mockito.Mockito.clearInvocations; -+import static org.mockito.Mockito.doThrow; -+import static org.mockito.Mockito.mock; -+import static org.mockito.Mockito.never; -+import static org.mockito.Mockito.spy; -+import static org.mockito.Mockito.times; -+import static org.mockito.Mockito.verify; - import static org.mockito.Mockito.when; - - import android.content.ComponentName; -@@ -69,6 +79,8 @@ import java.io.BufferedOutputStream; - import java.io.ByteArrayInputStream; - import java.io.ByteArrayOutputStream; - import java.io.File; -+import java.io.IOException; -+import java.io.OutputStream; - import java.util.Arrays; - import java.util.List; - import java.util.Map; -@@ -80,6 +92,9 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase { - private static final int MAX_VERSION = Integer.MAX_VALUE; - private static final String FILE_NAME = "phone-account-registrar-test-1223.xml"; - private static final String TEST_LABEL = "right"; -+ private static final String TEST_ID = "123"; -+ private final String PACKAGE_1 = "PACKAGE_1"; -+ private final String PACKAGE_2 = "PACKAGE_2"; - private PhoneAccountRegistrar mRegistrar; - @Mock private TelecomManager mTelecomManager; - @Mock private DefaultDialerCache mDefaultDialerCache; -@@ -942,6 +957,92 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase { - assertFalse(PhoneAccountHandle.areFromSamePackage(null, d)); - } - -+ /** -+ * Ensure an IllegalArgumentException is thrown when adding more than 10 schemes for a single -+ * account -+ */ -+ @Test -+ public void testLimitOnSchemeCount() { -+ PhoneAccountHandle handle = makeQuickAccountHandle(TEST_ID); -+ PhoneAccount.Builder builder = new PhoneAccount.Builder(handle, TEST_LABEL); -+ for (int i = 0; i < PhoneAccountRegistrar.MAX_PHONE_ACCOUNT_REGISTRATIONS + 1; i++) { -+ builder.addSupportedUriScheme(Integer.toString(i)); -+ } -+ try { -+ mRegistrar.enforceLimitsOnSchemes(builder.build()); -+ fail("should have hit exception in enforceLimitOnSchemes"); -+ } catch (IllegalArgumentException e) { -+ // pass test -+ } -+ } -+ -+ /** -+ * Ensure an IllegalArgumentException is thrown when adding more 256 chars for a single -+ * account -+ */ -+ @Test -+ public void testLimitOnSchemeLength() { -+ PhoneAccountHandle handle = makeQuickAccountHandle(TEST_ID); -+ PhoneAccount.Builder builder = new PhoneAccount.Builder(handle, TEST_LABEL); -+ builder.addSupportedUriScheme(generateStringOfLen(257)); -+ try { -+ mRegistrar.enforceLimitsOnSchemes(builder.build()); -+ fail("should have hit exception in enforceLimitOnSchemes"); -+ } catch (IllegalArgumentException e) { -+ // pass test -+ } -+ } -+ -+ /** -+ * Ensure an IllegalArgumentException is thrown when adding an address over the limit -+ */ -+ @Test -+ public void testLimitOnAddress() { -+ String text = generateStringOfLen(100); -+ PhoneAccountHandle handle = makeQuickAccountHandle(TEST_ID); -+ PhoneAccount.Builder builder = new PhoneAccount.Builder(handle,TEST_LABEL) -+ .setAddress(Uri.fromParts(text, text, text)); -+ try { -+ mRegistrar.enforceCharacterLimit(builder.build()); -+ fail("failed to throw IllegalArgumentException"); -+ } catch (IllegalArgumentException e) { -+ // pass test -+ } -+ finally { -+ mRegistrar.unregisterPhoneAccount(handle); -+ } -+ } -+ -+ /** -+ * Ensure an IllegalArgumentException is thrown when an Icon that throws an IOException is given -+ */ -+ @Test -+ public void testLimitOnIcon() throws Exception { -+ Icon mockIcon = mock(Icon.class); -+ // GIVEN -+ PhoneAccount.Builder builder = new PhoneAccount.Builder( -+ makeQuickAccountHandle(TEST_ID), TEST_LABEL).setIcon(mockIcon); -+ try { -+ // WHEN -+ Mockito.doThrow(new IOException()) -+ .when(mockIcon).writeToStream(any(OutputStream.class)); -+ //THEN -+ mRegistrar.enforceIconSizeLimit(builder.build()); -+ fail("failed to throw IllegalArgumentException"); -+ } catch (IllegalArgumentException e) { -+ // pass test -+ assertTrue(e.getMessage().contains(PhoneAccountRegistrar.ICON_ERROR_MSG)); -+ } -+ } -+ -+ private String generateStringOfLen(int len){ -+ StringBuilder sb = new StringBuilder(); -+ for(int i=0; i < len; i++){ -+ sb.append("a"); -+ } -+ return sb.toString(); -+ } -+ - private static ComponentName makeQuickConnectionServiceComponentName() { - return new ComponentName( - "com.android.server.telecom.tests", -diff --git a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java -index 2130121ac..00d8000e4 100644 ---- a/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java -+++ b/tests/src/com/android/server/telecom/tests/TelecomServiceImplTest.java -@@ -392,7 +392,7 @@ public class TelecomServiceImplTest extends TelecomTestCase { - add(SIP_PA_HANDLE_17); - }}; - when(mFakePhoneAccountRegistrar -- .getPhoneAccountsForPackage(anyString(), any(UserHandle.class))) -+ .getAllPhoneAccountHandlesForPackage(any(UserHandle.class), anyString())) - .thenReturn(phoneAccountHandleList); - makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17); - assertEquals(phoneAccountHandleList, diff --git a/Patches/LineageOS-17.1/android_packages_services_Telecomm/358579-backport.patch b/Patches/LineageOS-17.1/android_packages_services_Telecomm/358579-backport.patch deleted file mode 100644 index 38a64d31..00000000 --- a/Patches/LineageOS-17.1/android_packages_services_Telecomm/358579-backport.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Pranav Madapurmath <pmadapurmath@google.com> -Date: Tue, 21 Mar 2023 23:28:56 +0000 -Subject: [PATCH] Call Redirection: unbind service when onBind returns null - -The call redirection service does not handle the corner case of -onNullBinding (occurs when onBind returns null). This vulnerability -would give the app that has the call redirection role unintentional -access to launch background activities outside the scope of a call -lifecycle. - -Fixes: 273260090 -Test: Unit test to ensure we unbind the service on null onBind -Test: CTS for similar assertion -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:c3580d96071a7232ce11ad83848d6394b93121d8) -Merged-In: Ib9d44d239833131eb055e83801cb635e8efe0b81 -Change-Id: Ib9d44d239833131eb055e83801cb635e8efe0b81 ---- - .../CallRedirectionProcessor.java | 13 ++++++++++ - .../tests/CallRedirectionProcessorTest.java | 25 +++++++++++++++++++ - 2 files changed, 38 insertions(+) - -diff --git a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java -index 7a54118f8..9ddc4ab6c 100644 ---- a/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java -+++ b/src/com/android/server/telecom/callredirection/CallRedirectionProcessor.java -@@ -151,6 +151,19 @@ public class CallRedirectionProcessor implements CallRedirectionCallback { - Log.endSession(); - } - } -+ -+ @Override -+ public void onNullBinding(ComponentName componentName) { -+ // Make sure we unbind the service if onBind returns null -+ Log.startSession("CRSC.oNB"); -+ try { -+ synchronized (mTelecomLock) { -+ finishCallRedirection(); -+ } -+ } finally { -+ Log.endSession(); -+ } -+ } - } - - private class CallRedirectionAdapter extends ICallRedirectionAdapter.Stub { -diff --git a/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java b/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java -index 169c56acf..44d2b8956 100644 ---- a/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java -+++ b/tests/src/com/android/server/telecom/tests/CallRedirectionProcessorTest.java -@@ -280,4 +280,29 @@ public class CallRedirectionProcessorTest extends TelecomTestCase { - eq(mPhoneAccountHandle), eq(mGatewayInfo), eq(SPEAKER_PHONE_ON), eq(VIDEO_STATE), - eq(false), eq(CallRedirectionProcessor.UI_TYPE_NO_ACTION)); - } -+ -+ -+ @Test -+ public void testUnbindOnNullBind() throws Exception { -+ startProcessWithNoGateWayInfo(); -+ // To make sure tests are not flaky, clean all the previous handler messages -+ waitForHandlerAction(mProcessor.getHandler(), HANDLER_TIMEOUT_DELAY); -+ enableUserDefinedCallRedirectionService(); -+ disableCarrierCallRedirectionService(); -+ -+ mProcessor.performCallRedirection(); -+ -+ // Capture the binder -+ ArgumentCaptor<ServiceConnection> serviceConnectionCaptor = ArgumentCaptor.forClass( -+ ServiceConnection.class); -+ // Verify binding occurred -+ verify(mContext, times(1)).bindServiceAsUser(any(Intent.class), -+ serviceConnectionCaptor.capture(), anyInt(), eq(UserHandle.CURRENT)); -+ // Simulate null return from onBind -+ serviceConnectionCaptor.getValue().onNullBinding(USER_DEFINED_SERVICE_TEST_COMPONENT_NAME); -+ -+ // Verify service was unbound -+ verify(mContext, times(1)). -+ unbindService(any(ServiceConnection.class)); -+ } - } diff --git a/Patches/LineageOS-17.1/android_system_bt/351443.patch b/Patches/LineageOS-17.1/android_system_bt/351443.patch deleted file mode 100644 index 61a40371..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/351443.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Wed, 28 Dec 2022 00:32:37 +0000 -Subject: [PATCH] Fix an OOB Write bug in gatt_check_write_long_terminate - -this is the backport of Ifffa2c7f679c4ef72dbdb6b1f3378ca506680084 - -Bug: 258652631 -Test: manual -Tag: #security -Ignore-AOSP-First: security -Change-Id: Ic84122f07cbc198c676d366e39606621b7cb4e66 -(cherry picked from commit 9b17660bfd6f0f41cb9400ce0236d76c83605e03) -Merged-In: Ic84122f07cbc198c676d366e39606621b7cb4e66 ---- - stack/gatt/gatt_cl.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/stack/gatt/gatt_cl.cc b/stack/gatt/gatt_cl.cc -index 3115317da..db41c5f9f 100644 ---- a/stack/gatt/gatt_cl.cc -+++ b/stack/gatt/gatt_cl.cc -@@ -572,7 +572,8 @@ void gatt_process_prep_write_rsp(tGATT_TCB& tcb, tGATT_CLCB* p_clcb, - LOG(ERROR) << StringPrintf("value resp op_code = %s len = %d", - gatt_dbg_op_name(op_code), len); - -- if (len < GATT_PREP_WRITE_RSP_MIN_LEN) { -+ if (len < GATT_PREP_WRITE_RSP_MIN_LEN || -+ len > GATT_PREP_WRITE_RSP_MIN_LEN + sizeof(value.value)) { - LOG(ERROR) << "illegal prepare write response length, discard"; - gatt_end_operation(p_clcb, GATT_INVALID_PDU, &value); - return; -@@ -581,7 +582,7 @@ void gatt_process_prep_write_rsp(tGATT_TCB& tcb, tGATT_CLCB* p_clcb, - STREAM_TO_UINT16(value.handle, p); - STREAM_TO_UINT16(value.offset, p); - -- value.len = len - 4; -+ value.len = len - GATT_PREP_WRITE_RSP_MIN_LEN; - - memcpy(value.value, p, value.len); - diff --git a/Patches/LineageOS-17.1/android_system_bt/351444.patch b/Patches/LineageOS-17.1/android_system_bt/351444.patch deleted file mode 100644 index 43249424..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/351444.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Mon, 2 Jan 2023 22:05:45 +0000 -Subject: [PATCH] Fix an OOB access bug in A2DP_BuildMediaPayloadHeaderSbc - -In A2DP_BuildCodecHeaderSbc when p_buf->offset is 0, the -`-=` operation on it may result in integer underflow and -OOB write with the computed pointer passed to -A2DP_BuildMediaPayloadHeaderSbc. - -This is a backport of I45320085b1e458d3b0e0d86162a35aaaae7b34cb -Test: atest net_test_stack_a2dp_codecs_native -Ignore-AOSP-First: security -Tag:#security - -Bug: 186803518 -Change-Id: I4ff1a1de71884b8de23008b2569fdea3650e85ec -(cherry picked from commit a710300216be4a86373a65c6a685aeef8509cfa7) -Merged-In: I4ff1a1de71884b8de23008b2569fdea3650e85ec ---- - stack/a2dp/a2dp_sbc.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/stack/a2dp/a2dp_sbc.cc b/stack/a2dp/a2dp_sbc.cc -index 4c48993c4..5036eec2e 100644 ---- a/stack/a2dp/a2dp_sbc.cc -+++ b/stack/a2dp/a2dp_sbc.cc -@@ -704,6 +704,11 @@ bool A2DP_BuildCodecHeaderSbc(UNUSED_ATTR const uint8_t* p_codec_info, - BT_HDR* p_buf, uint16_t frames_per_packet) { - uint8_t* p; - -+ // there is a timestamp right following p_buf -+ if (p_buf->offset < 4 + A2DP_SBC_MPL_HDR_LEN) { -+ return false; -+ } -+ - p_buf->offset -= A2DP_SBC_MPL_HDR_LEN; - p = (uint8_t*)(p_buf + 1) + p_buf->offset; - p_buf->len += A2DP_SBC_MPL_HDR_LEN; diff --git a/Patches/LineageOS-17.1/android_system_bt/351445.patch b/Patches/LineageOS-17.1/android_system_bt/351445.patch deleted file mode 100644 index af7124d0..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/351445.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Wed, 4 Jan 2023 22:45:13 +0000 -Subject: [PATCH] Fix an OOB write in SDP_AddAttribute - -When the `attr_pad` becomes full, it is possible -that un index of `-1` is computed write -a zero byte to `p_val`, rusulting OOB write. - -``` - p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr - 1] = '\0'; -``` - -This is a backport of I937d22a2df26fca1d7f06b10182c4e713ddfed1b - -Bug: 261867748 -Test: manual -Tag: #security -Ignore-AOSP-First: security -Change-Id: Ibdda754e628cfc9d1706c14db114919a15d8d6b1 -(cherry picked from commit cc527a97f78a2999a0156a579e488afe9e3675b2) -Merged-In: Ibdda754e628cfc9d1706c14db114919a15d8d6b1 ---- - stack/sdp/sdp_db.cc | 20 +++++++++++++++----- - 1 file changed, 15 insertions(+), 5 deletions(-) - -diff --git a/stack/sdp/sdp_db.cc b/stack/sdp/sdp_db.cc -index ea5b84d23..4130ae71a 100644 ---- a/stack/sdp/sdp_db.cc -+++ b/stack/sdp/sdp_db.cc -@@ -362,6 +362,11 @@ bool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type, - uint16_t xx, yy, zz; - tSDP_RECORD* p_rec = &sdp_cb.server_db.record[0]; - -+ if (p_val == nullptr) { -+ SDP_TRACE_WARNING("Trying to add attribute with p_val == nullptr, skipped"); -+ return (false); -+ } -+ - if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) { - if ((attr_type == UINT_DESC_TYPE) || - (attr_type == TWO_COMP_INT_DESC_TYPE) || -@@ -398,6 +403,13 @@ bool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type, - if (p_rec->record_handle == handle) { - tSDP_ATTRIBUTE* p_attr = &p_rec->attribute[0]; - -+ // error out early, no need to look up -+ if (p_rec->free_pad_ptr >= SDP_MAX_PAD_LEN) { -+ SDP_TRACE_ERROR("the free pad for SDP record with handle %d is " -+ "full, skip adding the attribute", handle); -+ return (false); -+ } -+ - /* Found the record. Now, see if the attribute already exists */ - for (xx = 0; xx < p_rec->num_attributes; xx++, p_attr++) { - /* The attribute exists. replace it */ -@@ -437,15 +449,13 @@ bool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type, - attr_len = 0; - } - -- if ((attr_len > 0) && (p_val != 0)) { -+ if (attr_len > 0) { - p_attr->len = attr_len; - memcpy(&p_rec->attr_pad[p_rec->free_pad_ptr], p_val, (size_t)attr_len); - p_attr->value_ptr = &p_rec->attr_pad[p_rec->free_pad_ptr]; - p_rec->free_pad_ptr += attr_len; -- } else if ((attr_len == 0 && -- p_attr->len != -- 0) || /* if truncate to 0 length, simply don't add */ -- p_val == 0) { -+ } else if (attr_len == 0 && p_attr->len != 0) { -+ /* if truncate to 0 length, simply don't add */ - SDP_TRACE_ERROR( - "SDP_AddAttribute fail, length exceed maximum: ID %d: attr_len:%d ", - attr_id, attr_len); diff --git a/Patches/LineageOS-17.1/android_system_bt/353960.patch b/Patches/LineageOS-17.1/android_system_bt/353960.patch deleted file mode 100644 index fae2a270..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/353960.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Thu, 8 Dec 2022 01:08:11 +0000 -Subject: [PATCH] Fix OOB access in avdt_scb_hdl_pkt_no_frag - -This is a back port of the following 2 CLs: -- Id13b1ebde8f603123c8b7a49922b2f1378ab788f -- If0c7b25f2e6cb4531bbb6254e176e8ad1b5c5fb4 - -Regression test: I9c87e30ed58e7ad6a34ab7c96b0a8fb06324ad54 - -Bug: 142546355 258057241 -Test: atest net_test_stack_avdtp -Ignore-AOSP-First: security -Change-Id: Ie1707385d6452ece47915c153f4faaa1c8a287c9 -(cherry picked from commit b0b968e8c6214e20a5dc3617d66567225df0884f) -Merged-In: Ie1707385d6452ece47915c153f4faaa1c8a287c9 ---- - stack/avdt/avdt_scb_act.cc | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - -diff --git a/stack/avdt/avdt_scb_act.cc b/stack/avdt/avdt_scb_act.cc -index ce53c45eb..f2de4ba35 100644 ---- a/stack/avdt/avdt_scb_act.cc -+++ b/stack/avdt/avdt_scb_act.cc -@@ -255,19 +255,24 @@ void avdt_scb_hdl_pkt_no_frag(AvdtpScb* p_scb, tAVDT_SCB_EVT* p_data) { - if (offset > len) goto length_error; - p += 2; - BE_STREAM_TO_UINT16(ex_len, p); -- offset += ex_len * 4; - p += ex_len * 4; - } - -+ if ((p - p_start) >= len) { -+ AVDT_TRACE_WARNING("%s: handling malformatted packet: ex_len too large", __func__); -+ osi_free_and_reset((void**)&p_data->p_pkt); -+ return; -+ } -+ offset = p - p_start; -+ - /* adjust length for any padding at end of packet */ - if (o_p) { - /* padding length in last byte of packet */ -- pad_len = *(p_start + p_data->p_pkt->len); -+ pad_len = *(p_start + len - 1); - } - - /* do sanity check */ -- if ((offset > p_data->p_pkt->len) || -- ((pad_len + offset) > p_data->p_pkt->len)) { -+ if (pad_len >= (len - offset)) { - AVDT_TRACE_WARNING("Got bad media packet"); - osi_free_and_reset((void**)&p_data->p_pkt); - } diff --git a/Patches/LineageOS-17.1/android_system_bt/353961.patch b/Patches/LineageOS-17.1/android_system_bt/353961.patch deleted file mode 100644 index 3cabca42..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/353961.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Fri, 20 Jan 2023 19:39:30 +0000 -Subject: [PATCH] Fix an OOB bug in register_notification_rsp - -This is a backport of I901d973a736678d7f3cc816ddf0cbbcbbd1fe93f -to rvc-dev. - -Bug: 245916076 -Test: manual -Ignore-AOSP-First: security -Change-Id: I37a9f45e707702b2ec52b5a2d572f177f2911765 -(cherry picked from commit 901e34203c6280d414cbfa3978de04fd6515ffdf) -Merged-In: I37a9f45e707702b2ec52b5a2d572f177f2911765 ---- - btif/src/btif_rc.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/btif/src/btif_rc.cc b/btif/src/btif_rc.cc -index 575d83e37..be29e559b 100644 ---- a/btif/src/btif_rc.cc -+++ b/btif/src/btif_rc.cc -@@ -1892,6 +1892,11 @@ static bt_status_t register_notification_rsp( - dump_rc_notification_event_id(event_id)); - std::unique_lock<std::mutex> lock(btif_rc_cb.lock); - -+ if (event_id > MAX_RC_NOTIFICATIONS) { -+ BTIF_TRACE_ERROR("Invalid event id"); -+ return BT_STATUS_PARM_INVALID; -+ } -+ - memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP)); - - avrc_rsp.reg_notif.event_id = event_id; diff --git a/Patches/LineageOS-17.1/android_system_bt/358580.patch b/Patches/LineageOS-17.1/android_system_bt/358580.patch deleted file mode 100644 index ba90e5a3..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/358580.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Delwiche <delwiche@google.com> -Date: Tue, 11 Oct 2022 21:23:22 +0000 -Subject: [PATCH] Prevent use-after-free of HID reports - -BTA sends the the HID report pointer to BTIF and deallocates it immediately. -This is now prevented by providing a deep copy callback function for HID -reports when tranferring context from BTA to BTIF. - -This is a backport of change Icef7a7ed1185b4283ee4fe4f812ca154d8f1b825, -already merged on T for b/227620181. - -Bug: 228837201 -Test: Validated against researcher POC, ran BT unit tests, played audio -manually. -Tag: #security -Ignore-AOSP-First: Security -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:874c495c886cd8722625756dc5fd0634b16b4f42) -Merged-In: Ib837f395883de2369207f1b3b974d6bff02dcb19 -Change-Id: Ib837f395883de2369207f1b3b974d6bff02dcb19 ---- - btif/src/btif_hh.cc | 50 ++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 45 insertions(+), 5 deletions(-) - -diff --git a/btif/src/btif_hh.cc b/btif/src/btif_hh.cc -index 650923a3c..5c57ee80c 100644 ---- a/btif/src/btif_hh.cc -+++ b/btif/src/btif_hh.cc -@@ -1096,6 +1096,38 @@ static void btif_hh_upstreams_evt(uint16_t event, char* p_param) { - } - } - -+/******************************************************************************* -+ * -+ * Function btif_hh_hsdata_rpt_copy_cb -+ * -+ * Description Deep copies the tBTA_HH_HSDATA structure -+ * -+ * Returns void -+ * -+ ******************************************************************************/ -+ -+static void btif_hh_hsdata_rpt_copy_cb(uint16_t event, char* p_dest, -+ char* p_src) { -+ tBTA_HH_HSDATA* p_dst_data = (tBTA_HH_HSDATA*)p_dest; -+ tBTA_HH_HSDATA* p_src_data = (tBTA_HH_HSDATA*)p_src; -+ BT_HDR* hdr; -+ -+ if (!p_src) { -+ BTIF_TRACE_ERROR("%s: Nothing to copy", __func__); -+ return; -+ } -+ -+ memcpy(p_dst_data, p_src_data, sizeof(tBTA_HH_HSDATA)); -+ -+ hdr = p_src_data->rsp_data.p_rpt_data; -+ if (hdr != NULL) { -+ uint8_t* p_data = ((uint8_t*)p_dst_data) + sizeof(tBTA_HH_HSDATA); -+ memcpy(p_data, hdr, BT_HDR_SIZE + hdr->offset + hdr->len); -+ -+ p_dst_data->rsp_data.p_rpt_data = (BT_HDR*)p_data; -+ } -+} -+ - /******************************************************************************* - * - * Function bte_hh_evt -@@ -1109,6 +1141,7 @@ static void btif_hh_upstreams_evt(uint16_t event, char* p_param) { - void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH* p_data) { - bt_status_t status; - int param_len = 0; -+ tBTIF_COPY_CBACK* p_copy_cback = NULL; - - if (BTA_HH_ENABLE_EVT == event) - param_len = sizeof(tBTA_HH_STATUS); -@@ -1120,11 +1153,18 @@ void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH* p_data) { - param_len = sizeof(tBTA_HH_CBDATA); - else if (BTA_HH_GET_DSCP_EVT == event) - param_len = sizeof(tBTA_HH_DEV_DSCP_INFO); -- else if ((BTA_HH_GET_PROTO_EVT == event) || (BTA_HH_GET_RPT_EVT == event) || -- (BTA_HH_GET_IDLE_EVT == event)) -+ else if ((BTA_HH_GET_PROTO_EVT == event) || (BTA_HH_GET_IDLE_EVT == event)) -+ param_len = sizeof(tBTA_HH_HSDATA); -+ else if (BTA_HH_GET_RPT_EVT == event) { -+ BT_HDR* hdr = p_data->hs_data.rsp_data.p_rpt_data; - param_len = sizeof(tBTA_HH_HSDATA); -- else if ((BTA_HH_SET_PROTO_EVT == event) || (BTA_HH_SET_RPT_EVT == event) || -- (BTA_HH_VC_UNPLUG_EVT == event) || (BTA_HH_SET_IDLE_EVT == event)) -+ -+ if (hdr != NULL) { -+ p_copy_cback = btif_hh_hsdata_rpt_copy_cb; -+ param_len += BT_HDR_SIZE + hdr->offset + hdr->len; -+ } -+ } else if ((BTA_HH_SET_PROTO_EVT == event) || (BTA_HH_SET_RPT_EVT == event) || -+ (BTA_HH_VC_UNPLUG_EVT == event) || (BTA_HH_SET_IDLE_EVT == event)) - param_len = sizeof(tBTA_HH_CBDATA); - else if ((BTA_HH_ADD_DEV_EVT == event) || (BTA_HH_RMV_DEV_EVT == event)) - param_len = sizeof(tBTA_HH_DEV_INFO); -@@ -1133,7 +1173,7 @@ void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH* p_data) { - /* switch context to btif task context (copy full union size for convenience) - */ - status = btif_transfer_context(btif_hh_upstreams_evt, (uint16_t)event, -- (char*)p_data, param_len, NULL); -+ (char*)p_data, param_len, p_copy_cback); - - /* catch any failed context transfers */ - ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); diff --git a/Patches/LineageOS-17.1/android_system_bt/358581.patch b/Patches/LineageOS-17.1/android_system_bt/358581.patch deleted file mode 100644 index bc332f6e..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/358581.patch +++ /dev/null @@ -1,141 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Delwiche <delwiche@google.com> -Date: Tue, 21 Mar 2023 22:35:35 +0000 -Subject: [PATCH] Revert "Revert "[RESTRICT AUTOMERGE] Validate buffer length - in sdpu_build_uuid_seq"" - -This reverts commit 487a1079078f3717fdc4665c19a45eca5b3ec5e6. - -Reason for revert: Reinstate original change for QPR -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:a681067af2ea4565543238db3025d749923f63ec) -Merged-In: If0528519a29dc73ff99163098da2a05592ab15d8 -Change-Id: If0528519a29dc73ff99163098da2a05592ab15d8 ---- - stack/sdp/sdp_discovery.cc | 65 ++++++++++++++++++++++++++++++++++---- - 1 file changed, 58 insertions(+), 7 deletions(-) - -diff --git a/stack/sdp/sdp_discovery.cc b/stack/sdp/sdp_discovery.cc -index f5938e423..553e068f5 100644 ---- a/stack/sdp/sdp_discovery.cc -+++ b/stack/sdp/sdp_discovery.cc -@@ -70,10 +70,15 @@ static uint8_t* add_attr(uint8_t* p, uint8_t* p_end, tSDP_DISCOVERY_DB* p_db, - * - ******************************************************************************/ - static uint8_t* sdpu_build_uuid_seq(uint8_t* p_out, uint16_t num_uuids, -- Uuid* p_uuid_list) { -+ Uuid* p_uuid_list, uint16_t& bytes_left) { - uint16_t xx; - uint8_t* p_len; - -+ if (bytes_left < 2) { -+ DCHECK(0) << "SDP: No space for data element header"; -+ return (p_out); -+ } -+ - /* First thing is the data element header */ - UINT8_TO_BE_STREAM(p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); - -@@ -81,9 +86,20 @@ static uint8_t* sdpu_build_uuid_seq(uint8_t* p_out, uint16_t num_uuids, - p_len = p_out; - p_out += 1; - -+ /* Account for data element header and length */ -+ bytes_left -= 2; -+ - /* Now, loop through and put in all the UUID(s) */ - for (xx = 0; xx < num_uuids; xx++, p_uuid_list++) { - int len = p_uuid_list->GetShortestRepresentationSize(); -+ -+ if (len + 1 > bytes_left) { -+ DCHECK(0) << "SDP: Too many UUIDs for internal buffer"; -+ break; -+ } else { -+ bytes_left -= (len + 1); -+ } -+ - if (len == Uuid::kNumBytes16) { - UINT8_TO_BE_STREAM(p_out, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); - UINT16_TO_BE_STREAM(p_out, p_uuid_list->As16Bit()); -@@ -120,6 +136,7 @@ static void sdp_snd_service_search_req(tCONN_CB* p_ccb, uint8_t cont_len, - uint8_t *p, *p_start, *p_param_len; - BT_HDR* p_cmd = (BT_HDR*)osi_malloc(SDP_DATA_BUF_SIZE); - uint16_t param_len; -+ uint16_t bytes_left = SDP_DATA_BUF_SIZE; - - /* Prepare the buffer for sending the packet to L2CAP */ - p_cmd->offset = L2CAP_MIN_OFFSET; -@@ -134,13 +151,30 @@ static void sdp_snd_service_search_req(tCONN_CB* p_ccb, uint8_t cont_len, - p_param_len = p; - p += 2; - --/* Build the UID sequence. */ -+ /* Account for header size, max service record count and -+ * continuation state */ -+ const uint16_t base_bytes = (sizeof(BT_HDR) + L2CAP_MIN_OFFSET + -+ 3u + /* service search request header */ -+ 2u + /* param len */ -+ 3u + ((p_cont) ? cont_len : 0)); -+ -+ if (base_bytes > bytes_left) { -+ DCHECK(0) << "SDP: Overran SDP data buffer"; -+ osi_free(p_cmd); -+ return; -+ } -+ -+ bytes_left -= base_bytes; -+ -+ /* Build the UID sequence. */ - #if (SDP_BROWSE_PLUS == TRUE) - p = sdpu_build_uuid_seq(p, 1, -- &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx]); -+ &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], -+ bytes_left); - #else -+ /* Build the UID sequence. */ - p = sdpu_build_uuid_seq(p, p_ccb->p_db->num_uuid_filters, -- p_ccb->p_db->uuid_filters); -+ p_ccb->p_db->uuid_filters, bytes_left); - #endif - - /* Set max service record count */ -@@ -575,6 +609,7 @@ static void process_service_search_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, - if ((cont_request_needed) || (!p_reply)) { - BT_HDR* p_msg = (BT_HDR*)osi_malloc(SDP_DATA_BUF_SIZE); - uint8_t* p; -+ uint16_t bytes_left = SDP_DATA_BUF_SIZE; - - p_msg->offset = L2CAP_MIN_OFFSET; - p = p_start = (uint8_t*)(p_msg + 1) + L2CAP_MIN_OFFSET; -@@ -588,13 +623,29 @@ static void process_service_search_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, - p_param_len = p; - p += 2; - --/* Build the UID sequence. */ -+ /* Account for header size, max service record count and -+ * continuation state */ -+ const uint16_t base_bytes = (sizeof(BT_HDR) + L2CAP_MIN_OFFSET + -+ 3u + /* service search request header */ -+ 2u + /* param len */ -+ 3u + /* max service record count */ -+ ((p_reply) ? (*p_reply) : 0)); -+ -+ if (base_bytes > bytes_left) { -+ sdp_disconnect(p_ccb, SDP_INVALID_CONT_STATE); -+ return; -+ } -+ -+ bytes_left -= base_bytes; -+ -+ /* Build the UID sequence. */ - #if (SDP_BROWSE_PLUS == TRUE) - p = sdpu_build_uuid_seq(p, 1, -- &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx]); -+ &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], -+ bytes_left); - #else - p = sdpu_build_uuid_seq(p, p_ccb->p_db->num_uuid_filters, -- p_ccb->p_db->uuid_filters); -+ p_ccb->p_db->uuid_filters, bytes_left); - #endif - - /* Max attribute byte count */ diff --git a/Patches/LineageOS-17.1/android_system_bt/358582.patch b/Patches/LineageOS-17.1/android_system_bt/358582.patch deleted file mode 100644 index 58c7ed1f..00000000 --- a/Patches/LineageOS-17.1/android_system_bt/358582.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Delwiche <delwiche@google.com> -Date: Tue, 21 Mar 2023 22:39:16 +0000 -Subject: [PATCH] Revert "Revert "Fix wrong BR/EDR link key downgrades - (P_256->P_192)"" - -This reverts commit d733c86cbc06ce0ec72216b9d41e172d1939c46f. - -Function btm_sec_encrypt_change() is called at most places -with argument "encr_enable" treated as bool and not as per -(tHCI_ENCRYPT_MODE = 0/1/2) expected by the function. The -function has special handling for "encr_enable=1" to downgrade -the link key type for BR/EDR case. This gets executed even -when the caller/context did not mean/expect so. It appears -this handling in btm_sec_encrypt_change() is not necessary and -is removed by this commit to prevent accidental execution of it. - -Test: Verified re-pairing with an iPhone works fine now - -Issue Reproduction Steps: -1. Enable Bluetooth Hotspot on Android device (DUT). -2. Pair and connect an iPhone to DUT. -3. Forget this pairing on DUT. -4. On iPhone settings, click on old DUT's paired entry to connect. -5. iPhone notifies to click 'Forget Device' and try fresh pairing. -6. On iPhone, after doing 'Forget Device', discover DUT again. -7. Attempt pairing to DUT by clicking on discovered DUT entry. - Pairing will be unsuccessful. - -Issue Cause: -During re-pairing, DUT is seen to downgrade -BR/EDR link key unexpectedly from link key type 0x8 -(BTM_LKEY_TYPE_AUTH_COMB_P_256) to 0x5 (BTM_LKEY_TYPE_AUTH_COMB). - -Log snippet (re-pairing time): -btm_sec_link_key_notification set new_encr_key_256 to 1 -btif_dm_auth_cmpl_evt: Storing link key. key_type=0x8, bond_type=1 -btm_sec_encrypt_change new_encr_key_256 is 1 ---On DUT, HCI_Encryption_Key_Refresh_Complete event noticed--- -btm_sec_encrypt_change new_encr_key_256 is 0 -updated link key type to 5 -btif_dm_auth_cmpl_evt: Storing link key. key_type=0x5, bond_type=1 - -This is a backport of the following patch: aosp/1890096 - -Bug: 258834033 - -Reason for revert: Reinstate original change for QPR -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:56891eedc68c86b40977191dad28d65ebf86a94f) -Merged-In: Iba0c220b82bcf6b15368762b7052a3987ccbc0c6 -Change-Id: Iba0c220b82bcf6b15368762b7052a3987ccbc0c6 ---- - stack/btm/btm_sec.cc | 16 ---------------- - 1 file changed, 16 deletions(-) - -diff --git a/stack/btm/btm_sec.cc b/stack/btm/btm_sec.cc -index 277e01dc1..3ba1a6023 100644 ---- a/stack/btm/btm_sec.cc -+++ b/stack/btm/btm_sec.cc -@@ -4035,22 +4035,6 @@ void btm_sec_encrypt_change(uint16_t handle, uint8_t status, - SMP_BR_PairWith(p_dev_rec->bd_addr); - } - } -- } else { -- // BR/EDR is successfully encrypted. Correct LK type if needed -- // (BR/EDR LK derived from LE LTK was used for encryption) -- if ((encr_enable == 1) && /* encryption is ON for SSP */ -- /* LK type is for BR/EDR SC */ -- (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || -- p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) { -- if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) -- p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; -- else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ -- p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; -- -- BTM_TRACE_DEBUG("updated link key type to %d", -- p_dev_rec->link_key_type); -- btm_send_link_key_notif(p_dev_rec); -- } - } - } - diff --git a/Patches/LineageOS-17.1/android_system_nfc/353962.patch b/Patches/LineageOS-17.1/android_system_nfc/353962.patch deleted file mode 100644 index 94fb53c4..00000000 --- a/Patches/LineageOS-17.1/android_system_nfc/353962.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alisher Alikhodjaev <alisher@google.com> -Date: Tue, 31 Jan 2023 19:04:09 -0800 -Subject: [PATCH] OOBW in nci_snd_set_routing_cmd() - -Bug: 264879662 -Test: read a tag, nfc on/off -Change-Id: I408cf611fb35e9467d7484165ce48759970b158a -(cherry picked from commit 1dd4d2e1b481dd83ca2b222993fdb74ae5306c78) -Merged-In: I408cf611fb35e9467d7484165ce48759970b158a ---- - src/nfc/nci/nci_hmsgs.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/src/nfc/nci/nci_hmsgs.cc b/src/nfc/nci/nci_hmsgs.cc -index 885ebaa..c191c26 100644 ---- a/src/nfc/nci/nci_hmsgs.cc -+++ b/src/nfc/nci/nci_hmsgs.cc -@@ -630,6 +630,10 @@ uint8_t nci_snd_set_routing_cmd(bool more, uint8_t num_tlv, uint8_t tlv_size, - uint8_t* pp; - uint8_t size = tlv_size + 2; - -+ if (size < tlv_size) { -+ return (NCI_STATUS_FAILED); -+ } -+ - if (tlv_size == 0) { - /* just to terminate routing table - * 2 bytes (more=FALSE and num routing entries=0) */ diff --git a/Patches/LineageOS-17.1/android_vendor_nxp_opensource_commonsys_external_libnfc-nci/353963.patch b/Patches/LineageOS-17.1/android_vendor_nxp_opensource_commonsys_external_libnfc-nci/353963.patch deleted file mode 100644 index 664fc967..00000000 --- a/Patches/LineageOS-17.1/android_vendor_nxp_opensource_commonsys_external_libnfc-nci/353963.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alisher Alikhodjaev <alisher@google.com> -Date: Tue, 31 Jan 2023 19:04:09 -0800 -Subject: [PATCH] OOBW in nci_snd_set_routing_cmd() - -Bug: 264879662 -Test: read a tag, nfc on/off -Change-Id: I408cf611fb35e9467d7484165ce48759970b158a -(cherry picked from commit 1dd4d2e1b481dd83ca2b222993fdb74ae5306c78) -Merged-In: I408cf611fb35e9467d7484165ce48759970b158a ---- - SN100x/src/nfc/nci/nci_hmsgs.cc | 4 ++++ - src/nfc/nci/nci_hmsgs.cc | 4 ++++ - 2 files changed, 8 insertions(+) - -diff --git a/SN100x/src/nfc/nci/nci_hmsgs.cc b/SN100x/src/nfc/nci/nci_hmsgs.cc -index 99a40a1f..e37a82b6 100755 ---- a/SN100x/src/nfc/nci/nci_hmsgs.cc -+++ b/SN100x/src/nfc/nci/nci_hmsgs.cc -@@ -673,6 +673,10 @@ uint8_t nci_snd_set_routing_cmd(bool more, uint8_t num_tlv, uint8_t tlv_size, - uint8_t* pp; - uint8_t size = tlv_size + 2; - -+ if (size < tlv_size) { -+ return (NCI_STATUS_FAILED); -+ } -+ - if (tlv_size == 0) { - /* just to terminate routing table - * 2 bytes (more=FALSE and num routing entries=0) */ -diff --git a/src/nfc/nci/nci_hmsgs.cc b/src/nfc/nci/nci_hmsgs.cc -index eedfc084..898d1446 100755 ---- a/src/nfc/nci/nci_hmsgs.cc -+++ b/src/nfc/nci/nci_hmsgs.cc -@@ -727,6 +727,10 @@ uint8_t nci_snd_set_routing_cmd(bool more, uint8_t num_tlv, uint8_t tlv_size, - uint8_t* pp; - uint8_t size = tlv_size + 2; - -+ if (size < tlv_size) { -+ return (NCI_STATUS_FAILED); -+ } -+ - if (tlv_size == 0) { - /* just to terminate routing table - * 2 bytes (more=false and num routing entries=0) */ diff --git a/Patches/LineageOS-17.1/android_vendor_nxp_opensource_pn5xx_halimpl/353964.patch b/Patches/LineageOS-17.1/android_vendor_nxp_opensource_pn5xx_halimpl/353964.patch deleted file mode 100644 index 928a8fb6..00000000 --- a/Patches/LineageOS-17.1/android_vendor_nxp_opensource_pn5xx_halimpl/353964.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Alisher Alikhodjaev <alisher@google.com> -Date: Tue, 31 Jan 2023 19:04:09 -0800 -Subject: [PATCH] OOBW in nci_snd_set_routing_cmd() - -Bug: 264879662 -Test: read a tag, nfc on/off -Change-Id: I408cf611fb35e9467d7484165ce48759970b158a -(cherry picked from commit 1dd4d2e1b481dd83ca2b222993fdb74ae5306c78) -Merged-In: I408cf611fb35e9467d7484165ce48759970b158a ---- - halimpl/src/halLibnfc/src/nfc/nci/nci_hmsgs.cc | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/halimpl/src/halLibnfc/src/nfc/nci/nci_hmsgs.cc b/halimpl/src/halLibnfc/src/nfc/nci/nci_hmsgs.cc -index a76ba5a..34d1d07 100755 ---- a/halimpl/src/halLibnfc/src/nfc/nci/nci_hmsgs.cc -+++ b/halimpl/src/halLibnfc/src/nfc/nci/nci_hmsgs.cc -@@ -672,6 +672,10 @@ uint8_t nci_snd_set_routing_cmd(bool more, uint8_t num_tlv, uint8_t tlv_size, - uint8_t *pp; - uint8_t size = tlv_size + 2; - -+ if (size < tlv_size) { -+ return (NCI_STATUS_FAILED); -+ } -+ - if (tlv_size == 0) { - /* just to terminate routing table - * 2 bytes (more=false and num routing entries=0) */ diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351448.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351448.patch deleted file mode 100644 index 4d88efc1..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351448.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Wed, 28 Dec 2022 00:32:37 +0000 -Subject: [PATCH] Fix an OOB Write bug in gatt_check_write_long_terminate - -this is the backport of Ifffa2c7f679c4ef72dbdb6b1f3378ca506680084 - -Bug: 258652631 -Test: manual -Tag: #security -Ignore-AOSP-First: security -Change-Id: Ic84122f07cbc198c676d366e39606621b7cb4e66 -(cherry picked from commit 9b17660bfd6f0f41cb9400ce0236d76c83605e03) -Merged-In: Ic84122f07cbc198c676d366e39606621b7cb4e66 ---- - stack/gatt/gatt_cl.cc | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/stack/gatt/gatt_cl.cc b/stack/gatt/gatt_cl.cc -index 73a338b6d..98186daed 100644 ---- a/stack/gatt/gatt_cl.cc -+++ b/stack/gatt/gatt_cl.cc -@@ -578,7 +578,8 @@ void gatt_process_prep_write_rsp(tGATT_TCB& tcb, tGATT_CLCB* p_clcb, - LOG(ERROR) << StringPrintf("value resp op_code = %s len = %d", - gatt_dbg_op_name(op_code), len); - -- if (len < GATT_PREP_WRITE_RSP_MIN_LEN) { -+ if (len < GATT_PREP_WRITE_RSP_MIN_LEN || -+ len > GATT_PREP_WRITE_RSP_MIN_LEN + sizeof(value.value)) { - LOG(ERROR) << "illegal prepare write response length, discard"; - gatt_end_operation(p_clcb, GATT_INVALID_PDU, &value); - return; -@@ -587,7 +588,7 @@ void gatt_process_prep_write_rsp(tGATT_TCB& tcb, tGATT_CLCB* p_clcb, - STREAM_TO_UINT16(value.handle, p); - STREAM_TO_UINT16(value.offset, p); - -- value.len = len - 4; -+ value.len = len - GATT_PREP_WRITE_RSP_MIN_LEN; - - memcpy(value.value, p, value.len); - diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351449.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351449.patch deleted file mode 100644 index a173f7ae..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351449.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Mon, 2 Jan 2023 22:05:45 +0000 -Subject: [PATCH] Fix an OOB access bug in A2DP_BuildMediaPayloadHeaderSbc - -In A2DP_BuildCodecHeaderSbc when p_buf->offset is 0, the -`-=` operation on it may result in integer underflow and -OOB write with the computed pointer passed to -A2DP_BuildMediaPayloadHeaderSbc. - -This is a backport of I45320085b1e458d3b0e0d86162a35aaaae7b34cb -Test: atest net_test_stack_a2dp_codecs_native -Ignore-AOSP-First: security -Tag:#security - -Bug: 186803518 -Change-Id: I4ff1a1de71884b8de23008b2569fdea3650e85ec -(cherry picked from commit a710300216be4a86373a65c6a685aeef8509cfa7) -Merged-In: I4ff1a1de71884b8de23008b2569fdea3650e85ec ---- - stack/a2dp/a2dp_sbc.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/stack/a2dp/a2dp_sbc.cc b/stack/a2dp/a2dp_sbc.cc -index 623ecfac1..393a17ee5 100644 ---- a/stack/a2dp/a2dp_sbc.cc -+++ b/stack/a2dp/a2dp_sbc.cc -@@ -881,6 +881,11 @@ bool A2DP_BuildCodecHeaderSbc(UNUSED_ATTR const uint8_t* p_codec_info, - BT_HDR* p_buf, uint16_t frames_per_packet) { - uint8_t* p; - -+ // there is a timestamp right following p_buf -+ if (p_buf->offset < 4 + A2DP_SBC_MPL_HDR_LEN) { -+ return false; -+ } -+ - p_buf->offset -= A2DP_SBC_MPL_HDR_LEN; - p = (uint8_t*)(p_buf + 1) + p_buf->offset; - p_buf->len += A2DP_SBC_MPL_HDR_LEN; diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351450.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351450.patch deleted file mode 100644 index abe6ce2f..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351450.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Wed, 4 Jan 2023 22:45:13 +0000 -Subject: [PATCH] Fix an OOB write in SDP_AddAttribute - -When the `attr_pad` becomes full, it is possible -that un index of `-1` is computed write -a zero byte to `p_val`, rusulting OOB write. - -``` - p_val[SDP_MAX_PAD_LEN - p_rec->free_pad_ptr - 1] = '\0'; -``` - -This is a backport of I937d22a2df26fca1d7f06b10182c4e713ddfed1b - -Bug: 261867748 -Test: manual -Tag: #security -Ignore-AOSP-First: security -Change-Id: Ibdda754e628cfc9d1706c14db114919a15d8d6b1 -(cherry picked from commit cc527a97f78a2999a0156a579e488afe9e3675b2) -Merged-In: Ibdda754e628cfc9d1706c14db114919a15d8d6b1 ---- - stack/sdp/sdp_db.cc | 23 +++++++++++++++++------ - 1 file changed, 17 insertions(+), 6 deletions(-) - -diff --git a/stack/sdp/sdp_db.cc b/stack/sdp/sdp_db.cc -index 65ed52fd9..23e5b53ff 100644 ---- a/stack/sdp/sdp_db.cc -+++ b/stack/sdp/sdp_db.cc -@@ -399,6 +399,11 @@ bool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type, - uint16_t xx; - tSDP_RECORD* p_rec = &sdp_cb.server_db.record[0]; - -+ if (p_val == nullptr) { -+ SDP_TRACE_WARNING("Trying to add attribute with p_val == nullptr, skipped"); -+ return (false); -+ } -+ - if (sdp_cb.trace_level >= BT_TRACE_LEVEL_DEBUG) { - if ((attr_type == UINT_DESC_TYPE) || - (attr_type == TWO_COMP_INT_DESC_TYPE) || -@@ -433,7 +438,15 @@ bool SDP_AddAttribute(uint32_t handle, uint16_t attr_id, uint8_t attr_type, - /* Find the record in the database */ - for (xx = 0; xx < sdp_cb.server_db.num_records; xx++, p_rec++) { - if (p_rec->record_handle == handle) { -- return SDP_AddAttributeToRecord (p_rec, attr_id, attr_type, attr_len, p_val); -+ -+ // error out early, no need to look up -+ if (p_rec->free_pad_ptr >= SDP_MAX_PAD_LEN) { -+ SDP_TRACE_ERROR("the free pad for SDP record with handle %d is " -+ "full, skip adding the attribute", handle); -+ return (false); -+ } else { -+ return SDP_AddAttributeToRecord (p_rec, attr_id, attr_type, attr_len, p_val); -+ } - } - } - #endif -@@ -500,15 +513,13 @@ bool SDP_AddAttributeToRecord (tSDP_RECORD *p_rec, uint16_t attr_id, - attr_len = 0; - } - -- if ((attr_len > 0) && (p_val != 0)) { -+ if (attr_len > 0) { - p_attr->len = attr_len; - memcpy(&p_rec->attr_pad[p_rec->free_pad_ptr], p_val, (size_t)attr_len); - p_attr->value_ptr = &p_rec->attr_pad[p_rec->free_pad_ptr]; - p_rec->free_pad_ptr += attr_len; -- } else if ((attr_len == 0 && -- p_attr->len != -- 0) || /* if truncate to 0 length, simply don't add */ -- p_val == 0) { -+ } else if (attr_len == 0 && p_attr->len != 0) { -+ /* if truncate to 0 length, simply don't add */ - SDP_TRACE_ERROR( - "SDP_AddAttributeToRecord fail, length exceed maximum: ID %d: attr_len:%d ", - attr_id, attr_len); diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351451.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351451.patch deleted file mode 100644 index e69b0314..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/351451.patch +++ /dev/null @@ -1,100 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Rocky Liao <quic_rjliao@quicinc.com> -Date: Mon, 19 Sep 2022 17:39:42 +0800 -Subject: [PATCH] AVRCP: Fix potential buffer overflow - -There will be buffer overflow if remote response exceeds -AVRC_MAX_APP_ATTR_SIZE, add array index check to avoid -buffer overflow issue. - -CRs-fixed: 3278869 -Change-Id: Ia93690e0dc4b28fd01af3a406678d43d426d3be8 ---- - btif/src/btif_rc.cc | 24 +++++++++++++++--------- - 1 file changed, 15 insertions(+), 9 deletions(-) - -diff --git a/btif/src/btif_rc.cc b/btif/src/btif_rc.cc -index 0b34f7c36..a0e38998f 100644 ---- a/btif/src/btif_rc.cc -+++ b/btif/src/btif_rc.cc -@@ -5067,13 +5067,13 @@ static void handle_app_attr_txt_response(tBTA_AV_META_MSG* pmeta_msg, - * for standard attributes. - */ - p_app_settings->num_ext_attrs = 0; -- for (xx = 0; xx < p_app_settings->ext_attr_index; xx++) { -+ for (xx = 0; xx < p_app_settings->ext_attr_index && xx < AVRC_MAX_APP_ATTR_SIZE; xx++) { - osi_free_and_reset((void**)&p_app_settings->ext_attrs[xx].p_str); - } - p_app_settings->ext_attr_index = 0; - - if (p_dev) { -- for (xx = 0; xx < p_app_settings->num_attrs; xx++) { -+ for (xx = 0; xx < p_app_settings->num_attrs && xx < AVRC_MAX_APP_ATTR_SIZE; xx++) { - attrs[xx] = p_app_settings->attrs[xx].attr_id; - } - -@@ -5086,7 +5086,7 @@ static void handle_app_attr_txt_response(tBTA_AV_META_MSG* pmeta_msg, - - for (xx = 0; xx < p_rsp->num_attr; xx++) { - uint8_t x; -- for (x = 0; x < p_app_settings->num_ext_attrs; x++) { -+ for (x = 0; x < p_app_settings->num_ext_attrs && x < AVRC_MAX_APP_ATTR_SIZE; x++) { - if (p_app_settings->ext_attrs[x].attr_id == p_rsp->p_attrs[xx].attr_id) { - p_app_settings->ext_attrs[x].charset_id = p_rsp->p_attrs[xx].charset_id; - p_app_settings->ext_attrs[x].str_len = p_rsp->p_attrs[xx].str_len; -@@ -5096,7 +5096,7 @@ static void handle_app_attr_txt_response(tBTA_AV_META_MSG* pmeta_msg, - } - } - -- for (xx = 0; xx < p_app_settings->ext_attrs[0].num_val; xx++) { -+ for (xx = 0; xx < p_app_settings->ext_attrs[0].num_val && xx < BTRC_MAX_APP_ATTR_SIZE; xx++) { - vals[xx] = p_app_settings->ext_attrs[0].ext_attr_val[xx].val; - } - get_player_app_setting_value_text_cmd(vals, xx, p_dev); -@@ -5141,11 +5141,11 @@ static void handle_app_attr_val_txt_response( - * for standard attributes. - */ - p_app_settings->num_ext_attrs = 0; -- for (xx = 0; xx < p_app_settings->ext_attr_index; xx++) { -+ for (xx = 0; xx < p_app_settings->ext_attr_index && xx < AVRC_MAX_APP_ATTR_SIZE; xx++) { - int x; - btrc_player_app_ext_attr_t* p_ext_attr = &p_app_settings->ext_attrs[xx]; - -- for (x = 0; x < p_ext_attr->num_val; x++) -+ for (x = 0; x < p_ext_attr->num_val && x < BTRC_MAX_APP_ATTR_SIZE; x++) - osi_free_and_reset((void**)&p_ext_attr->ext_attr_val[x].p_str); - p_ext_attr->num_val = 0; - osi_free_and_reset((void**)&p_app_settings->ext_attrs[xx].p_str); -@@ -5162,11 +5162,17 @@ static void handle_app_attr_val_txt_response( - return; - } - -+ if (p_app_settings->ext_val_index >= AVRC_MAX_APP_ATTR_SIZE) { -+ BTIF_TRACE_ERROR("%s: ext_val_index is 0x%02x, overflow!", -+ __func__, p_app_settings->ext_val_index); -+ return; -+ } -+ - for (xx = 0; xx < p_rsp->num_attr; xx++) { - uint8_t x; - btrc_player_app_ext_attr_t* p_ext_attr; - p_ext_attr = &p_app_settings->ext_attrs[p_app_settings->ext_val_index]; -- for (x = 0; x < p_rsp->num_attr; x++) { -+ for (x = 0; x < p_rsp->num_attr && x < BTRC_MAX_APP_ATTR_SIZE; x++) { - if (p_ext_attr->ext_attr_val[x].val == p_rsp->p_attrs[xx].attr_id) { - p_ext_attr->ext_attr_val[x].charset_id = p_rsp->p_attrs[xx].charset_id; - p_ext_attr->ext_attr_val[x].str_len = p_rsp->p_attrs[xx].str_len; -@@ -5204,11 +5210,11 @@ static void handle_app_attr_val_txt_response( - /* Free the application settings information after sending to - * application. - */ -- for (xx = 0; xx < p_app_settings->ext_attr_index; xx++) { -+ for (xx = 0; xx < p_app_settings->ext_attr_index && xx < AVRC_MAX_APP_ATTR_SIZE; xx++) { - int x; - btrc_player_app_ext_attr_t* p_ext_attr = &p_app_settings->ext_attrs[xx]; - -- for (x = 0; x < p_ext_attr->num_val; x++) -+ for (x = 0; x < p_ext_attr->num_val && x < BTRC_MAX_APP_ATTR_SIZE; x++) - osi_free_and_reset((void**)&p_ext_attr->ext_attr_val[x].p_str); - p_ext_attr->num_val = 0; - osi_free_and_reset((void**)&p_app_settings->ext_attrs[xx].p_str); diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353967.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353967.patch deleted file mode 100644 index 397b2703..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353967.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Hui Peng <phui@google.com> -Date: Fri, 20 Jan 2023 19:39:30 +0000 -Subject: [PATCH] Fix an OOB bug in register_notification_rsp - -This is a backport of I901d973a736678d7f3cc816ddf0cbbcbbd1fe93f -to rvc-dev. - -Bug: 245916076 -Test: manual -Ignore-AOSP-First: security -Change-Id: I37a9f45e707702b2ec52b5a2d572f177f2911765 -(cherry picked from commit 901e34203c6280d414cbfa3978de04fd6515ffdf) -Merged-In: I37a9f45e707702b2ec52b5a2d572f177f2911765 ---- - btif/src/btif_rc.cc | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/btif/src/btif_rc.cc b/btif/src/btif_rc.cc -index a0e38998f..41fd73485 100644 ---- a/btif/src/btif_rc.cc -+++ b/btif/src/btif_rc.cc -@@ -3137,6 +3137,11 @@ static bt_status_t register_notification_rsp( - dump_rc_notification_event_id(event_id)); - std::unique_lock<std::mutex> lock(btif_rc_cb.lock); - -+ if (event_id > MAX_RC_NOTIFICATIONS) { -+ BTIF_TRACE_ERROR("Invalid event id"); -+ return BT_STATUS_PARM_INVALID; -+ } -+ - memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP)); - - avrc_rsp.reg_notif.event_id = event_id; diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353968.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353968.patch deleted file mode 100644 index 77f2869a..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/353968.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mayank Madhukar <quic_mmadhuka@quicinc.com> -Date: Thu, 14 Jul 2022 15:33:53 +0530 -Subject: [PATCH] AVDTP: Fix a potential overflow about the media payload - offset - -This variable is uint16, and is possible to overflow when the length of -header extension is larger. Here we compare with the data length to -prevent any exceptions. - -Change-Id: If55d77132e893d6856c9f4ccc42d24a6e7cafe29 -CRs-Fixed: 3237187 ---- - stack/avdt/avdt_scb_act.cc | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - -diff --git a/stack/avdt/avdt_scb_act.cc b/stack/avdt/avdt_scb_act.cc -index 130f44ab1..568575458 100644 ---- a/stack/avdt/avdt_scb_act.cc -+++ b/stack/avdt/avdt_scb_act.cc -@@ -277,19 +277,24 @@ void avdt_scb_hdl_pkt_no_frag(tAVDT_SCB* p_scb, tAVDT_SCB_EVT* p_data) { - if (offset > len) goto length_error; - p += 2; - BE_STREAM_TO_UINT16(ex_len, p); -- offset += ex_len * 4; - p += ex_len * 4; - } - -+ if ((p - p_start) > len) { -+ android_errorWriteLog(0x534e4554, "142546355"); -+ osi_free_and_reset((void**)&p_data->p_pkt); -+ return; -+ } -+ offset = p - p_start; -+ - /* adjust length for any padding at end of packet */ - if (o_p) { - /* padding length in last byte of packet */ -- pad_len = *(p_start + p_data->p_pkt->len); -+ pad_len = *(p_start + len); - } - - /* do sanity check */ -- if ((offset > p_data->p_pkt->len) || -- ((pad_len + offset) > p_data->p_pkt->len)) { -+ if (pad_len > (len - offset)) { - AVDT_TRACE_WARNING("Got bad media packet"); - osi_free_and_reset((void**)&p_data->p_pkt); - } diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358583.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358583.patch deleted file mode 100644 index d754007f..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358583.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Delwiche <delwiche@google.com> -Date: Tue, 11 Oct 2022 21:23:22 +0000 -Subject: [PATCH] Prevent use-after-free of HID reports - -BTA sends the the HID report pointer to BTIF and deallocates it immediately. -This is now prevented by providing a deep copy callback function for HID -reports when tranferring context from BTA to BTIF. - -This is a backport of change Icef7a7ed1185b4283ee4fe4f812ca154d8f1b825, -already merged on T for b/227620181. - -Bug: 228837201 -Test: Validated against researcher POC, ran BT unit tests, played audio -manually. -Tag: #security -Ignore-AOSP-First: Security -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:874c495c886cd8722625756dc5fd0634b16b4f42) -Merged-In: Ib837f395883de2369207f1b3b974d6bff02dcb19 -Change-Id: Ib837f395883de2369207f1b3b974d6bff02dcb19 - -Change-Id: I7e94dbdf4990ce8ebb03d8ffdacd4049f16873bb ---- - btif/src/btif_hh.cc | 50 ++++++++++++++++++++++++++++++++++++++++----- - 1 file changed, 45 insertions(+), 5 deletions(-) - -diff --git a/btif/src/btif_hh.cc b/btif/src/btif_hh.cc -index 1b770ddb1..b5135ff2f 100644 ---- a/btif/src/btif_hh.cc -+++ b/btif/src/btif_hh.cc -@@ -1127,6 +1127,38 @@ static void btif_hh_upstreams_evt(uint16_t event, char* p_param) { - } - } - -+/******************************************************************************* -+ * -+ * Function btif_hh_hsdata_rpt_copy_cb -+ * -+ * Description Deep copies the tBTA_HH_HSDATA structure -+ * -+ * Returns void -+ * -+ ******************************************************************************/ -+ -+static void btif_hh_hsdata_rpt_copy_cb(uint16_t event, char* p_dest, -+ char* p_src) { -+ tBTA_HH_HSDATA* p_dst_data = (tBTA_HH_HSDATA*)p_dest; -+ tBTA_HH_HSDATA* p_src_data = (tBTA_HH_HSDATA*)p_src; -+ BT_HDR* hdr; -+ -+ if (!p_src) { -+ BTIF_TRACE_ERROR("%s: Nothing to copy", __func__); -+ return; -+ } -+ -+ memcpy(p_dst_data, p_src_data, sizeof(tBTA_HH_HSDATA)); -+ -+ hdr = p_src_data->rsp_data.p_rpt_data; -+ if (hdr != NULL) { -+ uint8_t* p_data = ((uint8_t*)p_dst_data) + sizeof(tBTA_HH_HSDATA); -+ memcpy(p_data, hdr, BT_HDR_SIZE + hdr->offset + hdr->len); -+ -+ p_dst_data->rsp_data.p_rpt_data = (BT_HDR*)p_data; -+ } -+} -+ - /******************************************************************************* - * - * Function bte_hh_evt -@@ -1140,6 +1172,7 @@ static void btif_hh_upstreams_evt(uint16_t event, char* p_param) { - void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH* p_data) { - bt_status_t status; - int param_len = 0; -+ tBTIF_COPY_CBACK* p_copy_cback = NULL; - - if (BTA_HH_ENABLE_EVT == event) - param_len = sizeof(tBTA_HH_STATUS); -@@ -1151,11 +1184,18 @@ void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH* p_data) { - param_len = sizeof(tBTA_HH_CBDATA); - else if (BTA_HH_GET_DSCP_EVT == event) - param_len = sizeof(tBTA_HH_DEV_HANDLE_DSCP_INFO); -- else if ((BTA_HH_GET_PROTO_EVT == event) || (BTA_HH_GET_RPT_EVT == event) || -- (BTA_HH_GET_IDLE_EVT == event)) -+ else if ((BTA_HH_GET_PROTO_EVT == event) || (BTA_HH_GET_IDLE_EVT == event)) -+ param_len = sizeof(tBTA_HH_HSDATA); -+ else if (BTA_HH_GET_RPT_EVT == event) { -+ BT_HDR* hdr = p_data->hs_data.rsp_data.p_rpt_data; - param_len = sizeof(tBTA_HH_HSDATA); -- else if ((BTA_HH_SET_PROTO_EVT == event) || (BTA_HH_SET_RPT_EVT == event) || -- (BTA_HH_VC_UNPLUG_EVT == event) || (BTA_HH_SET_IDLE_EVT == event)) -+ -+ if (hdr != NULL) { -+ p_copy_cback = btif_hh_hsdata_rpt_copy_cb; -+ param_len += BT_HDR_SIZE + hdr->offset + hdr->len; -+ } -+ } else if ((BTA_HH_SET_PROTO_EVT == event) || (BTA_HH_SET_RPT_EVT == event) || -+ (BTA_HH_VC_UNPLUG_EVT == event) || (BTA_HH_SET_IDLE_EVT == event)) - param_len = sizeof(tBTA_HH_CBDATA); - else if ((BTA_HH_ADD_DEV_EVT == event) || (BTA_HH_RMV_DEV_EVT == event)) - param_len = sizeof(tBTA_HH_DEV_INFO); -@@ -1164,7 +1204,7 @@ void bte_hh_evt(tBTA_HH_EVT event, tBTA_HH* p_data) { - /* switch context to btif task context (copy full union size for convenience) - */ - status = btif_transfer_context(btif_hh_upstreams_evt, (uint16_t)event, -- (char*)p_data, param_len, NULL); -+ (char*)p_data, param_len, p_copy_cback); - - /* catch any failed context transfers */ - ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status); diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358584.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358584.patch deleted file mode 100644 index 546ba6da..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358584.patch +++ /dev/null @@ -1,139 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Delwiche <delwiche@google.com> -Date: Tue, 21 Mar 2023 22:35:08 +0000 -Subject: [PATCH] Revert^2 "Validate buffer length in sdpu_build_uuid_seq" - -fd2ded7341c7f867a153e86f003758808f11bfb9 -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:4d33899d2c0573cf351691cdf27628416621f545) -Merged-In: I40ea9f3858215f460e6dab3768e0c6d2155e4755 -Change-Id: I40ea9f3858215f460e6dab3768e0c6d2155e4755 - -Change-Id: I41b3e52c09638f8a46a26d9527b0e114f6c8682e ---- - stack/sdp/sdp_discovery.cc | 64 +++++++++++++++++++++++++++++++++----- - 1 file changed, 57 insertions(+), 7 deletions(-) - -diff --git a/stack/sdp/sdp_discovery.cc b/stack/sdp/sdp_discovery.cc -index ebfa510f1..14713c4b1 100644 ---- a/stack/sdp/sdp_discovery.cc -+++ b/stack/sdp/sdp_discovery.cc -@@ -74,10 +74,15 @@ static uint8_t* add_attr(uint8_t* p, uint8_t* p_end, tSDP_DISCOVERY_DB* p_db, - * - ******************************************************************************/ - static uint8_t* sdpu_build_uuid_seq(uint8_t* p_out, uint16_t num_uuids, -- Uuid* p_uuid_list) { -+ Uuid* p_uuid_list, uint16_t& bytes_left) { - uint16_t xx; - uint8_t* p_len; - -+ if (bytes_left < 2) { -+ DCHECK(0) << "SDP: No space for data element header"; -+ return (p_out); -+ } -+ - /* First thing is the data element header */ - UINT8_TO_BE_STREAM(p_out, (DATA_ELE_SEQ_DESC_TYPE << 3) | SIZE_IN_NEXT_BYTE); - -@@ -85,9 +90,20 @@ static uint8_t* sdpu_build_uuid_seq(uint8_t* p_out, uint16_t num_uuids, - p_len = p_out; - p_out += 1; - -+ /* Account for data element header and length */ -+ bytes_left -= 2; -+ - /* Now, loop through and put in all the UUID(s) */ - for (xx = 0; xx < num_uuids; xx++, p_uuid_list++) { - int len = p_uuid_list->GetShortestRepresentationSize(); -+ -+ if (len + 1 > bytes_left) { -+ DCHECK(0) << "SDP: Too many UUIDs for internal buffer"; -+ break; -+ } else { -+ bytes_left -= (len + 1); -+ } -+ - if (len == Uuid::kNumBytes16) { - UINT8_TO_BE_STREAM(p_out, (UUID_DESC_TYPE << 3) | SIZE_TWO_BYTES); - UINT16_TO_BE_STREAM(p_out, p_uuid_list->As16Bit()); -@@ -124,6 +140,7 @@ static void sdp_snd_service_search_req(tCONN_CB* p_ccb, uint8_t cont_len, - uint8_t *p, *p_start, *p_param_len; - BT_HDR* p_cmd = (BT_HDR*)osi_malloc(SDP_DATA_BUF_SIZE); - uint16_t param_len; -+ uint16_t bytes_left = SDP_DATA_BUF_SIZE; - - /* Prepare the buffer for sending the packet to L2CAP */ - p_cmd->offset = L2CAP_MIN_OFFSET; -@@ -138,13 +155,29 @@ static void sdp_snd_service_search_req(tCONN_CB* p_ccb, uint8_t cont_len, - p_param_len = p; - p += 2; - --/* Build the UID sequence. */ -+ /* Account for header size, max service record count and -+ * continuation state */ -+ const uint16_t base_bytes = (sizeof(BT_HDR) + L2CAP_MIN_OFFSET + -+ 3u + /* service search request header */ -+ 2u + /* param len */ -+ 3u + ((p_cont) ? cont_len : 0)); -+ -+ if (base_bytes > bytes_left) { -+ DCHECK(0) << "SDP: Overran SDP data buffer"; -+ osi_free(p_cmd); -+ return; -+ } -+ -+ bytes_left -= base_bytes; -+ -+ /* Build the UID sequence. */ - #if (SDP_BROWSE_PLUS == TRUE) - p = sdpu_build_uuid_seq(p, 1, -- &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx]); -+ &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], -+ bytes_left); - #else - p = sdpu_build_uuid_seq(p, p_ccb->p_db->num_uuid_filters, -- p_ccb->p_db->uuid_filters); -+ p_ccb->p_db->uuid_filters, bytes_left); - #endif - - /* Set max service record count */ -@@ -635,6 +668,7 @@ static void process_service_search_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, - if ((cont_request_needed) || (!p_reply)) { - BT_HDR* p_msg = (BT_HDR*)osi_malloc(SDP_DATA_BUF_SIZE); - uint8_t* p; -+ uint16_t bytes_left = SDP_DATA_BUF_SIZE; - - p_msg->offset = L2CAP_MIN_OFFSET; - p = p_start = (uint8_t*)(p_msg + 1) + L2CAP_MIN_OFFSET; -@@ -648,13 +682,29 @@ static void process_service_search_attr_rsp(tCONN_CB* p_ccb, uint8_t* p_reply, - p_param_len = p; - p += 2; - --/* Build the UID sequence. */ -+ /* Account for header size, max service record count and -+ * continuation state */ -+ const uint16_t base_bytes = (sizeof(BT_HDR) + L2CAP_MIN_OFFSET + -+ 3u + /* service search request header */ -+ 2u + /* param len */ -+ 3u + /* max service record count */ -+ ((p_reply) ? (*p_reply) : 0)); -+ -+ if (base_bytes > bytes_left) { -+ sdp_disconnect(p_ccb, SDP_INVALID_CONT_STATE); -+ return; -+ } -+ -+ bytes_left -= base_bytes; -+ -+ /* Build the UID sequence. */ - #if (SDP_BROWSE_PLUS == TRUE) - p = sdpu_build_uuid_seq(p, 1, -- &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx]); -+ &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], -+ bytes_left); - #else - p = sdpu_build_uuid_seq(p, p_ccb->p_db->num_uuid_filters, -- p_ccb->p_db->uuid_filters); -+ p_ccb->p_db->uuid_filters, bytes_left); - #endif - - /* Max attribute byte count */ diff --git a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358585.patch b/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358585.patch deleted file mode 100644 index 334a5d6e..00000000 --- a/Patches/LineageOS-17.1/android_vendor_qcom_opensource_system_bt/358585.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Brian Delwiche <delwiche@google.com> -Date: Tue, 21 Mar 2023 22:39:16 +0000 -Subject: [PATCH] Revert "Revert "Fix wrong BR/EDR link key downgrades - (P_256->P_192)"" - -This reverts commit d733c86cbc06ce0ec72216b9d41e172d1939c46f. - -Function btm_sec_encrypt_change() is called at most places -with argument "encr_enable" treated as bool and not as per -(tHCI_ENCRYPT_MODE = 0/1/2) expected by the function. The -function has special handling for "encr_enable=1" to downgrade -the link key type for BR/EDR case. This gets executed even -when the caller/context did not mean/expect so. It appears -this handling in btm_sec_encrypt_change() is not necessary and -is removed by this commit to prevent accidental execution of it. - -Test: Verified re-pairing with an iPhone works fine now - -Issue Reproduction Steps: -1. Enable Bluetooth Hotspot on Android device (DUT). -2. Pair and connect an iPhone to DUT. -3. Forget this pairing on DUT. -4. On iPhone settings, click on old DUT's paired entry to connect. -5. iPhone notifies to click 'Forget Device' and try fresh pairing. -6. On iPhone, after doing 'Forget Device', discover DUT again. -7. Attempt pairing to DUT by clicking on discovered DUT entry. - Pairing will be unsuccessful. - -Issue Cause: -During re-pairing, DUT is seen to downgrade -BR/EDR link key unexpectedly from link key type 0x8 -(BTM_LKEY_TYPE_AUTH_COMB_P_256) to 0x5 (BTM_LKEY_TYPE_AUTH_COMB). - -Log snippet (re-pairing time): -btm_sec_link_key_notification set new_encr_key_256 to 1 -btif_dm_auth_cmpl_evt: Storing link key. key_type=0x8, bond_type=1 -btm_sec_encrypt_change new_encr_key_256 is 1 ---On DUT, HCI_Encryption_Key_Refresh_Complete event noticed--- -btm_sec_encrypt_change new_encr_key_256 is 0 -updated link key type to 5 -btif_dm_auth_cmpl_evt: Storing link key. key_type=0x5, bond_type=1 - -This is a backport of the following patch: aosp/1890096 - -Bug: 258834033 - -Reason for revert: Reinstate original change for QPR -(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:56891eedc68c86b40977191dad28d65ebf86a94f) -Merged-In: Iba0c220b82bcf6b15368762b7052a3987ccbc0c6 -Change-Id: Iba0c220b82bcf6b15368762b7052a3987ccbc0c6 - -Change-Id: Ic5130971306864e5bd2a590f238175c9545a297a ---- - stack/btm/btm_sec.cc | 25 ------------------------- - 1 file changed, 25 deletions(-) - -diff --git a/stack/btm/btm_sec.cc b/stack/btm/btm_sec.cc -index 2e4c0c196..40f051c0d 100644 ---- a/stack/btm/btm_sec.cc -+++ b/stack/btm/btm_sec.cc -@@ -4303,31 +4303,6 @@ void btm_sec_encrypt_change(uint16_t handle, uint8_t status, - SMP_BR_PairWith(p_dev_rec->bd_addr); - } - } -- } else { -- // BR/EDR is successfully encrypted. Correct LK type if needed -- // (BR/EDR LK derived from LE LTK was used for encryption) -- if ((encr_enable == 1) && /* encryption is ON for SSP */ -- /* LK type is for BR/EDR SC */ -- (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256 || -- p_dev_rec->link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256)) { -- if (p_dev_rec->sec_smp_pair_pending != BTM_SEC_SMP_PAIR_PENDING) { -- if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) -- p_dev_rec->link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; -- else /* BTM_LKEY_TYPE_AUTH_COMB_P_256 */ -- p_dev_rec->link_key_type = BTM_LKEY_TYPE_AUTH_COMB; -- -- BTM_TRACE_DEBUG("updated link key type to %d", -- p_dev_rec->link_key_type); -- btm_send_link_key_notif(p_dev_rec); -- } else { -- BTM_TRACE_DEBUG("link key type to %d will update after SMP", -- p_dev_rec->link_key_type); -- if (p_dev_rec->link_key_type == BTM_LKEY_TYPE_UNAUTH_COMB_P_256) -- p_dev_rec->sec_smp_pair_pending |= BTM_SEC_LINK_KEY_TYPE_UNAUTH; -- else -- p_dev_rec->sec_smp_pair_pending |= BTM_SEC_LINK_KEY_TYPE_AUTH; -- } -- } - } - } - diff --git a/Scripts/LineageOS-14.1/Functions.sh b/Scripts/LineageOS-14.1/Functions.sh index 6bc3b367..0d972e87 100644 --- a/Scripts/LineageOS-14.1/Functions.sh +++ b/Scripts/LineageOS-14.1/Functions.sh @@ -108,7 +108,7 @@ patchWorkspaceReal() { gpgVerifyGitHead "$DOS_BUILD_BASE/external/chromium-webview"; source build/envsetup.sh; - repopick -it tzdb_N; + repopick -fit tzdb_N; sh "$DOS_SCRIPTS/Patch.sh"; sh "$DOS_SCRIPTS_COMMON/Enable_Verity.sh"; diff --git a/Scripts/LineageOS-16.0/Functions.sh b/Scripts/LineageOS-16.0/Functions.sh index 0c1f2d6a..444a30b4 100644 --- a/Scripts/LineageOS-16.0/Functions.sh +++ b/Scripts/LineageOS-16.0/Functions.sh @@ -77,20 +77,20 @@ patchWorkspaceReal() { source build/envsetup.sh; #repopick -it pie-firewall; #repopick cannot handle empty commits - repopick -it P_asb_2022-05 -e 341484; - repopick -it P_asb_2022-06 -e 342112; - repopick -it P_asb_2022-07 -e 342113; - repopick -it P_asb_2022-08 -e 342114; - repopick -it P_asb_2022-09 -e 342116; - repopick -it P_asb_2022-10 -e 342119; - repopick -it P_tzdata_2022; - repopick -it P_asb_2022-11 -e 344200; - repopick -it P_asb_2022-12 -e 345931; - repopick -it P_asb_2023-01 -e 347129; - repopick -it P_asb_2023-02 -e 349337; - repopick -it P_asb_2023-03; - repopick -it P_asb_2023-04; - repopick -it P_asb_2023-05; + repopick -fit P_asb_2022-05 -e 341484; + repopick -fit P_asb_2022-06 -e 342112; + repopick -fit P_asb_2022-07 -e 342113; + repopick -fit P_asb_2022-08 -e 342114; + repopick -fit P_asb_2022-09 -e 342116; + repopick -fit P_asb_2022-10 -e 342119; + repopick -fit P_tzdata_2022; + repopick -fit P_asb_2022-11 -e 344200; + repopick -fit P_asb_2022-12 -e 345931; + repopick -fit P_asb_2023-01 -e 347129; + repopick -fit P_asb_2023-02 -e 349337; + repopick -fit P_asb_2023-03; + repopick -fit P_asb_2023-04; + repopick -fit P_asb_2023-05; sh "$DOS_SCRIPTS/Patch.sh"; sh "$DOS_SCRIPTS_COMMON/Enable_Verity.sh"; diff --git a/Scripts/LineageOS-17.1/Functions.sh b/Scripts/LineageOS-17.1/Functions.sh index 210a4e8c..8d0f49b4 100644 --- a/Scripts/LineageOS-17.1/Functions.sh +++ b/Scripts/LineageOS-17.1/Functions.sh @@ -77,8 +77,12 @@ patchWorkspaceReal() { verifyAllPlatformTags; gpgVerifyGitHead "$DOS_BUILD_BASE/external/chromium-webview"; - #source build/envsetup.sh; + source build/envsetup.sh; #repopick -it ten-firewall; + repopick -fit Q_asb_2023-03; + repopick -fit Q_asb_2023-04; + repopick -fit Q_asb_2023-05; + repopick -fit Q_asb_2023-06; sh "$DOS_SCRIPTS/Patch.sh"; sh "$DOS_SCRIPTS_COMMON/Enable_Verity.sh"; diff --git a/Scripts/LineageOS-17.1/Patch.sh b/Scripts/LineageOS-17.1/Patch.sh index 93112faa..64763ac2 100644 --- a/Scripts/LineageOS-17.1/Patch.sh +++ b/Scripts/LineageOS-17.1/Patch.sh @@ -97,7 +97,6 @@ sed -i '75i$(my_res_package): PRIVATE_AAPT_FLAGS += --auto-add-overlay' core/aap awk -i inplace '!/updatable_apex.mk/' target/product/mainline_system.mk; #Disable APEX sed -i 's/PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION := 23/PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION := 28/' core/version_defaults.mk; #Set the minimum supported target SDK to Pie (GrapheneOS) #sed -i 's/PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS := true/PRODUCT_OTA_ENFORCE_VINTF_KERNEL_REQUIREMENTS := false/' core/product_config.mk; #broken by hardenDefconfig -sed -i 's/2023-02-05/2023-06-05/' core/version_defaults.mk; #Bump Security String #Q_asb_2023-06 #XXX fi; if enterAndClear "build/soong"; then @@ -133,42 +132,10 @@ awk -i inplace '!/deletePackage/' pico/src/com/svox/pico/LangPackUninstaller.jav fi; if enterAndClear "external/zlib"; then -applyPatch "$DOS_PATCHES/android_external_zlib/351107.patch"; #n-asb-2023-03 Fix a bug when getting a gzip header extra field with inflate(). -fi; - -if enterAndClear "frameworks/av"; then -applyPatch "$DOS_PATCHES/android_frameworks_av/358555.patch"; #R_asb_2023-06 Fix NuMediaExtractor::readSampleData buffer Handling +git fetch https://github.com/LineageOS/android_external_zlib refs/changes/70/352570/1 && git cherry-pick FETCH_HEAD; #Q_asb_2023-03 fi; if enterAndClear "frameworks/base"; then -applyPatch "$DOS_PATCHES/android_frameworks_base/351411-backport.patch"; #R_asb_2023-03 Move service initialization -applyPatch "$DOS_PATCHES/android_frameworks_base/351412.patch"; #R_asb_2023-03 Stop managed profile owner granting READ_SMS -applyPatch "$DOS_PATCHES/android_frameworks_base/351413-backport.patch"; #R_asb_2023-03 Enable user graularity for lockdown mode #XXX -applyPatch "$DOS_PATCHES/android_frameworks_base/351414-backport.patch"; #R_asb_2023-03 Revoke dev perm if app is upgrading to post 23 and perm has pre23 flag #XXX -applyPatch "$DOS_PATCHES/android_frameworks_base/351415.patch"; #R_asb_2023-03 Reconcile WorkSource parcel and unparcel code. -applyPatch "$DOS_PATCHES/android_frameworks_base/351436.patch"; #R_asb_2023-03 Revert "Ensure that only SysUI can override pending intent launch flags" -applyPatch "$DOS_PATCHES/android_frameworks_base/352555.patch"; #Q_asb_2023-03 Revert "[RESTRICT AUTOMERGE] Trim the activity info of another uid if no privilege" -applyPatch "$DOS_PATCHES/android_frameworks_base/353117.patch"; #Q_asb_2023-03 Fix sharing to another profile where an app has multiple targets -applyPatch "$DOS_PATCHES/android_frameworks_base/353944.patch"; #R_asb_2023-04 Context#startInstrumentation could be started from SHELL only now. -applyPatch "$DOS_PATCHES/android_frameworks_base/353945.patch"; #R_asb_2023-04 Checking if package belongs to UID before registering broadcast receiver -applyPatch "$DOS_PATCHES/android_frameworks_base/353946.patch"; #R_asb_2023-04 Fix checkKeyIntentParceledCorrectly's bypass -applyPatch "$DOS_PATCHES/android_frameworks_base/353947.patch"; #R_asb_2023-04 Encode Intent scheme when serializing to URI string -applyPatch "$DOS_PATCHES/android_frameworks_base/353948-backport.patch"; #R_asb_2023-04 Backport BAL restrictions from S to R, this blocks apps from using AlarmManager to bypass BAL restrictions. -applyPatch "$DOS_PATCHES/android_frameworks_base/353949-backport.patch"; #R_asb_2023-04 Strip part of the activity info of another uid if no privilege -applyPatch "$DOS_PATCHES/android_frameworks_base/353950-backport.patch"; #R_asb_2023-04 Add a limit on channel group creation -applyPatch "$DOS_PATCHES/android_frameworks_base/353951-backport.patch"; #R_asb_2023-04 Fix bypass BG-FGS and BAL via package manager APIs #XXX -applyPatch "$DOS_PATCHES/android_frameworks_base/355763-backport.patch"; #R_asb_2023-05 [pm] Prevent system app downgrades of versions lower than preload #XXX: really should have next patch -applyPatch "$DOS_PATCHES/android_frameworks_base/355764.patch"; #R_asb_2023-05 [pm] Still allow debuggable for system app downgrades -applyPatch "$DOS_PATCHES/android_frameworks_base/355765-backport.patch"; #R_asb_2023-05 Checks if AccessibilityServiceInfo is within parcelable size. -applyPatch "$DOS_PATCHES/android_frameworks_base/355766-backport.patch"; #R_asb_2023-05 Uri: check authority and scheme as part of determining URI path -applyPatch "$DOS_PATCHES/android_frameworks_base/355767.patch"; #R_asb_2023-05 Enforce stricter rules when registering phoneAccounts -#applyPatch "$DOS_PATCHES/android_frameworks_base/358556.patch"; #R_asb_2023-06 Remove Activity if it enters PiP without window #TODO: needs backport of findMainWindow -applyPatch "$DOS_PATCHES/android_frameworks_base/358557.patch"; #R_asb_2023-06 Prevent sharesheet from previewing unowned URIs -applyPatch "$DOS_PATCHES/android_frameworks_base/358560.patch"; #R_asb_2023-06 Check key intent for selectors and prohibited flags -applyPatch "$DOS_PATCHES/android_frameworks_base/358561-backport.patch"; #R_asb_2023-06 Handle invalid data during job loading. -applyPatch "$DOS_PATCHES/android_frameworks_base/358562-backport.patch"; #R_asb_2023-06 Allow filtering of services -#applyPatch "$DOS_PATCHES/android_frameworks_base/358564-backport.patch"; #R_asb_2023-06 Add BubbleMetadata detection to block FSI #TODO: needs backport of getSbn -applyPatch "$DOS_PATCHES/android_frameworks_base/358732-backport.patch"; #n-asb-2023-06 Prevent RemoteViews crashing SystemUi #applyPatch "$DOS_PATCHES/android_frameworks_base/272645.patch"; #ten-bt-sbc-hd-dualchannel: Add CHANNEL_MODE_DUAL_CHANNEL constant (ValdikSS) #applyPatch "$DOS_PATCHES/android_frameworks_base/272646-forwardport.patch"; #ten-bt-sbc-hd-dualchannel: Add Dual Channel into Bluetooth Audio Channel Mode developer options menu (ValdikSS) #applyPatch "$DOS_PATCHES/android_frameworks_base/272647.patch"; #ten-bt-sbc-hd-dualchannel: Allow SBC as HD audio codec in Bluetooth device configuration (ValdikSS) @@ -228,10 +195,6 @@ rm -rf packages/PrintRecommendationService; #Creates popups to install proprieta fi; if enterAndClear "frameworks/native"; then -applyPatch "$DOS_PATCHES/android_frameworks_native/353953-backport.patch"; #R_asb_2023-04 Mitigate the security vulnerability by sanitizing the transaction flags. -applyPatch "$DOS_PATCHES/android_frameworks_native/355772.patch"; #R_asb_2023-05 Check for malformed Sensor Flattenable -applyPatch "$DOS_PATCHES/android_frameworks_native/355773.patch"; #R_asb_2023-05 Remove some new memory leaks from SensorManager -applyPatch "$DOS_PATCHES/android_frameworks_native/355774.patch"; #R_asb_2023-05 Add removeInstanceForPackageMethod to SensorManager applyPatch "$DOS_PATCHES/android_frameworks_native/0001-Sensors.patch"; #Require OTHER_SENSORS permission for sensors (GrapheneOS) fi; @@ -242,7 +205,6 @@ fi; fi; if enterAndClear "frameworks/opt/net/wifi"; then -#applyPatch "$DOS_PATCHES/android_frameworks_opt_net_wifi/351437-backport.patch"; #R_asb_2023-03 Revert "[DO NOT MERGE] wifi: remove certificates for network factory reset" #XXX: reverted in R_asb_2023-04 if [ "$DOS_GRAPHENE_CONSTIFY" = true ]; then applyPatch "$DOS_PATCHES/android_frameworks_opt_net_wifi/0001-constify_JNINativeMethod.patch"; fi; #Constify JNINativeMethod tables (GrapheneOS) applyPatch "$DOS_PATCHES/android_frameworks_opt_net_wifi/0002-Random_MAC.patch"; #Add support for always generating new random MAC (GrapheneOS) fi; @@ -308,10 +270,6 @@ if enterAndClear "packages/apps/Bluetooth"; then if [ "$DOS_GRAPHENE_CONSTIFY" = true ]; then applyPatch "$DOS_PATCHES/android_packages_apps_Bluetooth/0001-constify_JNINativeMethod.patch"; fi; #Constify JNINativeMethod tables (GrapheneOS) fi; -if enterAndClear "packages/apps/Car/Settings"; then -applyPatch "$DOS_PATCHES/android_packages_apps_Car_Settings/358565-backport.patch"; #R_asb_2023-06 Convert argument to Intent in car settings AddAccountActivity. -fi; - #if enterAndClear "packages/apps/CarrierConfig"; then #rm -rf assets/*.xml; #cp $DOS_PATCHES_COMMON/android_packages_apps_CarrierConfig/*.xml assets/; @@ -340,7 +298,6 @@ if [ "$DOS_GRAPHENE_CONSTIFY" = true ]; then applyPatch "$DOS_PATCHES/android_pa fi; if enterAndClear "packages/apps/PermissionController"; then -applyPatch "$DOS_PATCHES/android_packages_apps_PermissionController/351439-backport.patch"; #R_asb_2023-03 Stop managed profile owner granting READ_SMS applyPatch "$DOS_PATCHES/android_packages_apps_PermissionController/0001-Network_Permission-1.patch"; #Always treat INTERNET as a runtime permission (GrapheneOS) applyPatch "$DOS_PATCHES/android_packages_apps_PermissionController/0001-Network_Permission-2.patch"; #Add INTERNET permission toggle (GrapheneOS) applyPatch "$DOS_PATCHES/android_packages_apps_PermissionController/0001-Sensors_Permission-1.patch"; #Always treat OTHER_SENSORS as a runtime permission (GrapheneOS) @@ -349,12 +306,6 @@ fi; if enterAndClear "packages/apps/Settings"; then git revert --no-edit 486980cfecce2ca64267f41462f9371486308e9d; #Don't hide OEM unlock -applyPatch "$DOS_PATCHES/android_packages_apps_Settings/351440-backport.patch"; #R_asb_2023-03 FRP bypass defense in the settings app -applyPatch "$DOS_PATCHES/android_packages_apps_Settings/351441.patch"; #R_asb_2023-03 Add DISALLOW_APPS_CONTROL check into uninstall app for all users -applyPatch "$DOS_PATCHES/android_packages_apps_Settings/353956.patch"; #R_asb_2023-04 Only primary user is allowed to control secure nfc -applyPatch "$DOS_PATCHES/android_packages_apps_Settings/358566.patch"; #R_asb_2023-06 Move display of VPN version into summary text -applyPatch "$DOS_PATCHES/android_packages_apps_Settings/358567-backport.patch"; #R_asb_2023-06 Import translations. -applyPatch "$DOS_PATCHES/android_packages_apps_Settings/358568-backport.patch"; #R_asb_2023-06 Convert argument to intent in AddAccountSettings. #applyPatch "$DOS_PATCHES/android_packages_apps_Settings/272651.patch"; #ten-bt-sbc-hd-dualchannel: Add Dual Channel into Bluetooth Audio Channel Mode developer options menu (ValdikSS) applyPatch "$DOS_PATCHES/android_packages_apps_Settings/0001-Captive_Portal_Toggle.patch"; #Add option to disable captive portal checks (MSe1969) #applyPatch "$DOS_PATCHES/android_packages_apps_Settings/0001-Captive_Portal_Toggle-gos.patch"; #Add option to disable captive portal checks (GrapheneOS) #FIXME: needs work @@ -382,10 +333,6 @@ if enterAndClear "packages/apps/Trebuchet"; then cp $DOS_BUILD_BASE/vendor/divested/overlay/common/packages/apps/Trebuchet/res/xml/default_workspace_*.xml res/xml/; #XXX: Likely no longer needed fi; -if enterAndClear "packages/apps/TvSettings"; then -applyPatch "$DOS_PATCHES/android_packages_apps_TvSettings/358578.patch"; #R_asb_2023-06 Convert argument to intent in addAccount TvSettings. -fi; - if enterAndClear "packages/apps/Updater"; then applyPatch "$DOS_PATCHES/android_packages_apps_Updater/0001-Server.patch"; #Switch to our server (DivestOS) applyPatch "$DOS_PATCHES/android_packages_apps_Updater/0002-Tor_Support.patch"; #Add Tor support (DivestOS) @@ -406,34 +353,15 @@ if enterAndClear "packages/providers/DownloadProvider"; then applyPatch "$DOS_PATCHES/android_packages_providers_DownloadProvider/0001-Network_Permission.patch"; #Expose the NETWORK permission (GrapheneOS) fi; -if enterAndClear "packages/providers/MediaProvider"; then -applyPatch "$DOS_PATCHES/android_packages_providers_MediaProvider/353957-backport.patch"; #R_asb_2023-04 Canonicalise path before extracting relative path -fi; - #if enterAndClear "packages/providers/TelephonyProvider"; then #cp $DOS_PATCHES_COMMON/android_packages_providers_TelephonyProvider/carrier_list.* assets/; #fi; -if enterAndClear "packages/services/Telecomm"; then -applyPatch "$DOS_PATCHES/android_packages_services_Telecomm/353958-backport.patch"; #R_asb_2023-04 Ensure service unbind when receiving a null call screening service in onBind. -applyPatch "$DOS_PATCHES/android_packages_services_Telecomm/353959.patch"; #R_asb_2023-04 Do not process content uri in call Intents -applyPatch "$DOS_PATCHES/android_packages_services_Telecomm/355777-backport.patch"; #R_asb_2023-05 enforce stricter rules when registering phoneAccounts -applyPatch "$DOS_PATCHES/android_packages_services_Telecomm/358579-backport.patch"; #R_asb_2023-06 Call Redirection: unbind service when onBind returns null -fi; - if enterAndClear "prebuilts/abi-dumps/vndk"; then applyPatch "$DOS_PATCHES/android_prebuilts_abi-dumps_vndk/0001-protobuf-avi.patch"; #Work around ABI changes from compiler hardening (GrapheneOS) fi; if enterAndClear "system/bt"; then -applyPatch "$DOS_PATCHES/android_system_bt/351443.patch"; #R_asb_2023-03 Fix an OOB Write bug in gatt_check_write_long_terminate -applyPatch "$DOS_PATCHES/android_system_bt/351444.patch"; #R_asb_2023-03 Fix an OOB access bug in A2DP_BuildMediaPayloadHeaderSbc -applyPatch "$DOS_PATCHES/android_system_bt/351445.patch"; #R_asb_2023-03 Fix an OOB write in SDP_AddAttribute -applyPatch "$DOS_PATCHES/android_system_bt/353960.patch"; #R_asb_2023-04 Fix OOB access in avdt_scb_hdl_pkt_no_frag -applyPatch "$DOS_PATCHES/android_system_bt/353961.patch"; #R_asb_2023-04 Fix an OOB bug in register_notification_rsp -applyPatch "$DOS_PATCHES/android_system_bt/358580.patch"; #R_asb_2023-06 Prevent use-after-free of HID reports -applyPatch "$DOS_PATCHES/android_system_bt/358581.patch"; #R_asb_2023-06 Revert "Revert "[RESTRICT AUTOMERGE] Validate buffer length in sdpu_build_uuid_seq"" -applyPatch "$DOS_PATCHES/android_system_bt/358582.patch"; #R_asb_2023-06 Revert "Revert "Fix wrong BR/EDR link key downgrades (P_256->P_192)"" applyPatch "$DOS_PATCHES_COMMON/android_system_bt/0001-alloc_size.patch"; #Add alloc_size attributes to the allocator (GrapheneOS) #applyPatch "$DOS_PATCHES/android_system_bt/272648.patch"; #ten-bt-sbc-hd-dualchannel: Increase maximum Bluetooth SBC codec bitrate for SBC HD (ValdikSS) #applyPatch "$DOS_PATCHES/android_system_bt/272649.patch"; #ten-bt-sbc-hd-dualchannel: Explicit SBC Dual Channel (SBC HD) support (ValdikSS) @@ -459,18 +387,6 @@ applyPatch "$DOS_PATCHES/android_system_netd/0001-Network_Permission.patch"; #Ex applyPatch "$DOS_PATCHES/android_system_netd/0002-hosts_toggle.patch"; #Add a toggle to disable /etc/hosts lookup (DivestOS) fi; -if enterAndClear "system/nfc"; then -applyPatch "$DOS_PATCHES/android_system_nfc/353962.patch"; #R_asb_2023-04 OOBW in nci_snd_set_routing_cmd() -fi; - -if enterAndClear "vendor/nxp/opensource/commonsys/external/libnfc-nci"; then -applyPatch "$DOS_PATCHES/android_vendor_nxp_opensource_commonsys_external_libnfc-nci/353963.patch"; #R_asb_2023-04 OOBW in nci_snd_set_routing_cmd() -fi; - -if enterAndClear "vendor/nxp/opensource/pn5xx/halimpl"; then -applyPatch "$DOS_PATCHES/android_vendor_nxp_opensource_pn5xx_halimpl/353964.patch"; #R_asb_2023-04 OOBW in nci_snd_set_routing_cmd() -fi; - if enterAndClear "system/sepolicy"; then applyPatch "$DOS_PATCHES/android_system_sepolicy/0002-protected_files.patch"; #label protected_{fifos,regular} as proc_security (GrapheneOS) applyPatch "$DOS_PATCHES/android_system_sepolicy/0003-ptrace_scope-1.patch"; #Allow init to control kernel.yama.ptrace_scope (GrapheneOS) @@ -510,18 +426,6 @@ if enter "vendor/divested"; then echo "PRODUCT_PACKAGES += vendor.lineage.trust@1.0-service" >> packages.mk; #Add deny usb service, all of our kernels have the necessary patch awk -i inplace '!/speed-profile/' build/target/product/lowram.mk; #breaks compile on some dexpreopt devices fi; - -if enterAndClear "vendor/qcom/opensource/commonsys/system/bt"; then -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/351448.patch"; #R_asb_2023-03 Fix an OOB Write bug in gatt_check_write_long_terminate -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/351449.patch"; #R_asb_2023-03 Fix an OOB access bug in A2DP_BuildMediaPayloadHeaderSbc -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/351450.patch"; #R_asb_2023-03 Fix an OOB write in SDP_AddAttribute -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/351451.patch"; #R_asb_2023-03 AVRCP: Fix potential buffer overflow -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/353967.patch"; #R_asb_2023-04 Fix an OOB bug in register_notification_rsp -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/353968.patch"; #R_asb_2023-04 AVDTP: Fix a potential overflow about the media payload offset -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/358583.patch"; #R_asb_2023-06 Prevent use-after-free of HID reports -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/358584.patch"; #R_asb_2023-06 Revert^2 "Validate buffer length in sdpu_build_uuid_seq" -applyPatch "$DOS_PATCHES/android_vendor_qcom_opensource_system_bt/358585.patch"; #R_asb_2023-06 Revert "Revert "Fix wrong BR/EDR link key downgrades (P_256->P_192)"" -fi; # #END OF ROM CHANGES # diff --git a/Scripts/LineageOS-18.1/Functions.sh b/Scripts/LineageOS-18.1/Functions.sh index bba7caa5..a8294472 100644 --- a/Scripts/LineageOS-18.1/Functions.sh +++ b/Scripts/LineageOS-18.1/Functions.sh @@ -114,11 +114,10 @@ patchWorkspaceReal() { verifyAllPlatformTags; gpgVerifyGitHead "$DOS_BUILD_BASE/external/chromium-webview"; - source build/envsetup.sh; + #source build/envsetup.sh; #repopick -it eleven-firewall; #repopick -i 314453; #TaskViewTouchController: Null check current animation on drag #repopick -i 325011; #lineage: Opt-in to shipping full recovery image by default - repopick -it R_asb_2023-06; sh "$DOS_SCRIPTS/Patch.sh"; sh "$DOS_SCRIPTS_COMMON/Enable_Verity.sh"; diff --git a/Scripts/LineageOS-19.1/Functions.sh b/Scripts/LineageOS-19.1/Functions.sh index c99717f4..ddbf9747 100644 --- a/Scripts/LineageOS-19.1/Functions.sh +++ b/Scripts/LineageOS-19.1/Functions.sh @@ -88,10 +88,9 @@ patchWorkspaceReal() { verifyAllPlatformTags; gpgVerifyGitHead "$DOS_BUILD_BASE/external/chromium-webview"; - source build/envsetup.sh; + #source build/envsetup.sh; #repopick -ift twelve-bt-sbc-hd-dualchannel; #repopick -it twelve-colors; - repopick -it S_asb_2023-06; sh "$DOS_SCRIPTS/Patch.sh"; sh "$DOS_SCRIPTS_COMMON/Enable_Verity.sh";