16e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown/*
26e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * Copyright (C) 2015 The Android Open Source Project
36e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown *
46e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
56e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * you may not use this file except in compliance with the License.
66e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * You may obtain a copy of the License at
76e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown *
86e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
96e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown *
106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * Unless required by applicable law or agreed to in writing, software
116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * See the License for the specific language governing permissions and
146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * limitations under the License.
156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown */
166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownpackage android.app;
186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport com.android.internal.app.IAppOpsService;
20a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishraimport com.android.internal.app.ISoundTriggerService;
216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport com.android.internal.appwidget.IAppWidgetService;
226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport com.android.internal.os.IDropBoxManagerService;
236e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.accounts.AccountManager;
256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.accounts.IAccountManager;
266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.app.admin.DevicePolicyManager;
276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.app.job.IJobScheduler;
286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.app.job.JobScheduler;
296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.app.trust.TrustManager;
306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.app.usage.IUsageStatsManager;
319c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Banimport android.app.usage.NetworkStatsManager;
326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.app.usage.UsageStatsManager;
336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.appwidget.AppWidgetManager;
346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.bluetooth.BluetoothManager;
356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.ClipboardManager;
366e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.Context;
376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.IRestrictionsManager;
386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.RestrictionsManager;
396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.pm.ILauncherApps;
406f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.content.pm.IShortcutService;
416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.pm.LauncherApps;
426f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onukiimport android.content.pm.ShortcutManager;
436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.content.res.Resources;
446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.ConsumerIrManager;
456e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.ISerialManager;
466e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.SensorManager;
476e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.SerialManager;
486e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.SystemSensorManager;
496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.camera2.CameraManager;
506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.display.DisplayManager;
516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.hdmi.HdmiControlManager;
526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.hdmi.IHdmiControlService;
536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.input.InputManager;
549ff7d2235427b211344fa58b608424805a21aa24Peng Xuimport android.hardware.location.ContextHubManager;
556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.usb.IUsbManager;
566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.hardware.usb.UsbManager;
572035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurentimport android.hardware.radio.RadioManager;
586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.location.CountryDetector;
596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.location.ICountryDetector;
606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.location.ILocationManager;
616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.location.LocationManager;
626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.AudioManager;
636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.MediaRouter;
646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.midi.IMidiManager;
656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.midi.MidiManager;
666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.projection.MediaProjectionManager;
676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.session.MediaSessionManager;
68a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishraimport android.media.soundtrigger.SoundTriggerManager;
696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.tv.ITvInputManager;
706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.media.tv.TvInputManager;
716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.ConnectivityManager;
72bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewartimport android.net.ConnectivityThread;
736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.EthernetManager;
746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.IConnectivityManager;
756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.IEthernetManager;
766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.INetworkPolicyManager;
776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.NetworkPolicyManager;
786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.NetworkScoreManager;
796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.nsd.INsdManager;
806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.nsd.NsdManager;
816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.IRttManager;
826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.IWifiManager;
836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.IWifiScanner;
846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.RttManager;
856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.WifiManager;
866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.WifiScanner;
8720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohenimport android.net.wifi.nan.IWifiNanManager;
8820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohenimport android.net.wifi.nan.WifiNanManager;
896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.p2p.IWifiP2pManager;
906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.net.wifi.p2p.WifiP2pManager;
916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.nfc.NfcManager;
926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.BatteryManager;
936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.DropBoxManager;
94965ecbbb3eb19007690c333ab3aa05e380deb633Polina Bondarenkoimport android.os.HardwarePropertiesManager;
956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.IBinder;
96f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.IHardwarePropertiesManager;
976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.IPowerManager;
98e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Baoimport android.os.IRecoverySystem;
996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.IUserManager;
1006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.PowerManager;
1016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.Process;
102e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Baoimport android.os.RecoverySystem;
1036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.ServiceManager;
1046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.SystemVibrator;
1056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.UserHandle;
1066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.UserManager;
1076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.Vibrator;
108713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.SystemHealthManager;
1096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.os.storage.StorageManager;
1106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.print.IPrintManager;
1116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.print.PrintManager;
112ebbf205bc6e8292f74d8fc4652c70274a445f907Jim Millerimport android.hardware.fingerprint.FingerprintManager;
113ebbf205bc6e8292f74d8fc4652c70274a445f907Jim Millerimport android.hardware.fingerprint.IFingerprintService;
1146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.service.persistentdata.IPersistentDataBlockService;
1156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.service.persistentdata.PersistentDataBlockManager;
1166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.telecom.TelecomManager;
1179a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseriimport android.telephony.CarrierConfigManager;
1186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.telephony.SubscriptionManager;
1196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.telephony.TelephonyManager;
1206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.util.Log;
1216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.ContextThemeWrapper;
1226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.LayoutInflater;
1236711f3b34c2ad9c622f56a08b81e313795fe7647Adam Powellimport com.android.internal.policy.PhoneLayoutInflater;
1246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.WindowManager;
1256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.WindowManagerImpl;
1266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.accessibility.AccessibilityManager;
1276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.accessibility.CaptioningManager;
1286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.inputmethod.InputMethodManager;
1296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport android.view.textservice.TextServicesManager;
1306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownimport java.util.HashMap;
1326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown/**
1346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * Manages all of the system services that can be returned by {@link Context#getSystemService}.
1356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown * Used by {@link ContextImpl}.
1366e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown */
1376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brownfinal class SystemServiceRegistry {
1386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    private final static String TAG = "SystemServiceRegistry";
1396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    // Service registry information.
1416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    // This information is never changed once static initialization has completed.
1426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    private static final HashMap<Class<?>, String> SYSTEM_SERVICE_NAMES =
1436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            new HashMap<Class<?>, String>();
1446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =
1456e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            new HashMap<String, ServiceFetcher<?>>();
1466e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    private static int sServiceCacheSize;
1476e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1486e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    // Not instantiable.
1496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    private SystemServiceRegistry() { }
1506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    static {
1526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
1536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<AccessibilityManager>() {
1546e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
1556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public AccessibilityManager createService(ContextImpl ctx) {
1566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return AccessibilityManager.getInstance(ctx);
1576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
1586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,
1606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<CaptioningManager>() {
1616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
1626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public CaptioningManager createService(ContextImpl ctx) {
1636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new CaptioningManager(ctx);
1646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
1656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
1676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<AccountManager>() {
1686e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
1696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public AccountManager createService(ContextImpl ctx) {
1706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.ACCOUNT_SERVICE);
1716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IAccountManager service = IAccountManager.Stub.asInterface(b);
1726e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new AccountManager(ctx, service);
1736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
1746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.ACTIVITY_SERVICE, ActivityManager.class,
1766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<ActivityManager>() {
1776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
1786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public ActivityManager createService(ContextImpl ctx) {
1796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
1806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
1816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.ALARM_SERVICE, AlarmManager.class,
1836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<AlarmManager>() {
1846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
1856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public AlarmManager createService(ContextImpl ctx) {
1866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
1876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IAlarmManager service = IAlarmManager.Stub.asInterface(b);
1886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new AlarmManager(service, ctx);
1896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
1906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.AUDIO_SERVICE, AudioManager.class,
1926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<AudioManager>() {
1936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
1946e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public AudioManager createService(ContextImpl ctx) {
1956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new AudioManager(ctx);
1966e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
1976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
1986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.MEDIA_ROUTER_SERVICE, MediaRouter.class,
1996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<MediaRouter>() {
2006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public MediaRouter createService(ContextImpl ctx) {
2026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new MediaRouter(ctx);
2036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.BLUETOOTH_SERVICE, BluetoothManager.class,
2066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<BluetoothManager>() {
2076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public BluetoothManager createService(ContextImpl ctx) {
2096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new BluetoothManager(ctx);
2106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.HDMI_CONTROL_SERVICE, HdmiControlManager.class,
2136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<HdmiControlManager>() {
2146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public HdmiControlManager createService() {
2166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.HDMI_CONTROL_SERVICE);
2176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new HdmiControlManager(IHdmiControlService.Stub.asInterface(b));
2186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.CLIPBOARD_SERVICE, ClipboardManager.class,
2216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<ClipboardManager>() {
2226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2236e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public ClipboardManager createService(ContextImpl ctx) {
2246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new ClipboardManager(ctx.getOuterContext(),
2256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        ctx.mMainThread.getHandler());
2266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        // The clipboard service moved to a new package.  If someone asks for the old
2296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        // interface by class then we want to redirect over to the new interface instead
2306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        // (which extends it).
2316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        SYSTEM_SERVICE_NAMES.put(android.text.ClipboardManager.class, Context.CLIPBOARD_SERVICE);
2326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class,
234cf9597791edc284b179f3aeaa64e9d53b5abbf36Lorenzo Colitti                new StaticApplicationContextServiceFetcher<ConnectivityManager>() {
2356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
236ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti            public ConnectivityManager createService(Context context) {
2376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
238ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti                IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
239ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti                return new ConnectivityManager(context, service);
2406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.COUNTRY_DETECTOR, CountryDetector.class,
2436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<CountryDetector>() {
2446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2456e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public CountryDetector createService() {
2466e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.COUNTRY_DETECTOR);
2476e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new CountryDetector(ICountryDetector.Stub.asInterface(b));
2486e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.DEVICE_POLICY_SERVICE, DevicePolicyManager.class,
2516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<DevicePolicyManager>() {
2526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public DevicePolicyManager createService(ContextImpl ctx) {
254cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki                return DevicePolicyManager.create(ctx);
2556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.DOWNLOAD_SERVICE, DownloadManager.class,
2586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<DownloadManager>() {
2596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public DownloadManager createService(ContextImpl ctx) {
26160cfad80bdf61db436643927337c2fb30186e99dJeff Sharkey                return new DownloadManager(ctx);
2626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.BATTERY_SERVICE, BatteryManager.class,
2656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<BatteryManager>() {
2666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public BatteryManager createService() {
2686e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new BatteryManager();
2696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.NFC_SERVICE, NfcManager.class,
2726e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<NfcManager>() {
2736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public NfcManager createService(ContextImpl ctx) {
2756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new NfcManager(ctx);
2766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.DROPBOX_SERVICE, DropBoxManager.class,
279b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey                new CachedServiceFetcher<DropBoxManager>() {
2806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
281b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey            public DropBoxManager createService(ContextImpl ctx) {
2826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.DROPBOX_SERVICE);
2836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
2846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                if (service == null) {
2856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    // Don't return a DropBoxManager that will NPE upon use.
2866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    // This also avoids caching a broken DropBoxManager in
2876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    // getDropBoxManager during early boot, before the
2886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    // DROPBOX_SERVICE is registered.
2896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    return null;
2906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                }
291b8e8a91f54f9f11a5936611c00d198ed21824854Jeff Sharkey                return new DropBoxManager(ctx, service);
2926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
2936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
2946e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.INPUT_SERVICE, InputManager.class,
2956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<InputManager>() {
2966e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
2976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public InputManager createService() {
2986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return InputManager.getInstance();
2996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.DISPLAY_SERVICE, DisplayManager.class,
3026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<DisplayManager>() {
3036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public DisplayManager createService(ContextImpl ctx) {
3056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new DisplayManager(ctx.getOuterContext());
3066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.INPUT_METHOD_SERVICE, InputMethodManager.class,
3096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<InputMethodManager>() {
3106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public InputMethodManager createService() {
3126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return InputMethodManager.getInstance();
3136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.TEXT_SERVICES_MANAGER_SERVICE, TextServicesManager.class,
3166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<TextServicesManager>() {
3176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public TextServicesManager createService() {
3196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return TextServicesManager.getInstance();
3206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.KEYGUARD_SERVICE, KeyguardManager.class,
3236e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<KeyguardManager>() {
3246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public KeyguardManager createService() {
3266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new KeyguardManager();
3276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.LAYOUT_INFLATER_SERVICE, LayoutInflater.class,
3306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<LayoutInflater>() {
3316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public LayoutInflater createService(ContextImpl ctx) {
3336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new PhoneLayoutInflater(ctx.getOuterContext());
3346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3366e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.LOCATION_SERVICE, LocationManager.class,
3376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<LocationManager>() {
3386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public LocationManager createService(ContextImpl ctx) {
3406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.LOCATION_SERVICE);
3416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
3426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.NETWORK_POLICY_SERVICE, NetworkPolicyManager.class,
34516a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov                new CachedServiceFetcher<NetworkPolicyManager>() {
3466e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
34716a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov            public NetworkPolicyManager createService(ContextImpl ctx) {
34816a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov                return new NetworkPolicyManager(ctx, INetworkPolicyManager.Stub.asInterface(
3496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        ServiceManager.getService(Context.NETWORK_POLICY_SERVICE)));
3506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.NOTIFICATION_SERVICE, NotificationManager.class,
3536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<NotificationManager>() {
3546e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public NotificationManager createService(ContextImpl ctx) {
3566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                final Context outerContext = ctx.getOuterContext();
3576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new NotificationManager(
3586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    new ContextThemeWrapper(outerContext,
3596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                            Resources.selectSystemTheme(0,
3606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                                    outerContext.getApplicationInfo().targetSdkVersion,
3616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                                    com.android.internal.R.style.Theme_Dialog,
3626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                                    com.android.internal.R.style.Theme_Holo_Dialog,
3636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                                    com.android.internal.R.style.Theme_DeviceDefault_Dialog,
3646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                                    com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)),
3656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    ctx.mMainThread.getHandler());
3666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3686e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.NSD_SERVICE, NsdManager.class,
3696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<NsdManager>() {
3706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public NsdManager createService(ContextImpl ctx) {
3726e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.NSD_SERVICE);
3736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                INsdManager service = INsdManager.Stub.asInterface(b);
3746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new NsdManager(ctx.getOuterContext(), service);
3756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
3776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.POWER_SERVICE, PowerManager.class,
3786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<PowerManager>() {
3796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
3806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public PowerManager createService(ContextImpl ctx) {
3816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.POWER_SERVICE);
3826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IPowerManager service = IPowerManager.Stub.asInterface(b);
3836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                if (service == null) {
3846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    Log.wtf(TAG, "Failed to get power manager service.");
3856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                }
3866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new PowerManager(ctx.getOuterContext(),
3876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        service, ctx.mMainThread.getHandler());
3886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
3896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
390e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao        registerService(Context.RECOVERY_SERVICE, RecoverySystem.class,
391e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                new CachedServiceFetcher<RecoverySystem>() {
392e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao            @Override
393e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao            public RecoverySystem createService(ContextImpl ctx) {
394e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                IBinder b = ServiceManager.getService(Context.RECOVERY_SERVICE);
395e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                IRecoverySystem service = IRecoverySystem.Stub.asInterface(b);
396e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                if (service == null) {
397e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                    Log.wtf(TAG, "Failed to get recovery service.");
398e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                }
399e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao                return new RecoverySystem(service);
400e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao            }});
401e8a403d57c8ea540f8287cdaee8b90f0cf9626a3Tao Bao
4026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.SEARCH_SERVICE, SearchManager.class,
4036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<SearchManager>() {
4046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public SearchManager createService(ContextImpl ctx) {
4066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new SearchManager(ctx.getOuterContext(),
4076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        ctx.mMainThread.getHandler());
4086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.SENSOR_SERVICE, SensorManager.class,
4116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<SensorManager>() {
4126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public SensorManager createService(ContextImpl ctx) {
4146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new SystemSensorManager(ctx.getOuterContext(),
4156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                  ctx.mMainThread.getHandler().getLooper());
4166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.STATUS_BAR_SERVICE, StatusBarManager.class,
4196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<StatusBarManager>() {
4206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public StatusBarManager createService(ContextImpl ctx) {
4226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new StatusBarManager(ctx.getOuterContext());
4236e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.STORAGE_SERVICE, StorageManager.class,
4266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<StorageManager>() {
4276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public StorageManager createService(ContextImpl ctx) {
4294887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey                return new StorageManager(ctx, ctx.mMainThread.getHandler().getLooper());
4306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.TELEPHONY_SERVICE, TelephonyManager.class,
4336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<TelephonyManager>() {
4346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public TelephonyManager createService(ContextImpl ctx) {
4366e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new TelephonyManager(ctx.getOuterContext());
4376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class,
4406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<SubscriptionManager>() {
4416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public SubscriptionManager createService(ContextImpl ctx) {
4436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new SubscriptionManager(ctx.getOuterContext());
4446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4456e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4469a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri        registerService(Context.CARRIER_CONFIG_SERVICE, CarrierConfigManager.class,
4479a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri                new CachedServiceFetcher<CarrierConfigManager>() {
4489a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            @Override
4499a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            public CarrierConfigManager createService(ContextImpl ctx) {
4509a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri                return new CarrierConfigManager();
4519a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri            }});
4529a1c9b67c4b2426884deb60c1ff84130ab47333cJonathan Basseri
4536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.TELECOM_SERVICE, TelecomManager.class,
4546e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<TelecomManager>() {
4556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public TelecomManager createService(ContextImpl ctx) {
4576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new TelecomManager(ctx.getOuterContext());
4586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.UI_MODE_SERVICE, UiModeManager.class,
4616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<UiModeManager>() {
4626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public UiModeManager createService(ContextImpl ctx) {
4646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new UiModeManager();
4656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.USB_SERVICE, UsbManager.class,
4686e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<UsbManager>() {
4696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public UsbManager createService(ContextImpl ctx) {
4716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.USB_SERVICE);
4726e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
4736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.SERIAL_SERVICE, SerialManager.class,
4766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<SerialManager>() {
4776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public SerialManager createService(ContextImpl ctx) {
4796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.SERIAL_SERVICE);
4806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
4816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.VIBRATOR_SERVICE, Vibrator.class,
4846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<Vibrator>() {
4856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public Vibrator createService(ContextImpl ctx) {
4876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new SystemVibrator(ctx);
4886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.WALLPAPER_SERVICE, WallpaperManager.class,
4916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<WallpaperManager>() {
4926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
4936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public WallpaperManager createService(ContextImpl ctx) {
4946e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new WallpaperManager(ctx.getOuterContext(),
4956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        ctx.mMainThread.getHandler());
4966e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
4976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
4986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.WIFI_SERVICE, WifiManager.class,
4996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<WifiManager>() {
5006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public WifiManager createService(ContextImpl ctx) {
5026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.WIFI_SERVICE);
5036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IWifiManager service = IWifiManager.Stub.asInterface(b);
504bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart                return new WifiManager(ctx.getOuterContext(), service,
505bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart                        ConnectivityThread.getInstanceLooper());
5066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.WIFI_P2P_SERVICE, WifiP2pManager.class,
5096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<WifiP2pManager>() {
5106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public WifiP2pManager createService() {
5126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.WIFI_P2P_SERVICE);
5136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
5146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new WifiP2pManager(service);
5156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
51720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen        registerService(Context.WIFI_NAN_SERVICE, WifiNanManager.class,
51820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                new StaticServiceFetcher<WifiNanManager>() {
51920d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            @Override
52020d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            public WifiNanManager createService() {
52120d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                IBinder b = ServiceManager.getService(Context.WIFI_NAN_SERVICE);
52220d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                IWifiNanManager service = IWifiNanManager.Stub.asInterface(b);
52320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                if (service == null) {
52420d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                    return null;
52520d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                }
52620d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen                return new WifiNanManager(service);
52720d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen            }});
52820d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen
5296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.WIFI_SCANNING_SERVICE, WifiScanner.class,
5306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<WifiScanner>() {
5316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public WifiScanner createService(ContextImpl ctx) {
5336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.WIFI_SCANNING_SERVICE);
5346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IWifiScanner service = IWifiScanner.Stub.asInterface(b);
53591312c7cb2df952424b16dc563bfe455661ceadaMitchell Wills                return new WifiScanner(ctx.getOuterContext(), service,
53691312c7cb2df952424b16dc563bfe455661ceadaMitchell Wills                        ConnectivityThread.getInstanceLooper());
5376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.WIFI_RTT_SERVICE, RttManager.class,
5406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<RttManager>() {
5416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public RttManager createService(ContextImpl ctx) {
5436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.WIFI_RTT_SERVICE);
5446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IRttManager service = IRttManager.Stub.asInterface(b);
545bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang                return new RttManager(ctx.getOuterContext(), service,
546bd3353a6c41896ed74d53b056ca1aefb2196c979Wei Wang                        ConnectivityThread.getInstanceLooper());
5476e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5486e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.ETHERNET_SERVICE, EthernetManager.class,
5506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<EthernetManager>() {
5516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public EthernetManager createService(ContextImpl ctx) {
5536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.ETHERNET_SERVICE);
5546e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IEthernetManager service = IEthernetManager.Stub.asInterface(b);
5556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new EthernetManager(ctx.getOuterContext(), service);
5566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.WINDOW_SERVICE, WindowManager.class,
5596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<WindowManager>() {
5606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public WindowManager createService(ContextImpl ctx) {
5624ece3d6bb18a609afcd0e82f0340b7d36ba24eeaAdam Lesinski                return new WindowManagerImpl(ctx);
5636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.USER_SERVICE, UserManager.class,
5666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<UserManager>() {
5676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5686e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public UserManager createService(ContextImpl ctx) {
5696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.USER_SERVICE);
5706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IUserManager service = IUserManager.Stub.asInterface(b);
5716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new UserManager(ctx, service);
5726e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5736e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5746e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.APP_OPS_SERVICE, AppOpsManager.class,
5756e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<AppOpsManager>() {
5766e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5776e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public AppOpsManager createService(ContextImpl ctx) {
5786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
5796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IAppOpsService service = IAppOpsService.Stub.asInterface(b);
5806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new AppOpsManager(ctx, service);
5816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.CAMERA_SERVICE, CameraManager.class,
5846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<CameraManager>() {
5856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public CameraManager createService(ContextImpl ctx) {
5876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new CameraManager(ctx);
5886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.LAUNCHER_APPS_SERVICE, LauncherApps.class,
5916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<LauncherApps>() {
5926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
5936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public LauncherApps createService(ContextImpl ctx) {
5945ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki                return new LauncherApps(ctx);
5956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
5966e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
5976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.RESTRICTIONS_SERVICE, RestrictionsManager.class,
5986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<RestrictionsManager>() {
5996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public RestrictionsManager createService(ContextImpl ctx) {
6016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.RESTRICTIONS_SERVICE);
6026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IRestrictionsManager service = IRestrictionsManager.Stub.asInterface(b);
6036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new RestrictionsManager(ctx, service);
6046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.PRINT_SERVICE, PrintManager.class,
6076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<PrintManager>() {
6086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public PrintManager createService(ContextImpl ctx) {
6106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder iBinder = ServiceManager.getService(Context.PRINT_SERVICE);
6116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IPrintManager service = IPrintManager.Stub.asInterface(iBinder);
6126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(),
6136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        UserHandle.getAppId(Process.myUid()));
6146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.CONSUMER_IR_SERVICE, ConsumerIrManager.class,
6176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<ConsumerIrManager>() {
6186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public ConsumerIrManager createService(ContextImpl ctx) {
6206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new ConsumerIrManager(ctx);
6216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6236e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.MEDIA_SESSION_SERVICE, MediaSessionManager.class,
6246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<MediaSessionManager>() {
6256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public MediaSessionManager createService(ContextImpl ctx) {
6276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new MediaSessionManager(ctx);
6286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.TRUST_SERVICE, TrustManager.class,
6316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<TrustManager>() {
6326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public TrustManager createService() {
6346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.TRUST_SERVICE);
6356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new TrustManager(b);
6366e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.FINGERPRINT_SERVICE, FingerprintManager.class,
6396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<FingerprintManager>() {
6406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public FingerprintManager createService(ContextImpl ctx) {
6426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder binder = ServiceManager.getService(Context.FINGERPRINT_SERVICE);
6436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IFingerprintService service = IFingerprintService.Stub.asInterface(binder);
6446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new FingerprintManager(ctx.getOuterContext(), service);
6456e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6466e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6476e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.TV_INPUT_SERVICE, TvInputManager.class,
6486e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<TvInputManager>() {
6496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public TvInputManager createService() {
6516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder iBinder = ServiceManager.getService(Context.TV_INPUT_SERVICE);
6526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                ITvInputManager service = ITvInputManager.Stub.asInterface(iBinder);
6536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new TvInputManager(service, UserHandle.myUserId());
6546e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.NETWORK_SCORE_SERVICE, NetworkScoreManager.class,
6576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<NetworkScoreManager>() {
6586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public NetworkScoreManager createService(ContextImpl ctx) {
6606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new NetworkScoreManager(ctx);
6616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.USAGE_STATS_SERVICE, UsageStatsManager.class,
6646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<UsageStatsManager>() {
6656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public UsageStatsManager createService(ContextImpl ctx) {
6676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder iBinder = ServiceManager.getService(Context.USAGE_STATS_SERVICE);
6686e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IUsageStatsManager service = IUsageStatsManager.Stub.asInterface(iBinder);
6696e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new UsageStatsManager(ctx.getOuterContext(), service);
6706e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6716e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6729c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban        registerService(Context.NETWORK_STATS_SERVICE, NetworkStatsManager.class,
6739c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban                new CachedServiceFetcher<NetworkStatsManager>() {
6749c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban            @Override
6759c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban            public NetworkStatsManager createService(ContextImpl ctx) {
6769c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban                return new NetworkStatsManager(ctx.getOuterContext());
6779c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban            }});
6789c5dfa5c79fff17f96bf977b86c0c9ceb8c3cf9bZoltan Szatmary-Ban
6796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.JOB_SCHEDULER_SERVICE, JobScheduler.class,
6806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<JobScheduler>() {
6816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public JobScheduler createService() {
6836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.JOB_SCHEDULER_SERVICE);
6846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new JobSchedulerImpl(IJobScheduler.Stub.asInterface(b));
6856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
6866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
6876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.PERSISTENT_DATA_BLOCK_SERVICE, PersistentDataBlockManager.class,
6886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new StaticServiceFetcher<PersistentDataBlockManager>() {
6896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
6906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public PersistentDataBlockManager createService() {
6916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
6926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IPersistentDataBlockService persistentDataBlockService =
6936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                        IPersistentDataBlockService.Stub.asInterface(b);
6946e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                if (persistentDataBlockService != null) {
6956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    return new PersistentDataBlockManager(persistentDataBlockService);
6966e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                } else {
6976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    // not supported
6986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    return null;
6996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                }
7006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
7016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
7026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.MEDIA_PROJECTION_SERVICE, MediaProjectionManager.class,
7036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<MediaProjectionManager>() {
7046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
7056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public MediaProjectionManager createService(ContextImpl ctx) {
7066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new MediaProjectionManager(ctx);
7076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
7086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
7096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.APPWIDGET_SERVICE, AppWidgetManager.class,
7106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<AppWidgetManager>() {
7116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
7126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public AppWidgetManager createService(ContextImpl ctx) {
7136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
7146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return new AppWidgetManager(ctx, IAppWidgetService.Stub.asInterface(b));
7156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
7166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
7176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        registerService(Context.MIDI_SERVICE, MidiManager.class,
7186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                new CachedServiceFetcher<MidiManager>() {
7196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            @Override
7206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            public MidiManager createService(ContextImpl ctx) {
7216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                IBinder b = ServiceManager.getService(Context.MIDI_SERVICE);
72247abda576e06612b8af7b80504fafdfc076aff2dRicardo Garcia                if (b == null) {
72347abda576e06612b8af7b80504fafdfc076aff2dRicardo Garcia                    return null;
72447abda576e06612b8af7b80504fafdfc076aff2dRicardo Garcia                }
725e0a6ca64fac5bd4f10139321604031816e90adb4Mike Lockwood                return new MidiManager(IMidiManager.Stub.asInterface(b));
7266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }});
7272035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent
7282035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent        registerService(Context.RADIO_SERVICE, RadioManager.class,
7292035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent                new CachedServiceFetcher<RadioManager>() {
7302035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent            @Override
7312035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent            public RadioManager createService(ContextImpl ctx) {
7322035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent                return new RadioManager(ctx);
7332035ac85f61b0e7fa384d52fcfa99766424c122cEric Laurent            }});
734a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra
735965ecbbb3eb19007690c333ab3aa05e380deb633Polina Bondarenko        registerService(Context.HARDWARE_PROPERTIES_SERVICE, HardwarePropertiesManager.class,
736965ecbbb3eb19007690c333ab3aa05e380deb633Polina Bondarenko                new CachedServiceFetcher<HardwarePropertiesManager>() {
737965ecbbb3eb19007690c333ab3aa05e380deb633Polina Bondarenko            @Override
738965ecbbb3eb19007690c333ab3aa05e380deb633Polina Bondarenko            public HardwarePropertiesManager createService(ContextImpl ctx) {
739f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                    IBinder b = ServiceManager.getService(Context.HARDWARE_PROPERTIES_SERVICE);
740f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                    IHardwarePropertiesManager service =
741f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                            IHardwarePropertiesManager.Stub.asInterface(b);
742f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                    if (service == null) {
743f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                        Log.wtf(TAG, "Failed to get hardwareproperties service.");
744f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                        return null;
745f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                    }
746f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                    return new HardwarePropertiesManager(ctx, service);
747965ecbbb3eb19007690c333ab3aa05e380deb633Polina Bondarenko            }});
748a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra
749a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra        registerService(Context.SOUND_TRIGGER_SERVICE, SoundTriggerManager.class,
750a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra                new CachedServiceFetcher<SoundTriggerManager>() {
751a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra            @Override
752a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra            public SoundTriggerManager createService(ContextImpl ctx) {
753a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra                IBinder b = ServiceManager.getService(Context.SOUND_TRIGGER_SERVICE);
754a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra                return new SoundTriggerManager(ctx, ISoundTriggerService.Stub.asInterface(b));
755a772e5fc062c8de48cb9c1d61755110f6b2e189bArunesh Mishra            }});
7566f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki
7576f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki        registerService(Context.SHORTCUT_SERVICE, ShortcutManager.class,
7586f7362d92573e4ae693bc513dca586d6a4eb087bMakoto Onuki                new CachedServiceFetcher<ShortcutManager>() {
7595504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki            @Override
7605504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki            public ShortcutManager createService(ContextImpl ctx) {
7615ba0d3e3a3035b67d2ce3a59975145b1e0061ef4Makoto Onuki                return new ShortcutManager(ctx);
7625504622fb01ab9774b5e73d05f86ee03a8b68ab7Makoto Onuki            }});
763713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
764713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        registerService(Context.SYSTEM_HEALTH_SERVICE, SystemHealthManager.class,
765713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                new CachedServiceFetcher<SystemHealthManager>() {
766713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            @Override
767713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            public SystemHealthManager createService(ContextImpl ctx) {
768713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return new SystemHealthManager();
769713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }});
7709ff7d2235427b211344fa58b608424805a21aa24Peng Xu
7719ff7d2235427b211344fa58b608424805a21aa24Peng Xu        registerService(Context.CONTEXTHUB_SERVICE, ContextHubManager.class,
7729ff7d2235427b211344fa58b608424805a21aa24Peng Xu                new CachedServiceFetcher<ContextHubManager>() {
7739ff7d2235427b211344fa58b608424805a21aa24Peng Xu            @Override
7749ff7d2235427b211344fa58b608424805a21aa24Peng Xu            public ContextHubManager createService(ContextImpl ctx) {
7759ff7d2235427b211344fa58b608424805a21aa24Peng Xu                return new ContextHubManager(ctx.getOuterContext(),
7769ff7d2235427b211344fa58b608424805a21aa24Peng Xu                  ctx.mMainThread.getHandler().getLooper());
7779ff7d2235427b211344fa58b608424805a21aa24Peng Xu            }});
7786e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
7796e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
7806e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
7816e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * Creates an array which is used to cache per-Context service instances.
7826e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
7836e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    public static Object[] createServiceCache() {
7846e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        return new Object[sServiceCacheSize];
7856e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
7866e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
7876e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
7886e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * Gets a system service from a given context.
7896e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
7906e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    public static Object getSystemService(ContextImpl ctx, String name) {
7916e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
7926e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        return fetcher != null ? fetcher.getService(ctx) : null;
7936e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
7946e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
7956e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
796e3383cc4539921756232ae4f3f54e99b95fb20ccPaul McLean     * Gets the name of the system-level service that is represented by the specified class.
7976e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
7986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    public static String getSystemServiceName(Class<?> serviceClass) {
7996e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        return SYSTEM_SERVICE_NAMES.get(serviceClass);
8006e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
8016e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8026e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
8036e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * Statically registers a system service with the context.
8046e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * This method must be called during static initialization only.
8056e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
8066e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    private static <T> void registerService(String serviceName, Class<T> serviceClass,
8076e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            ServiceFetcher<T> serviceFetcher) {
8086e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
8096e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
8106e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
8116e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8126e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
8136e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * Base interface for classes that fetch services.
8146e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * These objects must only be created during static initialization.
8156e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
8166e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    static abstract interface ServiceFetcher<T> {
8176e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        T getService(ContextImpl ctx);
8186e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
8196e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8206e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
8216e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * Override this class when the system service constructor needs a
8226e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * ContextImpl and should be cached and retained by that context.
8236e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
8246e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {
8256e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        private final int mCacheIndex;
8266e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8276e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        public CachedServiceFetcher() {
8286e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            mCacheIndex = sServiceCacheSize++;
8296e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
8306e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8316e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        @Override
8326e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        @SuppressWarnings("unchecked")
8336e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        public final T getService(ContextImpl ctx) {
8346e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            final Object[] cache = ctx.mServiceCache;
8356e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            synchronized (cache) {
8366e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                // Fetch or create the service.
8376e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                Object service = cache[mCacheIndex];
8386e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                if (service == null) {
8396e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    service = createService(ctx);
8406e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    cache[mCacheIndex] = service;
8416e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                }
8426e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return (T)service;
8436e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }
8446e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
8456e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8466e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        public abstract T createService(ContextImpl ctx);
8476e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
8486e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8496e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    /**
8506e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * Override this class when the system service does not need a ContextImpl
8516e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     * and should be cached and retained process-wide.
8526e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown     */
8536e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    static abstract class StaticServiceFetcher<T> implements ServiceFetcher<T> {
8546e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        private T mCachedInstance;
8556e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8566e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        @Override
8576e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        public final T getService(ContextImpl unused) {
8586e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            synchronized (StaticServiceFetcher.this) {
8596e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                if (mCachedInstance == null) {
8606e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                    mCachedInstance = createService();
8616e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                }
8626e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown                return mCachedInstance;
8636e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown            }
8646e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        }
8656e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown
8666e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown        public abstract T createService();
8676e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown    }
868ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti
869ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti    /**
870cf9597791edc284b179f3aeaa64e9d53b5abbf36Lorenzo Colitti     * Like StaticServiceFetcher, creates only one instance of the service per application, but when
871cf9597791edc284b179f3aeaa64e9d53b5abbf36Lorenzo Colitti     * creating the service for the first time, passes it the application context of the creating
872cf9597791edc284b179f3aeaa64e9d53b5abbf36Lorenzo Colitti     * application.
873ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti     *
874ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti     * TODO: Delete this once its only user (ConnectivityManager) is known to work well in the
875ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti     * case where multiple application components each have their own ConnectivityManager object.
876ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti     */
877cf9597791edc284b179f3aeaa64e9d53b5abbf36Lorenzo Colitti    static abstract class StaticApplicationContextServiceFetcher<T> implements ServiceFetcher<T> {
878ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti        private T mCachedInstance;
879ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti
880ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti        @Override
881ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti        public final T getService(ContextImpl ctx) {
882cf9597791edc284b179f3aeaa64e9d53b5abbf36Lorenzo Colitti            synchronized (StaticApplicationContextServiceFetcher.this) {
883ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti                if (mCachedInstance == null) {
8840ad9ab07fa0a106e55a423c837d306327045befeLorenzo Colitti                    Context appContext = ctx.getApplicationContext();
8850ad9ab07fa0a106e55a423c837d306327045befeLorenzo Colitti                    // If the application context is null, we're either in the system process or
8860ad9ab07fa0a106e55a423c837d306327045befeLorenzo Colitti                    // it's the application context very early in app initialization. In both these
8870ad9ab07fa0a106e55a423c837d306327045befeLorenzo Colitti                    // cases, the passed-in ContextImpl will not be freed, so it's safe to pass it
8880ad9ab07fa0a106e55a423c837d306327045befeLorenzo Colitti                    // to the service. http://b/27532714 .
8890ad9ab07fa0a106e55a423c837d306327045befeLorenzo Colitti                    mCachedInstance = createService(appContext != null ? appContext : ctx);
890ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti                }
891ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti                return mCachedInstance;
892ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti            }
893ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti        }
894ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti
895ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti        public abstract T createService(Context applicationContext);
896ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti    }
897ffc42b0b7be29ee4118e0515d5ab024927bcb8caLorenzo Colitti
8986e53931f49f49245deef8622eb8e7dc6ccf04536Jeff Brown}
899