diff options
25 files changed, 191 insertions, 285 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp index 09225a5447f4..94b3a10cc10d 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -19,6 +19,7 @@ java_defaults { // Add java_aconfig_libraries to here to add them to the core framework srcs: [ ":android.app.usage.flags-aconfig-java{.generated_srcjars}", + ":android.content.pm.flags-aconfig-java{.generated_srcjars}", ":android.os.flags-aconfig-java{.generated_srcjars}", ":android.os.vibrator.flags-aconfig-java{.generated_srcjars}", ":android.security.flags-aconfig-java{.generated_srcjars}", @@ -215,6 +216,19 @@ java_aconfig_library { defaults: ["framework-minus-apex-aconfig-java-defaults"], } +// Package Manager +aconfig_declarations { + name: "android.content.pm.flags-aconfig", + package: "android.content.pm", + srcs: ["core/java/android/content/pm/*.aconfig"], +} + +java_aconfig_library { + name: "android.content.pm.flags-aconfig-java", + aconfig_declarations: "android.content.pm.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + // Media BetterTogether aconfig_declarations { name: "com.android.media.flags.bettertogether-aconfig", diff --git a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java index 66c1efca0000..24d815f2964b 100644 --- a/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java +++ b/apex/jobscheduler/framework/java/android/os/PowerExemptionManager.java @@ -420,7 +420,7 @@ public class PowerExemptionManager { public static final int REASON_SYSTEM_EXEMPT_APP_OP = 327; /** - * Granted by {@link com.android.server.pm.PackageArchiverService} to the installer responsible + * Granted by {@link com.android.server.pm.PackageArchiver} to the installer responsible * for unarchiving an app. * * @hide diff --git a/core/api/system-current.txt b/core/api/system-current.txt index eba1fbe8cb33..2d8c60a3d6df 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3798,13 +3798,6 @@ package android.content.pm { field @RequiresPermission(android.Manifest.permission.ACCESS_SHORTCUTS) public static final int FLAG_GET_PERSONS_DATA = 2048; // 0x800 } - public class PackageArchiver { - method @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void requestArchive(@NonNull String, @NonNull android.content.IntentSender) throws android.content.pm.PackageManager.NameNotFoundException; - method @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void requestUnarchive(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; - field public static final String EXTRA_UNARCHIVE_ALL_USERS = "android.content.pm.extra.UNARCHIVE_ALL_USERS"; - field public static final String EXTRA_UNARCHIVE_PACKAGE_NAME = "android.content.pm.extra.UNARCHIVE_PACKAGE_NAME"; - } - public class PackageInfo implements android.os.Parcelable { field public boolean isArchived; } @@ -3812,6 +3805,8 @@ package android.content.pm { public class PackageInstaller { method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull java.io.File, int) throws android.content.pm.PackageInstaller.PackageParsingException; method @NonNull public android.content.pm.PackageInstaller.InstallInfo readInstallInfo(@NonNull android.os.ParcelFileDescriptor, @Nullable String, int) throws android.content.pm.PackageInstaller.PackageParsingException; + method @FlaggedApi(Flags.FLAG_ARCHIVING) @RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES, android.Manifest.permission.REQUEST_DELETE_PACKAGES}) public void requestArchive(@NonNull String, @NonNull android.content.IntentSender) throws android.content.pm.PackageManager.NameNotFoundException; + method @FlaggedApi(Flags.FLAG_ARCHIVING) @RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES, android.Manifest.permission.REQUEST_INSTALL_PACKAGES}) public void requestUnarchive(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setPermissionsResult(int, boolean); field public static final String ACTION_CONFIRM_INSTALL = "android.content.pm.action.CONFIRM_INSTALL"; field public static final String ACTION_CONFIRM_PRE_APPROVAL = "android.content.pm.action.CONFIRM_PRE_APPROVAL"; @@ -3822,6 +3817,8 @@ package android.content.pm { field public static final String EXTRA_DATA_LOADER_TYPE = "android.content.pm.extra.DATA_LOADER_TYPE"; field public static final String EXTRA_LEGACY_STATUS = "android.content.pm.extra.LEGACY_STATUS"; field public static final String EXTRA_RESOLVED_BASE_PATH = "android.content.pm.extra.RESOLVED_BASE_PATH"; + field @FlaggedApi(Flags.FLAG_ARCHIVING) public static final String EXTRA_UNARCHIVE_ALL_USERS = "android.content.pm.extra.UNARCHIVE_ALL_USERS"; + field @FlaggedApi(Flags.FLAG_ARCHIVING) public static final String EXTRA_UNARCHIVE_PACKAGE_NAME = "android.content.pm.extra.UNARCHIVE_PACKAGE_NAME"; field public static final int LOCATION_DATA_APP = 0; // 0x0 field public static final int LOCATION_MEDIA_DATA = 2; // 0x2 field public static final int LOCATION_MEDIA_OBB = 1; // 0x1 @@ -3906,7 +3903,6 @@ package android.content.pm { method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_INSTANT_APPS) public abstract java.util.List<android.content.pm.InstantAppInfo> getInstantApps(); method @Deprecated @NonNull public abstract java.util.List<android.content.pm.IntentFilterVerificationInfo> getIntentFilterVerifications(@NonNull String); method @Deprecated @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract int getIntentVerificationStatusAsUser(@NonNull String, int); - method @NonNull public android.content.pm.PackageArchiver getPackageArchiver(); method @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public int getPackageUidAsUser(@NonNull String, @NonNull android.content.pm.PackageManager.PackageInfoFlags, int) throws android.content.pm.PackageManager.NameNotFoundException; method @android.content.pm.PackageManager.PermissionFlags @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, android.Manifest.permission.GET_RUNTIME_PERMISSIONS}) public abstract int getPermissionFlags(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method @NonNull @RequiresPermission(android.Manifest.permission.SUSPEND_APPS) public String[] getUnsuspendablePackages(@NonNull String[]); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index fcd13b840cb1..02558602acd3 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -64,7 +64,6 @@ import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.KeySet; import android.content.pm.ModuleInfo; -import android.content.pm.PackageArchiver; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageItemInfo; @@ -173,7 +172,6 @@ public class ApplicationPackageManager extends PackageManager { private volatile UserManager mUserManager; private volatile PermissionManager mPermissionManager; private volatile PackageInstaller mInstaller; - private volatile PackageArchiver mPackageArchiver; private volatile ArtManager mArtManager; private volatile DevicePolicyManager mDevicePolicyManager; private volatile String mPermissionsControllerPackageName; @@ -3284,18 +3282,6 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public PackageArchiver getPackageArchiver() { - if (mPackageArchiver == null) { - try { - mPackageArchiver = new PackageArchiver(mContext, mPM.getPackageArchiverService()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - return mPackageArchiver; - } - - @Override public boolean isPackageAvailable(String packageName) { try { return mPM.isPackageAvailable(packageName, getUserId()); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index f156878f5694..e9bbed340800 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -5274,7 +5274,7 @@ public class Intent implements Parcelable, Cloneable { * Broadcast Action: Sent to the responsible installer of an archived package when unarchival * is requested. * - * @see android.content.pm.PackageArchiver + * @see android.content.pm.PackageInstaller#requestUnarchive(String) * @hide */ @SystemApi diff --git a/core/java/android/content/pm/IPackageArchiverService.aidl b/core/java/android/content/pm/IPackageArchiverService.aidl deleted file mode 100644 index dc6491d6d97e..000000000000 --- a/core/java/android/content/pm/IPackageArchiverService.aidl +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.content.pm; - -import android.content.IntentSender; -import android.os.UserHandle; - -/** {@hide} */ -interface IPackageArchiverService { - - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES,android.Manifest.permission.REQUEST_DELETE_PACKAGES})") - void requestArchive(String packageName, String callerPackageName, in IntentSender statusReceiver, in UserHandle userHandle); - - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES,android.Manifest.permission.REQUEST_INSTALL_PACKAGES})") - void requestUnarchive(String packageName, String callerPackageName, in UserHandle userHandle); -}
\ No newline at end of file diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl index ebe2aa3e3aa0..edb07ce423c1 100644 --- a/core/java/android/content/pm/IPackageInstaller.aidl +++ b/core/java/android/content/pm/IPackageInstaller.aidl @@ -24,6 +24,7 @@ import android.content.pm.ParceledListSlice; import android.content.pm.VersionedPackage; import android.content.IntentSender; import android.os.RemoteCallback; +import android.os.UserHandle; import android.graphics.Bitmap; @@ -75,4 +76,10 @@ interface IPackageInstaller { void waitForInstallConstraints(String installerPackageName, in List<String> packageNames, in PackageInstaller.InstallConstraints constraints, in IntentSender callback, long timeout); + + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.DELETE_PACKAGES,android.Manifest.permission.REQUEST_DELETE_PACKAGES})") + void requestArchive(String packageName, String callerPackageName, in IntentSender statusReceiver, in UserHandle userHandle); + + @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES,android.Manifest.permission.REQUEST_INSTALL_PACKAGES})") + void requestUnarchive(String packageName, String callerPackageName, in UserHandle userHandle); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 916c249019a7..556c794b6139 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -26,7 +26,6 @@ import android.content.pm.ArchivedPackageParcel; import android.content.pm.ChangedPackages; import android.content.pm.InstantAppInfo; import android.content.pm.FeatureInfo; -import android.content.pm.IPackageArchiverService; import android.content.pm.IDexModuleRegisterCallback; import android.content.pm.InstallSourceInfo; import android.content.pm.IOnChecksumsReadyListener; @@ -652,8 +651,6 @@ interface IPackageManager { @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) IPackageInstaller getPackageInstaller(); - IPackageArchiverService getPackageArchiverService(); - @EnforcePermission("DELETE_PACKAGES") boolean setBlockUninstallForUser(String packageName, boolean blockUninstall, int userId); @UnsupportedAppUsage diff --git a/core/java/android/content/pm/PackageArchiver.java b/core/java/android/content/pm/PackageArchiver.java deleted file mode 100644 index b06523160b92..000000000000 --- a/core/java/android/content/pm/PackageArchiver.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.content.pm; - -import android.Manifest; -import android.annotation.NonNull; -import android.annotation.RequiresPermission; -import android.annotation.SystemApi; -import android.content.Context; -import android.content.IntentSender; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.ParcelableException; -import android.os.RemoteException; - -/** - * {@code ArchiveManager} is used to archive apps. During the archival process, the apps APKs and - * cache are removed from the device while the user data is kept. Through the - * {@code requestUnarchive()} call, apps can be restored again through their responsible app store. - * - * <p> Archived apps are returned as displayable apps through the {@link LauncherApps} APIs and - * will be displayed to users with UI treatment to highlight that said apps are archived. If - * a user taps on an archived app, the app will be unarchived and the restoration process is - * communicated. - * - * @hide - */ -// TODO(b/278560219) Improve public documentation. -@SystemApi -public class PackageArchiver { - - /** - * Extra field for the package name of a package that is requested to be unarchived. Sent as - * part of the {@link android.content.Intent#ACTION_UNARCHIVE_PACKAGE} intent. - * - * @hide - */ - @SystemApi - public static final String EXTRA_UNARCHIVE_PACKAGE_NAME = - "android.content.pm.extra.UNARCHIVE_PACKAGE_NAME"; - - /** - * If true, the requestor of the unarchival has specified that the app should be unarchived - * for {@link android.os.UserHandle#ALL}. - * - * @hide - */ - @SystemApi - public static final String EXTRA_UNARCHIVE_ALL_USERS = - "android.content.pm.extra.UNARCHIVE_ALL_USERS"; - - private final Context mContext; - private final IPackageArchiverService mService; - - /** - * @hide - */ - public PackageArchiver(Context context, IPackageArchiverService service) { - mContext = context; - mService = service; - } - - /** - * Requests to archive a package which is currently installed. - * - * @param statusReceiver Callback used to notify when the operation is completed. - * @throws NameNotFoundException If {@code packageName} isn't found or not available to the - * caller or isn't archived. - * @hide - */ - @RequiresPermission(anyOf = { - Manifest.permission.DELETE_PACKAGES, - Manifest.permission.REQUEST_DELETE_PACKAGES}) - @SystemApi - public void requestArchive(@NonNull String packageName, @NonNull IntentSender statusReceiver) - throws NameNotFoundException { - try { - mService.requestArchive(packageName, mContext.getPackageName(), statusReceiver, - mContext.getUser()); - } catch (ParcelableException e) { - e.maybeRethrow(NameNotFoundException.class); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** - * Requests to unarchive a currently archived package. - * - * <p> Sends a request to unarchive an app to the responsible installer. The installer is - * determined by {@link InstallSourceInfo#getUpdateOwnerPackageName()}, or - * {@link InstallSourceInfo#getInstallingPackageName()} if the former value is null. - * - * <p> The installation will happen asynchronously and can be observed through - * {@link android.content.Intent#ACTION_PACKAGE_ADDED}. - * - * @throws NameNotFoundException If {@code packageName} isn't found or not visible to the - * caller or if the package has no installer on the device - * anymore to unarchive it. - * @hide - */ - @RequiresPermission(anyOf = { - Manifest.permission.INSTALL_PACKAGES, - Manifest.permission.REQUEST_INSTALL_PACKAGES}) - @SystemApi - public void requestUnarchive(@NonNull String packageName) - throws NameNotFoundException { - try { - mService.requestUnarchive(packageName, mContext.getPackageName(), mContext.getUser()); - } catch (ParcelableException e) { - e.maybeRethrow(NameNotFoundException.class); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } -} diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java index cdb8b46ba41a..1fe19231e4b4 100644 --- a/core/java/android/content/pm/PackageInfo.java +++ b/core/java/android/content/pm/PackageInfo.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; +import android.content.IntentSender; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; @@ -492,7 +493,8 @@ public class PackageInfo implements Parcelable { /** * Whether the package is currently in an archived state. * - * <p>Packages can be archived through {@link PackageArchiver} and do not have any APKs stored + * <p>Packages can be archived through + * {@link PackageInstaller#requestArchive(String, IntentSender)} and do not have any APKs stored * on the device, but do keep the data directory. * @hide */ diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index f417480e9e1a..390efd44be85 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -34,6 +34,7 @@ import android.Manifest; import android.annotation.CallbackExecutor; import android.annotation.CurrentTimeMillisLong; import android.annotation.DurationMillisLong; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -348,6 +349,28 @@ public class PackageInstaller { "android.content.pm.extra.RESOLVED_BASE_PATH"; /** + * Extra field for the package name of a package that is requested to be unarchived. Sent as + * part of the {@link android.content.Intent#ACTION_UNARCHIVE_PACKAGE} intent. + * + * @hide + */ + @SystemApi + @FlaggedApi(Flags.FLAG_ARCHIVING) + public static final String EXTRA_UNARCHIVE_PACKAGE_NAME = + "android.content.pm.extra.UNARCHIVE_PACKAGE_NAME"; + + /** + * If true, the requestor of the unarchival has specified that the app should be unarchived + * for {@link android.os.UserHandle#ALL}. + * + * @hide + */ + @SystemApi + @FlaggedApi(Flags.FLAG_ARCHIVING) + public static final String EXTRA_UNARCHIVE_ALL_USERS = + "android.content.pm.extra.UNARCHIVE_ALL_USERS"; + + /** * Streaming installation pending. * Caller should make sure DataLoader is able to prepare image and reinitiate the operation. * @@ -2158,6 +2181,72 @@ public class PackageInstaller { return new InstallInfo(result); } + /** + * Requests to archive a package which is currently installed. + * + * <p> During the archival process, the apps APKs and cache are removed from the device while + * the user data is kept. Through the {@link #requestUnarchive(String)} call, apps can be + * restored again through their responsible installer. + * + * <p> Archived apps are returned as displayable apps through the {@link LauncherApps} APIs and + * will be displayed to users with UI treatment to highlight that said apps are archived. If + * a user taps on an archived app, the app will be unarchived and the restoration process is + * communicated. + * + * @param statusReceiver Callback used to notify when the operation is completed. + * @throws PackageManager.NameNotFoundException If {@code packageName} isn't found or not + * available to the caller or isn't archived. + * @hide + */ + @RequiresPermission(anyOf = { + Manifest.permission.DELETE_PACKAGES, + Manifest.permission.REQUEST_DELETE_PACKAGES}) + @SystemApi + @FlaggedApi(Flags.FLAG_ARCHIVING) + public void requestArchive(@NonNull String packageName, @NonNull IntentSender statusReceiver) + throws PackageManager.NameNotFoundException { + try { + mInstaller.requestArchive(packageName, mInstallerPackageName, statusReceiver, + new UserHandle(mUserId)); + } catch (ParcelableException e) { + e.maybeRethrow(PackageManager.NameNotFoundException.class); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Requests to unarchive a currently archived package. + * + * <p> Sends a request to unarchive an app to the responsible installer. The installer is + * determined by {@link InstallSourceInfo#getUpdateOwnerPackageName()}, or + * {@link InstallSourceInfo#getInstallingPackageName()} if the former value is null. + * + * <p> The installation will happen asynchronously and can be observed through + * {@link android.content.Intent#ACTION_PACKAGE_ADDED}. + * + * @throws PackageManager.NameNotFoundException If {@code packageName} isn't found or not + * visible to the caller or if the package has no + * installer on the device anymore to unarchive it. + * @hide + */ + @RequiresPermission(anyOf = { + Manifest.permission.INSTALL_PACKAGES, + Manifest.permission.REQUEST_INSTALL_PACKAGES}) + @SystemApi + @FlaggedApi(Flags.FLAG_ARCHIVING) + public void requestUnarchive(@NonNull String packageName) + throws PackageManager.NameNotFoundException { + try { + mInstaller.requestUnarchive(packageName, mInstallerPackageName, + new UserHandle(mUserId)); + } catch (ParcelableException e) { + e.maybeRethrow(PackageManager.NameNotFoundException.class); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + // (b/239722738) This class serves as a bridge between the PackageLite class, which // is a hidden class, and the consumers of this class. (e.g. InstallInstalling.java) // This is a part of an effort to remove dependency on hidden APIs and use SystemAPIs or diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 9a53a2a60076..f03508475b83 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1238,8 +1238,9 @@ public abstract class PackageManager { /** * Flag parameter to also retrieve some information about archived packages. - * Packages can be archived through {@link PackageArchiver} and do not have any APKs stored on - * the device, but do keep the data directory. + * Packages can be archived through + * {@link PackageInstaller#requestArchive(String, IntentSender)} and do not have any APKs stored + * on the device, but do keep the data directory. * <p> Note: Archived apps are a subset of apps returned by {@link #MATCH_UNINSTALLED_PACKAGES}. * <p> Note: this flag may cause less information about currently installed * applications to be returned. @@ -9958,16 +9959,6 @@ public abstract class PackageManager { public abstract @NonNull PackageInstaller getPackageInstaller(); /** - * {@link PackageArchiver} can be used to archive and restore archived packages. - * - * @hide - */ - @SystemApi - public @NonNull PackageArchiver getPackageArchiver() { - throw new UnsupportedOperationException( - "getPackageArchiver not implemented in subclass"); - } - /** * Adds a {@code CrossProfileIntentFilter}. After calling this method all * intents sent from the user with id sourceUserId can also be be resolved * by activities in the user with id targetUserId if they match the diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig new file mode 100644 index 000000000000..0c8eb02e9681 --- /dev/null +++ b/core/java/android/content/pm/flags.aconfig @@ -0,0 +1,15 @@ +package: "android.content.pm" + +flag { + name: "quarantined_enabled" + namespace: "package_manager_service" + description: "Feature flag for Quarantined state" + bug: "269127435" +} + +flag { + name: "archiving" + namespace: "package_manager_service" + description: "Feature flag to enable the archiving feature." + bug: "278553670" +} diff --git a/services/core/Android.bp b/services/core/Android.bp index b941aaf32853..8e538b280f40 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -192,7 +192,6 @@ java_library_static { "apache-commons-math", "power_optimization_flags_lib", "notification_flags_lib", - "pm_flags_lib", "camera_platform_flags_core_java_lib", ], javac_shard_size: 50, diff --git a/services/core/java/com/android/server/pm/Android.bp b/services/core/java/com/android/server/pm/Android.bp deleted file mode 100644 index 89c0124d2cd4..000000000000 --- a/services/core/java/com/android/server/pm/Android.bp +++ /dev/null @@ -1,12 +0,0 @@ -aconfig_declarations { - name: "pm_flags", - package: "com.android.server.pm", - srcs: [ - "*.aconfig", - ], -} - -java_aconfig_library { - name: "pm_flags_lib", - aconfig_declarations: "pm_flags", -} diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java index 8f7b7217d005..76203ac7650d 100644 --- a/services/core/java/com/android/server/pm/IPackageManagerBase.java +++ b/services/core/java/com/android/server/pm/IPackageManagerBase.java @@ -30,7 +30,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageArchiverService; import android.content.pm.IPackageDeleteObserver; import android.content.pm.IPackageDeleteObserver2; import android.content.pm.IPackageInstaller; @@ -100,9 +99,6 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { private final PackageInstallerService mInstallerService; @NonNull - private final PackageArchiverService mPackageArchiverService; - - @NonNull private final PackageProperty mPackageProperty; @NonNull @@ -131,8 +127,7 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { @Nullable ComponentName instantAppResolverSettingsComponent, @NonNull String requiredSupplementalProcessPackage, @Nullable String servicesExtensionPackageName, - @Nullable String sharedSystemSharedLibraryPackageName, - @NonNull PackageArchiverService packageArchiverService) { + @Nullable String sharedSystemSharedLibraryPackageName) { mService = service; mContext = context; mDexOptHelper = dexOptHelper; @@ -148,7 +143,6 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { mRequiredSupplementalProcessPackage = requiredSupplementalProcessPackage; mServicesExtensionPackageName = servicesExtensionPackageName; mSharedSystemSharedLibraryPackageName = sharedSystemSharedLibraryPackageName; - mPackageArchiverService = packageArchiverService; } protected Computer snapshot() { @@ -622,12 +616,6 @@ public abstract class IPackageManagerBase extends IPackageManager.Stub { @Override @Deprecated - public final IPackageArchiverService getPackageArchiverService() { - return mPackageArchiverService; - } - - @Override - @Deprecated public final void getPackageSizeInfo(final String packageName, int userId, final IPackageStatsObserver observer) { throw new UnsupportedOperationException( diff --git a/services/core/java/com/android/server/pm/PackageArchiverService.java b/services/core/java/com/android/server/pm/PackageArchiver.java index e0524077e9c1..73ccf5cfd8f4 100644 --- a/services/core/java/com/android/server/pm/PackageArchiverService.java +++ b/services/core/java/com/android/server/pm/PackageArchiver.java @@ -31,10 +31,8 @@ import android.app.BroadcastOptions; import android.content.Context; import android.content.Intent; import android.content.IntentSender; -import android.content.pm.IPackageArchiverService; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; -import android.content.pm.PackageArchiver; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; @@ -74,7 +72,7 @@ import java.util.concurrent.CompletableFuture; * while the data directory is kept. Archived apps are included in the list of launcher apps where * tapping them re-installs the full app. */ -public class PackageArchiverService extends IPackageArchiverService.Stub { +public class PackageArchiver { private static final String TAG = "PackageArchiverService"; @@ -93,13 +91,12 @@ public class PackageArchiverService extends IPackageArchiverService.Stub { @Nullable private LauncherApps mLauncherApps; - public PackageArchiverService(Context context, PackageManagerService mPm) { + PackageArchiver(Context context, PackageManagerService mPm) { this.mContext = context; this.mPm = mPm; } - @Override - public void requestArchive( + void requestArchive( @NonNull String packageName, @NonNull String callerPackageName, @NonNull IntentSender intentSender, @@ -233,8 +230,7 @@ public class PackageArchiverService extends IPackageArchiverService.Stub { return true; } - @Override - public void requestUnarchive( + void requestUnarchive( @NonNull String packageName, @NonNull String callerPackageName, @NonNull UserHandle userHandle) { @@ -290,8 +286,8 @@ public class PackageArchiverService extends IPackageArchiverService.Stub { int userId = userHandle.getIdentifier(); Intent unarchiveIntent = new Intent(Intent.ACTION_UNARCHIVE_PACKAGE); unarchiveIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - unarchiveIntent.putExtra(PackageArchiver.EXTRA_UNARCHIVE_PACKAGE_NAME, packageName); - unarchiveIntent.putExtra(PackageArchiver.EXTRA_UNARCHIVE_ALL_USERS, + unarchiveIntent.putExtra(PackageInstaller.EXTRA_UNARCHIVE_PACKAGE_NAME, packageName); + unarchiveIntent.putExtra(PackageInstaller.EXTRA_UNARCHIVE_ALL_USERS, userId == UserHandle.USER_ALL); unarchiveIntent.setPackage(installerPackage); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index fabef7609546..95b565d235cb 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -18,9 +18,7 @@ package com.android.server.pm; import static android.app.admin.DevicePolicyResources.Strings.Core.PACKAGE_DELETED_BY_DO; import static android.os.Process.INVALID_UID; - import static com.android.server.pm.PackageManagerService.SHELL_PACKAGE_NAME; - import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -182,6 +180,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements Manifest.permission.USE_FULL_SCREEN_INTENT ); + final PackageArchiver mPackageArchiver; + private final Context mContext; private final PackageManagerService mPm; private final ApexManager mApexManager; @@ -301,6 +301,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements apexParserSupplier, mInstallThread.getLooper()); mGentleUpdateHelper = new GentleUpdateHelper( context, mInstallThread.getLooper(), new AppStateHelper(context)); + mPackageArchiver = new PackageArchiver(mContext, mPm); LocalServices.getService(SystemServiceManager.class).startService( new Lifecycle(context, this)); @@ -1504,6 +1505,24 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements mSilentUpdatePolicy.setSilentUpdatesThrottleTime(throttleTimeInSeconds); } + @Override + public void requestArchive( + @NonNull String packageName, + @NonNull String callerPackageName, + @NonNull IntentSender intentSender, + @NonNull UserHandle userHandle) { + mPackageArchiver.requestArchive(packageName, callerPackageName, intentSender, + userHandle); + } + + @Override + public void requestUnarchive( + @NonNull String packageName, + @NonNull String callerPackageName, + @NonNull UserHandle userHandle) { + mPackageArchiver.requestUnarchive(packageName, callerPackageName, userHandle); + } + private static int getSessionCount(SparseArray<PackageInstallerSession> sessions, int installerUid) { int count = 0; diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 0dd4111adbfa..9e0a83cda584 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -3396,7 +3396,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } if (!isInstalledByAdb(getInstallSource().mInitiatingPackageName) - && !mPm.mArchiverService.verifySupportsUnarchival( + && !mPm.mInstallerService.mPackageArchiver.verifySupportsUnarchival( getInstallSource().mInstallerPackageName)) { throw new PackageManagerException( PackageManager.INSTALL_FAILED_SESSION_INVALID, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e3ff6f6bd64a..a4e76bb84681 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -84,6 +84,7 @@ import android.content.pm.ComponentInfo; import android.content.pm.DataLoaderType; import android.content.pm.FallbackCategoryProvider; import android.content.pm.FeatureInfo; +import android.content.pm.Flags; import android.content.pm.IDexModuleRegisterCallback; import android.content.pm.IOnChecksumsReadyListener; import android.content.pm.IPackageDataObserver; @@ -799,9 +800,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService final SparseArray<VerifyingSession> mPendingEnableRollback = new SparseArray<>(); final PackageInstallerService mInstallerService; - - final PackageArchiverService mArchiverService; - final ArtManagerService mArtManagerService; // TODO(b/260124949): Remove these. @@ -1630,8 +1628,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService (i, pm) -> new CrossProfileIntentFilterHelper(i.getSettings(), i.getUserManagerService(), i.getLock(), i.getUserManagerInternal(), context), - (i, pm) -> new UpdateOwnershipHelper(), - (i, pm) -> new PackageArchiverService(i.getContext(), pm)); + (i, pm) -> new UpdateOwnershipHelper()); if (Build.VERSION.SDK_INT <= 0) { Slog.w(TAG, "**** ro.build.version.sdk not set!"); @@ -1776,7 +1773,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService mFactoryTest = testParams.factoryTest; mIncrementalManager = testParams.incrementalManager; mInstallerService = testParams.installerService; - mArchiverService = testParams.archiverService; mInstantAppRegistry = testParams.instantAppRegistry; mChangedPackagesTracker = testParams.changedPackagesTracker; mInstantAppResolverConnection = testParams.instantAppResolverConnection; @@ -2356,7 +2352,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); mInstallerService = mInjector.getPackageInstallerService(); - mArchiverService = mInjector.getPackageArchiverService(); final ComponentName instantAppResolverComponent = getInstantAppResolver(computer); if (instantAppResolverComponent != null) { if (DEBUG_INSTANT) { @@ -4621,7 +4616,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDomainVerificationConnection, mInstallerService, mPackageProperty, mResolveComponentName, mInstantAppResolverSettingsComponent, mRequiredSdkSandboxPackage, mServicesExtensionPackageName, - mSharedSystemSharedLibraryPackageName, mArchiverService); + mSharedSystemSharedLibraryPackageName); } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java index 9495279c65b8..0c2e082e0a86 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceInjector.java @@ -127,8 +127,7 @@ public class PackageManagerServiceInjector { mPreparingPackageParserProducer; private final Singleton<PackageInstallerService> mPackageInstallerServiceProducer; - private final Singleton<PackageArchiverService> - mPackageArchiverServiceProducer; + private final ProducerWithArgument<InstantAppResolverConnection, ComponentName> mInstantAppResolverConnectionProducer; private final Singleton<LegacyPermissionManagerInternal> @@ -187,8 +186,7 @@ public class PackageManagerServiceInjector { Producer<IBackupManager> iBackupManager, Producer<SharedLibrariesImpl> sharedLibrariesProducer, Producer<CrossProfileIntentFilterHelper> crossProfileIntentFilterHelperProducer, - Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer, - Producer<PackageArchiverService> packageArchiverServiceProducer) { + Producer<UpdateOwnershipHelper> updateOwnershipHelperProducer) { mContext = context; mLock = lock; mInstaller = installer; @@ -244,7 +242,6 @@ public class PackageManagerServiceInjector { mCrossProfileIntentFilterHelperProducer = new Singleton<>( crossProfileIntentFilterHelperProducer); mUpdateOwnershipHelperProducer = new Singleton<>(updateOwnershipHelperProducer); - mPackageArchiverServiceProducer = new Singleton<>(packageArchiverServiceProducer); } /** @@ -391,10 +388,6 @@ public class PackageManagerServiceInjector { return mPackageInstallerServiceProducer.get(this, mPackageManager); } - public PackageArchiverService getPackageArchiverService() { - return mPackageArchiverServiceProducer.get(this, mPackageManager); - } - public InstantAppResolverConnection getInstantAppResolverConnection( ComponentName instantAppResolverComponent) { return mInstantAppResolverConnectionProducer.produce( diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java index b91ce4be8ca1..ca572091486e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceTestParams.java @@ -60,7 +60,6 @@ public final class PackageManagerServiceTestParams { public @Nullable String incidentReportApproverPackage; public IncrementalManager incrementalManager; public PackageInstallerService installerService; - public PackageArchiverService archiverService; public InstantAppRegistry instantAppRegistry; public ChangedPackagesTracker changedPackagesTracker = new ChangedPackagesTracker(); public InstantAppResolverConnection instantAppResolverConnection; diff --git a/services/core/java/com/android/server/pm/flags.aconfig b/services/core/java/com/android/server/pm/flags.aconfig deleted file mode 100644 index e584801f5b37..000000000000 --- a/services/core/java/com/android/server/pm/flags.aconfig +++ /dev/null @@ -1,9 +0,0 @@ -package: "com.android.server.pm" - -flag { - name: "quarantined_enabled" - namespace: "package_manager_service" - description: "Feature flag for Quarantined state" - bug: "269127435" -} - diff --git a/services/core/java/com/android/server/pm/pkg/SuspendParams.java b/services/core/java/com/android/server/pm/pkg/SuspendParams.java index 4e08106ed49a..86391c91bea5 100644 --- a/services/core/java/com/android/server/pm/pkg/SuspendParams.java +++ b/services/core/java/com/android/server/pm/pkg/SuspendParams.java @@ -17,6 +17,7 @@ package com.android.server.pm.pkg; import android.annotation.Nullable; +import android.content.pm.Flags; import android.content.pm.SuspendDialogInfo; import android.os.BaseBundle; import android.os.PersistableBundle; @@ -24,7 +25,6 @@ import android.util.Slog; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; -import com.android.server.pm.Flags; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java index 60b28d3a2ff0..d988063bdfb0 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageArchiverTest.java @@ -38,7 +38,6 @@ import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.LauncherActivityInfo; import android.content.pm.LauncherApps; -import android.content.pm.PackageArchiver; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; @@ -75,7 +74,7 @@ import java.util.List; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) -public class PackageArchiverServiceTest { +public class PackageArchiverTest { private static final String PACKAGE = "com.example"; private static final String CALLER_PACKAGE = "com.caller"; @@ -119,7 +118,7 @@ public class PackageArchiverServiceTest { private PackageSetting mPackageSetting; - private PackageArchiverService mArchiveService; + private PackageArchiver mArchiveManager; @Before public void setUp() throws Exception { @@ -160,8 +159,8 @@ public class PackageArchiverServiceTest { mock(Resources.class)); when(mIcon.compress(eq(Bitmap.CompressFormat.PNG), eq(100), any())).thenReturn(true); - mArchiveService = spy(new PackageArchiverService(mContext, pm)); - doReturn(ICON_PATH).when(mArchiveService).storeIcon(eq(PACKAGE), + mArchiveManager = spy(new PackageArchiver(mContext, pm)); + doReturn(ICON_PATH).when(mArchiveManager).storeIcon(eq(PACKAGE), any(LauncherActivityInfo.class), eq(mUserId)); } @@ -169,7 +168,7 @@ public class PackageArchiverServiceTest { public void archiveApp_callerPackageNameIncorrect() { Exception e = assertThrows( SecurityException.class, - () -> mArchiveService.requestArchive(PACKAGE, "different", mIntentSender, + () -> mArchiveManager.requestArchive(PACKAGE, "different", mIntentSender, UserHandle.CURRENT)); assertThat(e).hasMessageThat().isEqualTo( String.format( @@ -186,7 +185,7 @@ public class PackageArchiverServiceTest { Exception e = assertThrows( ParcelableException.class, - () -> mArchiveService.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, + () -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT)); assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class); assertThat(e.getCause()).hasMessageThat().isEqualTo( @@ -197,7 +196,7 @@ public class PackageArchiverServiceTest { public void archiveApp_packageNotInstalledForUser() throws IntentSender.SendIntentException { mPackageSetting.modifyUserState(UserHandle.CURRENT.getIdentifier()).setInstalled(false); - mArchiveService.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT); + mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT); rule.mocks().getHandler().flush(); ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); @@ -226,7 +225,7 @@ public class PackageArchiverServiceTest { Exception e = assertThrows( ParcelableException.class, - () -> mArchiveService.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, + () -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT)); assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class); assertThat(e.getCause()).hasMessageThat().isEqualTo("No installer found"); @@ -239,7 +238,7 @@ public class PackageArchiverServiceTest { Exception e = assertThrows( ParcelableException.class, - () -> mArchiveService.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, + () -> mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT)); assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class); assertThat(e.getCause()).hasMessageThat().isEqualTo( @@ -249,10 +248,10 @@ public class PackageArchiverServiceTest { @Test public void archiveApp_storeIconFails() throws IntentSender.SendIntentException, IOException { IOException e = new IOException("IO"); - doThrow(e).when(mArchiveService).storeIcon(eq(PACKAGE), + doThrow(e).when(mArchiveManager).storeIcon(eq(PACKAGE), any(LauncherActivityInfo.class), eq(mUserId)); - mArchiveService.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT); + mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT); rule.mocks().getHandler().flush(); ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); @@ -268,7 +267,7 @@ public class PackageArchiverServiceTest { @Test public void archiveApp_success() { - mArchiveService.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT); + mArchiveManager.requestArchive(PACKAGE, CALLER_PACKAGE, mIntentSender, UserHandle.CURRENT); rule.mocks().getHandler().flush(); verify(mInstallerService).uninstall( @@ -286,7 +285,7 @@ public class PackageArchiverServiceTest { Exception e = assertThrows( SecurityException.class, - () -> mArchiveService.requestUnarchive(PACKAGE, "different", + () -> mArchiveManager.requestUnarchive(PACKAGE, "different", UserHandle.CURRENT)); assertThat(e).hasMessageThat().isEqualTo( String.format( @@ -304,7 +303,7 @@ public class PackageArchiverServiceTest { Exception e = assertThrows( ParcelableException.class, - () -> mArchiveService.requestUnarchive(PACKAGE, CALLER_PACKAGE, + () -> mArchiveManager.requestUnarchive(PACKAGE, CALLER_PACKAGE, UserHandle.CURRENT)); assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class); assertThat(e.getCause()).hasMessageThat().isEqualTo( @@ -315,7 +314,7 @@ public class PackageArchiverServiceTest { public void unarchiveApp_notArchived() { Exception e = assertThrows( ParcelableException.class, - () -> mArchiveService.requestUnarchive(PACKAGE, CALLER_PACKAGE, + () -> mArchiveManager.requestUnarchive(PACKAGE, CALLER_PACKAGE, UserHandle.CURRENT)); assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class); assertThat(e.getCause()).hasMessageThat().isEqualTo( @@ -338,7 +337,7 @@ public class PackageArchiverServiceTest { Exception e = assertThrows( ParcelableException.class, - () -> mArchiveService.requestUnarchive(PACKAGE, CALLER_PACKAGE, + () -> mArchiveManager.requestUnarchive(PACKAGE, CALLER_PACKAGE, UserHandle.CURRENT)); assertThat(e.getCause()).isInstanceOf(PackageManager.NameNotFoundException.class); assertThat(e.getCause()).hasMessageThat().isEqualTo( @@ -349,7 +348,7 @@ public class PackageArchiverServiceTest { public void unarchiveApp_success() { mUserState.setArchiveState(createArchiveState()).setInstalled(false); - mArchiveService.requestUnarchive(PACKAGE, CALLER_PACKAGE, UserHandle.CURRENT); + mArchiveManager.requestUnarchive(PACKAGE, CALLER_PACKAGE, UserHandle.CURRENT); rule.mocks().getHandler().flush(); ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); @@ -366,10 +365,10 @@ public class PackageArchiverServiceTest { /* initialExtras= */ isNull()); Intent intent = intentCaptor.getValue(); assertThat(intent.getFlags() & FLAG_RECEIVER_FOREGROUND).isNotEqualTo(0); - assertThat(intent.getStringExtra(PackageArchiver.EXTRA_UNARCHIVE_PACKAGE_NAME)).isEqualTo( + assertThat(intent.getStringExtra(PackageInstaller.EXTRA_UNARCHIVE_PACKAGE_NAME)).isEqualTo( PACKAGE); assertThat( - intent.getBooleanExtra(PackageArchiver.EXTRA_UNARCHIVE_ALL_USERS, true)).isFalse(); + intent.getBooleanExtra(PackageInstaller.EXTRA_UNARCHIVE_ALL_USERS, true)).isFalse(); assertThat(intent.getPackage()).isEqualTo(INSTALLER_PACKAGE); } |