diff options
author | Elliot Sisteron <elliotsisteron@google.com> | 2023-07-12 17:31:11 +0000 |
---|---|---|
committer | Elliot Sisteron <elliotsisteron@google.com> | 2023-07-13 12:33:14 +0000 |
commit | 3d83dc97404f21e1b1f6284660c2f2ae30b0ccff (patch) | |
tree | 366e6fcb9d01af87c11a1071e7932c8a4755bc59 /service | |
parent | 8c645092da0d62e0cb297a23060edc6829848983 (diff) | |
download | Permission-3d83dc97404f21e1b1f6284660c2f2ae30b0ccff.tar.gz |
Include stopped packages for Safety Center user initiated broadcasts.
By default, stopped packages are excluded when sending a broadcast.
This is to avoid abuse for packages that wish to use system broadcasts
to get woken up.
This may cause issues in the case of Safety Center broadcasts,
as the user may open the UI while one of the target packages
is stopped.
In our case, all the packages we're targeting are known beforehand
(defined in a config file), so including stopped packages seems
adequate. We're also only doing that on user-initiated broadcasts
(page open or button click).
Bug: 283707833
Test: manual
Relnote: Refresh Safety Center for stopped packages too
Change-Id: Icb482fb4b6cdacd111f7b03df8911e1851126f15
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java b/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java index 4752ada4c..a36beb2d3 100644 --- a/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java +++ b/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java @@ -18,6 +18,7 @@ package com.android.safetycenter; import static android.Manifest.permission.READ_SAFETY_CENTER_STATUS; import static android.Manifest.permission.SEND_SAFETY_CENTER_UPDATE; +import static android.content.Intent.FLAG_INCLUDE_STOPPED_PACKAGES; import static android.content.Intent.FLAG_RECEIVER_FOREGROUND; import static android.os.PowerExemptionManager.REASON_REFRESH_SAFETY_SOURCES; import static android.os.PowerExemptionManager.TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_ALLOWED; @@ -39,7 +40,6 @@ import android.os.Binder; import android.os.UserHandle; import android.safetycenter.SafetyCenterManager; import android.safetycenter.SafetyCenterManager.RefreshReason; -import android.safetycenter.SafetyCenterManager.RefreshRequestType; import android.safetycenter.SafetySourceData; import android.util.ArraySet; import android.util.Log; @@ -135,7 +135,6 @@ final class SafetyCenterBroadcastDispatcher { String broadcastId, @Nullable List<String> requiredSourceIds) { boolean hasSentAtLeastOneBroadcast = false; - int requestType = RefreshReasons.toRefreshRequestType(refreshReason); String packageName = broadcast.getPackageName(); Set<String> deniedSourceIds = getRefreshDeniedSourceIds(refreshReason); SparseArray<List<String>> userIdsToSourceIds = @@ -159,7 +158,7 @@ final class SafetyCenterBroadcastDispatcher { continue; } - Intent intent = createRefreshIntent(requestType, packageName, sourceIds, broadcastId); + Intent intent = createRefreshIntent(refreshReason, packageName, sourceIds, broadcastId); boolean broadcastWasSent = sendBroadcastIfResolves(intent, UserHandle.of(userId), broadcastOptions); if (broadcastWasSent) { @@ -280,20 +279,27 @@ final class SafetyCenterBroadcastDispatcher { } private static Intent createRefreshIntent( - @RefreshRequestType int requestType, + @RefreshReason int refreshReason, String packageName, List<String> sourceIdsToRefresh, String broadcastId) { String[] sourceIdsArray = sourceIdsToRefresh.toArray(new String[0]); - return createBroadcastIntent(ACTION_REFRESH_SAFETY_SOURCES) - .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE, requestType) - .putExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS, sourceIdsArray) - .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, broadcastId) - .setPackage(packageName); + int requestType = RefreshReasons.toRefreshRequestType(refreshReason); + Intent refreshIntent = + createBroadcastIntent(ACTION_REFRESH_SAFETY_SOURCES) + .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_REQUEST_TYPE, requestType) + .putExtra(EXTRA_REFRESH_SAFETY_SOURCE_IDS, sourceIdsArray) + .putExtra(EXTRA_REFRESH_SAFETY_SOURCES_BROADCAST_ID, broadcastId) + .setPackage(packageName); + boolean isUserInitiated = !RefreshReasons.isBackgroundRefresh(refreshReason); + if (isUserInitiated) { + return refreshIntent.addFlags(FLAG_INCLUDE_STOPPED_PACKAGES); + } + return refreshIntent; } private static Intent createBroadcastIntent(String intentAction) { - return new Intent(intentAction).setFlags(FLAG_RECEIVER_FOREGROUND); + return new Intent(intentAction).addFlags(FLAG_RECEIVER_FOREGROUND); } private static BroadcastOptions createBroadcastOptions() { |