1 package org.robolectric.shadows; 2 3 import android.app.ActivityThread; 4 import android.content.pm.ApplicationInfo; 5 import android.content.pm.PackageManager; 6 import android.os.RemoteException; 7 import java.lang.reflect.InvocationHandler; 8 import java.lang.reflect.Method; 9 import java.lang.reflect.Proxy; 10 import javax.annotation.Nonnull; 11 import org.robolectric.RuntimeEnvironment; 12 import org.robolectric.annotation.Implementation; 13 import org.robolectric.annotation.Implements; 14 15 @Implements(value = ActivityThread.class, isInAndroidSdk = false, looseSignatures = true) 16 public class ShadowActivityThread { 17 private static ApplicationInfo applicationInfo; 18 19 @Implementation getPackageManager()20 public static Object getPackageManager() { 21 ClassLoader classLoader = ShadowActivityThread.class.getClassLoader(); 22 Class<?> iPackageManagerClass; 23 try { 24 iPackageManagerClass = classLoader.loadClass("android.content.pm.IPackageManager"); 25 } catch (ClassNotFoundException e) { 26 throw new RuntimeException(e); 27 } 28 return Proxy.newProxyInstance( 29 classLoader, 30 new Class[] {iPackageManagerClass}, 31 new InvocationHandler() { 32 @Override 33 public Object invoke(Object proxy, @Nonnull Method method, Object[] args) 34 throws Exception { 35 if (method.getName().equals("getApplicationInfo")) { 36 String packageName = (String) args[0]; 37 int flags = (Integer) args[1]; 38 39 if (packageName.equals(ShadowActivityThread.applicationInfo.packageName)) { 40 return ShadowActivityThread.applicationInfo; 41 } 42 43 try { 44 return RuntimeEnvironment.application 45 .getPackageManager() 46 .getApplicationInfo(packageName, flags); 47 } catch (PackageManager.NameNotFoundException e) { 48 throw new RemoteException(e.getMessage()); 49 } 50 } else if (method.getName().equals("notifyPackageUse")) { 51 return null; 52 } else if (method.getName().equals("getPackageInstaller")) { 53 return null; 54 } 55 throw new UnsupportedOperationException("sorry, not supporting " + method + " yet!"); 56 } 57 }); 58 } 59 60 @Implementation 61 public static Object currentActivityThread() { 62 return RuntimeEnvironment.getActivityThread(); 63 } 64 65 /** 66 * Internal use only. 67 * 68 * @deprecated do not use 69 */ 70 @Deprecated 71 public static void setApplicationInfo(ApplicationInfo applicationInfo) { 72 ShadowActivityThread.applicationInfo = applicationInfo; 73 } 74 } 75