• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 static android.Manifest.permission.CALL_PHONE;
20 import static android.Manifest.permission.DUMP;
21 import static android.Manifest.permission.MODIFY_PHONE_STATE;
22 import static android.Manifest.permission.READ_PHONE_STATE;
23 import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
24 import static android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION;
25 import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
26 
27 import android.app.ActivityManager;
28 import android.app.AppOpsManager;
29 import android.content.ComponentName;
30 import android.content.Context;
31 import android.content.Intent;
32 import android.content.pm.ApplicationInfo;
33 import android.content.pm.PackageManager;
34 import android.content.res.Resources;
35 import android.net.Uri;
36 import android.os.Binder;
37 import android.os.Bundle;
38 import android.os.Process;
39 import android.os.UserHandle;
40 import android.os.UserManager;
41 import android.telecom.DefaultDialerManager;
42 import android.telecom.ParcelableCallAnalytics;
43 import android.telecom.PhoneAccount;
44 import android.telecom.PhoneAccountHandle;
45 import android.telecom.TelecomAnalytics;
46 import android.telecom.TelecomManager;
47 import android.telecom.VideoProfile;
48 import android.telephony.SubscriptionManager;
49 import android.telephony.TelephonyManager;
50 import android.util.EventLog;
51 
52 // TODO: Needed for move to system service: import com.android.internal.R;
53 import com.android.internal.telecom.ITelecomService;
54 import com.android.internal.util.IndentingPrintWriter;
55 import com.android.server.telecom.components.UserCallIntentProcessorFactory;
56 import com.android.server.telecom.settings.BlockedNumbersActivity;
57 
58 import java.io.FileDescriptor;
59 import java.io.PrintWriter;
60 import java.util.ArrayList;
61 import java.util.Arrays;
62 import java.util.Collections;
63 import java.util.List;
64 
65 /**
66  * Implementation of the ITelecom interface.
67  */
68 public class TelecomServiceImpl {
69     public interface DefaultDialerManagerAdapter {
getDefaultDialerApplication(Context context)70         String getDefaultDialerApplication(Context context);
getDefaultDialerApplication(Context context, int userId)71         String getDefaultDialerApplication(Context context, int userId);
setDefaultDialerApplication(Context context, String packageName)72         boolean setDefaultDialerApplication(Context context, String packageName);
isDefaultOrSystemDialer(Context context, String packageName)73         boolean isDefaultOrSystemDialer(Context context, String packageName);
74     }
75 
76     static class DefaultDialerManagerAdapterImpl implements DefaultDialerManagerAdapter {
77         @Override
getDefaultDialerApplication(Context context)78         public String getDefaultDialerApplication(Context context) {
79             return DefaultDialerManager.getDefaultDialerApplication(context);
80         }
81 
82         @Override
getDefaultDialerApplication(Context context, int userId)83         public String getDefaultDialerApplication(Context context, int userId) {
84             return DefaultDialerManager.getDefaultDialerApplication(context, userId);
85         }
86 
87         @Override
setDefaultDialerApplication(Context context, String packageName)88         public boolean setDefaultDialerApplication(Context context, String packageName) {
89             return DefaultDialerManager.setDefaultDialerApplication(context, packageName);
90         }
91 
92         @Override
isDefaultOrSystemDialer(Context context, String packageName)93         public boolean isDefaultOrSystemDialer(Context context, String packageName) {
94             return DefaultDialerManager.isDefaultOrSystemDialer(context, packageName);
95         }
96     }
97 
98     public interface SubscriptionManagerAdapter {
getDefaultVoiceSubId()99         int getDefaultVoiceSubId();
100     }
101 
102     static class SubscriptionManagerAdapterImpl implements SubscriptionManagerAdapter {
103         @Override
getDefaultVoiceSubId()104         public int getDefaultVoiceSubId() {
105             return SubscriptionManager.getDefaultVoiceSubscriptionId();
106         }
107     }
108 
109     private static final String PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION =
110             "android.permission.PROCESS_PHONE_ACCOUNT_REGISTRATION";
111     private static final int DEFAULT_VIDEO_STATE = -1;
112 
113     private final ITelecomService.Stub mBinderImpl = new ITelecomService.Stub() {
114         @Override
115         public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme,
116                 String callingPackage) {
117             try {
118                 Log.startSession("TSI.gDOPA");
119                 synchronized (mLock) {
120                     if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
121                         return null;
122                     }
123 
124                     final UserHandle callingUserHandle = Binder.getCallingUserHandle();
125                     long token = Binder.clearCallingIdentity();
126                     try {
127                         return mPhoneAccountRegistrar
128                                 .getOutgoingPhoneAccountForScheme(uriScheme, callingUserHandle);
129                     } catch (Exception e) {
130                         Log.e(this, e, "getDefaultOutgoingPhoneAccount");
131                         throw e;
132                     } finally {
133                         Binder.restoreCallingIdentity(token);
134                     }
135                 }
136             } finally {
137                 Log.endSession();
138             }
139         }
140 
141         @Override
142         public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount() {
143             synchronized (mLock) {
144                 try {
145                     Log.startSession("TSI.gUSOPA");
146                     final UserHandle callingUserHandle = Binder.getCallingUserHandle();
147                     return mPhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount(
148                             callingUserHandle);
149                 } catch (Exception e) {
150                     Log.e(this, e, "getUserSelectedOutgoingPhoneAccount");
151                     throw e;
152                 } finally {
153                     Log.endSession();
154                 }
155             }
156         }
157 
158         @Override
159         public void setUserSelectedOutgoingPhoneAccount(PhoneAccountHandle accountHandle) {
160             try {
161                 Log.startSession("TSI.sUSOPA");
162                 synchronized (mLock) {
163                     enforceModifyPermission();
164                     UserHandle callingUserHandle = Binder.getCallingUserHandle();
165                     long token = Binder.clearCallingIdentity();
166                     try {
167                         mPhoneAccountRegistrar.setUserSelectedOutgoingPhoneAccount(
168                                 accountHandle, callingUserHandle);
169                     } catch (Exception e) {
170                         Log.e(this, e, "setUserSelectedOutgoingPhoneAccount");
171                         throw e;
172                     } finally {
173                         Binder.restoreCallingIdentity(token);
174                     }
175                 }
176             } finally {
177                 Log.endSession();
178             }
179         }
180 
181         @Override
182         public List<PhoneAccountHandle> getCallCapablePhoneAccounts(
183                 boolean includeDisabledAccounts, String callingPackage) {
184             try {
185                 Log.startSession("TSI.gCCPA");
186                 if (!canReadPhoneState(callingPackage, "getDefaultOutgoingPhoneAccount")) {
187                     return Collections.emptyList();
188                 }
189                 synchronized (mLock) {
190                     final UserHandle callingUserHandle = Binder.getCallingUserHandle();
191                     long token = Binder.clearCallingIdentity();
192                     try {
193                         return mPhoneAccountRegistrar.getCallCapablePhoneAccounts(null,
194                                 includeDisabledAccounts, callingUserHandle);
195                     } catch (Exception e) {
196                         Log.e(this, e, "getCallCapablePhoneAccounts");
197                         throw e;
198                     } finally {
199                         Binder.restoreCallingIdentity(token);
200                     }
201                 }
202             } finally {
203                 Log.endSession();
204             }
205         }
206 
207         @Override
208         public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme,
209                 String callingPackage) {
210             try {
211                 Log.startSession("TSI.gPASS");
212                 synchronized (mLock) {
213                     if (!canReadPhoneState(callingPackage, "getPhoneAccountsSupportingScheme")) {
214                         return Collections.emptyList();
215                     }
216                     final UserHandle callingUserHandle = Binder.getCallingUserHandle();
217                     long token = Binder.clearCallingIdentity();
218                     try {
219                         return mPhoneAccountRegistrar.getCallCapablePhoneAccounts(uriScheme, false,
220                                 callingUserHandle);
221                     } catch (Exception e) {
222                         Log.e(this, e, "getPhoneAccountsSupportingScheme %s", uriScheme);
223                         throw e;
224                     } finally {
225                         Binder.restoreCallingIdentity(token);
226                     }
227                 }
228             } finally {
229                 Log.endSession();
230             }
231         }
232 
233         @Override
234         public List<PhoneAccountHandle> getPhoneAccountsForPackage(String packageName) {
235             synchronized (mLock) {
236                 final UserHandle callingUserHandle = Binder.getCallingUserHandle();
237                 long token = Binder.clearCallingIdentity();
238                 try {
239                     Log.startSession("TSI.gPAFP");
240                     return mPhoneAccountRegistrar.getPhoneAccountsForPackage(packageName,
241                             callingUserHandle);
242                 } catch (Exception e) {
243                     Log.e(this, e, "getPhoneAccountsForPackage %s", packageName);
244                     throw e;
245                 } finally {
246                     Binder.restoreCallingIdentity(token);
247                     Log.endSession();
248                 }
249             }
250         }
251 
252         @Override
253         public PhoneAccount getPhoneAccount(PhoneAccountHandle accountHandle) {
254             synchronized (mLock) {
255                 final UserHandle callingUserHandle = Binder.getCallingUserHandle();
256                 long token = Binder.clearCallingIdentity();
257                 try {
258                     Log.startSession("TSI.gPA");
259                     // In ideal case, we should not resolve the handle across profiles. But given
260                     // the fact that profile's call is handled by its parent user's in-call UI,
261                     // parent user's in call UI need to be able to get phone account from the
262                     // profile's phone account handle.
263                     return mPhoneAccountRegistrar
264                             .getPhoneAccount(accountHandle, callingUserHandle,
265                             /* acrossProfiles */ true);
266                 } catch (Exception e) {
267                     Log.e(this, e, "getPhoneAccount %s", accountHandle);
268                     throw e;
269                 } finally {
270                     Binder.restoreCallingIdentity(token);
271                     Log.endSession();
272                 }
273             }
274         }
275 
276         @Override
277         public int getAllPhoneAccountsCount() {
278             synchronized (mLock) {
279                 try {
280                     Log.startSession("TSI.gAPAC");
281                     // This list is pre-filtered for the calling user.
282                     return getAllPhoneAccounts().size();
283                 } catch (Exception e) {
284                     Log.e(this, e, "getAllPhoneAccountsCount");
285                     throw e;
286                 } finally {
287                     Log.endSession();
288                 }
289             }
290         }
291 
292         @Override
293         public List<PhoneAccount> getAllPhoneAccounts() {
294             synchronized (mLock) {
295                 final UserHandle callingUserHandle = Binder.getCallingUserHandle();
296                 long token = Binder.clearCallingIdentity();
297                 try {
298                     Log.startSession("TSI.gAPA");
299                     return mPhoneAccountRegistrar.getAllPhoneAccounts(callingUserHandle);
300                 } catch (Exception e) {
301                     Log.e(this, e, "getAllPhoneAccounts");
302                     throw e;
303                 } finally {
304                     Binder.restoreCallingIdentity(token);
305                     Log.endSession();
306                 }
307             }
308         }
309 
310         @Override
311         public List<PhoneAccountHandle> getAllPhoneAccountHandles() {
312             synchronized (mLock) {
313                 final UserHandle callingUserHandle = Binder.getCallingUserHandle();
314                 long token = Binder.clearCallingIdentity();
315                 try {
316                     Log.startSession("TSI.gAPAH");
317                     return mPhoneAccountRegistrar.getAllPhoneAccountHandles(callingUserHandle);
318                 } catch (Exception e) {
319                     Log.e(this, e, "getAllPhoneAccounts");
320                     throw e;
321                 } finally {
322                     Binder.restoreCallingIdentity(token);
323                     Log.endSession();
324                 }
325             }
326         }
327 
328         @Override
329         public PhoneAccountHandle getSimCallManager() {
330             try {
331                 Log.startSession("TSI.gSCM");
332                 long token = Binder.clearCallingIdentity();
333                 int user;
334                 try {
335                     user = ActivityManager.getCurrentUser();
336                     return getSimCallManagerForUser(user);
337                 } finally {
338                     Binder.restoreCallingIdentity(token);
339                 }
340             } finally {
341                 Log.endSession();
342             }
343         }
344 
345         @Override
346         public PhoneAccountHandle getSimCallManagerForUser(int user) {
347             synchronized (mLock) {
348                 try {
349                     Log.startSession("TSI.gSCMFU");
350                     final int callingUid = Binder.getCallingUid();
351                     long token = Binder.clearCallingIdentity();
352                     try {
353                         if (user != ActivityManager.getCurrentUser()) {
354                             enforceCrossUserPermission(callingUid);
355                         }
356                         return mPhoneAccountRegistrar.getSimCallManager(UserHandle.of(user));
357                     } finally {
358                         Binder.restoreCallingIdentity(token);
359                     }
360                 } catch (Exception e) {
361                     Log.e(this, e, "getSimCallManager");
362                     throw e;
363                 } finally {
364                     Log.endSession();
365                 }
366             }
367         }
368 
369         @Override
370         public void registerPhoneAccount(PhoneAccount account) {
371             try {
372                 Log.startSession("TSI.rPA");
373                 synchronized (mLock) {
374                     if (!mContext.getApplicationContext().getResources().getBoolean(
375                             com.android.internal.R.bool.config_voice_capable)) {
376                         Log.w(this,
377                                 "registerPhoneAccount not allowed on non-voice capable device.");
378                         return;
379                     }
380                     try {
381                         enforcePhoneAccountModificationForPackage(
382                                 account.getAccountHandle().getComponentName().getPackageName());
383                         if (account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
384                             enforceRegisterSimSubscriptionPermission();
385                         }
386                         if (account.hasCapabilities(PhoneAccount.CAPABILITY_MULTI_USER)) {
387                             enforceRegisterMultiUser();
388                         }
389                         enforceUserHandleMatchesCaller(account.getAccountHandle());
390                         mPhoneAccountRegistrar.registerPhoneAccount(account);
391                         // Broadcast an intent indicating the phone account which was registered.
392                         long token = Binder.clearCallingIdentity();
393                         try {
394                             Intent intent = new Intent(
395                                     TelecomManager.ACTION_PHONE_ACCOUNT_REGISTERED);
396                             intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
397                                     account.getAccountHandle());
398                             Log.i(this, "Sending phone-account registered intent as user");
399                             mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
400                                     PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION);
401                         } finally {
402                             Binder.restoreCallingIdentity(token);
403                         }
404                     } catch (Exception e) {
405                         Log.e(this, e, "registerPhoneAccount %s", account);
406                         throw e;
407                     }
408                 }
409             } finally {
410                 Log.endSession();
411             }
412         }
413 
414         @Override
415         public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
416             synchronized (mLock) {
417                 try {
418                     Log.startSession("TSI.uPA");
419                     enforcePhoneAccountModificationForPackage(
420                             accountHandle.getComponentName().getPackageName());
421                     enforceUserHandleMatchesCaller(accountHandle);
422                     mPhoneAccountRegistrar.unregisterPhoneAccount(accountHandle);
423 
424                     // Broadcast an intent indicating the phone account which was unregistered.
425                     long token = Binder.clearCallingIdentity();
426                     try {
427                         Intent intent =
428                                 new Intent(TelecomManager.ACTION_PHONE_ACCOUNT_UNREGISTERED);
429                         intent.putExtra(
430                                 TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
431                         Log.i(this, "Sending phone-account unregistered intent as user");
432                         mContext.sendBroadcastAsUser(intent, UserHandle.ALL,
433                                 PERMISSION_PROCESS_PHONE_ACCOUNT_REGISTRATION);
434                     } finally {
435                         Binder.restoreCallingIdentity(token);
436                     }
437                 } catch (Exception e) {
438                     Log.e(this, e, "unregisterPhoneAccount %s", accountHandle);
439                     throw e;
440                 } finally {
441                     Log.endSession();
442                 }
443             }
444         }
445 
446         @Override
447         public void clearAccounts(String packageName) {
448             synchronized (mLock) {
449                 try {
450                     Log.startSession("TSI.cA");
451                     enforcePhoneAccountModificationForPackage(packageName);
452                     mPhoneAccountRegistrar
453                             .clearAccounts(packageName, Binder.getCallingUserHandle());
454                 } catch (Exception e) {
455                     Log.e(this, e, "clearAccounts %s", packageName);
456                     throw e;
457                 } finally {
458                     Log.endSession();
459                 }
460             }
461         }
462 
463         /**
464          * @see android.telecom.TelecomManager#isVoiceMailNumber
465          */
466         @Override
467         public boolean isVoiceMailNumber(PhoneAccountHandle accountHandle, String number,
468                 String callingPackage) {
469             try {
470                 Log.startSession("TSI.iVMN");
471                 synchronized (mLock) {
472                     if (!canReadPhoneState(callingPackage, "isVoiceMailNumber")) {
473                         return false;
474                     }
475                     final UserHandle callingUserHandle = Binder.getCallingUserHandle();
476                     if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
477                             callingUserHandle)) {
478                         Log.d(this, "%s is not visible for the calling user [iVMN]", accountHandle);
479                         return false;
480                     }
481                     long token = Binder.clearCallingIdentity();
482                     try {
483                         return mPhoneAccountRegistrar.isVoiceMailNumber(accountHandle, number);
484                     } catch (Exception e) {
485                         Log.e(this, e, "getSubscriptionIdForPhoneAccount");
486                         throw e;
487                     } finally {
488                         Binder.restoreCallingIdentity(token);
489                     }
490                 }
491             } finally {
492                 Log.endSession();
493             }
494         }
495 
496         /**
497          * @see android.telecom.TelecomManager#getVoiceMailNumber
498          */
499         @Override
500         public String getVoiceMailNumber(PhoneAccountHandle accountHandle, String callingPackage) {
501             try {
502                 Log.startSession("TSI.gVMN");
503                 synchronized (mLock) {
504                     if (!canReadPhoneState(callingPackage, "getVoiceMailNumber")) {
505                         return null;
506                     }
507                     try {
508                         final UserHandle callingUserHandle = Binder.getCallingUserHandle();
509                         if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
510                                 callingUserHandle)) {
511                             Log.d(this, "%s is not visible for the calling user [gVMN]",
512                                     accountHandle);
513                             return null;
514                         }
515                         int subId = mSubscriptionManagerAdapter.getDefaultVoiceSubId();
516                         if (accountHandle != null) {
517                             subId = mPhoneAccountRegistrar
518                                     .getSubscriptionIdForPhoneAccount(accountHandle);
519                         }
520                         return getTelephonyManager().getVoiceMailNumber(subId);
521                     } catch (Exception e) {
522                         Log.e(this, e, "getSubscriptionIdForPhoneAccount");
523                         throw e;
524                     }
525                 }
526             } finally {
527                 Log.endSession();
528             }
529         }
530 
531         /**
532          * @see android.telecom.TelecomManager#getLine1Number
533          */
534         @Override
535         public String getLine1Number(PhoneAccountHandle accountHandle, String callingPackage) {
536             try {
537                 Log.startSession("getL1N");
538                 if (!canReadPhoneState(callingPackage, "getLine1Number")) {
539                     return null;
540                 }
541 
542                 synchronized (mLock) {
543                     final UserHandle callingUserHandle = Binder.getCallingUserHandle();
544                     if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
545                             callingUserHandle)) {
546                         Log.d(this, "%s is not visible for the calling user [gL1N]", accountHandle);
547                         return null;
548                     }
549 
550                     long token = Binder.clearCallingIdentity();
551                     try {
552                         int subId = mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(
553                                 accountHandle);
554                         return getTelephonyManager().getLine1Number(subId);
555                     } catch (Exception e) {
556                         Log.e(this, e, "getSubscriptionIdForPhoneAccount");
557                         throw e;
558                     } finally {
559                         Binder.restoreCallingIdentity(token);
560                     }
561                 }
562             } finally {
563                 Log.endSession();
564             }
565         }
566 
567         /**
568          * @see android.telecom.TelecomManager#silenceRinger
569          */
570         @Override
571         public void silenceRinger(String callingPackage) {
572             try {
573                 Log.startSession("TSI.sR");
574                 synchronized (mLock) {
575                     enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
576 
577                     long token = Binder.clearCallingIdentity();
578                     try {
579                         Log.i(this, "Silence Ringer requested by %s", callingPackage);
580                         mCallsManager.getCallAudioManager().silenceRingers();
581                         mCallsManager.getInCallController().silenceRinger();
582                     } finally {
583                         Binder.restoreCallingIdentity(token);
584                     }
585                 }
586             } finally {
587                 Log.endSession();
588             }
589         }
590 
591         /**
592          * @see android.telecom.TelecomManager#getDefaultPhoneApp
593          * @deprecated - Use {@link android.telecom.TelecomManager#getDefaultDialerPackage()}
594          *         instead.
595          */
596         @Override
597         public ComponentName getDefaultPhoneApp() {
598             try {
599                 Log.startSession("TSI.gDPA");
600                 // No need to synchronize
601                 Resources resources = mContext.getResources();
602                 return new ComponentName(
603                         resources.getString(R.string.ui_default_package),
604                         resources.getString(R.string.dialer_default_class));
605             } finally {
606                 Log.endSession();
607             }
608         }
609 
610         /**
611          * @return the package name of the current user-selected default dialer. If no default
612          *         has been selected, the package name of the system dialer is returned. If
613          *         neither exists, then {@code null} is returned.
614          * @see android.telecom.TelecomManager#getDefaultDialerPackage
615          */
616         @Override
617         public String getDefaultDialerPackage() {
618             try {
619                 Log.startSession("TSI.gDDP");
620                 final long token = Binder.clearCallingIdentity();
621                 try {
622                     return mDefaultDialerManagerAdapter.getDefaultDialerApplication(mContext);
623                 } finally {
624                     Binder.restoreCallingIdentity(token);
625                 }
626             } finally {
627                 Log.endSession();
628             }
629         }
630 
631         /**
632          * @see android.telecom.TelecomManager#getSystemDialerPackage
633          */
634         @Override
635         public String getSystemDialerPackage() {
636             try {
637                 Log.startSession("TSI.gSDP");
638                 return mContext.getResources().getString(R.string.ui_default_package);
639             } finally {
640                 Log.endSession();
641             }
642         }
643 
644         /**
645          * @see android.telecom.TelecomManager#isInCall
646          */
647         @Override
648         public boolean isInCall(String callingPackage) {
649             try {
650                 Log.startSession("TSI.iIC");
651                 if (!canReadPhoneState(callingPackage, "isInCall")) {
652                     return false;
653                 }
654 
655                 synchronized (mLock) {
656                     final int callState = mCallsManager.getCallState();
657                     return callState == TelephonyManager.CALL_STATE_OFFHOOK
658                             || callState == TelephonyManager.CALL_STATE_RINGING;
659                 }
660             } finally {
661                 Log.endSession();
662             }
663         }
664 
665         /**
666          * @see android.telecom.TelecomManager#isRinging
667          */
668         @Override
669         public boolean isRinging(String callingPackage) {
670             try {
671                 Log.startSession("TSI.iR");
672                 if (!canReadPhoneState(callingPackage, "isRinging")) {
673                     return false;
674                 }
675 
676                 synchronized (mLock) {
677                     // Note: We are explicitly checking the calls telecom is tracking rather than
678                     // relying on mCallsManager#getCallState(). Since getCallState() relies on the
679                     // current state as tracked by PhoneStateBroadcaster, any failure to properly
680                     // track the current call state there could result in the wrong ringing state
681                     // being reported by this API.
682                     return mCallsManager.hasRingingCall();
683                 }
684             } finally {
685                 Log.endSession();
686             }
687         }
688 
689         /**
690          * @see TelecomManager#getCallState
691          */
692         @Override
693         public int getCallState() {
694             try {
695                 Log.startSession("TSI.getCallState");
696                 synchronized (mLock) {
697                     return mCallsManager.getCallState();
698                 }
699             } finally {
700                 Log.endSession();
701             }
702         }
703 
704         /**
705          * @see android.telecom.TelecomManager#endCall
706          */
707         @Override
708         public boolean endCall() {
709             try {
710                 Log.startSession("TSI.eC");
711                 synchronized (mLock) {
712                     enforceModifyPermission();
713 
714                     long token = Binder.clearCallingIdentity();
715                     try {
716                         return endCallInternal();
717                     } finally {
718                         Binder.restoreCallingIdentity(token);
719                     }
720                 }
721             } finally {
722                 Log.endSession();
723             }
724         }
725 
726         /**
727          * @see android.telecom.TelecomManager#acceptRingingCall
728          */
729         @Override
730         public void acceptRingingCall() {
731             try {
732                 Log.startSession("TSI.aRC");
733                 synchronized (mLock) {
734                     enforceModifyPermission();
735 
736                     long token = Binder.clearCallingIdentity();
737                     try {
738                         acceptRingingCallInternal(DEFAULT_VIDEO_STATE);
739                     } finally {
740                         Binder.restoreCallingIdentity(token);
741                     }
742                 }
743             } finally {
744                 Log.endSession();
745             }
746         }
747 
748         /**
749          * @see android.telecom.TelecomManager#acceptRingingCall(int)
750          *
751          */
752         @Override
753         public void acceptRingingCallWithVideoState(int videoState) {
754             try {
755                 Log.startSession("TSI.aRCWVS");
756                 synchronized (mLock) {
757                     enforceModifyPermission();
758 
759                     long token = Binder.clearCallingIdentity();
760                     try {
761                         acceptRingingCallInternal(videoState);
762                     } finally {
763                         Binder.restoreCallingIdentity(token);
764                     }
765                 }
766             } finally {
767                 Log.endSession();
768             }
769         }
770 
771         /**
772          * @see android.telecom.TelecomManager#showInCallScreen
773          */
774         @Override
775         public void showInCallScreen(boolean showDialpad, String callingPackage) {
776             try {
777                 Log.startSession("TSI.sICS");
778                 if (!canReadPhoneState(callingPackage, "showInCallScreen")) {
779                     return;
780                 }
781 
782                 synchronized (mLock) {
783 
784                     long token = Binder.clearCallingIdentity();
785                     try {
786                         mCallsManager.getInCallController().bringToForeground(showDialpad);
787                     } finally {
788                         Binder.restoreCallingIdentity(token);
789                     }
790                 }
791             } finally {
792                 Log.endSession();
793             }
794         }
795 
796         /**
797          * @see android.telecom.TelecomManager#cancelMissedCallsNotification
798          */
799         @Override
800         public void cancelMissedCallsNotification(String callingPackage) {
801             try {
802                 Log.startSession("TSI.cMCN");
803                 synchronized (mLock) {
804                     enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
805                     UserHandle userHandle = Binder.getCallingUserHandle();
806                     long token = Binder.clearCallingIdentity();
807                     try {
808                         mCallsManager.getMissedCallNotifier().clearMissedCalls(userHandle);
809                     } finally {
810                         Binder.restoreCallingIdentity(token);
811                     }
812                 }
813             } finally {
814                 Log.endSession();
815             }
816         }
817         /**
818          * @see android.telecom.TelecomManager#handleMmi
819          */
820         @Override
821         public boolean handlePinMmi(String dialString, String callingPackage) {
822             try {
823                 Log.startSession("TSI.hPM");
824                 synchronized (mLock) {
825                     enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
826 
827                     // Switch identity so that TelephonyManager checks Telecom's permissions
828                     // instead.
829                     long token = Binder.clearCallingIdentity();
830                     boolean retval = false;
831                     try {
832                         retval = getTelephonyManager().handlePinMmi(dialString);
833                     } finally {
834                         Binder.restoreCallingIdentity(token);
835                     }
836 
837                     return retval;
838                 }
839             }finally {
840                 Log.endSession();
841             }
842         }
843 
844         /**
845          * @see android.telecom.TelecomManager#handleMmi
846          */
847         @Override
848         public boolean handlePinMmiForPhoneAccount(PhoneAccountHandle accountHandle,
849                 String dialString, String callingPackage) {
850             try {
851                 Log.startSession("TSI.hPMFPA");
852                 synchronized (mLock) {
853                     enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
854 
855                     UserHandle callingUserHandle = Binder.getCallingUserHandle();
856                     if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
857                             callingUserHandle)) {
858                         Log.d(this, "%s is not visible for the calling user [hMMI]", accountHandle);
859                         return false;
860                     }
861 
862                     // Switch identity so that TelephonyManager checks Telecom's permissions
863                     // instead.
864                     long token = Binder.clearCallingIdentity();
865                     boolean retval = false;
866                     try {
867                         int subId = mPhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(
868                                 accountHandle);
869                         retval = getTelephonyManager().handlePinMmiForSubscriber(subId, dialString);
870                     } finally {
871                         Binder.restoreCallingIdentity(token);
872                     }
873                     return retval;
874                 }
875             }finally {
876                 Log.endSession();
877             }
878         }
879 
880         /**
881          * @see android.telecom.TelecomManager#getAdnUriForPhoneAccount
882          */
883         @Override
884         public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle,
885                 String callingPackage) {
886             try {
887                 Log.startSession("TSI.aAUFPA");
888                 synchronized (mLock) {
889                     enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage);
890                     if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle,
891                             Binder.getCallingUserHandle())) {
892                         Log.d(this, "%s is not visible for the calling user [gA4PA]",
893                                 accountHandle);
894                         return null;
895                     }
896                     // Switch identity so that TelephonyManager checks Telecom's permissions
897                     // instead.
898                     long token = Binder.clearCallingIdentity();
899                     String retval = "content://icc/adn/";
900                     try {
901                         long subId = mPhoneAccountRegistrar
902                                 .getSubscriptionIdForPhoneAccount(accountHandle);
903                         retval = retval + "subId/" + subId;
904                     } finally {
905                         Binder.restoreCallingIdentity(token);
906                     }
907 
908                     return Uri.parse(retval);
909                 }
910             } finally {
911                 Log.endSession();
912             }
913         }
914 
915         /**
916          * @see android.telecom.TelecomManager#isTtySupported
917          */
918         @Override
919         public boolean isTtySupported(String callingPackage) {
920             try {
921                 Log.startSession("TSI.iTS");
922                 if (!canReadPhoneState(callingPackage, "hasVoiceMailNumber")) {
923                     return false;
924                 }
925 
926                 synchronized (mLock) {
927                     return mCallsManager.isTtySupported();
928                 }
929             } finally {
930                 Log.endSession();
931             }
932         }
933 
934         /**
935          * @see android.telecom.TelecomManager#getCurrentTtyMode
936          */
937         @Override
938         public int getCurrentTtyMode(String callingPackage) {
939             try {
940                 Log.startSession("TSI.gCTM");
941                 if (!canReadPhoneState(callingPackage, "getCurrentTtyMode")) {
942                     return TelecomManager.TTY_MODE_OFF;
943                 }
944 
945                 synchronized (mLock) {
946                     return mCallsManager.getCurrentTtyMode();
947                 }
948             } finally {
949                 Log.endSession();
950             }
951         }
952 
953         /**
954          * @see android.telecom.TelecomManager#addNewIncomingCall
955          */
956         @Override
957         public void addNewIncomingCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) {
958             try {
959                 Log.startSession("TSI.aNIC");
960                 synchronized (mLock) {
961                     Log.i(this, "Adding new incoming call with phoneAccountHandle %s",
962                             phoneAccountHandle);
963                     if (phoneAccountHandle != null &&
964                             phoneAccountHandle.getComponentName() != null) {
965                         // TODO(sail): Add unit tests for adding incoming calls from a SIM call
966                         // manager.
967                         if (isCallerSimCallManager() && TelephonyUtil.isPstnComponentName(
968                                 phoneAccountHandle.getComponentName())) {
969                             Log.v(this, "Allowing call manager to add incoming call with PSTN" +
970                                     " handle");
971                         } else {
972                             mAppOpsManager.checkPackage(
973                                     Binder.getCallingUid(),
974                                     phoneAccountHandle.getComponentName().getPackageName());
975                             // Make sure it doesn't cross the UserHandle boundary
976                             enforceUserHandleMatchesCaller(phoneAccountHandle);
977                             enforcePhoneAccountIsRegisteredEnabled(phoneAccountHandle,
978                                     Binder.getCallingUserHandle());
979                         }
980                         long token = Binder.clearCallingIdentity();
981                         try {
982                             Intent intent = new Intent(TelecomManager.ACTION_INCOMING_CALL);
983                             intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
984                                     phoneAccountHandle);
985                             intent.putExtra(CallIntentProcessor.KEY_IS_INCOMING_CALL, true);
986                             if (extras != null) {
987                                 extras.setDefusable(true);
988                                 intent.putExtra(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS, extras);
989                             }
990                             mCallIntentProcessorAdapter.processIncomingCallIntent(
991                                     mCallsManager, intent);
992                         } finally {
993                             Binder.restoreCallingIdentity(token);
994                         }
995                     } else {
996                         Log.w(this, "Null phoneAccountHandle. Ignoring request to add new" +
997                                 " incoming call");
998                     }
999                 }
1000             } finally {
1001                 Log.endSession();
1002             }
1003         }
1004 
1005         /**
1006          * @see android.telecom.TelecomManager#addNewUnknownCall
1007          */
1008         @Override
1009         public void addNewUnknownCall(PhoneAccountHandle phoneAccountHandle, Bundle extras) {
1010             try {
1011                 Log.startSession("TSI.aNUC");
1012                 synchronized (mLock) {
1013                     if (phoneAccountHandle != null &&
1014                             phoneAccountHandle.getComponentName() != null) {
1015                         mAppOpsManager.checkPackage(
1016                                 Binder.getCallingUid(),
1017                                 phoneAccountHandle.getComponentName().getPackageName());
1018 
1019                         // Make sure it doesn't cross the UserHandle boundary
1020                         enforceUserHandleMatchesCaller(phoneAccountHandle);
1021                         enforcePhoneAccountIsRegisteredEnabled(phoneAccountHandle,
1022                                 Binder.getCallingUserHandle());
1023                         long token = Binder.clearCallingIdentity();
1024 
1025                         try {
1026                             Intent intent = new Intent(TelecomManager.ACTION_NEW_UNKNOWN_CALL);
1027                             if (extras != null) {
1028                                 extras.setDefusable(true);
1029                                 intent.putExtras(extras);
1030                             }
1031                             intent.putExtra(CallIntentProcessor.KEY_IS_UNKNOWN_CALL, true);
1032                             intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
1033                                     phoneAccountHandle);
1034                             mCallIntentProcessorAdapter.processUnknownCallIntent(mCallsManager, intent);
1035                         } finally {
1036                             Binder.restoreCallingIdentity(token);
1037                         }
1038                     } else {
1039                         Log.i(this,
1040                                 "Null phoneAccountHandle or not initiated by Telephony. " +
1041                                         "Ignoring request to add new unknown call.");
1042                     }
1043                 }
1044             } finally {
1045                 Log.endSession();
1046             }
1047         }
1048 
1049         /**
1050          * @see android.telecom.TelecomManager#placeCall
1051          */
1052         @Override
1053         public void placeCall(Uri handle, Bundle extras, String callingPackage) {
1054             try {
1055                 Log.startSession("TSI.pC");
1056                 enforceCallingPackage(callingPackage);
1057                 if (!canCallPhone(callingPackage, "placeCall")) {
1058                     throw new SecurityException("Package " + callingPackage
1059                             + " is not allowed to place phone calls");
1060                 }
1061 
1062                 // Note: we can still get here for the default/system dialer, even if the Phone
1063                 // permission is turned off. This is because the default/system dialer is always
1064                 // allowed to attempt to place a call (regardless of permission state), in case
1065                 // it turns out to be an emergency call. If the permission is denied and the
1066                 // call is being made to a non-emergency number, the call will be denied later on
1067                 // by {@link UserCallIntentProcessor}.
1068 
1069                 final boolean hasCallAppOp = mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE,
1070                         Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
1071 
1072                 final boolean hasCallPermission = mContext.checkCallingPermission(CALL_PHONE) ==
1073                         PackageManager.PERMISSION_GRANTED;
1074 
1075                 synchronized (mLock) {
1076                     final UserHandle userHandle = Binder.getCallingUserHandle();
1077                     long token = Binder.clearCallingIdentity();
1078                     try {
1079                         final Intent intent = new Intent(Intent.ACTION_CALL, handle);
1080                         if (extras != null) {
1081                             extras.setDefusable(true);
1082                             intent.putExtras(extras);
1083                         }
1084                         mUserCallIntentProcessorFactory.create(mContext, userHandle)
1085                                 .processIntent(
1086                                         intent, callingPackage, hasCallAppOp && hasCallPermission);
1087                     } finally {
1088                         Binder.restoreCallingIdentity(token);
1089                     }
1090                 }
1091             } finally {
1092                 Log.endSession();
1093             }
1094         }
1095 
1096         /**
1097          * @see android.telecom.TelecomManager#enablePhoneAccount
1098          */
1099         @Override
1100         public boolean enablePhoneAccount(PhoneAccountHandle accountHandle, boolean isEnabled) {
1101             try {
1102                 Log.startSession("TSI.ePA");
1103                 enforceModifyPermission();
1104                 synchronized (mLock) {
1105                     long token = Binder.clearCallingIdentity();
1106                     try {
1107                         // enable/disable phone account
1108                         return mPhoneAccountRegistrar.enablePhoneAccount(accountHandle, isEnabled);
1109                     } finally {
1110                         Binder.restoreCallingIdentity(token);
1111                     }
1112                 }
1113             } finally {
1114                 Log.endSession();
1115             }
1116         }
1117 
1118         @Override
1119         public boolean setDefaultDialer(String packageName) {
1120             try {
1121                 Log.startSession("TSI.sDD");
1122                 enforcePermission(MODIFY_PHONE_STATE);
1123                 enforcePermission(WRITE_SECURE_SETTINGS);
1124                 synchronized (mLock) {
1125                     long token = Binder.clearCallingIdentity();
1126                     try {
1127                         final boolean result =
1128                                 mDefaultDialerManagerAdapter
1129                                         .setDefaultDialerApplication(mContext, packageName);
1130                         if (result) {
1131                             final Intent intent =
1132                                     new Intent(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED);
1133                             intent.putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME,
1134                                     packageName);
1135                             mContext.sendBroadcastAsUser(intent,
1136                                     new UserHandle(ActivityManager.getCurrentUser()));
1137                         }
1138                         return result;
1139                     } finally {
1140                         Binder.restoreCallingIdentity(token);
1141                     }
1142                 }
1143             } finally {
1144                 Log.endSession();
1145             }
1146         }
1147 
1148         @Override
1149         public TelecomAnalytics dumpCallAnalytics() {
1150             try {
1151                 Log.startSession("TSI.dCA");
1152                 enforcePermission(DUMP);
1153                 return Analytics.dumpToParcelableAnalytics();
1154             } finally {
1155                 Log.endSession();
1156             }
1157         }
1158 
1159         /**
1160          * Dumps the current state of the TelecomService.  Used when generating problem reports.
1161          *
1162          * @param fd The file descriptor.
1163          * @param writer The print writer to dump the state to.
1164          * @param args Optional dump arguments.
1165          */
1166         @Override
1167         protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
1168             if (mContext.checkCallingOrSelfPermission(
1169                     android.Manifest.permission.DUMP)
1170                     != PackageManager.PERMISSION_GRANTED) {
1171                 writer.println("Permission Denial: can't dump TelecomService " +
1172                         "from from pid=" + Binder.getCallingPid() + ", uid=" +
1173                         Binder.getCallingUid());
1174                 return;
1175             }
1176 
1177             final IndentingPrintWriter pw = new IndentingPrintWriter(writer, "  ");
1178             if (mCallsManager != null) {
1179                 pw.println("CallsManager: ");
1180                 pw.increaseIndent();
1181                 mCallsManager.dump(pw);
1182                 pw.decreaseIndent();
1183 
1184                 pw.println("PhoneAccountRegistrar: ");
1185                 pw.increaseIndent();
1186                 mPhoneAccountRegistrar.dump(pw);
1187                 pw.decreaseIndent();
1188 
1189                 pw.println("Analytics:");
1190                 pw.increaseIndent();
1191                 Analytics.dump(pw);
1192                 pw.decreaseIndent();
1193             }
1194 
1195             Log.dumpCallEvents(pw);
1196         }
1197 
1198         /**
1199          * @see android.telecom.TelecomManager#createManageBlockedNumbersIntent
1200          */
1201         @Override
1202         public Intent createManageBlockedNumbersIntent() {
1203             return BlockedNumbersActivity.getIntentForStartingActivity();
1204         }
1205     };
1206 
1207     private Context mContext;
1208     private AppOpsManager mAppOpsManager;
1209     private UserManager mUserManager;
1210     private PackageManager mPackageManager;
1211     private CallsManager mCallsManager;
1212     private final PhoneAccountRegistrar mPhoneAccountRegistrar;
1213     private final CallIntentProcessor.Adapter mCallIntentProcessorAdapter;
1214     private final UserCallIntentProcessorFactory mUserCallIntentProcessorFactory;
1215     private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter;
1216     private final SubscriptionManagerAdapter mSubscriptionManagerAdapter;
1217     private final TelecomSystem.SyncRoot mLock;
1218 
TelecomServiceImpl( Context context, CallsManager callsManager, PhoneAccountRegistrar phoneAccountRegistrar, CallIntentProcessor.Adapter callIntentProcessorAdapter, UserCallIntentProcessorFactory userCallIntentProcessorFactory, DefaultDialerManagerAdapter defaultDialerManagerAdapter, SubscriptionManagerAdapter subscriptionManagerAdapter, TelecomSystem.SyncRoot lock)1219     public TelecomServiceImpl(
1220             Context context,
1221             CallsManager callsManager,
1222             PhoneAccountRegistrar phoneAccountRegistrar,
1223             CallIntentProcessor.Adapter callIntentProcessorAdapter,
1224             UserCallIntentProcessorFactory userCallIntentProcessorFactory,
1225             DefaultDialerManagerAdapter defaultDialerManagerAdapter,
1226             SubscriptionManagerAdapter subscriptionManagerAdapter,
1227             TelecomSystem.SyncRoot lock) {
1228         mContext = context;
1229         mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
1230 
1231         mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
1232         mPackageManager = mContext.getPackageManager();
1233 
1234         mCallsManager = callsManager;
1235         mLock = lock;
1236         mPhoneAccountRegistrar = phoneAccountRegistrar;
1237         mUserCallIntentProcessorFactory = userCallIntentProcessorFactory;
1238         mDefaultDialerManagerAdapter = defaultDialerManagerAdapter;
1239         mCallIntentProcessorAdapter = callIntentProcessorAdapter;
1240         mSubscriptionManagerAdapter = subscriptionManagerAdapter;
1241     }
1242 
getBinder()1243     public ITelecomService.Stub getBinder() {
1244         return mBinderImpl;
1245     }
1246 
1247     //
1248     // Supporting methods for the ITelecomService interface implementation.
1249     //
1250 
isPhoneAccountHandleVisibleToCallingUser( PhoneAccountHandle phoneAccountUserHandle, UserHandle callingUser)1251     private boolean isPhoneAccountHandleVisibleToCallingUser(
1252             PhoneAccountHandle phoneAccountUserHandle, UserHandle callingUser) {
1253         return mPhoneAccountRegistrar.getPhoneAccount(phoneAccountUserHandle, callingUser) != null;
1254     }
1255 
isCallerSystemApp()1256     private boolean isCallerSystemApp() {
1257         int uid = Binder.getCallingUid();
1258         String[] packages = mPackageManager.getPackagesForUid(uid);
1259         for (String packageName : packages) {
1260             if (isPackageSystemApp(packageName)) {
1261                 return true;
1262             }
1263         }
1264         return false;
1265     }
1266 
isPackageSystemApp(String packageName)1267     private boolean isPackageSystemApp(String packageName) {
1268         try {
1269             ApplicationInfo applicationInfo = mPackageManager.getApplicationInfo(packageName,
1270                     PackageManager.GET_META_DATA);
1271             if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
1272                 return true;
1273             }
1274         } catch (PackageManager.NameNotFoundException e) {
1275         }
1276         return false;
1277     }
1278 
acceptRingingCallInternal(int videoState)1279     private void acceptRingingCallInternal(int videoState) {
1280         Call call = mCallsManager.getFirstCallWithState(CallState.RINGING);
1281         if (call != null) {
1282             if (videoState == DEFAULT_VIDEO_STATE || !isValidAcceptVideoState(videoState)) {
1283                 videoState = call.getVideoState();
1284             }
1285             call.answer(videoState);
1286         }
1287     }
1288 
endCallInternal()1289     private boolean endCallInternal() {
1290         // Always operate on the foreground call if one exists, otherwise get the first call in
1291         // priority order by call-state.
1292         Call call = mCallsManager.getForegroundCall();
1293         if (call == null) {
1294             call = mCallsManager.getFirstCallWithState(
1295                     CallState.ACTIVE,
1296                     CallState.DIALING,
1297                     CallState.PULLING,
1298                     CallState.RINGING,
1299                     CallState.ON_HOLD);
1300         }
1301 
1302         if (call != null) {
1303             if (call.getState() == CallState.RINGING) {
1304                 call.reject(false /* rejectWithMessage */, null);
1305             } else {
1306                 call.disconnect();
1307             }
1308             return true;
1309         }
1310 
1311         return false;
1312     }
1313 
1314     // Enforce that the PhoneAccountHandle being passed in is both registered to the current user
1315     // and enabled.
enforcePhoneAccountIsRegisteredEnabled(PhoneAccountHandle phoneAccountHandle, UserHandle callingUserHandle)1316     private void enforcePhoneAccountIsRegisteredEnabled(PhoneAccountHandle phoneAccountHandle,
1317                                                         UserHandle callingUserHandle) {
1318         PhoneAccount phoneAccount = mPhoneAccountRegistrar.getPhoneAccount(phoneAccountHandle,
1319                 callingUserHandle);
1320         if(phoneAccount == null) {
1321             EventLog.writeEvent(0x534e4554, "26864502", Binder.getCallingUid(), "R");
1322             throw new SecurityException("This PhoneAccountHandle is not registered for this user!");
1323         }
1324         if(!phoneAccount.isEnabled()) {
1325             EventLog.writeEvent(0x534e4554, "26864502", Binder.getCallingUid(), "E");
1326             throw new SecurityException("This PhoneAccountHandle is not enabled for this user!");
1327         }
1328     }
1329 
enforcePhoneAccountModificationForPackage(String packageName)1330     private void enforcePhoneAccountModificationForPackage(String packageName) {
1331         // TODO: Use a new telecomm permission for this instead of reusing modify.
1332 
1333         int result = mContext.checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
1334 
1335         // Callers with MODIFY_PHONE_STATE can use the PhoneAccount mechanism to implement
1336         // built-in behavior even when PhoneAccounts are not exposed as a third-part API. They
1337         // may also modify PhoneAccounts on behalf of any 'packageName'.
1338 
1339         if (result != PackageManager.PERMISSION_GRANTED) {
1340             // Other callers are only allowed to modify PhoneAccounts if the relevant system
1341             // feature is enabled ...
1342             enforceConnectionServiceFeature();
1343             // ... and the PhoneAccounts they refer to are for their own package.
1344             enforceCallingPackage(packageName);
1345         }
1346     }
1347 
enforcePermissionOrPrivilegedDialer(String permission, String packageName)1348     private void enforcePermissionOrPrivilegedDialer(String permission, String packageName) {
1349         if (!isPrivilegedDialerCalling(packageName)) {
1350             try {
1351                 enforcePermission(permission);
1352             } catch (SecurityException e) {
1353                 Log.e(this, e, "Caller must be the default or system dialer, or have the permission"
1354                         + " %s to perform this operation.", permission);
1355                 throw e;
1356             }
1357         }
1358     }
1359 
enforceCallingPackage(String packageName)1360     private void enforceCallingPackage(String packageName) {
1361         mAppOpsManager.checkPackage(Binder.getCallingUid(), packageName);
1362     }
1363 
enforceConnectionServiceFeature()1364     private void enforceConnectionServiceFeature() {
1365         enforceFeature(PackageManager.FEATURE_CONNECTION_SERVICE);
1366     }
1367 
enforceRegisterSimSubscriptionPermission()1368     private void enforceRegisterSimSubscriptionPermission() {
1369         enforcePermission(REGISTER_SIM_SUBSCRIPTION);
1370     }
1371 
enforceModifyPermission()1372     private void enforceModifyPermission() {
1373         enforcePermission(MODIFY_PHONE_STATE);
1374     }
1375 
enforcePermission(String permission)1376     private void enforcePermission(String permission) {
1377         mContext.enforceCallingOrSelfPermission(permission, null);
1378     }
1379 
enforceRegisterMultiUser()1380     private void enforceRegisterMultiUser() {
1381         if (!isCallerSystemApp()) {
1382             throw new SecurityException("CAPABILITY_MULTI_USER is only available to system apps.");
1383         }
1384     }
1385 
enforceUserHandleMatchesCaller(PhoneAccountHandle accountHandle)1386     private void enforceUserHandleMatchesCaller(PhoneAccountHandle accountHandle) {
1387         if (!Binder.getCallingUserHandle().equals(accountHandle.getUserHandle())) {
1388             throw new SecurityException("Calling UserHandle does not match PhoneAccountHandle's");
1389         }
1390     }
1391 
enforceCrossUserPermission(int callingUid)1392     private void enforceCrossUserPermission(int callingUid) {
1393         if (callingUid != Process.SYSTEM_UID && callingUid != 0) {
1394             mContext.enforceCallingOrSelfPermission(
1395                     android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, "Must be system or have"
1396                             + " INTERACT_ACROSS_USERS_FULL permission");
1397         }
1398     }
1399 
enforceFeature(String feature)1400     private void enforceFeature(String feature) {
1401         PackageManager pm = mContext.getPackageManager();
1402         if (!pm.hasSystemFeature(feature)) {
1403             throw new UnsupportedOperationException(
1404                     "System does not support feature " + feature);
1405         }
1406     }
1407 
canReadPhoneState(String callingPackage, String message)1408     private boolean canReadPhoneState(String callingPackage, String message) {
1409         // The system/default dialer can always read phone state - so that emergency calls will
1410         // still work.
1411         if (isPrivilegedDialerCalling(callingPackage)) {
1412             return true;
1413         }
1414 
1415         try {
1416             mContext.enforceCallingOrSelfPermission(READ_PRIVILEGED_PHONE_STATE, message);
1417             // SKIP checking run-time OP_READ_PHONE_STATE since caller or self has PRIVILEGED
1418             // permission
1419             return true;
1420         } catch (SecurityException e) {
1421             // Accessing phone state is gated by a special permission.
1422             mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, message);
1423 
1424             // Some apps that have the permission can be restricted via app ops.
1425             return mAppOpsManager.noteOp(AppOpsManager.OP_READ_PHONE_STATE,
1426                     Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
1427         }
1428     }
1429 
canCallPhone(String callingPackage, String message)1430     private boolean canCallPhone(String callingPackage, String message) {
1431         // The system/default dialer can always read phone state - so that emergency calls will
1432         // still work.
1433         if (isPrivilegedDialerCalling(callingPackage)) {
1434             return true;
1435         }
1436 
1437         // Accessing phone state is gated by a special permission.
1438         mContext.enforceCallingOrSelfPermission(CALL_PHONE, message);
1439 
1440         // Some apps that have the permission can be restricted via app ops.
1441         return mAppOpsManager.noteOp(AppOpsManager.OP_CALL_PHONE,
1442                 Binder.getCallingUid(), callingPackage) == AppOpsManager.MODE_ALLOWED;
1443     }
1444 
isCallerSimCallManager()1445     private boolean isCallerSimCallManager() {
1446         long token = Binder.clearCallingIdentity();
1447         PhoneAccountHandle accountHandle = null;
1448         try {
1449              accountHandle = mPhoneAccountRegistrar.getSimCallManagerOfCurrentUser();
1450         } finally {
1451             Binder.restoreCallingIdentity(token);
1452         }
1453 
1454         if (accountHandle != null) {
1455             try {
1456                 mAppOpsManager.checkPackage(
1457                         Binder.getCallingUid(), accountHandle.getComponentName().getPackageName());
1458                 return true;
1459             } catch (SecurityException e) {
1460             }
1461         }
1462         return false;
1463     }
1464 
isPrivilegedDialerCalling(String callingPackage)1465     private boolean isPrivilegedDialerCalling(String callingPackage) {
1466         mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackage);
1467         return mDefaultDialerManagerAdapter.isDefaultOrSystemDialer(mContext, callingPackage);
1468     }
1469 
getTelephonyManager()1470     private TelephonyManager getTelephonyManager() {
1471         return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
1472     }
1473 
1474     /**
1475      * Determines if a video state is valid for accepting an incoming call.
1476      * For the purpose of accepting a call, states {@link VideoProfile#STATE_AUDIO_ONLY}, and
1477      * any combination of {@link VideoProfile#STATE_RX_ENABLED} and
1478      * {@link VideoProfile#STATE_TX_ENABLED} are considered valid.
1479      *
1480      * @param videoState The video state.
1481      * @return {@code true} if the video state is valid, {@code false} otherwise.
1482      */
isValidAcceptVideoState(int videoState)1483     private boolean isValidAcceptVideoState(int videoState) {
1484         // Given a video state input, turn off TX and RX so that we can determine if those were the
1485         // only bits set.
1486         int remainingState = videoState & ~VideoProfile.STATE_TX_ENABLED;
1487         remainingState = remainingState & ~VideoProfile.STATE_RX_ENABLED;
1488 
1489         // If only TX or RX were set (or neither), the video state is valid.
1490         return remainingState == 0;
1491     }
1492 }
1493