implement PackageManager.getPackageInstaller()
diff --git a/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java b/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java
index ca4bb49..74d5aad 100644
--- a/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java
+++ b/robolectric/src/main/java/org/robolectric/res/builder/DefaultPackageManager.java
@@ -6,16 +6,31 @@
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.PatternMatcher;
import android.util.Pair;
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.ShadowsAdapter;
+import org.robolectric.manifest.ActivityData;
+import org.robolectric.manifest.AndroidManifest;
+import org.robolectric.manifest.BroadcastReceiverData;
+import org.robolectric.manifest.ContentProviderData;
+import org.robolectric.manifest.IntentFilterData;
+import org.robolectric.manifest.ServiceData;
+import org.robolectric.res.ResName;
+import org.robolectric.res.ResourceIndex;
+import org.robolectric.res.ResourceLoader;
+import org.robolectric.util.TempDirectory;
import java.io.File;
import java.nio.file.Paths;
@@ -31,18 +46,6 @@
import java.util.Set;
import java.util.TreeMap;
-import org.robolectric.ShadowsAdapter;
-import org.robolectric.manifest.ActivityData;
-import org.robolectric.manifest.AndroidManifest;
-import org.robolectric.manifest.BroadcastReceiverData;
-import org.robolectric.manifest.ContentProviderData;
-import org.robolectric.manifest.IntentFilterData;
-import org.robolectric.manifest.ServiceData;
-import org.robolectric.res.ResName;
-import org.robolectric.res.ResourceIndex;
-import org.robolectric.res.ResourceLoader;
-import org.robolectric.util.TempDirectory;
-
public class DefaultPackageManager extends StubPackageManager implements RobolectricPackageManager {
public DefaultPackageManager(ShadowsAdapter shadowsAdapter) {
@@ -125,6 +128,11 @@
private HashMap<String, Integer> applicationEnabledSettingMap = new HashMap<>();
@Override
+ public PackageInstaller getPackageInstaller() {
+ return new RoboPackageInstaller();
+ }
+
+ @Override
public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
if (packageInfos.containsKey(packageName)) {
return packageInfos.get(packageName);
@@ -727,4 +735,26 @@
}
return bundle;
}
+
+ private class RoboPackageInstaller extends PackageInstaller {
+ public RoboPackageInstaller() {
+ super(RuntimeEnvironment.application, DefaultPackageManager.this, null, null, -1);
+ }
+
+ @Override
+ public List<SessionInfo> getAllSessions() {
+ return ImmutableList.copyOf(Iterables.transform(packageInfos.keySet(), packageNameToSessionInfo()));
+ }
+
+ private Function<String, PackageInstaller.SessionInfo> packageNameToSessionInfo() {
+ return new Function<String, PackageInstaller.SessionInfo>() {
+ @Override
+ public PackageInstaller.SessionInfo apply(String packageName) {
+ PackageInstaller.SessionInfo sessionInfo = new PackageInstaller.SessionInfo();
+ sessionInfo.appPackageName = packageName;
+ return sessionInfo;
+ }
+ };
+ }
+ }
}
diff --git a/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java b/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java
index d611beb..ac1b79c 100644
--- a/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/res/DefaultRobolectricPackageManagerTest.java
@@ -7,26 +7,23 @@
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
+import android.content.pm.PackageInstaller;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.robolectric.*;
+import org.robolectric.R;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.res.builder.RobolectricPackageManager;
@@ -34,6 +31,13 @@
import org.robolectric.shadows.ShadowDrawable;
import org.robolectric.test.TemporaryFolder;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -43,7 +47,7 @@
import static org.robolectric.Robolectric.setupActivity;
@RunWith(RobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
+@Config(manifest = Config.NONE, sdk = 23)
public class DefaultRobolectricPackageManagerTest {
private static final String TEST_PACKAGE_NAME = "com.some.other.package";
private static final String TEST_PACKAGE_LABEL = "My Little App";
@@ -51,6 +55,39 @@
@Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
+ public void getPackageInstaller() {
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.packageName = TEST_PACKAGE_NAME;
+ packageInfo.applicationInfo = new ApplicationInfo();
+ packageInfo.applicationInfo.packageName = TEST_PACKAGE_NAME;
+ packageInfo.applicationInfo.name = TEST_PACKAGE_LABEL;
+ rpm.addPackage(packageInfo);
+
+ List<PackageInstaller.SessionInfo> allSessions = RuntimeEnvironment.getPackageManager().getPackageInstaller().getAllSessions();
+
+ List<String> allPackageNames = new LinkedList<>();
+ for (PackageInstaller.SessionInfo session : allSessions) {
+ allPackageNames.add(session.appPackageName);
+ }
+
+ assertThat(allPackageNames).contains(TEST_PACKAGE_NAME);
+ }
+
+ @Test
+ public void packageInstallerAndGetInstalledPackagesAreConsistent() {
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.packageName = TEST_PACKAGE_NAME;
+ packageInfo.applicationInfo = new ApplicationInfo();
+ packageInfo.applicationInfo.packageName = TEST_PACKAGE_NAME;
+ packageInfo.applicationInfo.name = TEST_PACKAGE_LABEL;
+ rpm.addPackage(packageInfo);
+
+ List<PackageInstaller.SessionInfo> allSessions = RuntimeEnvironment.getPackageManager().getPackageInstaller().getAllSessions();
+
+ assertThat(allSessions).hasSameSizeAs(rpm.getInstalledPackages(0));
+ }
+
+ @Test
public void getApplicationInfo_ThisApplication() throws Exception {
ApplicationInfo info = rpm.getApplicationInfo(RuntimeEnvironment.application.getPackageName(), 0);
assertThat(info).isNotNull();