package org.robolectric.shadows; import android.annotation.UserIdInt; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.FeatureInfo; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageStatsObserver; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageStats; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Drawable; import android.os.UserHandle; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.robolectric.RuntimeEnvironment; import org.robolectric.android.StubPackageManager; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.manifest.AndroidManifest; import org.robolectric.res.builder.RobolectricPackageManager; @Implements(PackageManager.class) public class ShadowPackageManager implements RobolectricPackageManager { protected Map<String, Boolean> permissionRationaleMap = new HashMap<>(); protected List<FeatureInfo> systemAvailableFeatures = new LinkedList<>(); private Map<String, PackageInfo> packageArchiveInfo = new HashMap<>(); protected final Map<Integer, Integer> verificationResults = new HashMap<>(); protected final Map<String, String> currentToCanonicalNames = new HashMap<>(); /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getPackageInfo(String, int)} instead. */ @Override @Deprecated public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getApplicationInfo(String, int)} instead. */ @Override @Deprecated public ApplicationInfo getApplicationInfo(String packageName, int flags) throws NameNotFoundException { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getActivityInfo(ComponentName, int)} instead. */ @Override @Deprecated public ActivityInfo getActivityInfo(ComponentName className, int flags) throws NameNotFoundException { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getReceiverInfo(ComponentName, int)} instead. */ @Override @Deprecated public ActivityInfo getReceiverInfo(ComponentName className, int flags) throws NameNotFoundException { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getServiceInfo(ComponentName, int)} instead. */ @Override @Deprecated public ServiceInfo getServiceInfo(ComponentName className, int flags) throws NameNotFoundException { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getInstalledPackages(int)} instead. */ @Override @Deprecated public List<PackageInfo> getInstalledPackages(int flags) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#queryIntentActivities(Intent, int)} instead. */ @Override @Deprecated public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#queryIntentServices(Intent, int)} instead. */ @Override @Deprecated public List<ResolveInfo> queryIntentServices(Intent intent, int flags) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#queryBroadcastReceivers(Intent, int)} instead. */ @Override @Deprecated public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#resolveActivity(Intent, int)} instead. */ @Override @Deprecated public ResolveInfo resolveActivity(Intent intent, int flags) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#resolveService(Intent, int)} instead. */ @Override @Deprecated public ResolveInfo resolveService(Intent intent, int flags) { throw new UnsupportedOperationException("Not implemented"); } @Override public void addResolveInfoForIntent(Intent intent, List<ResolveInfo> info) { RuntimeEnvironment.getRobolectricPackageManager().addResolveInfoForIntent(intent, info); } @Override public void addResolveInfoForIntent(Intent intent, ResolveInfo info) { RuntimeEnvironment.getRobolectricPackageManager().addResolveInfoForIntent(intent, info); } @Override public void removeResolveInfosForIntent(Intent intent, String packageName) { RuntimeEnvironment.getRobolectricPackageManager().removeResolveInfosForIntent(intent, packageName); } @Override public Drawable getActivityIcon(Intent intent) throws NameNotFoundException { return RuntimeEnvironment.getRobolectricPackageManager().getActivityIcon(intent); } @Override public Drawable getActivityIcon(ComponentName componentName) throws NameNotFoundException { return RuntimeEnvironment.getRobolectricPackageManager().getActivityIcon(componentName); } @Override public void addActivityIcon(ComponentName component, Drawable drawable) { RuntimeEnvironment.getRobolectricPackageManager().addActivityIcon(component, drawable); } @Override public void addActivityIcon(Intent intent, Drawable drawable) { RuntimeEnvironment.getRobolectricPackageManager().addActivityIcon(intent, drawable); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getApplicationIcon(String)} instead. */ @Override @Deprecated public Drawable getApplicationIcon(String packageName) throws NameNotFoundException { throw new UnsupportedOperationException("Not implemented"); } @Override public void setApplicationIcon(String packageName, Drawable drawable) { RuntimeEnvironment.getRobolectricPackageManager().setApplicationIcon(packageName, drawable); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getLaunchIntentForPackage(String)} instead. */ @Override @Deprecated public Intent getLaunchIntentForPackage(String packageName) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#getApplicationLabel(ApplicationInfo)} instead. */ @Override @Deprecated public CharSequence getApplicationLabel(ApplicationInfo info) { throw new UnsupportedOperationException("Not implemented"); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#setComponentEnabledSetting(ComponentName, int, int)} instead. */ @Override @Deprecated public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) { throw new UnsupportedOperationException("Not implemented"); } @Override public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { RuntimeEnvironment.getRobolectricPackageManager().addPreferredActivity(filter, match, set, activity); } @Override public int getPreferredActivities(List<IntentFilter> outFilters, List<ComponentName> outActivities, String packageName) { return RuntimeEnvironment.getRobolectricPackageManager().getPreferredActivities(outFilters, outActivities, packageName); } @Override public ComponentState getComponentState(ComponentName componentName) { return RuntimeEnvironment.getRobolectricPackageManager().getComponentState(componentName); } @Override public void addPackage(PackageInfo packageInfo) { RuntimeEnvironment.getRobolectricPackageManager().addPackage(packageInfo); } @Override public void addPackage(PackageInfo packageInfo, PackageStats packageStats) { RuntimeEnvironment.getRobolectricPackageManager().addPackage(packageInfo, packageStats); } @Override public void addPermissionInfo(PermissionInfo permissionInfo) { RuntimeEnvironment.getRobolectricPackageManager().addPermissionInfo(permissionInfo); } @Override public void addPackage(String packageName) { RuntimeEnvironment.getRobolectricPackageManager().addPackage(packageName); } @Override public void addManifest(AndroidManifest androidManifest, int labelRes) { RuntimeEnvironment.getRobolectricPackageManager().addManifest(androidManifest, labelRes); } @Override public void removePackage(String packageName) { RuntimeEnvironment.getRobolectricPackageManager().removePackage(packageName); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#hasSystemFeature(String)} instead. */ @Override @Deprecated public boolean hasSystemFeature(String name) { throw new UnsupportedOperationException("Not implemented"); } @Override public void setSystemFeature(String name, boolean supported) { RuntimeEnvironment.getRobolectricPackageManager().setSystemFeature(name, supported); } @Override public void addDrawableResolution(String packageName, int resourceId, Drawable drawable) { RuntimeEnvironment.getRobolectricPackageManager().addDrawableResolution(packageName, resourceId, drawable); } @Override public Drawable getDrawable(String packageName, int resourceId, ApplicationInfo applicationInfo) { return RuntimeEnvironment.getRobolectricPackageManager().getDrawable(packageName, resourceId, applicationInfo); } /** * @deprecated We're forced to implement this because we're implementing {@link RobolectricPackageManager} which will * be removed in the next release. Prefer {@link PackageManager#checkPermission(String, String)} instead. */ @Override @Deprecated public int checkPermission(String permName, String pkgName) { return 0; } @Override public boolean isQueryIntentImplicitly() { return RuntimeEnvironment.getRobolectricPackageManager().isQueryIntentImplicitly(); } @Override public void setQueryIntentImplicitly(boolean queryIntentImplicitly) { RuntimeEnvironment.getRobolectricPackageManager().setQueryIntentImplicitly(queryIntentImplicitly); } @Override public void reset() { RuntimeEnvironment.getRobolectricPackageManager().reset(); } @Override public void setNameForUid(int uid, String name) { RuntimeEnvironment.getRobolectricPackageManager().setNameForUid(uid, name); } @Override public void setPackagesForCallingUid(String... packagesForCallingUid) { RuntimeEnvironment.getRobolectricPackageManager().setPackagesForCallingUid(packagesForCallingUid); } @Override public void setPackagesForUid(int uid, String... packagesForCallingUid) { RuntimeEnvironment.getRobolectricPackageManager().setPackagesForUid(uid, packagesForCallingUid); } public void setPackageArchiveInfo(String archiveFilePath, PackageInfo packageInfo) { packageArchiveInfo.put(archiveFilePath, packageInfo); } public int getVerificationResult(int id) { Integer result = verificationResults.get(id); if (result == null) { // 0 isn't a "valid" result, so we can check for the case when verification isn't // called, if needed return 0; } return result; } public void setShouldShowRequestPermissionRationale(String permission, boolean show) { permissionRationaleMap.put(permission, show); } public void addSystemAvailableFeature(FeatureInfo featureInfo) { systemAvailableFeatures.add(featureInfo); } public void clearSystemAvailableFeatures() { systemAvailableFeatures.clear(); } public void addCurrentToCannonicalName(String currentName, String canonicalName) { currentToCanonicalNames.put(currentName, canonicalName); } @Implementation public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, UserHandle userHandle) { return getDelegatePackageManager().queryBroadcastReceiversAsUser(intent, flags, userHandle); } @Implementation public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, @UserIdInt int userId) { return getDelegatePackageManager().queryBroadcastReceivers(intent, flags, userId); } @Implementation public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags) { return getDelegatePackageManager().getPackageArchiveInfo(archiveFilePath, flags); } @Implementation public void freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer) { getDelegatePackageManager().freeStorageAndNotify(freeStorageSize, observer); } @Implementation public void freeStorage(long freeStorageSize, IntentSender pi) { getDelegatePackageManager().freeStorage(freeStorageSize, pi); } @Implementation public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) { getDelegatePackageManager().getPackageSizeInfo(packageName, observer); } @Implementation public void addPreferredActivityAsUser(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, @UserIdInt int userId) { getDelegatePackageManager().addPreferredActivityAsUser(filter, match, set, activity, userId); } @Implementation public void replacePreferredActivityAsUser(IntentFilter filter, int match, ComponentName[] set, ComponentName activity, @UserIdInt int userId) { getDelegatePackageManager().replacePreferredActivityAsUser(filter, match, set, activity, userId); } static PackageManager getDelegatePackageManager() { return (PackageManager) RuntimeEnvironment.getRobolectricPackageManager(); } }