blob: 9724e6b41571290d0a4b925f3e706c52093ba5c1 [file] [log] [blame]
package com.xtremelabs.robolectric.shadows;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.os.Looper;
import com.xtremelabs.robolectric.internal.Implementation;
import com.xtremelabs.robolectric.internal.Implements;
import com.xtremelabs.robolectric.internal.RealObject;
import com.xtremelabs.robolectric.tester.android.content.TestSharedPreferences;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.xtremelabs.robolectric.Robolectric.shadowOf;
@SuppressWarnings({"UnusedDeclaration"})
@Implements(ContextWrapper.class)
public class ShadowContextWrapper extends ShadowContext {
@RealObject private ContextWrapper realContextWrapper;
protected Context baseContext;
private PackageManager packageManager;
private String appName;
private String packageName;
private Set<String> grantedPermissions = new HashSet<String>();
public void __constructor__(Context baseContext) {
this.baseContext = baseContext;
}
@Implementation
public Context getApplicationContext() {
return baseContext.getApplicationContext();
}
@Implementation
public Resources.Theme getTheme() {
return getResources().newTheme();
}
@Implementation
public Resources getResources() {
return getApplicationContext().getResources();
}
@Implementation
public ContentResolver getContentResolver() {
return getApplicationContext().getContentResolver();
}
@Implementation
public Object getSystemService(String name) {
return getApplicationContext().getSystemService(name);
}
@Implementation
public void sendBroadcast(Intent intent) {
getApplicationContext().sendBroadcast(intent);
}
public List<Intent> getBroadcastIntents() {
return ((ShadowApplication) shadowOf(getApplicationContext())).getBroadcastIntents();
}
@Implementation
public int checkPermission(java.lang.String permission, int pid, int uid) {
return grantedPermissions.contains(permission) ? PERMISSION_GRANTED : PERMISSION_DENIED;
}
@Implementation
public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
return ((ShadowApplication) shadowOf(getApplicationContext())).registerReceiverWithContext(receiver, filter, realContextWrapper);
}
@Implementation
public void unregisterReceiver(BroadcastReceiver broadcastReceiver) {
getApplicationContext().unregisterReceiver(broadcastReceiver);
}
@Implementation
public String getPackageName() {
return realContextWrapper == getApplicationContext() ? packageName : getApplicationContext().getPackageName();
}
@Implementation
public ApplicationInfo getApplicationInfo() {
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.name = appName;
appInfo.packageName = packageName;
appInfo.processName = packageName;
return appInfo;
}
/**
* Non-Android accessor to set the application name.
*
* @param name
*/
public void setApplicationName(String name) {
appName = name;
}
/**
* Implements Android's {@code PackageManager}.
*
* @return a {@code RobolectricPackageManager}
*/
@Implementation
public PackageManager getPackageManager() {
return realContextWrapper == getApplicationContext() ? packageManager : getApplicationContext().getPackageManager();
}
@Implementation
public ComponentName startService(Intent service) {
return getApplicationContext().startService(service);
}
@Implementation
public boolean stopService(Intent name) {
return getApplicationContext().stopService(name);
}
@Implementation
public void startActivity(Intent intent) {
getApplicationContext().startActivity(intent);
}
@Implementation
public SharedPreferences getSharedPreferences(String name, int mode) {
return new TestSharedPreferences(getShadowApplication().getSharedPreferenceMap(), name, mode);
}
@Implementation
public AssetManager getAssets() {
return getResources().getAssets();
}
/**
* Non-Android accessor that delegates to the application to consume and return the next {@code Intent} on the
* started activities stack.
*
* @return the next started {@code Intent} for an activity
*/
public Intent getNextStartedActivity() {
return getShadowApplication().getNextStartedActivity();
}
/**
* Non-Android accessor that delegates to the application to return (without consuming) the next {@code Intent} on
* the started activities stack.
*
* @return the next started {@code Intent} for an activity
*/
public Intent peekNextStartedActivity() {
return getShadowApplication().peekNextStartedActivity();
}
/**
* Non-Android accessor that delegates to the application to consume and return the next {@code Intent} on the
* started services stack.
*
* @return the next started {@code Intent} for a service
*/
public Intent getNextStartedService() {
return getShadowApplication().getNextStartedService();
}
/**
* Non-android accessor that delefates to the application to clear the stack of started
* service intents.
*/
public void clearStartedServices() {
getShadowApplication().clearStartedServices();
}
/**
* Return (without consuming) the next {@code Intent} on the started services stack.
*
* @return the next started {@code Intent} for a service
*/
public Intent peekNextStartedService() {
return getShadowApplication().peekNextStartedService();
}
/**
* Non-Android accessor that delegates to the application to return the next {@code Intent} to stop
* a service (irrespective of if the service was running)
*
* @return {@code Intent} for the next service requested to be stopped
*/
public Intent getNextStoppedService() {
return getShadowApplication().getNextStoppedService();
}
/**
* Non-Android accessor that is used at start-up to set the package name
*
* @param packageName the package name
*/
public void setPackageName(String packageName) {
this.packageName = packageName;
}
/**
* Non-Android accessor that is used at start-up to set the packageManager =
*
* @param packageManager the package manager
*/
public void setPackageManager(PackageManager packageManager) {
this.packageManager = packageManager;
}
@Implementation
public Looper getMainLooper() {
return getShadowApplication().getMainLooper();
}
@Implementation
public Context getBaseContext() {
return baseContext;
}
@Implementation
public void attachBaseContext(Context context) {
baseContext = context;
}
private ShadowApplication getShadowApplication() {
return ((ShadowApplication) shadowOf(getApplicationContext()));
}
@Implementation
public boolean bindService(Intent intent, final ServiceConnection serviceConnection, int i) {
return getShadowApplication().bindService(intent, serviceConnection, i);
}
/**
* Non-Android accessor that is used to grant permissions checked via
* {@link android.content.ContextWrapper#checkPermission(String, int, int)}
*
* @param permissionNames permission names that should be granted
*/
public void grantPermissions(String... permissionNames) {
for (String permissionName : permissionNames) {
grantedPermissions.add(permissionName);
}
}
}