1 /* 2 * Copyright (C) 2014 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 com.android.server.telecom; 18 19 import android.Manifest; 20 import android.app.ActivityManager; 21 import android.bluetooth.BluetoothManager; 22 import android.content.BroadcastReceiver; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.content.IntentFilter; 26 import android.content.ServiceConnection; 27 import android.content.pm.ResolveInfo; 28 import android.net.Uri; 29 import android.os.BugreportManager; 30 import android.os.DropBoxManager; 31 import android.os.UserHandle; 32 import android.telecom.Log; 33 import android.telecom.PhoneAccountHandle; 34 import android.telephony.AnomalyReporter; 35 import android.telephony.TelephonyManager; 36 import android.widget.Toast; 37 38 import androidx.annotation.NonNull; 39 40 import com.android.internal.annotations.VisibleForTesting; 41 import com.android.server.telecom.CallAudioManager.AudioServiceFactory; 42 import com.android.server.telecom.DefaultDialerCache.DefaultDialerManagerAdapter; 43 import com.android.server.telecom.bluetooth.BluetoothDeviceManager; 44 import com.android.server.telecom.bluetooth.BluetoothRouteManager; 45 import com.android.server.telecom.bluetooth.BluetoothStateReceiver; 46 import com.android.server.telecom.callfiltering.BlockedNumbersAdapter; 47 import com.android.server.telecom.callfiltering.IncomingCallFilterGraph; 48 import com.android.server.telecom.components.UserCallIntentProcessor; 49 import com.android.server.telecom.components.UserCallIntentProcessorFactory; 50 import com.android.server.telecom.flags.FeatureFlags; 51 import com.android.server.telecom.ui.AudioProcessingNotification; 52 import com.android.server.telecom.ui.CallStreamingNotification; 53 import com.android.server.telecom.ui.DisconnectedCallNotifier; 54 import com.android.server.telecom.ui.IncomingCallNotifier; 55 import com.android.server.telecom.ui.MissedCallNotifierImpl.MissedCallNotifierImplFactory; 56 import com.android.server.telecom.ui.ToastFactory; 57 import com.android.server.telecom.voip.TransactionManager; 58 59 import java.io.FileNotFoundException; 60 import java.io.InputStream; 61 import java.util.List; 62 import java.util.concurrent.Executor; 63 import java.util.concurrent.Executors; 64 65 /** 66 * Top-level Application class for Telecom. 67 */ 68 public class TelecomSystem { 69 70 /** 71 * This interface is implemented by system-instantiated components (e.g., Services and 72 * Activity-s) that wish to use the TelecomSystem but would like to be testable. Such a 73 * component should implement the getTelecomSystem() method to return the global singleton, 74 * and use its own method. Tests can subclass the component to return a non-singleton. 75 * 76 * A refactoring goal for Telecom is to limit use of the TelecomSystem singleton to those 77 * system-instantiated components, and have all other parts of the system just take all their 78 * dependencies as explicit arguments to their constructor or other methods. 79 */ 80 public interface Component { getTelecomSystem()81 TelecomSystem getTelecomSystem(); 82 } 83 84 85 /** 86 * Tagging interface for the object used for synchronizing multi-threaded operations in 87 * the Telecom system. 88 */ 89 public interface SyncRoot { 90 } 91 92 private static final IntentFilter USER_SWITCHED_FILTER = 93 new IntentFilter(Intent.ACTION_USER_SWITCHED); 94 95 private static final IntentFilter USER_STARTING_FILTER = 96 new IntentFilter(Intent.ACTION_USER_STARTING); 97 98 private static final IntentFilter BOOT_COMPLETE_FILTER = 99 new IntentFilter(Intent.ACTION_BOOT_COMPLETED); 100 101 /** Intent filter for dialer secret codes. */ 102 private static final IntentFilter DIALER_SECRET_CODE_FILTER; 103 104 /** 105 * Initializes the dialer secret code intent filter. Setup to handle the various secret codes 106 * which can be dialed (e.g. in format *#*#code#*#*) to trigger various behavior in Telecom. 107 */ 108 static { 109 DIALER_SECRET_CODE_FILTER = new IntentFilter( 110 "android.provider.Telephony.SECRET_CODE"); 111 DIALER_SECRET_CODE_FILTER.addDataScheme("android_secret_code"); 112 DIALER_SECRET_CODE_FILTER addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_DEBUG_ON, null)113 .addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_DEBUG_ON, null); 114 DIALER_SECRET_CODE_FILTER addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_DEBUG_OFF, null)115 .addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_DEBUG_OFF, null); 116 DIALER_SECRET_CODE_FILTER addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_MARK, null)117 .addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_MARK, null); 118 DIALER_SECRET_CODE_FILTER addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_MENU, null)119 .addDataAuthority(DialerCodeReceiver.TELECOM_SECRET_CODE_MENU, null); 120 121 USER_SWITCHED_FILTER.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 122 USER_STARTING_FILTER.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 123 BOOT_COMPLETE_FILTER.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 124 DIALER_SECRET_CODE_FILTER.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); 125 } 126 127 private static TelecomSystem INSTANCE = null; 128 129 private final SyncRoot mLock = new SyncRoot() { }; 130 private final MissedCallNotifier mMissedCallNotifier; 131 private final IncomingCallNotifier mIncomingCallNotifier; 132 private final PhoneAccountRegistrar mPhoneAccountRegistrar; 133 private final CallsManager mCallsManager; 134 private final RespondViaSmsManager mRespondViaSmsManager; 135 private final Context mContext; 136 private final CallIntentProcessor mCallIntentProcessor; 137 private final TelecomBroadcastIntentProcessor mTelecomBroadcastIntentProcessor; 138 private final TelecomServiceImpl mTelecomServiceImpl; 139 private final ContactsAsyncHelper mContactsAsyncHelper; 140 private final DialerCodeReceiver mDialerCodeReceiver; 141 private final FeatureFlags mFeatureFlags; 142 143 private boolean mIsBootComplete = false; 144 145 private final BroadcastReceiver mUserSwitchedReceiver = new BroadcastReceiver() { 146 @Override 147 public void onReceive(Context context, Intent intent) { 148 Log.startSession("TSSwR.oR"); 149 try { 150 synchronized (mLock) { 151 int userHandleId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); 152 UserHandle currentUserHandle = new UserHandle(userHandleId); 153 mPhoneAccountRegistrar.setCurrentUserHandle(currentUserHandle); 154 mCallsManager.onUserSwitch(currentUserHandle); 155 } 156 } finally { 157 Log.endSession(); 158 } 159 } 160 }; 161 162 private final BroadcastReceiver mUserStartingReceiver = new BroadcastReceiver() { 163 @Override 164 public void onReceive(Context context, Intent intent) { 165 Log.startSession("TSStR.oR"); 166 try { 167 synchronized (mLock) { 168 int userHandleId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); 169 UserHandle addingUserHandle = new UserHandle(userHandleId); 170 mCallsManager.onUserStarting(addingUserHandle); 171 } 172 } finally { 173 Log.endSession(); 174 } 175 } 176 }; 177 178 private final BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() { 179 @Override 180 public void onReceive(Context context, Intent intent) { 181 Log.startSession("TSBCR.oR"); 182 try { 183 synchronized (mLock) { 184 mIsBootComplete = true; 185 mCallsManager.onBootCompleted(); 186 } 187 } finally { 188 Log.endSession(); 189 } 190 } 191 }; 192 getInstance()193 public static TelecomSystem getInstance() { 194 return INSTANCE; 195 } 196 setInstance(TelecomSystem instance)197 public static void setInstance(TelecomSystem instance) { 198 if (INSTANCE != null) { 199 Log.w("TelecomSystem", "Attempt to set TelecomSystem.INSTANCE twice"); 200 } 201 Log.i(TelecomSystem.class, "TelecomSystem.INSTANCE being set"); 202 INSTANCE = instance; 203 } 204 TelecomSystem( Context context, MissedCallNotifierImplFactory missedCallNotifierImplFactory, CallerInfoAsyncQueryFactory callerInfoAsyncQueryFactory, HeadsetMediaButtonFactory headsetMediaButtonFactory, ProximitySensorManagerFactory proximitySensorManagerFactory, InCallWakeLockControllerFactory inCallWakeLockControllerFactory, AudioServiceFactory audioServiceFactory, ConnectionServiceFocusManager.ConnectionServiceFocusManagerFactory connectionServiceFocusManagerFactory, Timeouts.Adapter timeoutsAdapter, AsyncRingtonePlayer asyncRingtonePlayer, PhoneNumberUtilsAdapter phoneNumberUtilsAdapter, IncomingCallNotifier incomingCallNotifier, InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory, CallAudioRouteStateMachine.Factory callAudioRouteStateMachineFactory, CallAudioModeStateMachine.Factory callAudioModeStateMachineFactory, ClockProxy clockProxy, RoleManagerAdapter roleManagerAdapter, ContactsAsyncHelper.Factory contactsAsyncHelperFactory, DeviceIdleControllerAdapter deviceIdleControllerAdapter, Ringer.AccessibilityManagerAdapter accessibilityManagerAdapter, Executor asyncTaskExecutor, Executor asyncCallAudioTaskExecutor, BlockedNumbersAdapter blockedNumbersAdapter, FeatureFlags featureFlags, com.android.internal.telephony.flags.FeatureFlags telephonyFlags)205 public TelecomSystem( 206 Context context, 207 MissedCallNotifierImplFactory missedCallNotifierImplFactory, 208 CallerInfoAsyncQueryFactory callerInfoAsyncQueryFactory, 209 HeadsetMediaButtonFactory headsetMediaButtonFactory, 210 ProximitySensorManagerFactory proximitySensorManagerFactory, 211 InCallWakeLockControllerFactory inCallWakeLockControllerFactory, 212 AudioServiceFactory audioServiceFactory, 213 ConnectionServiceFocusManager.ConnectionServiceFocusManagerFactory 214 connectionServiceFocusManagerFactory, 215 Timeouts.Adapter timeoutsAdapter, 216 AsyncRingtonePlayer asyncRingtonePlayer, 217 PhoneNumberUtilsAdapter phoneNumberUtilsAdapter, 218 IncomingCallNotifier incomingCallNotifier, 219 InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory, 220 CallAudioRouteStateMachine.Factory callAudioRouteStateMachineFactory, 221 CallAudioModeStateMachine.Factory callAudioModeStateMachineFactory, 222 ClockProxy clockProxy, 223 RoleManagerAdapter roleManagerAdapter, 224 ContactsAsyncHelper.Factory contactsAsyncHelperFactory, 225 DeviceIdleControllerAdapter deviceIdleControllerAdapter, 226 Ringer.AccessibilityManagerAdapter accessibilityManagerAdapter, 227 Executor asyncTaskExecutor, 228 Executor asyncCallAudioTaskExecutor, 229 BlockedNumbersAdapter blockedNumbersAdapter, 230 FeatureFlags featureFlags, 231 com.android.internal.telephony.flags.FeatureFlags telephonyFlags) { 232 mContext = context.getApplicationContext(); 233 mFeatureFlags = featureFlags; 234 LogUtils.initLogging(mContext); 235 android.telecom.Log.setLock(mLock); 236 AnomalyReporter.initialize(mContext); 237 DefaultDialerManagerAdapter defaultDialerAdapter = 238 new DefaultDialerCache.DefaultDialerManagerAdapterImpl(); 239 240 DefaultDialerCache defaultDialerCache = new DefaultDialerCache(mContext, 241 defaultDialerAdapter, roleManagerAdapter, mLock); 242 243 Log.startSession("TS.init"); 244 // Wrap this in a try block to ensure session cleanup occurs in the case of error. 245 try { 246 mPhoneAccountRegistrar = new PhoneAccountRegistrar(mContext, mLock, defaultDialerCache, 247 packageName -> AppLabelProxy.Util.getAppLabel( 248 mContext.getPackageManager(), packageName), null, mFeatureFlags); 249 250 mContactsAsyncHelper = contactsAsyncHelperFactory.create( 251 new ContactsAsyncHelper.ContentResolverAdapter() { 252 @Override 253 public InputStream openInputStream(Context context, Uri uri) 254 throws FileNotFoundException { 255 return context.getContentResolver().openInputStream(uri); 256 } 257 }); 258 CallAudioCommunicationDeviceTracker communicationDeviceTracker = new 259 CallAudioCommunicationDeviceTracker(mContext); 260 BluetoothDeviceManager bluetoothDeviceManager = new BluetoothDeviceManager(mContext, 261 mContext.getSystemService(BluetoothManager.class).getAdapter(), 262 communicationDeviceTracker, featureFlags); 263 BluetoothRouteManager bluetoothRouteManager = new BluetoothRouteManager(mContext, mLock, 264 bluetoothDeviceManager, new Timeouts.Adapter(), 265 communicationDeviceTracker, featureFlags); 266 BluetoothStateReceiver bluetoothStateReceiver = new BluetoothStateReceiver( 267 bluetoothDeviceManager, bluetoothRouteManager, 268 communicationDeviceTracker, featureFlags); 269 mContext.registerReceiver(bluetoothStateReceiver, BluetoothStateReceiver.INTENT_FILTER); 270 communicationDeviceTracker.setBluetoothRouteManager(bluetoothRouteManager); 271 272 WiredHeadsetManager wiredHeadsetManager = new WiredHeadsetManager(mContext); 273 SystemStateHelper systemStateHelper = new SystemStateHelper(mContext, mLock); 274 275 mMissedCallNotifier = missedCallNotifierImplFactory 276 .makeMissedCallNotifierImpl(mContext, mPhoneAccountRegistrar, 277 defaultDialerCache, 278 deviceIdleControllerAdapter, 279 featureFlags); 280 DisconnectedCallNotifier.Factory disconnectedCallNotifierFactory = 281 new DisconnectedCallNotifier.Default(); 282 283 CallerInfoLookupHelper callerInfoLookupHelper = 284 new CallerInfoLookupHelper(context, callerInfoAsyncQueryFactory, 285 mContactsAsyncHelper, mLock); 286 287 EmergencyCallHelper emergencyCallHelper = new EmergencyCallHelper(mContext, 288 defaultDialerCache, timeoutsAdapter); 289 290 InCallControllerFactory inCallControllerFactory = new InCallControllerFactory() { 291 @Override 292 public InCallController create(Context context, SyncRoot lock, 293 CallsManager callsManager, SystemStateHelper systemStateProvider, 294 DefaultDialerCache defaultDialerCache, Timeouts.Adapter timeoutsAdapter, 295 EmergencyCallHelper emergencyCallHelper) { 296 return new InCallController(context, lock, callsManager, systemStateProvider, 297 defaultDialerCache, timeoutsAdapter, emergencyCallHelper, 298 new CarModeTracker(), clockProxy, featureFlags); 299 } 300 }; 301 302 CallEndpointControllerFactory callEndpointControllerFactory = 303 new CallEndpointControllerFactory() { 304 @Override 305 public CallEndpointController create(Context context, SyncRoot lock, 306 CallsManager callsManager) { 307 return new CallEndpointController(context, callsManager, featureFlags); 308 } 309 }; 310 311 CallDiagnosticServiceController callDiagnosticServiceController = 312 new CallDiagnosticServiceController( 313 new CallDiagnosticServiceController.ContextProxy() { 314 @Override 315 public List<ResolveInfo> queryIntentServicesAsUser( 316 @NonNull Intent intent, int flags, int userId) { 317 return mContext.getPackageManager().queryIntentServicesAsUser( 318 intent, flags, userId); 319 } 320 321 @Override 322 public boolean bindServiceAsUser(@NonNull Intent service, 323 @NonNull ServiceConnection conn, int flags, 324 @NonNull UserHandle user) { 325 return mContext.bindServiceAsUser(service, conn, flags, user); 326 } 327 328 @Override 329 public void unbindService(@NonNull ServiceConnection conn) { 330 mContext.unbindService(conn); 331 } 332 333 @Override 334 public UserHandle getCurrentUserHandle() { 335 return mCallsManager.getCurrentUserHandle(); 336 } 337 }, 338 mContext.getResources().getString( 339 com.android.server.telecom.R.string 340 .call_diagnostic_service_package_name), 341 mLock 342 ); 343 344 AudioProcessingNotification audioProcessingNotification = 345 new AudioProcessingNotification(mContext); 346 347 ToastFactory toastFactory = new ToastFactory() { 348 @Override 349 public void makeText(Context context, int resId, int duration) { 350 if (mFeatureFlags.telecomResolveHiddenDependencies()) { 351 context.getMainExecutor().execute(() -> 352 Toast.makeText(context, resId, duration).show()); 353 } else { 354 Toast.makeText(context, context.getMainLooper(), 355 context.getString(resId), duration).show(); 356 } 357 } 358 359 @Override 360 public void makeText(Context context, CharSequence text, int duration) { 361 if (mFeatureFlags.telecomResolveHiddenDependencies()) { 362 context.getMainExecutor().execute(() -> 363 Toast.makeText(context, text, duration).show()); 364 } else { 365 Toast.makeText(context, context.getMainLooper(), text, duration).show(); 366 } 367 } 368 }; 369 370 EmergencyCallDiagnosticLogger emergencyCallDiagnosticLogger = 371 new EmergencyCallDiagnosticLogger(mContext.getSystemService( 372 TelephonyManager.class), mContext.getSystemService( 373 BugreportManager.class), timeoutsAdapter, mContext.getSystemService( 374 DropBoxManager.class), asyncTaskExecutor, clockProxy); 375 376 CallAnomalyWatchdog callAnomalyWatchdog = new CallAnomalyWatchdog( 377 Executors.newSingleThreadScheduledExecutor(), 378 mLock, timeoutsAdapter, clockProxy, emergencyCallDiagnosticLogger); 379 380 TransactionManager transactionManager = TransactionManager.getInstance(); 381 382 CallStreamingNotification callStreamingNotification = 383 new CallStreamingNotification(mContext, 384 packageName -> AppLabelProxy.Util.getAppLabel( 385 mContext.getPackageManager(), packageName), asyncTaskExecutor); 386 387 mCallsManager = new CallsManager( 388 mContext, 389 mLock, 390 callerInfoLookupHelper, 391 mMissedCallNotifier, 392 disconnectedCallNotifierFactory, 393 mPhoneAccountRegistrar, 394 headsetMediaButtonFactory, 395 proximitySensorManagerFactory, 396 inCallWakeLockControllerFactory, 397 connectionServiceFocusManagerFactory, 398 audioServiceFactory, 399 bluetoothRouteManager, 400 wiredHeadsetManager, 401 systemStateHelper, 402 defaultDialerCache, 403 timeoutsAdapter, 404 asyncRingtonePlayer, 405 phoneNumberUtilsAdapter, 406 emergencyCallHelper, 407 toneGeneratorFactory, 408 clockProxy, 409 audioProcessingNotification, 410 bluetoothStateReceiver, 411 callAudioRouteStateMachineFactory, 412 callAudioModeStateMachineFactory, 413 inCallControllerFactory, 414 callDiagnosticServiceController, 415 roleManagerAdapter, 416 toastFactory, 417 callEndpointControllerFactory, 418 callAnomalyWatchdog, 419 accessibilityManagerAdapter, 420 asyncTaskExecutor, 421 asyncCallAudioTaskExecutor, 422 blockedNumbersAdapter, 423 transactionManager, 424 emergencyCallDiagnosticLogger, 425 communicationDeviceTracker, 426 callStreamingNotification, 427 bluetoothDeviceManager, 428 featureFlags, 429 telephonyFlags, 430 IncomingCallFilterGraph::new); 431 432 mIncomingCallNotifier = incomingCallNotifier; 433 incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() { 434 @Override 435 public boolean hasUnholdableCallsForOtherConnectionService( 436 PhoneAccountHandle phoneAccountHandle) { 437 return mCallsManager.hasUnholdableCallsForOtherConnectionService( 438 phoneAccountHandle); 439 } 440 441 @Override 442 public int getNumUnholdableCallsForOtherConnectionService( 443 PhoneAccountHandle phoneAccountHandle) { 444 return mCallsManager.getNumUnholdableCallsForOtherConnectionService( 445 phoneAccountHandle); 446 } 447 448 @Override 449 public Call getActiveCall() { 450 return mCallsManager.getActiveCall(); 451 } 452 }); 453 mCallsManager.setIncomingCallNotifier(mIncomingCallNotifier); 454 455 mRespondViaSmsManager = new RespondViaSmsManager(mCallsManager, mLock); 456 mCallsManager.setRespondViaSmsManager(mRespondViaSmsManager); 457 458 mContext.registerReceiverAsUser(mUserSwitchedReceiver, UserHandle.ALL, 459 USER_SWITCHED_FILTER, null, null); 460 mContext.registerReceiverAsUser(mUserStartingReceiver, UserHandle.ALL, 461 USER_STARTING_FILTER, null, null); 462 mContext.registerReceiverAsUser(mBootCompletedReceiver, UserHandle.ALL, 463 BOOT_COMPLETE_FILTER, null, null); 464 465 // Set current user explicitly since USER_SWITCHED_FILTER intent can be missed at 466 // startup 467 synchronized (mLock) { 468 UserHandle currentUserHandle = UserHandle.of(ActivityManager.getCurrentUser()); 469 mPhoneAccountRegistrar.setCurrentUserHandle(currentUserHandle); 470 mCallsManager.onUserSwitch(currentUserHandle); 471 } 472 473 mCallIntentProcessor = new CallIntentProcessor(mContext, mCallsManager, 474 defaultDialerCache, featureFlags); 475 mTelecomBroadcastIntentProcessor = new TelecomBroadcastIntentProcessor( 476 mContext, mCallsManager); 477 478 // Register the receiver for the dialer secret codes, used to enable extended logging. 479 mDialerCodeReceiver = new DialerCodeReceiver(mCallsManager); 480 mContext.registerReceiver(mDialerCodeReceiver, DIALER_SECRET_CODE_FILTER, 481 Manifest.permission.CONTROL_INCALL_EXPERIENCE, null); 482 483 // There is no USER_SWITCHED broadcast for user 0, handle it here explicitly. 484 mTelecomServiceImpl = new TelecomServiceImpl( 485 mContext, mCallsManager, mPhoneAccountRegistrar, 486 new CallIntentProcessor.AdapterImpl(defaultDialerCache), 487 new UserCallIntentProcessorFactory() { 488 @Override 489 public UserCallIntentProcessor create(Context context, 490 UserHandle userHandle) { 491 return new UserCallIntentProcessor(context, userHandle, featureFlags); 492 } 493 }, 494 defaultDialerCache, 495 new TelecomServiceImpl.SubscriptionManagerAdapterImpl(), 496 new TelecomServiceImpl.SettingsSecureAdapterImpl(), 497 featureFlags, 498 null, 499 mLock); 500 } finally { 501 Log.endSession(); 502 } 503 } 504 505 @VisibleForTesting getPhoneAccountRegistrar()506 public PhoneAccountRegistrar getPhoneAccountRegistrar() { 507 return mPhoneAccountRegistrar; 508 } 509 510 @VisibleForTesting getCallsManager()511 public CallsManager getCallsManager() { 512 return mCallsManager; 513 } 514 getCallIntentProcessor()515 public CallIntentProcessor getCallIntentProcessor() { 516 return mCallIntentProcessor; 517 } 518 getTelecomBroadcastIntentProcessor()519 public TelecomBroadcastIntentProcessor getTelecomBroadcastIntentProcessor() { 520 return mTelecomBroadcastIntentProcessor; 521 } 522 getTelecomServiceImpl()523 public TelecomServiceImpl getTelecomServiceImpl() { 524 return mTelecomServiceImpl; 525 } 526 getLock()527 public Object getLock() { 528 return mLock; 529 } 530 isBootComplete()531 public boolean isBootComplete() { 532 return mIsBootComplete; 533 } 534 getFeatureFlags()535 public FeatureFlags getFeatureFlags() { 536 return mFeatureFlags; 537 } 538 } 539