summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuprabh Shukla <suprabh@google.com>2018-05-10 15:54:08 -0700
committerSuprabh Shukla <suprabh@google.com>2018-05-11 14:24:54 -0700
commit1ab90a2ed5262633dd1ce9fbddb9b6536f83b441 (patch)
tree5cc7b7730a769c6b2f6b70421bf44913c4eae835
parent1b69d7b40661640bbcbe9b456de8b8c21aefee37 (diff)
Fixing user tap on suspended widget
Widgets get masked with separate remove views when suspended. Need to update them with the correct pending intent. Moved around the logic creating the suspended alert activity to make it reusable. Test: Manually, "pm suspend <app-with-widget>", followed by tap on widget Existing tests pass: atest GtsSuspendAppsTestCases atest com.android.server.am.ActivityStartInterceptorTest Bug: 79474038 Change-Id: Ic75ee762434bf92c54bda307e9cb6018f94a914c
-rw-r--r--core/java/com/android/internal/app/SuspendedAppActivity.java51
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java19
-rw-r--r--services/core/java/com/android/server/am/ActivityStartInterceptor.java30
3 files changed, 58 insertions, 42 deletions
diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java
index 25af3557e354..f42a195f001f 100644
--- a/core/java/com/android/internal/app/SuspendedAppActivity.java
+++ b/core/java/com/android/internal/app/SuspendedAppActivity.java
@@ -16,10 +16,12 @@
package com.android.internal.app;
+import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.Slog;
@@ -30,35 +32,47 @@ import com.android.internal.R;
public class SuspendedAppActivity extends AlertActivity
implements DialogInterface.OnClickListener {
private static final String TAG = "SuspendedAppActivity";
-
public static final String EXTRA_SUSPENDED_PACKAGE =
"SuspendedAppActivity.extra.SUSPENDED_PACKAGE";
public static final String EXTRA_SUSPENDING_PACKAGE =
"SuspendedAppActivity.extra.SUSPENDING_PACKAGE";
public static final String EXTRA_DIALOG_MESSAGE = "SuspendedAppActivity.extra.DIALOG_MESSAGE";
- public static final String EXTRA_MORE_DETAILS_INTENT =
- "SuspendedAppActivity.extra.MORE_DETAILS_INTENT";
private Intent mMoreDetailsIntent;
private int mUserId;
+ private PackageManager mPm;
private CharSequence getAppLabel(String packageName) {
- final PackageManager pm = getPackageManager();
try {
- return pm.getApplicationInfoAsUser(packageName, 0, mUserId).loadLabel(pm);
+ return mPm.getApplicationInfoAsUser(packageName, 0, mUserId).loadLabel(mPm);
} catch (PackageManager.NameNotFoundException ne) {
Slog.e(TAG, "Package " + packageName + " not found", ne);
}
return packageName;
}
+ private Intent getMoreDetailsActivity(String suspendingPackage, String suspendedPackage,
+ int userId) {
+ final Intent moreDetailsIntent = new Intent(Intent.ACTION_SHOW_SUSPENDED_APP_DETAILS)
+ .setPackage(suspendingPackage);
+ final String requiredPermission = Manifest.permission.SEND_SHOW_SUSPENDED_APP_DETAILS;
+ final ResolveInfo resolvedInfo = mPm.resolveActivityAsUser(moreDetailsIntent, 0, userId);
+ if (resolvedInfo != null && resolvedInfo.activityInfo != null
+ && requiredPermission.equals(resolvedInfo.activityInfo.permission)) {
+ moreDetailsIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, suspendedPackage)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return moreDetailsIntent;
+ }
+ return null;
+ }
+
@Override
public void onCreate(Bundle icicle) {
- getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
super.onCreate(icicle);
+ mPm = getPackageManager();
+ getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG);
final Intent intent = getIntent();
- mMoreDetailsIntent = intent.getParcelableExtra(EXTRA_MORE_DETAILS_INTENT);
mUserId = intent.getIntExtra(Intent.EXTRA_USER_ID, -1);
if (mUserId < 0) {
Slog.wtf(TAG, "Invalid user: " + mUserId);
@@ -66,13 +80,13 @@ public class SuspendedAppActivity extends AlertActivity
return;
}
final String suppliedMessage = intent.getStringExtra(EXTRA_DIALOG_MESSAGE);
- final CharSequence suspendedAppLabel = getAppLabel(
- intent.getStringExtra(EXTRA_SUSPENDED_PACKAGE));
+ final String suspendedPackage = intent.getStringExtra(EXTRA_SUSPENDED_PACKAGE);
+ final String suspendingPackage = intent.getStringExtra(EXTRA_SUSPENDING_PACKAGE);
+ final CharSequence suspendedAppLabel = getAppLabel(suspendedPackage);
final CharSequence dialogMessage;
if (suppliedMessage == null) {
- dialogMessage = getString(R.string.app_suspended_default_message,
- suspendedAppLabel,
- getAppLabel(intent.getStringExtra(EXTRA_SUSPENDING_PACKAGE)));
+ dialogMessage = getString(R.string.app_suspended_default_message, suspendedAppLabel,
+ getAppLabel(suspendingPackage));
} else {
dialogMessage = String.format(getResources().getConfiguration().getLocales().get(0),
suppliedMessage, suspendedAppLabel);
@@ -82,6 +96,7 @@ public class SuspendedAppActivity extends AlertActivity
ap.mTitle = getString(R.string.app_suspended_title);
ap.mMessage = dialogMessage;
ap.mPositiveButtonText = getString(android.R.string.ok);
+ mMoreDetailsIntent = getMoreDetailsActivity(suspendingPackage, suspendedPackage, mUserId);
if (mMoreDetailsIntent != null) {
ap.mNeutralButtonText = getString(R.string.app_suspended_more_details);
}
@@ -99,4 +114,16 @@ public class SuspendedAppActivity extends AlertActivity
}
finish();
}
+
+ public static Intent createSuspendedAppInterceptIntent(String suspendedPackage,
+ String suspendingPackage, String dialogMessage, int userId) {
+ return new Intent()
+ .setClassName("android", SuspendedAppActivity.class.getName())
+ .putExtra(EXTRA_SUSPENDED_PACKAGE, suspendedPackage)
+ .putExtra(EXTRA_DIALOG_MESSAGE, dialogMessage)
+ .putExtra(EXTRA_SUSPENDING_PACKAGE, suspendingPackage)
+ .putExtra(Intent.EXTRA_USER_ID, userId)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ }
}
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index f992049ef1fb..8d2d4a31efc5 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -20,6 +20,8 @@ import static android.content.Context.KEYGUARD_SERVICE;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
+
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AlarmManager;
@@ -50,6 +52,7 @@ import android.content.pm.LauncherApps;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
@@ -96,6 +99,7 @@ import android.view.WindowManager;
import android.widget.RemoteViews;
import com.android.internal.R;
+import com.android.internal.app.SuspendedAppActivity;
import com.android.internal.app.UnlaunchableAppActivity;
import com.android.internal.appwidget.IAppWidgetHost;
import com.android.internal.appwidget.IAppWidgetService;
@@ -228,6 +232,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
private AppOpsManager mAppOpsManager;
private KeyguardManager mKeyguardManager;
private DevicePolicyManagerInternal mDevicePolicyManagerInternal;
+ private PackageManagerInternal mPackageManagerInternal;
private SecurityPolicy mSecurityPolicy;
@@ -254,6 +259,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mKeyguardManager = (KeyguardManager) mContext.getSystemService(KEYGUARD_SERVICE);
mDevicePolicyManagerInternal = LocalServices.getService(DevicePolicyManagerInternal.class);
+ mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mSaveStateHandler = BackgroundThread.getHandler();
mCallbackHandler = new CallbackHandler(mContext.getMainLooper());
mBackupRestoreController = new BackupRestoreController();
@@ -620,8 +626,17 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
if (provider.maskedBySuspendedPackage) {
UserInfo userInfo = mUserManager.getUserInfo(providerUserId);
showBadge = userInfo.isManagedProfile();
- onClickIntent = mDevicePolicyManagerInternal.createShowAdminSupportIntent(
- providerUserId, true);
+ final String suspendingPackage = mPackageManagerInternal.getSuspendingPackage(
+ providerPackage, providerUserId);
+ if (PLATFORM_PACKAGE_NAME.equals(suspendingPackage)) {
+ onClickIntent = mDevicePolicyManagerInternal.createShowAdminSupportIntent(
+ providerUserId, true);
+ } else {
+ final String dialogMessage = mPackageManagerInternal.getSuspendedDialogMessage(
+ providerPackage, providerUserId);
+ onClickIntent = SuspendedAppActivity.createSuspendedAppInterceptIntent(
+ providerPackage, suspendingPackage, dialogMessage, providerUserId);
+ }
} else if (provider.maskedByQuietProfile) {
showBadge = true;
onClickIntent = UnlaunchableAppActivity.createInQuietModeDialogIntent(
diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
index 8c3ff34aa73d..ff97db83766e 100644
--- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java
+++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
@@ -34,7 +34,6 @@ import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
-import android.Manifest;
import android.app.ActivityOptions;
import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManagerInternal;
@@ -233,31 +232,6 @@ class ActivityStartInterceptor {
return true;
}
- private Intent createSuspendedAppInterceptIntent(String suspendedPackage,
- String suspendingPackage, String dialogMessage, int userId) {
- final Intent interceptIntent = new Intent(mServiceContext, SuspendedAppActivity.class)
- .putExtra(SuspendedAppActivity.EXTRA_SUSPENDED_PACKAGE, suspendedPackage)
- .putExtra(SuspendedAppActivity.EXTRA_DIALOG_MESSAGE, dialogMessage)
- .putExtra(SuspendedAppActivity.EXTRA_SUSPENDING_PACKAGE, suspendingPackage)
- .putExtra(Intent.EXTRA_USER_ID, userId)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-
- final Intent moreDetailsIntent = new Intent(Intent.ACTION_SHOW_SUSPENDED_APP_DETAILS)
- .setPackage(suspendingPackage);
- final String requiredPermission = Manifest.permission.SEND_SHOW_SUSPENDED_APP_DETAILS;
- final ResolveInfo resolvedInfo = mSupervisor.resolveIntent(moreDetailsIntent, null, userId,
- 0, mRealCallingUid);
- if (resolvedInfo != null && resolvedInfo.activityInfo != null
- && requiredPermission.equals(resolvedInfo.activityInfo.permission)) {
- moreDetailsIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, suspendedPackage)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- interceptIntent.putExtra(SuspendedAppActivity.EXTRA_MORE_DETAILS_INTENT,
- moreDetailsIntent);
- }
- return interceptIntent;
- }
-
private boolean interceptSuspendedPackageIfNeeded() {
// Do not intercept if the package is not suspended
if (mAInfo == null || mAInfo.applicationInfo == null ||
@@ -274,8 +248,8 @@ class ActivityStartInterceptor {
return interceptSuspendedByAdminPackage();
}
final String dialogMessage = pmi.getSuspendedDialogMessage(suspendedPackage, mUserId);
- mIntent = createSuspendedAppInterceptIntent(suspendedPackage, suspendingPackage,
- dialogMessage, mUserId);
+ mIntent = SuspendedAppActivity.createSuspendedAppInterceptIntent(suspendedPackage,
+ suspendingPackage, dialogMessage, mUserId);
mCallingPid = mRealCallingPid;
mCallingUid = mRealCallingUid;
mResolvedType = null;