Update ActivityIntentHelper to use PendingIntents directly am: 3ee3b7a20a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19285839

Change-Id: I3f54a52572868d487b54061685a1a0e16b5d0856
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
John Wu
2023-03-28 02:34:49 +00:00
committed by Automerger Merge Worker
5 changed files with 60 additions and 17 deletions

View File

@@ -16,6 +16,7 @@
package com.android.systemui; package com.android.systemui;
import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
@@ -34,12 +35,12 @@ import javax.inject.Inject;
@SysUISingleton @SysUISingleton
public class ActivityIntentHelper { public class ActivityIntentHelper {
private final Context mContext; private final PackageManager mPm;
@Inject @Inject
public ActivityIntentHelper(Context context) { public ActivityIntentHelper(Context context) {
// TODO: inject a package manager, not a context. // TODO: inject a package manager, not a context.
mContext = context; mPm = context.getPackageManager();
} }
/** /**
@@ -56,6 +57,15 @@ public class ActivityIntentHelper {
return targetActivityInfo == null; return targetActivityInfo == null;
} }
/**
* @see #wouldLaunchResolverActivity(Intent, int)
*/
public boolean wouldPendingLaunchResolverActivity(PendingIntent intent, int currentUserId) {
ActivityInfo targetActivityInfo = getPendingTargetActivityInfo(intent, currentUserId,
false /* onlyDirectBootAware */);
return targetActivityInfo == null;
}
/** /**
* Returns info about the target Activity of a given intent, or null if the intent does not * Returns info about the target Activity of a given intent, or null if the intent does not
* resolve to a specific component meeting the requirements. * resolve to a specific component meeting the requirements.
@@ -68,19 +78,45 @@ public class ActivityIntentHelper {
*/ */
public ActivityInfo getTargetActivityInfo(Intent intent, int currentUserId, public ActivityInfo getTargetActivityInfo(Intent intent, int currentUserId,
boolean onlyDirectBootAware) { boolean onlyDirectBootAware) {
PackageManager packageManager = mContext.getPackageManager(); int flags = PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA;
int flags = PackageManager.MATCH_DEFAULT_ONLY;
if (!onlyDirectBootAware) { if (!onlyDirectBootAware) {
flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE; | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
} }
final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser( final List<ResolveInfo> appList = mPm.queryIntentActivitiesAsUser(
intent, flags, currentUserId); intent, flags, currentUserId);
if (appList.size() == 0) { if (appList.size() == 0) {
return null; return null;
} }
ResolveInfo resolved = packageManager.resolveActivityAsUser(intent, if (appList.size() == 1) {
flags | PackageManager.GET_META_DATA, currentUserId); return appList.get(0).activityInfo;
}
ResolveInfo resolved = mPm.resolveActivityAsUser(intent, flags, currentUserId);
if (resolved == null || wouldLaunchResolverActivity(resolved, appList)) {
return null;
} else {
return resolved.activityInfo;
}
}
/**
* @see #getTargetActivityInfo(Intent, int, boolean)
*/
public ActivityInfo getPendingTargetActivityInfo(PendingIntent intent, int currentUserId,
boolean onlyDirectBootAware) {
int flags = PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA;
if (!onlyDirectBootAware) {
flags |= PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
}
final List<ResolveInfo> appList = intent.queryIntentComponents(flags);
if (appList.size() == 0) {
return null;
}
if (appList.size() == 1) {
return appList.get(0).activityInfo;
}
ResolveInfo resolved = mPm.resolveActivityAsUser(intent.getIntent(), flags, currentUserId);
if (resolved == null || wouldLaunchResolverActivity(resolved, appList)) { if (resolved == null || wouldLaunchResolverActivity(resolved, appList)) {
return null; return null;
} else { } else {
@@ -103,6 +139,17 @@ public class ActivityIntentHelper {
| ActivityInfo.FLAG_SHOW_FOR_ALL_USERS)) > 0; | ActivityInfo.FLAG_SHOW_FOR_ALL_USERS)) > 0;
} }
/**
* @see #wouldShowOverLockscreen(Intent, int)
*/
public boolean wouldPendingShowOverLockscreen(PendingIntent intent, int currentUserId) {
ActivityInfo targetActivityInfo = getPendingTargetActivityInfo(intent,
currentUserId, false /* onlyDirectBootAware */);
return targetActivityInfo != null
&& (targetActivityInfo.flags & (ActivityInfo.FLAG_SHOW_WHEN_LOCKED
| ActivityInfo.FLAG_SHOW_FOR_ALL_USERS)) > 0;
}
/** /**
* Determines if sending the given intent would result in starting an Intent resolver activity, * Determines if sending the given intent would result in starting an Intent resolver activity,
* instead of resolving to a specific component. * instead of resolving to a specific component.

View File

@@ -4117,7 +4117,7 @@ public class CentralSurfacesImpl extends CoreStartable implements
final PendingIntent intent, @Nullable final Runnable intentSentUiThreadCallback, final PendingIntent intent, @Nullable final Runnable intentSentUiThreadCallback,
@Nullable ActivityLaunchAnimator.Controller animationController) { @Nullable ActivityLaunchAnimator.Controller animationController) {
final boolean willLaunchResolverActivity = intent.isActivity() final boolean willLaunchResolverActivity = intent.isActivity()
&& mActivityIntentHelper.wouldLaunchResolverActivity(intent.getIntent(), && mActivityIntentHelper.wouldPendingLaunchResolverActivity(intent,
mLockscreenUserManager.getCurrentUserId()); mLockscreenUserManager.getCurrentUserId());
boolean animate = !willLaunchResolverActivity boolean animate = !willLaunchResolverActivity

View File

@@ -253,12 +253,12 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
boolean isActivityIntent = intent != null && intent.isActivity() && !isBubble; boolean isActivityIntent = intent != null && intent.isActivity() && !isBubble;
final boolean willLaunchResolverActivity = isActivityIntent final boolean willLaunchResolverActivity = isActivityIntent
&& mActivityIntentHelper.wouldLaunchResolverActivity(intent.getIntent(), && mActivityIntentHelper.wouldPendingLaunchResolverActivity(intent,
mLockscreenUserManager.getCurrentUserId()); mLockscreenUserManager.getCurrentUserId());
final boolean animate = !willLaunchResolverActivity final boolean animate = !willLaunchResolverActivity
&& mCentralSurfaces.shouldAnimateLaunch(isActivityIntent); && mCentralSurfaces.shouldAnimateLaunch(isActivityIntent);
boolean showOverLockscreen = mKeyguardStateController.isShowing() && intent != null boolean showOverLockscreen = mKeyguardStateController.isShowing() && intent != null
&& mActivityIntentHelper.wouldShowOverLockscreen(intent.getIntent(), && mActivityIntentHelper.wouldPendingShowOverLockscreen(intent,
mLockscreenUserManager.getCurrentUserId()); mLockscreenUserManager.getCurrentUserId());
ActivityStarter.OnDismissAction postKeyguardAction = new ActivityStarter.OnDismissAction() { ActivityStarter.OnDismissAction postKeyguardAction = new ActivityStarter.OnDismissAction() {
@Override @Override

View File

@@ -258,8 +258,9 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
final boolean isActivity = pendingIntent.isActivity(); final boolean isActivity = pendingIntent.isActivity();
if (isActivity || appRequestedAuth) { if (isActivity || appRequestedAuth) {
mActionClickLogger.logWaitingToCloseKeyguard(pendingIntent); mActionClickLogger.logWaitingToCloseKeyguard(pendingIntent);
final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity( final boolean afterKeyguardGone = mActivityIntentHelper
pendingIntent.getIntent(), mLockscreenUserManager.getCurrentUserId()); .wouldPendingLaunchResolverActivity(pendingIntent,
mLockscreenUserManager.getCurrentUserId());
mActivityStarter.dismissKeyguardThenExecute(() -> { mActivityStarter.dismissKeyguardThenExecute(() -> {
mActionClickLogger.logKeyguardGone(pendingIntent); mActionClickLogger.logKeyguardGone(pendingIntent);

View File

@@ -37,7 +37,6 @@ import android.app.KeyguardManager;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Intent;
import android.os.Handler; import android.os.Handler;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
@@ -137,8 +136,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
@Mock @Mock
private PendingIntent mContentIntent; private PendingIntent mContentIntent;
@Mock @Mock
private Intent mContentIntentInner;
@Mock
private OnUserInteractionCallback mOnUserInteractionCallback; private OnUserInteractionCallback mOnUserInteractionCallback;
@Mock @Mock
private Runnable mFutureDismissalRunnable; private Runnable mFutureDismissalRunnable;
@@ -163,7 +160,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mContentIntent.isActivity()).thenReturn(true); when(mContentIntent.isActivity()).thenReturn(true);
when(mContentIntent.getCreatorUserHandle()).thenReturn(UserHandle.of(1)); when(mContentIntent.getCreatorUserHandle()).thenReturn(UserHandle.of(1));
when(mContentIntent.getIntent()).thenReturn(mContentIntentInner);
mNotificationTestHelper = new NotificationTestHelper( mNotificationTestHelper = new NotificationTestHelper(
mContext, mContext,
@@ -387,7 +383,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
eq(entry.getKey()), any(NotificationVisibility.class)); eq(entry.getKey()), any(NotificationVisibility.class));
// The content intent should NOT be sent on click. // The content intent should NOT be sent on click.
verify(mContentIntent).getIntent();
verify(mContentIntent).isActivity(); verify(mContentIntent).isActivity();
verifyNoMoreInteractions(mContentIntent); verifyNoMoreInteractions(mContentIntent);