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