Home | History | Annotate | Download | only in res
      1 package com.xtremelabs.robolectric.res;
      2 
      3 import java.util.ArrayList;
      4 import java.util.Collections;
      5 import java.util.HashMap;
      6 import java.util.List;
      7 import java.util.Map;
      8 
      9 import android.content.ComponentName;
     10 import android.content.ContextWrapper;
     11 import android.content.Intent;
     12 import android.content.pm.ApplicationInfo;
     13 import android.content.pm.PackageInfo;
     14 import android.content.pm.ResolveInfo;
     15 import android.graphics.drawable.Drawable;
     16 
     17 import com.xtremelabs.robolectric.RobolectricConfig;
     18 import com.xtremelabs.robolectric.tester.android.content.pm.StubPackageManager;
     19 
     20 public class RobolectricPackageManager extends StubPackageManager {
     21 
     22     private Map<String, PackageInfo> packageList;
     23     private Map<Intent, List<ResolveInfo>> resolveList = new HashMap<Intent, List<ResolveInfo>>();
     24     private Map<ComponentName, ComponentState> componentList = new HashMap<ComponentName,ComponentState>();
     25     private Map<ComponentName, Drawable> drawableList = new HashMap<ComponentName, Drawable>();
     26     private Map<String, Boolean> systemFeatureList = new HashMap<String, Boolean>();
     27 
     28     private ContextWrapper contextWrapper;
     29     private RobolectricConfig config;
     30     private ApplicationInfo applicationInfo;
     31 
     32     public RobolectricPackageManager(ContextWrapper contextWrapper, RobolectricConfig config) {
     33         this.contextWrapper = contextWrapper;
     34         this.config = config;
     35         initializePackageInfo();
     36     }
     37 
     38     @Override
     39     public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
     40         if (packageList.containsKey(packageName)) {
     41         	return packageList.get(packageName);
     42         }
     43 
     44         throw new NameNotFoundException();
     45     }
     46 
     47     @Override
     48     public ApplicationInfo getApplicationInfo(String packageName, int flags) throws NameNotFoundException {
     49 
     50         if (config.getPackageName().equals(packageName)) {
     51             if (applicationInfo == null) {
     52                 applicationInfo = new ApplicationInfo();
     53                 applicationInfo.flags = config.getApplicationFlags();
     54                 applicationInfo.targetSdkVersion = config.getSdkVersion();
     55                 applicationInfo.packageName = config.getPackageName();
     56                 applicationInfo.processName = config.getProcessName();
     57                 applicationInfo.name = config.getApplicationName();
     58             }
     59             return applicationInfo;
     60         }
     61 
     62         PackageInfo info;
     63         if ((info = packageList.get(packageName)) != null) {
     64         	return info.applicationInfo;
     65         }
     66 
     67         throw new NameNotFoundException();
     68     }
     69 
     70     @Override
     71     public List<PackageInfo> getInstalledPackages(int flags) {
     72         return new ArrayList<PackageInfo>(packageList.values());
     73     }
     74 
     75     @Override
     76     public List<ResolveInfo> queryIntentActivities( Intent intent, int flags ) {
     77         return queryIntent(intent, flags);
     78     }
     79 
     80     @Override
     81     public List<ResolveInfo> queryIntentServices( Intent intent, int flags ) {
     82         return queryIntent(intent, flags);
     83     }
     84 
     85     @Override
     86     public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
     87         return queryIntent(intent, flags);
     88     }
     89 
     90     @Override
     91     public ResolveInfo resolveActivity(Intent intent, int flags) {
     92     	List<ResolveInfo> candidates = queryIntentActivities(intent, flags);
     93     	return candidates.isEmpty() ? null : candidates.get(0);
     94     }
     95 
     96     @Override
     97     public ResolveInfo resolveService(Intent intent, int flags) {
     98         return resolveActivity(intent, flags);
     99     }
    100 
    101     public void addResolveInfoForIntent( Intent intent, List<ResolveInfo> info ) {
    102         resolveList.put(intent, info);
    103     }
    104 
    105     public void addResolveInfoForIntent(Intent intent, ResolveInfo info) {
    106         List<ResolveInfo> l = resolveList.get(intent);
    107         if (l == null) {
    108             l = new ArrayList<ResolveInfo>();
    109             resolveList.put(intent, l);
    110         }
    111         l.add(info);
    112     }
    113 
    114     @Override
    115     public Drawable getActivityIcon(Intent intent) {
    116     	return drawableList.get(intent.getComponent());
    117     }
    118 
    119     @Override
    120     public Drawable getActivityIcon(ComponentName componentName) {
    121     	return drawableList.get(componentName);
    122     }
    123 
    124     public void addActivityIcon( ComponentName component, Drawable d ) {
    125     	drawableList.put( component, d);
    126     }
    127 
    128     public void addActivityIcon( Intent intent, Drawable d ) {
    129     	drawableList.put( intent.getComponent(), d);
    130     }
    131 
    132 	@Override
    133 	public Intent getLaunchIntentForPackage(String packageName) {
    134 		Intent i = new Intent();
    135 		i.setComponent( new ComponentName(packageName, "") );
    136 		return i;
    137 	}
    138 
    139 	@Override
    140 	public CharSequence getApplicationLabel(ApplicationInfo info) {
    141 		return info.name;
    142 	}
    143 
    144 	@Override
    145 	public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) {
    146 		componentList.put(componentName, new ComponentState(newState, flags));
    147 	}
    148 
    149 	/**
    150 	 * Non-Android accessor.  Use to make assertions on values passed to
    151 	 * setComponentEnabledSetting.
    152 	 *
    153 	 * @param componentName
    154 	 * @return
    155 	 */
    156 	public RobolectricPackageManager.ComponentState getComponentState(ComponentName componentName) {
    157 		return componentList.get(componentName);
    158 	}
    159 
    160     /**
    161      * Non-Android accessor.  Used to add a package to the list of those
    162      * already 'installed' on system.
    163      *
    164      * @param packageInfo
    165      */
    166     public void addPackage( PackageInfo packageInfo ) {
    167     	 packageList.put(packageInfo.packageName, packageInfo);
    168     }
    169 
    170     public void addPackage( String packageName ) {
    171     	PackageInfo info = new PackageInfo();
    172     	info.packageName = packageName;
    173     	addPackage( info );
    174     }
    175 
    176     @Override
    177     public boolean hasSystemFeature(String name) {
    178         return systemFeatureList.containsKey(name) ? systemFeatureList.get(name) : false;
    179     }
    180 
    181     /**
    182      * Non-Android accessor.  Used to declare a system feature is
    183      * or is not supported.
    184      *
    185      * @param name
    186      * @param supported
    187      */
    188     public void setSystemFeature(String name, boolean supported) {
    189     	systemFeatureList.put(name, supported);
    190     }
    191 
    192     private List<ResolveInfo> queryIntent(Intent intent, int flags) {
    193         List<ResolveInfo> result = resolveList.get(intent);
    194         if (result == null) {
    195             return Collections.emptyList();
    196         } else {
    197             return result;
    198         }
    199     }
    200 
    201     private void initializePackageInfo() {
    202     	if (packageList != null) { return; }
    203 
    204         PackageInfo packageInfo = new PackageInfo();
    205         packageInfo.packageName = contextWrapper.getPackageName();
    206         packageInfo.versionName = "1.0";
    207 
    208         packageList = new HashMap<String, PackageInfo>();
    209         addPackage( packageInfo );
    210     }
    211 
    212     public class ComponentState {
    213     	public int newState;
    214     	public int flags;
    215 
    216 		public ComponentState(int newState, int flags) {
    217 			this.newState = newState;
    218 			this.flags = flags;
    219 		}
    220     }
    221 }
    222