diff options
author | 2022-11-24 19:13:18 +0000 | |
---|---|---|
committer | 2022-11-24 19:13:18 +0000 | |
commit | 2b004288df161d58f15165f12ff54a6d989f49cf (patch) | |
tree | c6eada27284568eeb46fc9df7cf8ed4cd21cd307 | |
parent | e4d814650a6752c1f2106456dbb2050f85bb39ff (diff) | |
parent | 2b8a1b5b66473c7403df432f0cf4fcf3fc7c5ef4 (diff) |
Merge "Handle static safety sources package name."
3 files changed, 45 insertions, 15 deletions
diff --git a/service/java/com/android/safetycenter/PendingIntentFactory.java b/service/java/com/android/safetycenter/PendingIntentFactory.java index 11afb12cf..6ae9df608 100644 --- a/service/java/com/android/safetycenter/PendingIntentFactory.java +++ b/service/java/com/android/safetycenter/PendingIntentFactory.java @@ -26,6 +26,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.ResolveInfoFlags; import android.content.res.Resources; import android.os.Binder; import android.os.UserHandle; @@ -34,7 +35,6 @@ import android.util.Log; import androidx.annotation.RequiresApi; -import com.android.permission.util.PackageUtils; import com.android.safetycenter.resources.SafetyCenterResourcesContext; import java.util.Arrays; @@ -92,8 +92,7 @@ final class PendingIntentFactory { if (packageContext == null) { return null; } - Intent intent = - createIntent(sourceId, intentAction, packageName, userId, isQuietModeEnabled); + Intent intent = createIntent(packageContext, sourceId, intentAction, isQuietModeEnabled); if (intent == null) { return null; } @@ -208,10 +207,9 @@ final class PendingIntentFactory { @Nullable private Intent createIntent( + @NonNull Context packageContext, @NonNull String sourceId, @NonNull String intentAction, - @NonNull String packageName, - @UserIdInt int userId, boolean isQuietModeEnabled) { Intent intent = new Intent(intentAction); @@ -231,11 +229,11 @@ final class PendingIntentFactory { if (isQuietModeEnabled) { return intent; } - if (intentResolves(intent, userId)) { + if (intentResolves(packageContext, intent)) { return intent; } - intent.setPackage(packageName); - if (intentResolves(intent, userId)) { + intent.setPackage(packageContext.getPackageName()); + if (intentResolves(packageContext, intent)) { return intent; } return null; @@ -249,8 +247,10 @@ final class PendingIntentFactory { .contains(sourceId); } - private boolean intentResolves(@NonNull Intent intent, @UserIdInt int userId) { - return !PackageUtils.queryUnfilteredIntentActivitiesAsUser(intent, 0, userId, mContext) + private static boolean intentResolves(@NonNull Context packageContext, @NonNull Intent intent) { + return !packageContext + .getPackageManager() + .queryIntentActivities(intent, ResolveInfoFlags.of(0)) .isEmpty(); } diff --git a/service/java/com/android/safetycenter/SafetyCenterDataFactory.java b/service/java/com/android/safetycenter/SafetyCenterDataFactory.java index 0bfc463f7..734273a3d 100644 --- a/service/java/com/android/safetycenter/SafetyCenterDataFactory.java +++ b/service/java/com/android/safetycenter/SafetyCenterDataFactory.java @@ -687,7 +687,7 @@ final class SafetyCenterDataFactory { case SafetySource.SAFETY_SOURCE_TYPE_STATIC: return toDefaultSafetyCenterEntry( safetySource, - defaultPackageName, + getStaticSourcePackageNameOrDefault(safetySource, defaultPackageName), SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED, SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_ICON, userId, @@ -868,7 +868,7 @@ final class SafetyCenterDataFactory { case SafetySource.SAFETY_SOURCE_TYPE_STATIC: return toDefaultSafetyCenterStaticEntry( safetySource, - defaultPackageName, + getStaticSourcePackageNameOrDefault(safetySource, defaultPackageName), userId, isUserManaged, isManagedUserRunning); @@ -934,6 +934,19 @@ final class SafetyCenterDataFactory { return safetySourceData.getStatus(); } + @NonNull + private static String getStaticSourcePackageNameOrDefault( + @NonNull SafetySource safetySource, @NonNull String defaultPackageName) { + if (!SdkLevel.isAtLeastU()) { + return defaultPackageName; + } + String sourcePackageName = safetySource.getOptionalPackageName(); + if (sourcePackageName == null) { + return defaultPackageName; + } + return sourcePackageName; + } + @SafetyCenterStatus.OverallSeverityLevel private static int toSafetyCenterStatusOverallSeverityLevel( @SafetySourceData.SeverityLevel int safetySourceSeverityLevel) { diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetySourceCtsData.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetySourceCtsData.kt index 7d4a70166..99a123b53 100644 --- a/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetySourceCtsData.kt +++ b/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetySourceCtsData.kt @@ -20,6 +20,7 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.content.Intent.FLAG_RECEIVER_FOREGROUND +import android.content.pm.PackageManager.ResolveInfoFlags import android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE import android.safetycenter.SafetyEvent import android.safetycenter.SafetySourceData @@ -40,6 +41,7 @@ import android.safetycenter.cts.testing.SafetySourceIntentHandler.Companion.EXTR import android.safetycenter.cts.testing.SafetySourceIntentHandler.Companion.EXTRA_SOURCE_ISSUE_ACTION_ID import android.safetycenter.cts.testing.SafetySourceIntentHandler.Companion.EXTRA_SOURCE_ISSUE_ID import androidx.annotation.RequiresApi +import java.lang.IllegalStateException import kotlin.math.max /** @@ -590,8 +592,23 @@ class SafetySourceCtsData(private val context: Context) { } /** Returns a [PendingIntent] that redirects to [intent]. */ - fun createRedirectPendingIntent(context: Context, intent: Intent): PendingIntent = - PendingIntent.getActivity( - context, 0 /* requestCode */, intent, PendingIntent.FLAG_IMMUTABLE) + fun createRedirectPendingIntent(context: Context, intent: Intent): PendingIntent { + val explicitIntent = Intent(intent).setPackage(context.packageName) + val redirectIntent = + if (intentResolves(context, intent)) { + intent + } else if (intentResolves(context, explicitIntent)) { + explicitIntent + } else { + throw IllegalStateException("Intent doesn't resolve") + } + return PendingIntent.getActivity( + context, 0 /* requestCode */, redirectIntent, PendingIntent.FLAG_IMMUTABLE) + } + + private fun intentResolves(context: Context, intent: Intent): Boolean = + context.packageManager + .queryIntentActivities(intent, ResolveInfoFlags.of(0)) + .isNotEmpty() } } |