Home | History | Annotate | Download | only in controller
      1 package org.robolectric.android.controller;
      2 
      3 import android.content.ComponentName;
      4 import android.content.ContentProvider;
      5 import android.content.Context;
      6 import android.content.pm.PackageManager;
      7 import android.content.pm.ProviderInfo;
      8 import org.robolectric.RuntimeEnvironment;
      9 import org.robolectric.shadows.ShadowContentResolver;
     10 import org.robolectric.util.Logger;
     11 
     12 public class ContentProviderController<T extends ContentProvider>  {
     13   private T contentProvider;
     14 
     15   private ContentProviderController(T contentProvider) {
     16     this.contentProvider = contentProvider;
     17   }
     18 
     19   public static <T extends ContentProvider> ContentProviderController<T> of(T contentProvider) {
     20     return new ContentProviderController<>(contentProvider);
     21   }
     22 
     23   /**
     24    * Create and register {@link ContentProvider} using {@link ProviderInfo} found from manifest.
     25    */
     26   public ContentProviderController<T> create() {
     27     Context baseContext = RuntimeEnvironment.application.getBaseContext();
     28 
     29     ComponentName componentName = createRelative(baseContext.getPackageName(), contentProvider.getClass().getName());
     30 
     31     ProviderInfo providerInfo = null;
     32     try {
     33       providerInfo = baseContext.getPackageManager().getProviderInfo(componentName, 0);
     34     } catch (PackageManager.NameNotFoundException e) {
     35       Logger.strict("Unable to find provider info for " + componentName, e);
     36     }
     37 
     38     return create(providerInfo);
     39   }
     40 
     41   /**
     42    * Create and register {@link ContentProvider} using {@link ProviderInfo} found from manifest.
     43    *
     44    * @param authority the authority to use
     45    * @return this {@link ContentProviderController}
     46    */
     47   public ContentProviderController<T> create(String authority) {
     48     ProviderInfo providerInfo = new ProviderInfo();
     49     providerInfo.authority = authority;
     50     return create(providerInfo);
     51   }
     52 
     53   /**
     54    * Create and register {@link ContentProvider} using the given {@link ProviderInfo}.
     55    *
     56    * @param providerInfo the {@link ProviderInfo} to use
     57    * @return this {@link ContentProviderController}
     58    */
     59   public ContentProviderController<T> create(ProviderInfo providerInfo) {
     60     Context baseContext = RuntimeEnvironment.application.getBaseContext();
     61     contentProvider.attachInfo(baseContext, providerInfo);
     62 
     63     if (providerInfo != null) {
     64       ShadowContentResolver.registerProviderInternal(providerInfo.authority, contentProvider);
     65     }
     66 
     67     return this;
     68   }
     69 
     70   public T get() {
     71     return contentProvider;
     72   }
     73 
     74   public ContentProviderController<T> shutdown() {
     75     contentProvider.shutdown();
     76     return this;
     77   }
     78 
     79   private static ComponentName createRelative(String pkg, String cls) {
     80     final String fullName;
     81     if (cls.charAt(0) == '.') {
     82       // Relative to the package. Prepend the package name.
     83       fullName = pkg + cls;
     84     } else {
     85       // Fully qualified package name.
     86       fullName = cls;
     87     }
     88     return new ComponentName(pkg, fullName);
     89   }
     90 }
     91