diff options
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; |