Skip to content
Snippets Groups Projects
Commit 3ee3b7a2 authored by John Wu's avatar John Wu Committed by Beth Thibodeau
Browse files

Update ActivityIntentHelper to use PendingIntents directly

Use PendingIntent.queryIntentComponents to query components instead of
going through the intent contained. This allows package manager to
properly determine the identity to perform the intent resolution.

Bug: 238415222
Bug: 271845008
Test: manual
Change-Id: I0dd32765755732a7a9141e3be2b04b7eed696928
Merged-In: I0dd32765755732a7a9141e3be2b04b7eed696928
parent eba590b2
No related branches found
No related tags found
No related merge requests found
......@@ -16,6 +16,7 @@
package com.android.systemui;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
......@@ -34,12 +35,12 @@ import javax.inject.Inject;
@SysUISingleton
public class ActivityIntentHelper {
private final Context mContext;
private final PackageManager mPm;
@Inject
public ActivityIntentHelper(Context context) {
// TODO: inject a package manager, not a context.
mContext = context;
mPm = context.getPackageManager();
}
/**
......@@ -56,6 +57,15 @@ public class ActivityIntentHelper {
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
* resolve to a specific component meeting the requirements.
......@@ -68,19 +78,45 @@ public class ActivityIntentHelper {
*/
public ActivityInfo getTargetActivityInfo(Intent intent, int currentUserId,
boolean onlyDirectBootAware) {
PackageManager packageManager = mContext.getPackageManager();
int flags = PackageManager.MATCH_DEFAULT_ONLY;
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 = packageManager.queryIntentActivitiesAsUser(
final List<ResolveInfo> appList = mPm.queryIntentActivitiesAsUser(
intent, flags, currentUserId);
if (appList.size() == 0) {
return null;
}
ResolveInfo resolved = packageManager.resolveActivityAsUser(intent,
flags | PackageManager.GET_META_DATA, currentUserId);
if (appList.size() == 1) {
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)) {
return null;
} else {
......@@ -103,6 +139,17 @@ public class ActivityIntentHelper {
| 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,
* instead of resolving to a specific component.
......
......@@ -4117,7 +4117,7 @@ public class CentralSurfacesImpl extends CoreStartable implements
final PendingIntent intent, @Nullable final Runnable intentSentUiThreadCallback,
@Nullable ActivityLaunchAnimator.Controller animationController) {
final boolean willLaunchResolverActivity = intent.isActivity()
&& mActivityIntentHelper.wouldLaunchResolverActivity(intent.getIntent(),
&& mActivityIntentHelper.wouldPendingLaunchResolverActivity(intent,
mLockscreenUserManager.getCurrentUserId());
boolean animate = !willLaunchResolverActivity
......
......@@ -253,12 +253,12 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
boolean isActivityIntent = intent != null && intent.isActivity() && !isBubble;
final boolean willLaunchResolverActivity = isActivityIntent
&& mActivityIntentHelper.wouldLaunchResolverActivity(intent.getIntent(),
&& mActivityIntentHelper.wouldPendingLaunchResolverActivity(intent,
mLockscreenUserManager.getCurrentUserId());
final boolean animate = !willLaunchResolverActivity
&& mCentralSurfaces.shouldAnimateLaunch(isActivityIntent);
boolean showOverLockscreen = mKeyguardStateController.isShowing() && intent != null
&& mActivityIntentHelper.wouldShowOverLockscreen(intent.getIntent(),
&& mActivityIntentHelper.wouldPendingShowOverLockscreen(intent,
mLockscreenUserManager.getCurrentUserId());
ActivityStarter.OnDismissAction postKeyguardAction = new ActivityStarter.OnDismissAction() {
@Override
......
......@@ -258,8 +258,9 @@ public class StatusBarRemoteInputCallback implements Callback, Callbacks,
final boolean isActivity = pendingIntent.isActivity();
if (isActivity || appRequestedAuth) {
mActionClickLogger.logWaitingToCloseKeyguard(pendingIntent);
final boolean afterKeyguardGone = mActivityIntentHelper.wouldLaunchResolverActivity(
pendingIntent.getIntent(), mLockscreenUserManager.getCurrentUserId());
final boolean afterKeyguardGone = mActivityIntentHelper
.wouldPendingLaunchResolverActivity(pendingIntent,
mLockscreenUserManager.getCurrentUserId());
mActivityStarter.dismissKeyguardThenExecute(() -> {
mActionClickLogger.logKeyguardGone(pendingIntent);
......
......@@ -37,7 +37,6 @@ import android.app.KeyguardManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
......@@ -137,8 +136,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
@Mock
private PendingIntent mContentIntent;
@Mock
private Intent mContentIntentInner;
@Mock
private OnUserInteractionCallback mOnUserInteractionCallback;
@Mock
private Runnable mFutureDismissalRunnable;
......@@ -163,7 +160,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this);
when(mContentIntent.isActivity()).thenReturn(true);
when(mContentIntent.getCreatorUserHandle()).thenReturn(UserHandle.of(1));
when(mContentIntent.getIntent()).thenReturn(mContentIntentInner);
mNotificationTestHelper = new NotificationTestHelper(
mContext,
......@@ -387,7 +383,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
eq(entry.getKey()), any(NotificationVisibility.class));
// The content intent should NOT be sent on click.
verify(mContentIntent).getIntent();
verify(mContentIntent).isActivity();
verifyNoMoreInteractions(mContentIntent);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment