• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app;
18 
19 import android.accounts.AccountManager;
20 import android.accounts.IAccountManager;
21 import android.app.admin.DevicePolicyManager;
22 import android.app.admin.IDevicePolicyManager;
23 import android.app.job.IJobScheduler;
24 import android.app.job.JobScheduler;
25 import android.app.timezone.RulesManager;
26 import android.app.trust.TrustManager;
27 import android.app.usage.IStorageStatsManager;
28 import android.app.usage.IUsageStatsManager;
29 import android.app.usage.NetworkStatsManager;
30 import android.app.usage.StorageStatsManager;
31 import android.app.usage.UsageStatsManager;
32 import android.appwidget.AppWidgetManager;
33 import android.bluetooth.BluetoothManager;
34 import android.companion.CompanionDeviceManager;
35 import android.companion.ICompanionDeviceManager;
36 import android.content.ClipboardManager;
37 import android.content.Context;
38 import android.content.IRestrictionsManager;
39 import android.content.RestrictionsManager;
40 import android.content.pm.IShortcutService;
41 import android.content.pm.LauncherApps;
42 import android.content.pm.PackageManager;
43 import android.content.pm.ShortcutManager;
44 import android.content.res.Resources;
45 import android.hardware.ConsumerIrManager;
46 import android.hardware.ISerialManager;
47 import android.hardware.SensorManager;
48 import android.hardware.SerialManager;
49 import android.hardware.SystemSensorManager;
50 import android.hardware.camera2.CameraManager;
51 import android.hardware.display.DisplayManager;
52 import android.hardware.fingerprint.FingerprintManager;
53 import android.hardware.fingerprint.IFingerprintService;
54 import android.hardware.hdmi.HdmiControlManager;
55 import android.hardware.hdmi.IHdmiControlService;
56 import android.hardware.input.InputManager;
57 import android.hardware.location.ContextHubManager;
58 import android.hardware.radio.RadioManager;
59 import android.hardware.usb.IUsbManager;
60 import android.hardware.usb.UsbManager;
61 import android.location.CountryDetector;
62 import android.location.ICountryDetector;
63 import android.location.ILocationManager;
64 import android.location.LocationManager;
65 import android.media.AudioManager;
66 import android.media.MediaRouter;
67 import android.media.midi.IMidiManager;
68 import android.media.midi.MidiManager;
69 import android.media.projection.MediaProjectionManager;
70 import android.media.session.MediaSessionManager;
71 import android.media.soundtrigger.SoundTriggerManager;
72 import android.media.tv.ITvInputManager;
73 import android.media.tv.TvInputManager;
74 import android.net.ConnectivityManager;
75 import android.net.ConnectivityThread;
76 import android.net.EthernetManager;
77 import android.net.IConnectivityManager;
78 import android.net.IEthernetManager;
79 import android.net.IIpSecService;
80 import android.net.INetworkPolicyManager;
81 import android.net.IpSecManager;
82 import android.net.NetworkPolicyManager;
83 import android.net.NetworkScoreManager;
84 import android.net.nsd.INsdManager;
85 import android.net.nsd.NsdManager;
86 import android.net.lowpan.ILowpanManager;
87 import android.net.lowpan.LowpanManager;
88 import android.net.wifi.IRttManager;
89 import android.net.wifi.IWifiManager;
90 import android.net.wifi.IWifiScanner;
91 import android.net.wifi.RttManager;
92 import android.net.wifi.WifiManager;
93 import android.net.wifi.WifiScanner;
94 import android.net.wifi.aware.IWifiAwareManager;
95 import android.net.wifi.aware.WifiAwareManager;
96 import android.net.wifi.p2p.IWifiP2pManager;
97 import android.net.wifi.p2p.WifiP2pManager;
98 import android.nfc.NfcManager;
99 import android.os.BatteryManager;
100 import android.os.BatteryStats;
101 import android.os.Build;
102 import android.os.DropBoxManager;
103 import android.os.HardwarePropertiesManager;
104 import android.os.IBatteryPropertiesRegistrar;
105 import android.os.IBinder;
106 import android.os.IHardwarePropertiesManager;
107 import android.os.IPowerManager;
108 import android.os.IRecoverySystem;
109 import android.os.IUserManager;
110 import android.os.IncidentManager;
111 import android.os.PowerManager;
112 import android.os.Process;
113 import android.os.RecoverySystem;
114 import android.os.ServiceManager;
115 import android.os.ServiceManager.ServiceNotFoundException;
116 import android.os.SystemVibrator;
117 import android.os.UserHandle;
118 import android.os.UserManager;
119 import android.os.Vibrator;
120 import android.os.health.SystemHealthManager;
121 import android.os.storage.StorageManager;
122 import android.print.IPrintManager;
123 import android.print.PrintManager;
124 import android.service.oemlock.IOemLockService;
125 import android.service.oemlock.OemLockManager;
126 import android.service.persistentdata.IPersistentDataBlockService;
127 import android.service.persistentdata.PersistentDataBlockManager;
128 import android.service.vr.IVrManager;
129 import android.telecom.TelecomManager;
130 import android.telephony.CarrierConfigManager;
131 import android.telephony.SubscriptionManager;
132 import android.telephony.TelephonyManager;
133 import android.telephony.euicc.EuiccManager;
134 import android.util.Log;
135 import android.view.ContextThemeWrapper;
136 import android.view.LayoutInflater;
137 import android.view.WindowManager;
138 import android.view.WindowManagerImpl;
139 import android.view.accessibility.AccessibilityManager;
140 import android.view.accessibility.CaptioningManager;
141 import android.view.autofill.AutofillManager;
142 import android.view.autofill.IAutoFillManager;
143 import android.view.inputmethod.InputMethodManager;
144 import android.view.textclassifier.TextClassificationManager;
145 import android.view.textservice.TextServicesManager;
146 
147 import com.android.internal.app.IAppOpsService;
148 import com.android.internal.app.IBatteryStats;
149 import com.android.internal.app.ISoundTriggerService;
150 import com.android.internal.appwidget.IAppWidgetService;
151 import com.android.internal.os.IDropBoxManagerService;
152 import com.android.internal.policy.PhoneLayoutInflater;
153 
154 import java.util.HashMap;
155 
156 /**
157  * Manages all of the system services that can be returned by {@link Context#getSystemService}.
158  * Used by {@link ContextImpl}.
159  */
160 final class SystemServiceRegistry {
161     private static final String TAG = "SystemServiceRegistry";
162 
163     // Service registry information.
164     // This information is never changed once static initialization has completed.
165     private static final HashMap<Class<?>, String> SYSTEM_SERVICE_NAMES =
166             new HashMap<Class<?>, String>();
167     private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =
168             new HashMap<String, ServiceFetcher<?>>();
169     private static int sServiceCacheSize;
170 
171     // Not instantiable.
SystemServiceRegistry()172     private SystemServiceRegistry() { }
173 
174     static {
registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class, new CachedServiceFetcher<AccessibilityManager>() { @Override public AccessibilityManager createService(ContextImpl ctx) { return AccessibilityManager.getInstance(ctx); }})175         registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
176                 new CachedServiceFetcher<AccessibilityManager>() {
177             @Override
178             public AccessibilityManager createService(ContextImpl ctx) {
179                 return AccessibilityManager.getInstance(ctx);
180             }});
181 
registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class, new CachedServiceFetcher<CaptioningManager>() { @Override public CaptioningManager createService(ContextImpl ctx) { return new CaptioningManager(ctx); }})182         registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,
183                 new CachedServiceFetcher<CaptioningManager>() {
184             @Override
185             public CaptioningManager createService(ContextImpl ctx) {
186                 return new CaptioningManager(ctx);
187             }});
188 
registerService(Context.ACCOUNT_SERVICE, AccountManager.class, new CachedServiceFetcher<AccountManager>() { @Override public AccountManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.ACCOUNT_SERVICE); IAccountManager service = IAccountManager.Stub.asInterface(b); return new AccountManager(ctx, service); }})189         registerService(Context.ACCOUNT_SERVICE, AccountManager.class,
190                 new CachedServiceFetcher<AccountManager>() {
191             @Override
192             public AccountManager createService(ContextImpl ctx) throws ServiceNotFoundException {
193                 IBinder b = ServiceManager.getServiceOrThrow(Context.ACCOUNT_SERVICE);
194                 IAccountManager service = IAccountManager.Stub.asInterface(b);
195                 return new AccountManager(ctx, service);
196             }});
197 
registerService(Context.ACTIVITY_SERVICE, ActivityManager.class, new CachedServiceFetcher<ActivityManager>() { @Override public ActivityManager createService(ContextImpl ctx) { return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})198         registerService(Context.ACTIVITY_SERVICE, ActivityManager.class,
199                 new CachedServiceFetcher<ActivityManager>() {
200             @Override
201             public ActivityManager createService(ContextImpl ctx) {
202                 return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
203             }});
204 
registerService(Context.ALARM_SERVICE, AlarmManager.class, new CachedServiceFetcher<AlarmManager>() { @Override public AlarmManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.ALARM_SERVICE); IAlarmManager service = IAlarmManager.Stub.asInterface(b); return new AlarmManager(service, ctx); }})205         registerService(Context.ALARM_SERVICE, AlarmManager.class,
206                 new CachedServiceFetcher<AlarmManager>() {
207             @Override
208             public AlarmManager createService(ContextImpl ctx) throws ServiceNotFoundException {
209                 IBinder b = ServiceManager.getServiceOrThrow(Context.ALARM_SERVICE);
210                 IAlarmManager service = IAlarmManager.Stub.asInterface(b);
211                 return new AlarmManager(service, ctx);
212             }});
213 
registerService(Context.AUDIO_SERVICE, AudioManager.class, new CachedServiceFetcher<AudioManager>() { @Override public AudioManager createService(ContextImpl ctx) { return new AudioManager(ctx); }})214         registerService(Context.AUDIO_SERVICE, AudioManager.class,
215                 new CachedServiceFetcher<AudioManager>() {
216             @Override
217             public AudioManager createService(ContextImpl ctx) {
218                 return new AudioManager(ctx);
219             }});
220 
registerService(Context.MEDIA_ROUTER_SERVICE, MediaRouter.class, new CachedServiceFetcher<MediaRouter>() { @Override public MediaRouter createService(ContextImpl ctx) { return new MediaRouter(ctx); }})221         registerService(Context.MEDIA_ROUTER_SERVICE, MediaRouter.class,
222                 new CachedServiceFetcher<MediaRouter>() {
223             @Override
224             public MediaRouter createService(ContextImpl ctx) {
225                 return new MediaRouter(ctx);
226             }});
227 
registerService(Context.BLUETOOTH_SERVICE, BluetoothManager.class, new CachedServiceFetcher<BluetoothManager>() { @Override public BluetoothManager createService(ContextImpl ctx) { return new BluetoothManager(ctx); }})228         registerService(Context.BLUETOOTH_SERVICE, BluetoothManager.class,
229                 new CachedServiceFetcher<BluetoothManager>() {
230             @Override
231             public BluetoothManager createService(ContextImpl ctx) {
232                 return new BluetoothManager(ctx);
233             }});
234 
registerService(Context.HDMI_CONTROL_SERVICE, HdmiControlManager.class, new StaticServiceFetcher<HdmiControlManager>() { @Override public HdmiControlManager createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.HDMI_CONTROL_SERVICE); return new HdmiControlManager(IHdmiControlService.Stub.asInterface(b)); }})235         registerService(Context.HDMI_CONTROL_SERVICE, HdmiControlManager.class,
236                 new StaticServiceFetcher<HdmiControlManager>() {
237             @Override
238             public HdmiControlManager createService() throws ServiceNotFoundException {
239                 IBinder b = ServiceManager.getServiceOrThrow(Context.HDMI_CONTROL_SERVICE);
240                 return new HdmiControlManager(IHdmiControlService.Stub.asInterface(b));
241             }});
242 
registerService(Context.TEXT_CLASSIFICATION_SERVICE, TextClassificationManager.class, new CachedServiceFetcher<TextClassificationManager>() { @Override public TextClassificationManager createService(ContextImpl ctx) { return new TextClassificationManager(ctx); }})243         registerService(Context.TEXT_CLASSIFICATION_SERVICE, TextClassificationManager.class,
244                 new CachedServiceFetcher<TextClassificationManager>() {
245             @Override
246             public TextClassificationManager createService(ContextImpl ctx) {
247                 return new TextClassificationManager(ctx);
248             }});
249 
registerService(Context.CLIPBOARD_SERVICE, ClipboardManager.class, new CachedServiceFetcher<ClipboardManager>() { @Override public ClipboardManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new ClipboardManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})250         registerService(Context.CLIPBOARD_SERVICE, ClipboardManager.class,
251                 new CachedServiceFetcher<ClipboardManager>() {
252             @Override
253             public ClipboardManager createService(ContextImpl ctx) throws ServiceNotFoundException {
254                 return new ClipboardManager(ctx.getOuterContext(),
255                         ctx.mMainThread.getHandler());
256             }});
257 
258         // The clipboard service moved to a new package.  If someone asks for the old
259         // interface by class then we want to redirect over to the new interface instead
260         // (which extends it).
SYSTEM_SERVICE_NAMES.put(android.text.ClipboardManager.class, Context.CLIPBOARD_SERVICE)261         SYSTEM_SERVICE_NAMES.put(android.text.ClipboardManager.class, Context.CLIPBOARD_SERVICE);
262 
registerService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class, new StaticApplicationContextServiceFetcher<ConnectivityManager>() { @Override public ConnectivityManager createService(Context context) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.CONNECTIVITY_SERVICE); IConnectivityManager service = IConnectivityManager.Stub.asInterface(b); return new ConnectivityManager(context, service); }})263         registerService(Context.CONNECTIVITY_SERVICE, ConnectivityManager.class,
264                 new StaticApplicationContextServiceFetcher<ConnectivityManager>() {
265             @Override
266             public ConnectivityManager createService(Context context) throws ServiceNotFoundException {
267                 IBinder b = ServiceManager.getServiceOrThrow(Context.CONNECTIVITY_SERVICE);
268                 IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
269                 return new ConnectivityManager(context, service);
270             }});
271 
registerService(Context.IPSEC_SERVICE, IpSecManager.class, new StaticServiceFetcher<IpSecManager>() { @Override public IpSecManager createService() { IBinder b = ServiceManager.getService(Context.IPSEC_SERVICE); IIpSecService service = IIpSecService.Stub.asInterface(b); return new IpSecManager(service); }})272         registerService(Context.IPSEC_SERVICE, IpSecManager.class,
273                 new StaticServiceFetcher<IpSecManager>() {
274             @Override
275             public IpSecManager createService() {
276                 IBinder b = ServiceManager.getService(Context.IPSEC_SERVICE);
277                 IIpSecService service = IIpSecService.Stub.asInterface(b);
278                 return new IpSecManager(service);
279             }});
280 
registerService(Context.COUNTRY_DETECTOR, CountryDetector.class, new StaticServiceFetcher<CountryDetector>() { @Override public CountryDetector createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.COUNTRY_DETECTOR); return new CountryDetector(ICountryDetector.Stub.asInterface(b)); }})281         registerService(Context.COUNTRY_DETECTOR, CountryDetector.class,
282                 new StaticServiceFetcher<CountryDetector>() {
283             @Override
284             public CountryDetector createService() throws ServiceNotFoundException {
285                 IBinder b = ServiceManager.getServiceOrThrow(Context.COUNTRY_DETECTOR);
286                 return new CountryDetector(ICountryDetector.Stub.asInterface(b));
287             }});
288 
registerService(Context.DEVICE_POLICY_SERVICE, DevicePolicyManager.class, new CachedServiceFetcher<DevicePolicyManager>() { @Override public DevicePolicyManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.DEVICE_POLICY_SERVICE); return new DevicePolicyManager(ctx, IDevicePolicyManager.Stub.asInterface(b)); }})289         registerService(Context.DEVICE_POLICY_SERVICE, DevicePolicyManager.class,
290                 new CachedServiceFetcher<DevicePolicyManager>() {
291             @Override
292             public DevicePolicyManager createService(ContextImpl ctx) throws ServiceNotFoundException {
293                 IBinder b = ServiceManager.getServiceOrThrow(Context.DEVICE_POLICY_SERVICE);
294                 return new DevicePolicyManager(ctx, IDevicePolicyManager.Stub.asInterface(b));
295             }});
296 
registerService(Context.DOWNLOAD_SERVICE, DownloadManager.class, new CachedServiceFetcher<DownloadManager>() { @Override public DownloadManager createService(ContextImpl ctx) { return new DownloadManager(ctx); }})297         registerService(Context.DOWNLOAD_SERVICE, DownloadManager.class,
298                 new CachedServiceFetcher<DownloadManager>() {
299             @Override
300             public DownloadManager createService(ContextImpl ctx) {
301                 return new DownloadManager(ctx);
302             }});
303 
registerService(Context.BATTERY_SERVICE, BatteryManager.class, new StaticServiceFetcher<BatteryManager>() { @Override public BatteryManager createService() throws ServiceNotFoundException { IBatteryStats stats = IBatteryStats.Stub.asInterface( ServiceManager.getServiceOrThrow(BatteryStats.SERVICE_NAME)); IBatteryPropertiesRegistrar registrar = IBatteryPropertiesRegistrar.Stub .asInterface(ServiceManager.getServiceOrThrow("batteryproperties")); return new BatteryManager(stats, registrar); }})304         registerService(Context.BATTERY_SERVICE, BatteryManager.class,
305                 new StaticServiceFetcher<BatteryManager>() {
306             @Override
307             public BatteryManager createService() throws ServiceNotFoundException {
308                 IBatteryStats stats = IBatteryStats.Stub.asInterface(
309                         ServiceManager.getServiceOrThrow(BatteryStats.SERVICE_NAME));
310                 IBatteryPropertiesRegistrar registrar = IBatteryPropertiesRegistrar.Stub
311                         .asInterface(ServiceManager.getServiceOrThrow("batteryproperties"));
312                 return new BatteryManager(stats, registrar);
313             }});
314 
registerService(Context.NFC_SERVICE, NfcManager.class, new CachedServiceFetcher<NfcManager>() { @Override public NfcManager createService(ContextImpl ctx) { return new NfcManager(ctx); }})315         registerService(Context.NFC_SERVICE, NfcManager.class,
316                 new CachedServiceFetcher<NfcManager>() {
317             @Override
318             public NfcManager createService(ContextImpl ctx) {
319                 return new NfcManager(ctx);
320             }});
321 
registerService(Context.DROPBOX_SERVICE, DropBoxManager.class, new CachedServiceFetcher<DropBoxManager>() { @Override public DropBoxManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.DROPBOX_SERVICE); IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b); return new DropBoxManager(ctx, service); }})322         registerService(Context.DROPBOX_SERVICE, DropBoxManager.class,
323                 new CachedServiceFetcher<DropBoxManager>() {
324             @Override
325             public DropBoxManager createService(ContextImpl ctx) throws ServiceNotFoundException {
326                 IBinder b = ServiceManager.getServiceOrThrow(Context.DROPBOX_SERVICE);
327                 IDropBoxManagerService service = IDropBoxManagerService.Stub.asInterface(b);
328                 return new DropBoxManager(ctx, service);
329             }});
330 
registerService(Context.INPUT_SERVICE, InputManager.class, new StaticServiceFetcher<InputManager>() { @Override public InputManager createService() { return InputManager.getInstance(); }})331         registerService(Context.INPUT_SERVICE, InputManager.class,
332                 new StaticServiceFetcher<InputManager>() {
333             @Override
334             public InputManager createService() {
335                 return InputManager.getInstance();
336             }});
337 
registerService(Context.DISPLAY_SERVICE, DisplayManager.class, new CachedServiceFetcher<DisplayManager>() { @Override public DisplayManager createService(ContextImpl ctx) { return new DisplayManager(ctx.getOuterContext()); }})338         registerService(Context.DISPLAY_SERVICE, DisplayManager.class,
339                 new CachedServiceFetcher<DisplayManager>() {
340             @Override
341             public DisplayManager createService(ContextImpl ctx) {
342                 return new DisplayManager(ctx.getOuterContext());
343             }});
344 
registerService(Context.INPUT_METHOD_SERVICE, InputMethodManager.class, new StaticServiceFetcher<InputMethodManager>() { @Override public InputMethodManager createService() { return InputMethodManager.getInstance(); }})345         registerService(Context.INPUT_METHOD_SERVICE, InputMethodManager.class,
346                 new StaticServiceFetcher<InputMethodManager>() {
347             @Override
348             public InputMethodManager createService() {
349                 return InputMethodManager.getInstance();
350             }});
351 
registerService(Context.TEXT_SERVICES_MANAGER_SERVICE, TextServicesManager.class, new StaticServiceFetcher<TextServicesManager>() { @Override public TextServicesManager createService() { return TextServicesManager.getInstance(); }})352         registerService(Context.TEXT_SERVICES_MANAGER_SERVICE, TextServicesManager.class,
353                 new StaticServiceFetcher<TextServicesManager>() {
354             @Override
355             public TextServicesManager createService() {
356                 return TextServicesManager.getInstance();
357             }});
358 
registerService(Context.KEYGUARD_SERVICE, KeyguardManager.class, new CachedServiceFetcher<KeyguardManager>() { @Override public KeyguardManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new KeyguardManager(ctx); }})359         registerService(Context.KEYGUARD_SERVICE, KeyguardManager.class,
360                 new CachedServiceFetcher<KeyguardManager>() {
361             @Override
362             public KeyguardManager createService(ContextImpl ctx) throws ServiceNotFoundException {
363                 return new KeyguardManager(ctx);
364             }});
365 
registerService(Context.LAYOUT_INFLATER_SERVICE, LayoutInflater.class, new CachedServiceFetcher<LayoutInflater>() { @Override public LayoutInflater createService(ContextImpl ctx) { return new PhoneLayoutInflater(ctx.getOuterContext()); }})366         registerService(Context.LAYOUT_INFLATER_SERVICE, LayoutInflater.class,
367                 new CachedServiceFetcher<LayoutInflater>() {
368             @Override
369             public LayoutInflater createService(ContextImpl ctx) {
370                 return new PhoneLayoutInflater(ctx.getOuterContext());
371             }});
372 
registerService(Context.LOCATION_SERVICE, LocationManager.class, new CachedServiceFetcher<LocationManager>() { @Override public LocationManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.LOCATION_SERVICE); return new LocationManager(ctx, ILocationManager.Stub.asInterface(b)); }})373         registerService(Context.LOCATION_SERVICE, LocationManager.class,
374                 new CachedServiceFetcher<LocationManager>() {
375             @Override
376             public LocationManager createService(ContextImpl ctx) throws ServiceNotFoundException {
377                 IBinder b = ServiceManager.getServiceOrThrow(Context.LOCATION_SERVICE);
378                 return new LocationManager(ctx, ILocationManager.Stub.asInterface(b));
379             }});
380 
registerService(Context.NETWORK_POLICY_SERVICE, NetworkPolicyManager.class, new CachedServiceFetcher<NetworkPolicyManager>() { @Override public NetworkPolicyManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new NetworkPolicyManager(ctx, INetworkPolicyManager.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.NETWORK_POLICY_SERVICE))); }})381         registerService(Context.NETWORK_POLICY_SERVICE, NetworkPolicyManager.class,
382                 new CachedServiceFetcher<NetworkPolicyManager>() {
383             @Override
384             public NetworkPolicyManager createService(ContextImpl ctx) throws ServiceNotFoundException {
385                 return new NetworkPolicyManager(ctx, INetworkPolicyManager.Stub.asInterface(
386                         ServiceManager.getServiceOrThrow(Context.NETWORK_POLICY_SERVICE)));
387             }});
388 
registerService(Context.NOTIFICATION_SERVICE, NotificationManager.class, new CachedServiceFetcher<NotificationManager>() { @Override public NotificationManager createService(ContextImpl ctx) { final Context outerContext = ctx.getOuterContext(); return new NotificationManager( new ContextThemeWrapper(outerContext, Resources.selectSystemTheme(0, outerContext.getApplicationInfo().targetSdkVersion, com.android.internal.R.style.Theme_Dialog, com.android.internal.R.style.Theme_Holo_Dialog, com.android.internal.R.style.Theme_DeviceDefault_Dialog, com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)), ctx.mMainThread.getHandler()); }})389         registerService(Context.NOTIFICATION_SERVICE, NotificationManager.class,
390                 new CachedServiceFetcher<NotificationManager>() {
391             @Override
392             public NotificationManager createService(ContextImpl ctx) {
393                 final Context outerContext = ctx.getOuterContext();
394                 return new NotificationManager(
395                     new ContextThemeWrapper(outerContext,
396                             Resources.selectSystemTheme(0,
397                                     outerContext.getApplicationInfo().targetSdkVersion,
398                                     com.android.internal.R.style.Theme_Dialog,
399                                     com.android.internal.R.style.Theme_Holo_Dialog,
400                                     com.android.internal.R.style.Theme_DeviceDefault_Dialog,
401                                     com.android.internal.R.style.Theme_DeviceDefault_Light_Dialog)),
402                     ctx.mMainThread.getHandler());
403             }});
404 
registerService(Context.NSD_SERVICE, NsdManager.class, new CachedServiceFetcher<NsdManager>() { @Override public NsdManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.NSD_SERVICE); INsdManager service = INsdManager.Stub.asInterface(b); return new NsdManager(ctx.getOuterContext(), service); }})405         registerService(Context.NSD_SERVICE, NsdManager.class,
406                 new CachedServiceFetcher<NsdManager>() {
407             @Override
408             public NsdManager createService(ContextImpl ctx) throws ServiceNotFoundException {
409                 IBinder b = ServiceManager.getServiceOrThrow(Context.NSD_SERVICE);
410                 INsdManager service = INsdManager.Stub.asInterface(b);
411                 return new NsdManager(ctx.getOuterContext(), service);
412             }});
413 
registerService(Context.POWER_SERVICE, PowerManager.class, new CachedServiceFetcher<PowerManager>() { @Override public PowerManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.POWER_SERVICE); IPowerManager service = IPowerManager.Stub.asInterface(b); return new PowerManager(ctx.getOuterContext(), service, ctx.mMainThread.getHandler()); }})414         registerService(Context.POWER_SERVICE, PowerManager.class,
415                 new CachedServiceFetcher<PowerManager>() {
416             @Override
417             public PowerManager createService(ContextImpl ctx) throws ServiceNotFoundException {
418                 IBinder b = ServiceManager.getServiceOrThrow(Context.POWER_SERVICE);
419                 IPowerManager service = IPowerManager.Stub.asInterface(b);
420                 return new PowerManager(ctx.getOuterContext(),
421                         service, ctx.mMainThread.getHandler());
422             }});
423 
registerService(Context.RECOVERY_SERVICE, RecoverySystem.class, new CachedServiceFetcher<RecoverySystem>() { @Override public RecoverySystem createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.RECOVERY_SERVICE); IRecoverySystem service = IRecoverySystem.Stub.asInterface(b); return new RecoverySystem(service); }})424         registerService(Context.RECOVERY_SERVICE, RecoverySystem.class,
425                 new CachedServiceFetcher<RecoverySystem>() {
426             @Override
427             public RecoverySystem createService(ContextImpl ctx) throws ServiceNotFoundException {
428                 IBinder b = ServiceManager.getServiceOrThrow(Context.RECOVERY_SERVICE);
429                 IRecoverySystem service = IRecoverySystem.Stub.asInterface(b);
430                 return new RecoverySystem(service);
431             }});
432 
registerService(Context.SEARCH_SERVICE, SearchManager.class, new CachedServiceFetcher<SearchManager>() { @Override public SearchManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new SearchManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})433         registerService(Context.SEARCH_SERVICE, SearchManager.class,
434                 new CachedServiceFetcher<SearchManager>() {
435             @Override
436             public SearchManager createService(ContextImpl ctx) throws ServiceNotFoundException {
437                 return new SearchManager(ctx.getOuterContext(),
438                         ctx.mMainThread.getHandler());
439             }});
440 
registerService(Context.SENSOR_SERVICE, SensorManager.class, new CachedServiceFetcher<SensorManager>() { @Override public SensorManager createService(ContextImpl ctx) { return new SystemSensorManager(ctx.getOuterContext(), ctx.mMainThread.getHandler().getLooper()); }})441         registerService(Context.SENSOR_SERVICE, SensorManager.class,
442                 new CachedServiceFetcher<SensorManager>() {
443             @Override
444             public SensorManager createService(ContextImpl ctx) {
445                 return new SystemSensorManager(ctx.getOuterContext(),
446                   ctx.mMainThread.getHandler().getLooper());
447             }});
448 
registerService(Context.STATUS_BAR_SERVICE, StatusBarManager.class, new CachedServiceFetcher<StatusBarManager>() { @Override public StatusBarManager createService(ContextImpl ctx) { return new StatusBarManager(ctx.getOuterContext()); }})449         registerService(Context.STATUS_BAR_SERVICE, StatusBarManager.class,
450                 new CachedServiceFetcher<StatusBarManager>() {
451             @Override
452             public StatusBarManager createService(ContextImpl ctx) {
453                 return new StatusBarManager(ctx.getOuterContext());
454             }});
455 
registerService(Context.STORAGE_SERVICE, StorageManager.class, new CachedServiceFetcher<StorageManager>() { @Override public StorageManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new StorageManager(ctx, ctx.mMainThread.getHandler().getLooper()); }})456         registerService(Context.STORAGE_SERVICE, StorageManager.class,
457                 new CachedServiceFetcher<StorageManager>() {
458             @Override
459             public StorageManager createService(ContextImpl ctx) throws ServiceNotFoundException {
460                 return new StorageManager(ctx, ctx.mMainThread.getHandler().getLooper());
461             }});
462 
registerService(Context.STORAGE_STATS_SERVICE, StorageStatsManager.class, new CachedServiceFetcher<StorageStatsManager>() { @Override public StorageStatsManager createService(ContextImpl ctx) throws ServiceNotFoundException { IStorageStatsManager service = IStorageStatsManager.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.STORAGE_STATS_SERVICE)); return new StorageStatsManager(ctx, service); }})463         registerService(Context.STORAGE_STATS_SERVICE, StorageStatsManager.class,
464                 new CachedServiceFetcher<StorageStatsManager>() {
465             @Override
466             public StorageStatsManager createService(ContextImpl ctx) throws ServiceNotFoundException {
467                 IStorageStatsManager service = IStorageStatsManager.Stub.asInterface(
468                         ServiceManager.getServiceOrThrow(Context.STORAGE_STATS_SERVICE));
469                 return new StorageStatsManager(ctx, service);
470             }});
471 
registerService(Context.TELEPHONY_SERVICE, TelephonyManager.class, new CachedServiceFetcher<TelephonyManager>() { @Override public TelephonyManager createService(ContextImpl ctx) { return new TelephonyManager(ctx.getOuterContext()); }})472         registerService(Context.TELEPHONY_SERVICE, TelephonyManager.class,
473                 new CachedServiceFetcher<TelephonyManager>() {
474             @Override
475             public TelephonyManager createService(ContextImpl ctx) {
476                 return new TelephonyManager(ctx.getOuterContext());
477             }});
478 
registerService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class, new CachedServiceFetcher<SubscriptionManager>() { @Override public SubscriptionManager createService(ContextImpl ctx) { return new SubscriptionManager(ctx.getOuterContext()); }})479         registerService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class,
480                 new CachedServiceFetcher<SubscriptionManager>() {
481             @Override
482             public SubscriptionManager createService(ContextImpl ctx) {
483                 return new SubscriptionManager(ctx.getOuterContext());
484             }});
485 
registerService(Context.CARRIER_CONFIG_SERVICE, CarrierConfigManager.class, new CachedServiceFetcher<CarrierConfigManager>() { @Override public CarrierConfigManager createService(ContextImpl ctx) { return new CarrierConfigManager(); }})486         registerService(Context.CARRIER_CONFIG_SERVICE, CarrierConfigManager.class,
487                 new CachedServiceFetcher<CarrierConfigManager>() {
488             @Override
489             public CarrierConfigManager createService(ContextImpl ctx) {
490                 return new CarrierConfigManager();
491             }});
492 
registerService(Context.TELECOM_SERVICE, TelecomManager.class, new CachedServiceFetcher<TelecomManager>() { @Override public TelecomManager createService(ContextImpl ctx) { return new TelecomManager(ctx.getOuterContext()); }})493         registerService(Context.TELECOM_SERVICE, TelecomManager.class,
494                 new CachedServiceFetcher<TelecomManager>() {
495             @Override
496             public TelecomManager createService(ContextImpl ctx) {
497                 return new TelecomManager(ctx.getOuterContext());
498             }});
499 
registerService(Context.EUICC_SERVICE, EuiccManager.class, new CachedServiceFetcher<EuiccManager>() { @Override public EuiccManager createService(ContextImpl ctx) { return new EuiccManager(ctx.getOuterContext()); }})500         registerService(Context.EUICC_SERVICE, EuiccManager.class,
501                 new CachedServiceFetcher<EuiccManager>() {
502             @Override
503             public EuiccManager createService(ContextImpl ctx) {
504                 return new EuiccManager(ctx.getOuterContext());
505             }});
506 
registerService(Context.UI_MODE_SERVICE, UiModeManager.class, new CachedServiceFetcher<UiModeManager>() { @Override public UiModeManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new UiModeManager(); }})507         registerService(Context.UI_MODE_SERVICE, UiModeManager.class,
508                 new CachedServiceFetcher<UiModeManager>() {
509             @Override
510             public UiModeManager createService(ContextImpl ctx) throws ServiceNotFoundException {
511                 return new UiModeManager();
512             }});
513 
registerService(Context.USB_SERVICE, UsbManager.class, new CachedServiceFetcher<UsbManager>() { @Override public UsbManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.USB_SERVICE); return new UsbManager(ctx, IUsbManager.Stub.asInterface(b)); }})514         registerService(Context.USB_SERVICE, UsbManager.class,
515                 new CachedServiceFetcher<UsbManager>() {
516             @Override
517             public UsbManager createService(ContextImpl ctx) throws ServiceNotFoundException {
518                 IBinder b = ServiceManager.getServiceOrThrow(Context.USB_SERVICE);
519                 return new UsbManager(ctx, IUsbManager.Stub.asInterface(b));
520             }});
521 
registerService(Context.SERIAL_SERVICE, SerialManager.class, new CachedServiceFetcher<SerialManager>() { @Override public SerialManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.SERIAL_SERVICE); return new SerialManager(ctx, ISerialManager.Stub.asInterface(b)); }})522         registerService(Context.SERIAL_SERVICE, SerialManager.class,
523                 new CachedServiceFetcher<SerialManager>() {
524             @Override
525             public SerialManager createService(ContextImpl ctx) throws ServiceNotFoundException {
526                 IBinder b = ServiceManager.getServiceOrThrow(Context.SERIAL_SERVICE);
527                 return new SerialManager(ctx, ISerialManager.Stub.asInterface(b));
528             }});
529 
registerService(Context.VIBRATOR_SERVICE, Vibrator.class, new CachedServiceFetcher<Vibrator>() { @Override public Vibrator createService(ContextImpl ctx) { return new SystemVibrator(ctx); }})530         registerService(Context.VIBRATOR_SERVICE, Vibrator.class,
531                 new CachedServiceFetcher<Vibrator>() {
532             @Override
533             public Vibrator createService(ContextImpl ctx) {
534                 return new SystemVibrator(ctx);
535             }});
536 
registerService(Context.WALLPAPER_SERVICE, WallpaperManager.class, new CachedServiceFetcher<WallpaperManager>() { @Override public WallpaperManager createService(ContextImpl ctx) { return new WallpaperManager(ctx.getOuterContext(), ctx.mMainThread.getHandler()); }})537         registerService(Context.WALLPAPER_SERVICE, WallpaperManager.class,
538                 new CachedServiceFetcher<WallpaperManager>() {
539             @Override
540             public WallpaperManager createService(ContextImpl ctx) {
541                 return new WallpaperManager(ctx.getOuterContext(),
542                         ctx.mMainThread.getHandler());
543             }});
544 
registerService(Context.LOWPAN_SERVICE, LowpanManager.class, new CachedServiceFetcher<LowpanManager>() { @Override public LowpanManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.LOWPAN_SERVICE); ILowpanManager service = ILowpanManager.Stub.asInterface(b); return new LowpanManager(ctx.getOuterContext(), service, ConnectivityThread.getInstanceLooper()); }})545         registerService(Context.LOWPAN_SERVICE, LowpanManager.class,
546                 new CachedServiceFetcher<LowpanManager>() {
547             @Override
548             public LowpanManager createService(ContextImpl ctx) throws ServiceNotFoundException {
549                 IBinder b = ServiceManager.getServiceOrThrow(Context.LOWPAN_SERVICE);
550                 ILowpanManager service = ILowpanManager.Stub.asInterface(b);
551                 return new LowpanManager(ctx.getOuterContext(), service,
552                         ConnectivityThread.getInstanceLooper());
553             }});
554 
registerService(Context.WIFI_SERVICE, WifiManager.class, new CachedServiceFetcher<WifiManager>() { @Override public WifiManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_SERVICE); IWifiManager service = IWifiManager.Stub.asInterface(b); return new WifiManager(ctx.getOuterContext(), service, ConnectivityThread.getInstanceLooper()); }})555         registerService(Context.WIFI_SERVICE, WifiManager.class,
556                 new CachedServiceFetcher<WifiManager>() {
557             @Override
558             public WifiManager createService(ContextImpl ctx) throws ServiceNotFoundException {
559                 IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_SERVICE);
560                 IWifiManager service = IWifiManager.Stub.asInterface(b);
561                 return new WifiManager(ctx.getOuterContext(), service,
562                         ConnectivityThread.getInstanceLooper());
563             }});
564 
registerService(Context.WIFI_P2P_SERVICE, WifiP2pManager.class, new StaticServiceFetcher<WifiP2pManager>() { @Override public WifiP2pManager createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_P2P_SERVICE); IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b); return new WifiP2pManager(service); }})565         registerService(Context.WIFI_P2P_SERVICE, WifiP2pManager.class,
566                 new StaticServiceFetcher<WifiP2pManager>() {
567             @Override
568             public WifiP2pManager createService() throws ServiceNotFoundException {
569                 IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_P2P_SERVICE);
570                 IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);
571                 return new WifiP2pManager(service);
572             }});
573 
registerService(Context.WIFI_AWARE_SERVICE, WifiAwareManager.class, new CachedServiceFetcher<WifiAwareManager>() { @Override public WifiAwareManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_AWARE_SERVICE); IWifiAwareManager service = IWifiAwareManager.Stub.asInterface(b); if (service == null) { return null; } return new WifiAwareManager(ctx.getOuterContext(), service); }})574         registerService(Context.WIFI_AWARE_SERVICE, WifiAwareManager.class,
575                 new CachedServiceFetcher<WifiAwareManager>() {
576             @Override
577             public WifiAwareManager createService(ContextImpl ctx) throws ServiceNotFoundException {
578                 IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_AWARE_SERVICE);
579                 IWifiAwareManager service = IWifiAwareManager.Stub.asInterface(b);
580                 if (service == null) {
581                     return null;
582                 }
583                 return new WifiAwareManager(ctx.getOuterContext(), service);
584             }});
585 
registerService(Context.WIFI_SCANNING_SERVICE, WifiScanner.class, new CachedServiceFetcher<WifiScanner>() { @Override public WifiScanner createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_SCANNING_SERVICE); IWifiScanner service = IWifiScanner.Stub.asInterface(b); return new WifiScanner(ctx.getOuterContext(), service, ConnectivityThread.getInstanceLooper()); }})586         registerService(Context.WIFI_SCANNING_SERVICE, WifiScanner.class,
587                 new CachedServiceFetcher<WifiScanner>() {
588             @Override
589             public WifiScanner createService(ContextImpl ctx) throws ServiceNotFoundException {
590                 IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_SCANNING_SERVICE);
591                 IWifiScanner service = IWifiScanner.Stub.asInterface(b);
592                 return new WifiScanner(ctx.getOuterContext(), service,
593                         ConnectivityThread.getInstanceLooper());
594             }});
595 
registerService(Context.WIFI_RTT_SERVICE, RttManager.class, new CachedServiceFetcher<RttManager>() { @Override public RttManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_RTT_SERVICE); IRttManager service = IRttManager.Stub.asInterface(b); return new RttManager(ctx.getOuterContext(), service, ConnectivityThread.getInstanceLooper()); }})596         registerService(Context.WIFI_RTT_SERVICE, RttManager.class,
597                 new CachedServiceFetcher<RttManager>() {
598             @Override
599             public RttManager createService(ContextImpl ctx) throws ServiceNotFoundException {
600                 IBinder b = ServiceManager.getServiceOrThrow(Context.WIFI_RTT_SERVICE);
601                 IRttManager service = IRttManager.Stub.asInterface(b);
602                 return new RttManager(ctx.getOuterContext(), service,
603                         ConnectivityThread.getInstanceLooper());
604             }});
605 
registerService(Context.ETHERNET_SERVICE, EthernetManager.class, new CachedServiceFetcher<EthernetManager>() { @Override public EthernetManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.ETHERNET_SERVICE); IEthernetManager service = IEthernetManager.Stub.asInterface(b); return new EthernetManager(ctx.getOuterContext(), service); }})606         registerService(Context.ETHERNET_SERVICE, EthernetManager.class,
607                 new CachedServiceFetcher<EthernetManager>() {
608             @Override
609             public EthernetManager createService(ContextImpl ctx) throws ServiceNotFoundException {
610                 IBinder b = ServiceManager.getServiceOrThrow(Context.ETHERNET_SERVICE);
611                 IEthernetManager service = IEthernetManager.Stub.asInterface(b);
612                 return new EthernetManager(ctx.getOuterContext(), service);
613             }});
614 
registerService(Context.WINDOW_SERVICE, WindowManager.class, new CachedServiceFetcher<WindowManager>() { @Override public WindowManager createService(ContextImpl ctx) { return new WindowManagerImpl(ctx); }})615         registerService(Context.WINDOW_SERVICE, WindowManager.class,
616                 new CachedServiceFetcher<WindowManager>() {
617             @Override
618             public WindowManager createService(ContextImpl ctx) {
619                 return new WindowManagerImpl(ctx);
620             }});
621 
registerService(Context.USER_SERVICE, UserManager.class, new CachedServiceFetcher<UserManager>() { @Override public UserManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.USER_SERVICE); IUserManager service = IUserManager.Stub.asInterface(b); return new UserManager(ctx, service); }})622         registerService(Context.USER_SERVICE, UserManager.class,
623                 new CachedServiceFetcher<UserManager>() {
624             @Override
625             public UserManager createService(ContextImpl ctx) throws ServiceNotFoundException {
626                 IBinder b = ServiceManager.getServiceOrThrow(Context.USER_SERVICE);
627                 IUserManager service = IUserManager.Stub.asInterface(b);
628                 return new UserManager(ctx, service);
629             }});
630 
registerService(Context.APP_OPS_SERVICE, AppOpsManager.class, new CachedServiceFetcher<AppOpsManager>() { @Override public AppOpsManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.APP_OPS_SERVICE); IAppOpsService service = IAppOpsService.Stub.asInterface(b); return new AppOpsManager(ctx, service); }})631         registerService(Context.APP_OPS_SERVICE, AppOpsManager.class,
632                 new CachedServiceFetcher<AppOpsManager>() {
633             @Override
634             public AppOpsManager createService(ContextImpl ctx) throws ServiceNotFoundException {
635                 IBinder b = ServiceManager.getServiceOrThrow(Context.APP_OPS_SERVICE);
636                 IAppOpsService service = IAppOpsService.Stub.asInterface(b);
637                 return new AppOpsManager(ctx, service);
638             }});
639 
registerService(Context.CAMERA_SERVICE, CameraManager.class, new CachedServiceFetcher<CameraManager>() { @Override public CameraManager createService(ContextImpl ctx) { return new CameraManager(ctx); }})640         registerService(Context.CAMERA_SERVICE, CameraManager.class,
641                 new CachedServiceFetcher<CameraManager>() {
642             @Override
643             public CameraManager createService(ContextImpl ctx) {
644                 return new CameraManager(ctx);
645             }});
646 
registerService(Context.LAUNCHER_APPS_SERVICE, LauncherApps.class, new CachedServiceFetcher<LauncherApps>() { @Override public LauncherApps createService(ContextImpl ctx) { return new LauncherApps(ctx); }})647         registerService(Context.LAUNCHER_APPS_SERVICE, LauncherApps.class,
648                 new CachedServiceFetcher<LauncherApps>() {
649             @Override
650             public LauncherApps createService(ContextImpl ctx) {
651                 return new LauncherApps(ctx);
652             }});
653 
registerService(Context.RESTRICTIONS_SERVICE, RestrictionsManager.class, new CachedServiceFetcher<RestrictionsManager>() { @Override public RestrictionsManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.RESTRICTIONS_SERVICE); IRestrictionsManager service = IRestrictionsManager.Stub.asInterface(b); return new RestrictionsManager(ctx, service); }})654         registerService(Context.RESTRICTIONS_SERVICE, RestrictionsManager.class,
655                 new CachedServiceFetcher<RestrictionsManager>() {
656             @Override
657             public RestrictionsManager createService(ContextImpl ctx) throws ServiceNotFoundException {
658                 IBinder b = ServiceManager.getServiceOrThrow(Context.RESTRICTIONS_SERVICE);
659                 IRestrictionsManager service = IRestrictionsManager.Stub.asInterface(b);
660                 return new RestrictionsManager(ctx, service);
661             }});
662 
registerService(Context.PRINT_SERVICE, PrintManager.class, new CachedServiceFetcher<PrintManager>() { @Override public PrintManager createService(ContextImpl ctx) throws ServiceNotFoundException { IPrintManager service = null; if (ctx.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PRINTING)) { service = IPrintManager.Stub.asInterface(ServiceManager .getServiceOrThrow(Context.PRINT_SERVICE)); } return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(), UserHandle.getAppId(Process.myUid())); }})663         registerService(Context.PRINT_SERVICE, PrintManager.class,
664                 new CachedServiceFetcher<PrintManager>() {
665             @Override
666             public PrintManager createService(ContextImpl ctx) throws ServiceNotFoundException {
667                 IPrintManager service = null;
668                 // If the feature not present, don't try to look up every time
669                 if (ctx.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PRINTING)) {
670                     service = IPrintManager.Stub.asInterface(ServiceManager
671                             .getServiceOrThrow(Context.PRINT_SERVICE));
672                 }
673                 return new PrintManager(ctx.getOuterContext(), service, UserHandle.myUserId(),
674                         UserHandle.getAppId(Process.myUid()));
675             }});
676 
registerService(Context.COMPANION_DEVICE_SERVICE, CompanionDeviceManager.class, new CachedServiceFetcher<CompanionDeviceManager>() { @Override public CompanionDeviceManager createService(ContextImpl ctx) throws ServiceNotFoundException { ICompanionDeviceManager service = null; if (ctx.getPackageManager().hasSystemFeature( PackageManager.FEATURE_COMPANION_DEVICE_SETUP)) { service = ICompanionDeviceManager.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.COMPANION_DEVICE_SERVICE)); } return new CompanionDeviceManager(service, ctx.getOuterContext()); }})677         registerService(Context.COMPANION_DEVICE_SERVICE, CompanionDeviceManager.class,
678                 new CachedServiceFetcher<CompanionDeviceManager>() {
679             @Override
680             public CompanionDeviceManager createService(ContextImpl ctx)
681                     throws ServiceNotFoundException {
682                 ICompanionDeviceManager service = null;
683                 // If the feature not present, don't try to look up every time
684                 if (ctx.getPackageManager().hasSystemFeature(
685                         PackageManager.FEATURE_COMPANION_DEVICE_SETUP)) {
686                     service = ICompanionDeviceManager.Stub.asInterface(
687                             ServiceManager.getServiceOrThrow(Context.COMPANION_DEVICE_SERVICE));
688                 }
689                 return new CompanionDeviceManager(service, ctx.getOuterContext());
690             }});
691 
registerService(Context.CONSUMER_IR_SERVICE, ConsumerIrManager.class, new CachedServiceFetcher<ConsumerIrManager>() { @Override public ConsumerIrManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new ConsumerIrManager(ctx); }})692         registerService(Context.CONSUMER_IR_SERVICE, ConsumerIrManager.class,
693                 new CachedServiceFetcher<ConsumerIrManager>() {
694             @Override
695             public ConsumerIrManager createService(ContextImpl ctx) throws ServiceNotFoundException {
696                 return new ConsumerIrManager(ctx);
697             }});
698 
registerService(Context.MEDIA_SESSION_SERVICE, MediaSessionManager.class, new CachedServiceFetcher<MediaSessionManager>() { @Override public MediaSessionManager createService(ContextImpl ctx) { return new MediaSessionManager(ctx); }})699         registerService(Context.MEDIA_SESSION_SERVICE, MediaSessionManager.class,
700                 new CachedServiceFetcher<MediaSessionManager>() {
701             @Override
702             public MediaSessionManager createService(ContextImpl ctx) {
703                 return new MediaSessionManager(ctx);
704             }});
705 
registerService(Context.TRUST_SERVICE, TrustManager.class, new StaticServiceFetcher<TrustManager>() { @Override public TrustManager createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.TRUST_SERVICE); return new TrustManager(b); }})706         registerService(Context.TRUST_SERVICE, TrustManager.class,
707                 new StaticServiceFetcher<TrustManager>() {
708             @Override
709             public TrustManager createService() throws ServiceNotFoundException {
710                 IBinder b = ServiceManager.getServiceOrThrow(Context.TRUST_SERVICE);
711                 return new TrustManager(b);
712             }});
713 
registerService(Context.FINGERPRINT_SERVICE, FingerprintManager.class, new CachedServiceFetcher<FingerprintManager>() { @Override public FingerprintManager createService(ContextImpl ctx) throws ServiceNotFoundException { final IBinder binder; if (ctx.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) { binder = ServiceManager.getServiceOrThrow(Context.FINGERPRINT_SERVICE); } else { binder = ServiceManager.getService(Context.FINGERPRINT_SERVICE); } IFingerprintService service = IFingerprintService.Stub.asInterface(binder); return new FingerprintManager(ctx.getOuterContext(), service); }})714         registerService(Context.FINGERPRINT_SERVICE, FingerprintManager.class,
715                 new CachedServiceFetcher<FingerprintManager>() {
716             @Override
717             public FingerprintManager createService(ContextImpl ctx) throws ServiceNotFoundException {
718                 final IBinder binder;
719                 if (ctx.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) {
720                     binder = ServiceManager.getServiceOrThrow(Context.FINGERPRINT_SERVICE);
721                 } else {
722                     binder = ServiceManager.getService(Context.FINGERPRINT_SERVICE);
723                 }
724                 IFingerprintService service = IFingerprintService.Stub.asInterface(binder);
725                 return new FingerprintManager(ctx.getOuterContext(), service);
726             }});
727 
registerService(Context.TV_INPUT_SERVICE, TvInputManager.class, new StaticServiceFetcher<TvInputManager>() { @Override public TvInputManager createService() throws ServiceNotFoundException { IBinder iBinder = ServiceManager.getServiceOrThrow(Context.TV_INPUT_SERVICE); ITvInputManager service = ITvInputManager.Stub.asInterface(iBinder); return new TvInputManager(service, UserHandle.myUserId()); }})728         registerService(Context.TV_INPUT_SERVICE, TvInputManager.class,
729                 new StaticServiceFetcher<TvInputManager>() {
730             @Override
731             public TvInputManager createService() throws ServiceNotFoundException {
732                 IBinder iBinder = ServiceManager.getServiceOrThrow(Context.TV_INPUT_SERVICE);
733                 ITvInputManager service = ITvInputManager.Stub.asInterface(iBinder);
734                 return new TvInputManager(service, UserHandle.myUserId());
735             }});
736 
registerService(Context.NETWORK_SCORE_SERVICE, NetworkScoreManager.class, new CachedServiceFetcher<NetworkScoreManager>() { @Override public NetworkScoreManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new NetworkScoreManager(ctx); }})737         registerService(Context.NETWORK_SCORE_SERVICE, NetworkScoreManager.class,
738                 new CachedServiceFetcher<NetworkScoreManager>() {
739             @Override
740             public NetworkScoreManager createService(ContextImpl ctx) throws ServiceNotFoundException {
741                 return new NetworkScoreManager(ctx);
742             }});
743 
registerService(Context.USAGE_STATS_SERVICE, UsageStatsManager.class, new CachedServiceFetcher<UsageStatsManager>() { @Override public UsageStatsManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder iBinder = ServiceManager.getServiceOrThrow(Context.USAGE_STATS_SERVICE); IUsageStatsManager service = IUsageStatsManager.Stub.asInterface(iBinder); return new UsageStatsManager(ctx.getOuterContext(), service); }})744         registerService(Context.USAGE_STATS_SERVICE, UsageStatsManager.class,
745                 new CachedServiceFetcher<UsageStatsManager>() {
746             @Override
747             public UsageStatsManager createService(ContextImpl ctx) throws ServiceNotFoundException {
748                 IBinder iBinder = ServiceManager.getServiceOrThrow(Context.USAGE_STATS_SERVICE);
749                 IUsageStatsManager service = IUsageStatsManager.Stub.asInterface(iBinder);
750                 return new UsageStatsManager(ctx.getOuterContext(), service);
751             }});
752 
registerService(Context.NETWORK_STATS_SERVICE, NetworkStatsManager.class, new CachedServiceFetcher<NetworkStatsManager>() { @Override public NetworkStatsManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new NetworkStatsManager(ctx.getOuterContext()); }})753         registerService(Context.NETWORK_STATS_SERVICE, NetworkStatsManager.class,
754                 new CachedServiceFetcher<NetworkStatsManager>() {
755             @Override
756             public NetworkStatsManager createService(ContextImpl ctx) throws ServiceNotFoundException {
757                 return new NetworkStatsManager(ctx.getOuterContext());
758             }});
759 
registerService(Context.JOB_SCHEDULER_SERVICE, JobScheduler.class, new StaticServiceFetcher<JobScheduler>() { @Override public JobScheduler createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.JOB_SCHEDULER_SERVICE); return new JobSchedulerImpl(IJobScheduler.Stub.asInterface(b)); }})760         registerService(Context.JOB_SCHEDULER_SERVICE, JobScheduler.class,
761                 new StaticServiceFetcher<JobScheduler>() {
762             @Override
763             public JobScheduler createService() throws ServiceNotFoundException {
764                 IBinder b = ServiceManager.getServiceOrThrow(Context.JOB_SCHEDULER_SERVICE);
765                 return new JobSchedulerImpl(IJobScheduler.Stub.asInterface(b));
766             }});
767 
registerService(Context.PERSISTENT_DATA_BLOCK_SERVICE, PersistentDataBlockManager.class, new StaticServiceFetcher<PersistentDataBlockManager>() { @Override public PersistentDataBlockManager createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.PERSISTENT_DATA_BLOCK_SERVICE); IPersistentDataBlockService persistentDataBlockService = IPersistentDataBlockService.Stub.asInterface(b); if (persistentDataBlockService != null) { return new PersistentDataBlockManager(persistentDataBlockService); } else { return null; } }})768         registerService(Context.PERSISTENT_DATA_BLOCK_SERVICE, PersistentDataBlockManager.class,
769                 new StaticServiceFetcher<PersistentDataBlockManager>() {
770             @Override
771             public PersistentDataBlockManager createService() throws ServiceNotFoundException {
772                 IBinder b = ServiceManager.getServiceOrThrow(Context.PERSISTENT_DATA_BLOCK_SERVICE);
773                 IPersistentDataBlockService persistentDataBlockService =
774                         IPersistentDataBlockService.Stub.asInterface(b);
775                 if (persistentDataBlockService != null) {
776                     return new PersistentDataBlockManager(persistentDataBlockService);
777                 } else {
778                     // not supported
779                     return null;
780                 }
781             }});
782 
registerService(Context.OEM_LOCK_SERVICE, OemLockManager.class, new StaticServiceFetcher<OemLockManager>() { @Override public OemLockManager createService() throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.OEM_LOCK_SERVICE); IOemLockService oemLockService = IOemLockService.Stub.asInterface(b); if (oemLockService != null) { return new OemLockManager(oemLockService); } else { return null; } }})783         registerService(Context.OEM_LOCK_SERVICE, OemLockManager.class,
784                 new StaticServiceFetcher<OemLockManager>() {
785             @Override
786             public OemLockManager createService() throws ServiceNotFoundException {
787                 IBinder b = ServiceManager.getServiceOrThrow(Context.OEM_LOCK_SERVICE);
788                 IOemLockService oemLockService = IOemLockService.Stub.asInterface(b);
789                 if (oemLockService != null) {
790                     return new OemLockManager(oemLockService);
791                 } else {
792                     // not supported
793                     return null;
794                 }
795             }});
796 
registerService(Context.MEDIA_PROJECTION_SERVICE, MediaProjectionManager.class, new CachedServiceFetcher<MediaProjectionManager>() { @Override public MediaProjectionManager createService(ContextImpl ctx) { return new MediaProjectionManager(ctx); }})797         registerService(Context.MEDIA_PROJECTION_SERVICE, MediaProjectionManager.class,
798                 new CachedServiceFetcher<MediaProjectionManager>() {
799             @Override
800             public MediaProjectionManager createService(ContextImpl ctx) {
801                 return new MediaProjectionManager(ctx);
802             }});
803 
registerService(Context.APPWIDGET_SERVICE, AppWidgetManager.class, new CachedServiceFetcher<AppWidgetManager>() { @Override public AppWidgetManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.APPWIDGET_SERVICE); return new AppWidgetManager(ctx, IAppWidgetService.Stub.asInterface(b)); }})804         registerService(Context.APPWIDGET_SERVICE, AppWidgetManager.class,
805                 new CachedServiceFetcher<AppWidgetManager>() {
806             @Override
807             public AppWidgetManager createService(ContextImpl ctx) throws ServiceNotFoundException {
808                 IBinder b = ServiceManager.getServiceOrThrow(Context.APPWIDGET_SERVICE);
809                 return new AppWidgetManager(ctx, IAppWidgetService.Stub.asInterface(b));
810             }});
811 
registerService(Context.MIDI_SERVICE, MidiManager.class, new CachedServiceFetcher<MidiManager>() { @Override public MidiManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.MIDI_SERVICE); return new MidiManager(IMidiManager.Stub.asInterface(b)); }})812         registerService(Context.MIDI_SERVICE, MidiManager.class,
813                 new CachedServiceFetcher<MidiManager>() {
814             @Override
815             public MidiManager createService(ContextImpl ctx) throws ServiceNotFoundException {
816                 IBinder b = ServiceManager.getServiceOrThrow(Context.MIDI_SERVICE);
817                 return new MidiManager(IMidiManager.Stub.asInterface(b));
818             }});
819 
registerService(Context.RADIO_SERVICE, RadioManager.class, new CachedServiceFetcher<RadioManager>() { @Override public RadioManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new RadioManager(ctx); }})820         registerService(Context.RADIO_SERVICE, RadioManager.class,
821                 new CachedServiceFetcher<RadioManager>() {
822             @Override
823             public RadioManager createService(ContextImpl ctx) throws ServiceNotFoundException {
824                 return new RadioManager(ctx);
825             }});
826 
registerService(Context.HARDWARE_PROPERTIES_SERVICE, HardwarePropertiesManager.class, new CachedServiceFetcher<HardwarePropertiesManager>() { @Override public HardwarePropertiesManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.HARDWARE_PROPERTIES_SERVICE); IHardwarePropertiesManager service = IHardwarePropertiesManager.Stub.asInterface(b); return new HardwarePropertiesManager(ctx, service); }})827         registerService(Context.HARDWARE_PROPERTIES_SERVICE, HardwarePropertiesManager.class,
828                 new CachedServiceFetcher<HardwarePropertiesManager>() {
829             @Override
830             public HardwarePropertiesManager createService(ContextImpl ctx) throws ServiceNotFoundException {
831                 IBinder b = ServiceManager.getServiceOrThrow(Context.HARDWARE_PROPERTIES_SERVICE);
832                 IHardwarePropertiesManager service =
833                         IHardwarePropertiesManager.Stub.asInterface(b);
834                 return new HardwarePropertiesManager(ctx, service);
835             }});
836 
registerService(Context.SOUND_TRIGGER_SERVICE, SoundTriggerManager.class, new CachedServiceFetcher<SoundTriggerManager>() { @Override public SoundTriggerManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.SOUND_TRIGGER_SERVICE); return new SoundTriggerManager(ctx, ISoundTriggerService.Stub.asInterface(b)); }})837         registerService(Context.SOUND_TRIGGER_SERVICE, SoundTriggerManager.class,
838                 new CachedServiceFetcher<SoundTriggerManager>() {
839             @Override
840             public SoundTriggerManager createService(ContextImpl ctx) throws ServiceNotFoundException {
841                 IBinder b = ServiceManager.getServiceOrThrow(Context.SOUND_TRIGGER_SERVICE);
842                 return new SoundTriggerManager(ctx, ISoundTriggerService.Stub.asInterface(b));
843             }});
844 
registerService(Context.SHORTCUT_SERVICE, ShortcutManager.class, new CachedServiceFetcher<ShortcutManager>() { @Override public ShortcutManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.SHORTCUT_SERVICE); return new ShortcutManager(ctx, IShortcutService.Stub.asInterface(b)); }})845         registerService(Context.SHORTCUT_SERVICE, ShortcutManager.class,
846                 new CachedServiceFetcher<ShortcutManager>() {
847             @Override
848             public ShortcutManager createService(ContextImpl ctx) throws ServiceNotFoundException {
849                 IBinder b = ServiceManager.getServiceOrThrow(Context.SHORTCUT_SERVICE);
850                 return new ShortcutManager(ctx, IShortcutService.Stub.asInterface(b));
851             }});
852 
registerService(Context.SYSTEM_HEALTH_SERVICE, SystemHealthManager.class, new CachedServiceFetcher<SystemHealthManager>() { @Override public SystemHealthManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(BatteryStats.SERVICE_NAME); return new SystemHealthManager(IBatteryStats.Stub.asInterface(b)); }})853         registerService(Context.SYSTEM_HEALTH_SERVICE, SystemHealthManager.class,
854                 new CachedServiceFetcher<SystemHealthManager>() {
855             @Override
856             public SystemHealthManager createService(ContextImpl ctx) throws ServiceNotFoundException {
857                 IBinder b = ServiceManager.getServiceOrThrow(BatteryStats.SERVICE_NAME);
858                 return new SystemHealthManager(IBatteryStats.Stub.asInterface(b));
859             }});
860 
registerService(Context.CONTEXTHUB_SERVICE, ContextHubManager.class, new CachedServiceFetcher<ContextHubManager>() { @Override public ContextHubManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new ContextHubManager(ctx.getOuterContext(), ctx.mMainThread.getHandler().getLooper()); }})861         registerService(Context.CONTEXTHUB_SERVICE, ContextHubManager.class,
862                 new CachedServiceFetcher<ContextHubManager>() {
863             @Override
864             public ContextHubManager createService(ContextImpl ctx) throws ServiceNotFoundException {
865                 return new ContextHubManager(ctx.getOuterContext(),
866                   ctx.mMainThread.getHandler().getLooper());
867             }});
868 
registerService(Context.INCIDENT_SERVICE, IncidentManager.class, new CachedServiceFetcher<IncidentManager>() { @Override public IncidentManager createService(ContextImpl ctx) throws ServiceNotFoundException { return new IncidentManager(ctx); }})869         registerService(Context.INCIDENT_SERVICE, IncidentManager.class,
870                 new CachedServiceFetcher<IncidentManager>() {
871             @Override
872             public IncidentManager createService(ContextImpl ctx) throws ServiceNotFoundException {
873                 return new IncidentManager(ctx);
874             }});
875 
registerService(Context.AUTOFILL_MANAGER_SERVICE, AutofillManager.class, new CachedServiceFetcher<AutofillManager>() { @Override public AutofillManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getService(Context.AUTOFILL_MANAGER_SERVICE); IAutoFillManager service = IAutoFillManager.Stub.asInterface(b); return new AutofillManager(ctx.getOuterContext(), service); }})876         registerService(Context.AUTOFILL_MANAGER_SERVICE, AutofillManager.class,
877                 new CachedServiceFetcher<AutofillManager>() {
878             @Override
879             public AutofillManager createService(ContextImpl ctx) throws ServiceNotFoundException {
880                 // Get the services without throwing as this is an optional feature
881                 IBinder b = ServiceManager.getService(Context.AUTOFILL_MANAGER_SERVICE);
882                 IAutoFillManager service = IAutoFillManager.Stub.asInterface(b);
883                 return new AutofillManager(ctx.getOuterContext(), service);
884             }});
885 
registerService(Context.VR_SERVICE, VrManager.class, new CachedServiceFetcher<VrManager>() { @Override public VrManager createService(ContextImpl ctx) throws ServiceNotFoundException { IBinder b = ServiceManager.getServiceOrThrow(Context.VR_SERVICE); return new VrManager(IVrManager.Stub.asInterface(b)); } })886         registerService(Context.VR_SERVICE, VrManager.class, new CachedServiceFetcher<VrManager>() {
887             @Override
888             public VrManager createService(ContextImpl ctx) throws ServiceNotFoundException {
889                 IBinder b = ServiceManager.getServiceOrThrow(Context.VR_SERVICE);
890                 return new VrManager(IVrManager.Stub.asInterface(b));
891             }
892         });
893 
registerService(Context.TIME_ZONE_RULES_MANAGER_SERVICE, RulesManager.class, new CachedServiceFetcher<RulesManager>() { @Override public RulesManager createService(ContextImpl ctx) { return new RulesManager(ctx.getOuterContext()); }})894         registerService(Context.TIME_ZONE_RULES_MANAGER_SERVICE, RulesManager.class,
895                 new CachedServiceFetcher<RulesManager>() {
896             @Override
897             public RulesManager createService(ContextImpl ctx) {
898                 return new RulesManager(ctx.getOuterContext());
899             }});
900     }
901 
902     /**
903      * Creates an array which is used to cache per-Context service instances.
904      */
createServiceCache()905     public static Object[] createServiceCache() {
906         return new Object[sServiceCacheSize];
907     }
908 
909     /**
910      * Gets a system service from a given context.
911      */
getSystemService(ContextImpl ctx, String name)912     public static Object getSystemService(ContextImpl ctx, String name) {
913         ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
914         return fetcher != null ? fetcher.getService(ctx) : null;
915     }
916 
917     /**
918      * Gets the name of the system-level service that is represented by the specified class.
919      */
getSystemServiceName(Class<?> serviceClass)920     public static String getSystemServiceName(Class<?> serviceClass) {
921         return SYSTEM_SERVICE_NAMES.get(serviceClass);
922     }
923 
924     /**
925      * Statically registers a system service with the context.
926      * This method must be called during static initialization only.
927      */
registerService(String serviceName, Class<T> serviceClass, ServiceFetcher<T> serviceFetcher)928     private static <T> void registerService(String serviceName, Class<T> serviceClass,
929             ServiceFetcher<T> serviceFetcher) {
930         SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
931         SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
932     }
933 
934     /**
935      * Base interface for classes that fetch services.
936      * These objects must only be created during static initialization.
937      */
938     static abstract interface ServiceFetcher<T> {
getService(ContextImpl ctx)939         T getService(ContextImpl ctx);
940     }
941 
942     /**
943      * Override this class when the system service constructor needs a
944      * ContextImpl and should be cached and retained by that context.
945      */
946     static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {
947         private final int mCacheIndex;
948 
CachedServiceFetcher()949         public CachedServiceFetcher() {
950             mCacheIndex = sServiceCacheSize++;
951         }
952 
953         @Override
954         @SuppressWarnings("unchecked")
getService(ContextImpl ctx)955         public final T getService(ContextImpl ctx) {
956             final Object[] cache = ctx.mServiceCache;
957             synchronized (cache) {
958                 // Fetch or create the service.
959                 Object service = cache[mCacheIndex];
960                 if (service == null) {
961                     try {
962                         service = createService(ctx);
963                         cache[mCacheIndex] = service;
964                     } catch (ServiceNotFoundException e) {
965                         onServiceNotFound(e);
966                     }
967                 }
968                 return (T)service;
969             }
970         }
971 
createService(ContextImpl ctx)972         public abstract T createService(ContextImpl ctx) throws ServiceNotFoundException;
973     }
974 
975     /**
976      * Override this class when the system service does not need a ContextImpl
977      * and should be cached and retained process-wide.
978      */
979     static abstract class StaticServiceFetcher<T> implements ServiceFetcher<T> {
980         private T mCachedInstance;
981 
982         @Override
getService(ContextImpl ctx)983         public final T getService(ContextImpl ctx) {
984             synchronized (StaticServiceFetcher.this) {
985                 if (mCachedInstance == null) {
986                     try {
987                         mCachedInstance = createService();
988                     } catch (ServiceNotFoundException e) {
989                         onServiceNotFound(e);
990                     }
991                 }
992                 return mCachedInstance;
993             }
994         }
995 
createService()996         public abstract T createService() throws ServiceNotFoundException;
997     }
998 
999     /**
1000      * Like StaticServiceFetcher, creates only one instance of the service per application, but when
1001      * creating the service for the first time, passes it the application context of the creating
1002      * application.
1003      *
1004      * TODO: Delete this once its only user (ConnectivityManager) is known to work well in the
1005      * case where multiple application components each have their own ConnectivityManager object.
1006      */
1007     static abstract class StaticApplicationContextServiceFetcher<T> implements ServiceFetcher<T> {
1008         private T mCachedInstance;
1009 
1010         @Override
getService(ContextImpl ctx)1011         public final T getService(ContextImpl ctx) {
1012             synchronized (StaticApplicationContextServiceFetcher.this) {
1013                 if (mCachedInstance == null) {
1014                     Context appContext = ctx.getApplicationContext();
1015                     // If the application context is null, we're either in the system process or
1016                     // it's the application context very early in app initialization. In both these
1017                     // cases, the passed-in ContextImpl will not be freed, so it's safe to pass it
1018                     // to the service. http://b/27532714 .
1019                     try {
1020                         mCachedInstance = createService(appContext != null ? appContext : ctx);
1021                     } catch (ServiceNotFoundException e) {
1022                         onServiceNotFound(e);
1023                     }
1024                 }
1025                 return mCachedInstance;
1026             }
1027         }
1028 
createService(Context applicationContext)1029         public abstract T createService(Context applicationContext) throws ServiceNotFoundException;
1030     }
1031 
onServiceNotFound(ServiceNotFoundException e)1032     public static void onServiceNotFound(ServiceNotFoundException e) {
1033         // We're mostly interested in tracking down long-lived core system
1034         // components that might stumble if they obtain bad references; just
1035         // emit a tidy log message for normal apps
1036         if (android.os.Process.myUid() < android.os.Process.FIRST_APPLICATION_UID) {
1037             Log.wtf(TAG, e.getMessage(), e);
1038         } else {
1039             Log.w(TAG, e.getMessage());
1040         }
1041     }
1042 }
1043