package org.robolectric.android.controller;
import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.shadows.ShadowContentResolver;
import org.robolectric.util.Logger;
public class ContentProviderController<T extends ContentProvider> extends org.robolectric.util.ContentProviderController<T> {
private T contentProvider;
private ContentProviderController(T contentProvider) {
this.contentProvider = contentProvider;
}
public static <T extends ContentProvider> ContentProviderController<T> of(T contentProvider) {
return new ContentProviderController<>(contentProvider);
}
/**
* Create and register {@link ContentProvider} using {@link ProviderInfo} found from manifest.
*/
@Override
public ContentProviderController<T> create() {
Context baseContext = RuntimeEnvironment.application.getBaseContext();
ComponentName componentName = createRelative(baseContext.getPackageName(), contentProvider.getClass().getName());
ProviderInfo providerInfo = null;
try {
providerInfo = baseContext.getPackageManager().getProviderInfo(componentName, 0);
} catch (PackageManager.NameNotFoundException e) {
Logger.strict("Unable to find provider info for " + componentName, e);
}
return create(providerInfo);
}
/**
* Create and register {@link ContentProvider} using {@link ProviderInfo} found from manifest.
*
* @param authority the authority to use
* @return this {@link ContentProviderController}
*/
public ContentProviderController<T> create(String authority) {
ProviderInfo providerInfo = new ProviderInfo();
providerInfo.authority = authority;
return create(providerInfo);
}
/**
* Create and register {@link ContentProvider} using the given {@link ProviderInfo}.
*
* @param providerInfo the {@link ProviderInfo} to use
* @return this {@link ContentProviderController}
*/
@Override
public ContentProviderController<T> create(ProviderInfo providerInfo) {
Context baseContext = RuntimeEnvironment.application.getBaseContext();
contentProvider.attachInfo(baseContext, providerInfo);
if (providerInfo != null) {
ShadowContentResolver.registerProviderInternal(providerInfo.authority, contentProvider);
}
return this;
}
@Override
public T get() {
return contentProvider;
}
@Override
public ContentProviderController<T> shutdown() {
contentProvider.shutdown();
return this;
}
private static ComponentName createRelative(String pkg, String cls) {
final String fullName;
if (cls.charAt(0) == '.') {
// Relative to the package. Prepend the package name.
fullName = pkg + cls;
} else {
// Fully qualified package name.
fullName = cls;
}
return new ComponentName(pkg, fullName);
}
}