blob: 1a352fbb6e07bb7b4cd2581cf705cd886b2ebdb4 [file] [log] [blame]
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
import static android.os.Build.VERSION_CODES.KITKAT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.N_MR1;
import static android.os.Build.VERSION_CODES.O;
import static android.os.Build.VERSION_CODES.P;
import android.accounts.IAccountManager;
import android.app.IAlarmManager;
import android.app.ISearchManager;
import android.app.admin.IDevicePolicyManager;
import android.app.job.IJobScheduler;
import android.app.slice.ISliceManager;
import android.app.trust.ITrustManager;
import android.app.usage.IUsageStatsManager;
import android.content.Context;
import android.content.IClipboard;
import android.content.IRestrictionsManager;
import android.content.pm.IShortcutService;
import android.hardware.fingerprint.IFingerprintService;
import android.hardware.input.IInputManager;
import android.hardware.usb.IUsbManager;
import android.location.ICountryDetector;
import android.location.ILocationManager;
import android.media.IAudioService;
import android.media.IMediaRouterService;
import android.media.session.ISessionManager;
import android.net.IConnectivityManager;
import android.net.INetworkScoreService;
import android.net.nsd.INsdManager;
import android.net.wifi.IWifiManager;
import android.net.wifi.p2p.IWifiP2pManager;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.IBatteryPropertiesRegistrar;
import android.os.IBinder;
import android.os.IInterface;
import android.os.IPowerManager;
import android.os.IUserManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.storage.IStorageManager;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
import com.android.internal.os.IDropBoxManagerService;
import com.android.internal.view.IInputMethodManager;
import java.util.HashMap;
import java.util.Map;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.util.ReflectionHelpers;
@Implements(value = ServiceManager.class, isInAndroidSdk = false)
public class ShadowServiceManager {
private static Map<String, IBinder> SERVICES =
new HashMap<String, IBinder>() {
{
put(
Context.CLIPBOARD_SERVICE,
createBinder(IClipboard.class, "android.content.IClipboard"));
put(
Context.WIFI_P2P_SERVICE,
createBinder(IWifiP2pManager.class, "android.net.wifi.p2p.IWifiP2pManager"));
put(
Context.ACCOUNT_SERVICE,
createBinder(IAccountManager.class, "android.accounts.IAccountManager"));
put(
Context.USB_SERVICE,
createBinder(IUsbManager.class, "android.hardware.usb.IUsbManager"));
put(
Context.LOCATION_SERVICE,
createBinder(ILocationManager.class, "android.location.ILocationManager"));
put(
Context.INPUT_METHOD_SERVICE,
createBinder(
IInputMethodManager.class, "com.android.internal.view.IInputMethodManager"));
put(
Context.ALARM_SERVICE,
createBinder(IAlarmManager.class, "android.app.IAlarmManager"));
put(Context.POWER_SERVICE, createBinder(IPowerManager.class, "android.os.IPowerManager"));
put(
BatteryStats.SERVICE_NAME,
createBinder(IBatteryStats.class, "com.android.internal.app.IBatteryStats"));
put(
Context.DROPBOX_SERVICE,
createBinder(
IDropBoxManagerService.class, "com.android.internal.os.IDropBoxManagerService"));
put(
Context.DEVICE_POLICY_SERVICE,
createBinder(IDevicePolicyManager.class, "android.app.admin.IDevicePolicyManager"));
put(
Context.CONNECTIVITY_SERVICE,
createBinder(IConnectivityManager.class, "android.net.IConnectivityManager"));
put(
Context.WIFI_SERVICE,
createBinder(IWifiManager.class, "android.net.wifi.IWifiManager"));
put(
Context.SEARCH_SERVICE,
createBinder(ISearchManager.class, "android.app.ISearchManager"));
put(
Context.UI_MODE_SERVICE,
createBinder(ISearchManager.class, "android.app.IUiModeManager"));
put(
Context.NETWORK_POLICY_SERVICE,
createBinder(ISearchManager.class, "android.net.INetworkPolicyManager"));
put(
Context.INPUT_SERVICE,
createBinder(IInputManager.class, "android.net.IInputManager"));
put(
Context.COUNTRY_DETECTOR,
createBinder(ICountryDetector.class, "android.location.ICountryDetector"));
put(
Context.NSD_SERVICE,
createBinder(INsdManager.class, "android.net.nsd.INsdManagerandroi"));
put(
Context.AUDIO_SERVICE,
createBinder(IAudioService.class, "android.media.IAudioService"));
if (RuntimeEnvironment.getApiLevel() >= JELLY_BEAN_MR1) {
put(Context.USER_SERVICE, createBinder(IUserManager.class, "android.os.IUserManager"));
}
if (RuntimeEnvironment.getApiLevel() >= JELLY_BEAN_MR2) {
put(
Context.APP_OPS_SERVICE,
createBinder(IAppOpsService.class, "com.android.internal.app.IAppOpsService"));
}
if (RuntimeEnvironment.getApiLevel() >= KITKAT) {
put(
"batteryproperties",
createBinder(
IBatteryPropertiesRegistrar.class, "android.os.IBatteryPropertiesRegistrar"));
}
if (RuntimeEnvironment.getApiLevel() >= LOLLIPOP) {
put(
Context.RESTRICTIONS_SERVICE,
createBinder(IRestrictionsManager.class, "android.content.IRestrictionsManager"));
put(
Context.TRUST_SERVICE,
createBinder(ITrustManager.class, "android.app.trust.ITrustManager"));
put(
Context.JOB_SCHEDULER_SERVICE,
createBinder(IJobScheduler.class, "android.app.job.IJobScheduler"));
put(
Context.NETWORK_SCORE_SERVICE,
createBinder(INetworkScoreService.class, "android.net.INetworkScoreService"));
put(
Context.USAGE_STATS_SERVICE,
createBinder(IUsageStatsManager.class, "android.app.usage.IUsageStatsManager"));
put(
Context.MEDIA_ROUTER_SERVICE,
createBinder(IMediaRouterService.class, "android.media.IMediaRouterService"));
put(
Context.MEDIA_SESSION_SERVICE,
createDeepBinder(ISessionManager.class, "android.media.session.ISessionManager"));
}
if (RuntimeEnvironment.getApiLevel() >= M) {
put(
Context.FINGERPRINT_SERVICE,
createBinder(
IFingerprintService.class, "android.hardware.fingerprint.IFingerprintService"));
}
if (RuntimeEnvironment.getApiLevel() >= N_MR1) {
put(
Context.SHORTCUT_SERVICE,
createBinder(IShortcutService.class, "android.content.pm.IShortcutService"));
}
if (RuntimeEnvironment.getApiLevel() >= O) {
put("mount", createBinder(IStorageManager.class, "android.os.storage.IStorageManager"));
} else {
put(
"mount",
createBinder(
"android.os.storage.IMountService", "android.os.storage.IMountService"));
}
if (RuntimeEnvironment.getApiLevel() >= P) {
put(
Context.SLICE_SERVICE,
createBinder(ISliceManager.class, "android.app.slice.SliceManager"));
}
}
};
@Implementation
public static IBinder getService(String name) {
return SERVICES.get(name);
}
private static Binder createBinder(String className, String descriptor) {
Class<IInterface> clazz = null;
try {
clazz = (Class<IInterface>) Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
Binder binder = new Binder();
binder.attachInterface(ReflectionHelpers.createNullProxy(clazz), descriptor);
return binder;
}
private static Binder createBinder(Class<? extends IInterface> clazz, String descriptor) {
Binder binder = new Binder();
binder.attachInterface(ReflectionHelpers.createNullProxy(clazz), descriptor);
return binder;
}
private static Binder createDeepBinder(Class<? extends IInterface> clazz, String descriptor) {
Binder binder = new Binder();
binder.attachInterface(ReflectionHelpers.createDeepProxy(clazz), descriptor);
return binder;
}
@Implementation
public static void addService(String name, IBinder service) {
}
@Implementation
public static IBinder checkService(String name) {
return null;
}
@Implementation
public static String[] listServices() throws RemoteException {
return null;
}
@Implementation
public static void initServiceCache(Map<String, IBinder> cache) {
}
}