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