diff options
| author | TreeHugger Robot <treehugger-gerrit@google.com> | 2019-09-30 22:43:18 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-09-30 22:43:18 +0000 |
| commit | 0617359e5a672f23ea1e949ca37cde4f3cb101a6 (patch) | |
| tree | dbd585472ed787338ffeea1c6e4faa41012098cd /core/java/android | |
| parent | 6c32679a3528bec9f50f4b2d503dc9aaf3171598 (diff) | |
| parent | d3278449d7d4d2a56d688fc27bb0c3eb36fb8ed2 (diff) | |
Merge "Allowing more than one app to suspend apps"
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 5 | ||||
| -rw-r--r-- | core/java/android/content/Intent.java | 11 | ||||
| -rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 3 | ||||
| -rw-r--r-- | core/java/android/content/pm/LauncherApps.java | 4 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManagerInternal.java | 4 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageUserState.java | 197 |
6 files changed, 186 insertions, 38 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index d74399c54bda..a2013075b379 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2414,14 +2414,11 @@ public class ApplicationPackageManager extends PackageManager { @Override public Bundle getSuspendedPackageAppExtras() { - final PersistableBundle extras; try { - extras = mPM.getSuspendedPackageAppExtras(mContext.getOpPackageName(), - getUserId()); + return mPM.getSuspendedPackageAppExtras(mContext.getOpPackageName(), getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - return extras != null ? new Bundle(extras.deepCopy()) : null; } @Override diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 72204daf01ef..39ddc82e9269 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2025,17 +2025,6 @@ public class Intent implements Parcelable, Cloneable { public static final String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED"; /** - * Intent extra: A {@link Bundle} of extras supplied for the launcher when any packages on - * device are suspended. Will be sent with {@link #ACTION_PACKAGES_SUSPENDED}. - * - * @see PackageManager#isPackageSuspended() - * @see #ACTION_PACKAGES_SUSPENDED - * - * @hide - */ - public static final String EXTRA_LAUNCHER_EXTRAS = "android.intent.extra.LAUNCHER_EXTRAS"; - - /** * Intent extra: ID of the shortcut used to send the share intent. Will be sent with * {@link #ACTION_SEND}. * diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index c6beee2f898a..4d7c43ace923 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -50,6 +50,7 @@ import android.content.pm.VersionedPackage; import android.content.pm.dex.IArtManager; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.PersistableBundle; import android.content.IntentSender; @@ -280,7 +281,7 @@ interface IPackageManager { boolean isPackageSuspendedForUser(String packageName, int userId); - PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId); + Bundle getSuspendedPackageAppExtras(String packageName, int userId); /** * Backup/restore support - only the system uid may use these. diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 3933e81c732a..d2a40304e078 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -248,7 +248,11 @@ public class LauncherApps { * system, {@code null} otherwise. * @see PackageManager#isPackageSuspended() * @see #getSuspendedPackageLauncherExtras(String, UserHandle) + * @deprecated {@code launcherExtras} should be obtained by using + * {@link #getSuspendedPackageLauncherExtras(String, UserHandle)}. For all other cases, + * {@link #onPackagesSuspended(String[], UserHandle)} should be used. */ + @Deprecated public void onPackagesSuspended(String[] packageNames, UserHandle user, @Nullable Bundle launcherExtras) { onPackagesSuspended(packageNames, user); diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 746549814c8d..6adf0387bb4c 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -193,11 +193,13 @@ public abstract class PackageManagerInternal { * suspended application. * * @param suspendedPackage The package that has been suspended. + * @param suspendingPackage * @param userId The user for which to check. * @return A {@link SuspendDialogInfo} object describing the dialog to be shown. */ @Nullable - public abstract SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, int userId); + public abstract SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, + String suspendingPackage, int userId); /** * Gets any distraction flags set via diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java index b271ccdad041..55574c3cb880 100644 --- a/core/java/android/content/pm/PackageUserState.java +++ b/core/java/android/content/pm/PackageUserState.java @@ -32,6 +32,7 @@ import android.content.pm.parsing.ComponentParseUtils; import android.os.BaseBundle; import android.os.Debug; import android.os.PersistableBundle; +import android.util.ArrayMap; import android.util.ArraySet; import android.util.DebugUtils; import android.util.Slog; @@ -39,6 +40,11 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.IOException; import java.util.Arrays; import java.util.Objects; @@ -57,10 +63,7 @@ public class PackageUserState { public boolean hidden; // Is the app restricted by owner / admin public int distractionFlags; public boolean suspended; - public String suspendingPackage; - public SuspendDialogInfo dialogInfo; - public PersistableBundle suspendedAppExtras; - public PersistableBundle suspendedLauncherExtras; + public ArrayMap<String, SuspendParams> suspendParams; // Suspending package to suspend params public boolean instantApp; public boolean virtualPreload; public int enabled; @@ -96,10 +99,7 @@ public class PackageUserState { hidden = o.hidden; distractionFlags = o.distractionFlags; suspended = o.suspended; - suspendingPackage = o.suspendingPackage; - dialogInfo = o.dialogInfo; - suspendedAppExtras = o.suspendedAppExtras; - suspendedLauncherExtras = o.suspendedLauncherExtras; + suspendParams = new ArrayMap<>(o.suspendParams); instantApp = o.instantApp; virtualPreload = o.virtualPreload; enabled = o.enabled; @@ -263,19 +263,7 @@ public class PackageUserState { return false; } if (suspended) { - if (suspendingPackage == null - || !suspendingPackage.equals(oldState.suspendingPackage)) { - return false; - } - if (!Objects.equals(dialogInfo, oldState.dialogInfo)) { - return false; - } - if (!BaseBundle.kindofEquals(suspendedAppExtras, - oldState.suspendedAppExtras)) { - return false; - } - if (!BaseBundle.kindofEquals(suspendedLauncherExtras, - oldState.suspendedLauncherExtras)) { + if (!Objects.equals(suspendParams, oldState.suspendParams)) { return false; } } @@ -340,4 +328,171 @@ public class PackageUserState { } return true; } + + @Override + public int hashCode() { + int hashCode = Long.hashCode(ceDataInode); + hashCode = 31 * hashCode + Boolean.hashCode(installed); + hashCode = 31 * hashCode + Boolean.hashCode(stopped); + hashCode = 31 * hashCode + Boolean.hashCode(notLaunched); + hashCode = 31 * hashCode + Boolean.hashCode(hidden); + hashCode = 31 * hashCode + distractionFlags; + hashCode = 31 * hashCode + Boolean.hashCode(suspended); + hashCode = 31 * hashCode + Objects.hashCode(suspendParams); + hashCode = 31 * hashCode + Boolean.hashCode(instantApp); + hashCode = 31 * hashCode + Boolean.hashCode(virtualPreload); + hashCode = 31 * hashCode + enabled; + hashCode = 31 * hashCode + Objects.hashCode(lastDisableAppCaller); + hashCode = 31 * hashCode + domainVerificationStatus; + hashCode = 31 * hashCode + appLinkGeneration; + hashCode = 31 * hashCode + categoryHint; + hashCode = 31 * hashCode + installReason; + hashCode = 31 * hashCode + Objects.hashCode(disabledComponents); + hashCode = 31 * hashCode + Objects.hashCode(enabledComponents); + hashCode = 31 * hashCode + Objects.hashCode(harmfulAppWarning); + return hashCode; + } + + /** + * Container to describe suspension parameters. + */ + public static final class SuspendParams { + private static final String TAG_DIALOG_INFO = "dialog-info"; + private static final String TAG_APP_EXTRAS = "app-extras"; + private static final String TAG_LAUNCHER_EXTRAS = "launcher-extras"; + + public SuspendDialogInfo dialogInfo; + public PersistableBundle appExtras; + public PersistableBundle launcherExtras; + + private SuspendParams() { + } + + /** + * Returns a {@link SuspendParams} object with the given fields. Returns {@code null} if all + * the fields are {@code null}. + * + * @param dialogInfo + * @param appExtras + * @param launcherExtras + * @return A {@link SuspendParams} object or {@code null}. + */ + public static SuspendParams getInstanceOrNull(SuspendDialogInfo dialogInfo, + PersistableBundle appExtras, PersistableBundle launcherExtras) { + if (dialogInfo == null && appExtras == null && launcherExtras == null) { + return null; + } + final SuspendParams instance = new SuspendParams(); + instance.dialogInfo = dialogInfo; + instance.appExtras = appExtras; + instance.launcherExtras = launcherExtras; + return instance; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof SuspendParams)) { + return false; + } + final SuspendParams other = (SuspendParams) obj; + if (!Objects.equals(dialogInfo, other.dialogInfo)) { + return false; + } + if (!BaseBundle.kindofEquals(appExtras, other.appExtras)) { + return false; + } + if (!BaseBundle.kindofEquals(launcherExtras, other.launcherExtras)) { + return false; + } + return true; + } + + @Override + public int hashCode() { + int hashCode = Objects.hashCode(dialogInfo); + hashCode = 31 * hashCode + ((appExtras != null) ? appExtras.size() : 0); + hashCode = 31 * hashCode + ((launcherExtras != null) ? launcherExtras.size() : 0); + return hashCode; + } + + /** + * Serializes this object into an xml format + * @param out the {@link XmlSerializer} object + * @throws IOException + */ + public void saveToXml(XmlSerializer out) throws IOException { + if (dialogInfo != null) { + out.startTag(null, TAG_DIALOG_INFO); + dialogInfo.saveToXml(out); + out.endTag(null, TAG_DIALOG_INFO); + } + if (appExtras != null) { + out.startTag(null, TAG_APP_EXTRAS); + try { + appExtras.saveToXml(out); + } catch (XmlPullParserException e) { + Slog.e(LOG_TAG, "Exception while trying to write appExtras." + + " Will be lost on reboot", e); + } + out.endTag(null, TAG_APP_EXTRAS); + } + if (launcherExtras != null) { + out.startTag(null, TAG_LAUNCHER_EXTRAS); + try { + launcherExtras.saveToXml(out); + } catch (XmlPullParserException e) { + Slog.e(LOG_TAG, "Exception while trying to write launcherExtras." + + " Will be lost on reboot", e); + } + out.endTag(null, TAG_LAUNCHER_EXTRAS); + } + } + + /** + * Parses this object from the xml format. Returns {@code null} if no object related + * information could be read. + * @param in the reader + * @return + */ + public static SuspendParams restoreFromXml(XmlPullParser in) throws IOException { + SuspendDialogInfo readDialogInfo = null; + PersistableBundle readAppExtras = null; + PersistableBundle readLauncherExtras = null; + + final int currentDepth = in.getDepth(); + int type; + try { + while ((type = in.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG + || in.getDepth() > currentDepth)) { + if (type == XmlPullParser.END_TAG + || type == XmlPullParser.TEXT) { + continue; + } + switch (in.getName()) { + case TAG_DIALOG_INFO: + readDialogInfo = SuspendDialogInfo.restoreFromXml(in); + break; + case TAG_APP_EXTRAS: + readAppExtras = PersistableBundle.restoreFromXml(in); + break; + case TAG_LAUNCHER_EXTRAS: + readLauncherExtras = PersistableBundle.restoreFromXml(in); + break; + default: + Slog.w(LOG_TAG, "Unknown tag " + in.getName() + + " in SuspendParams. Ignoring"); + break; + } + } + } catch (XmlPullParserException e) { + Slog.e(LOG_TAG, "Exception while trying to parse SuspendParams," + + " some fields may default", e); + } + return getInstanceOrNull(readDialogInfo, readAppExtras, readLauncherExtras); + } + } } |
