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