summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;