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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user