Home | History | Annotate | Download | only in telephony
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  * Copyright (c) 2013, The Linux Foundation. All rights reserved.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 package com.android.internal.telephony;
     19 
     20 
     21 import android.app.ActivityManagerNative;
     22 import android.content.Context;
     23 import android.content.Intent;
     24 import android.net.LinkProperties;
     25 import android.net.NetworkCapabilities;
     26 import android.os.AsyncResult;
     27 import android.os.Bundle;
     28 import android.os.Handler;
     29 import android.os.Message;
     30 import android.os.PersistableBundle;
     31 import android.os.SystemProperties;
     32 import android.os.UserHandle;
     33 import android.telephony.CarrierConfigManager;
     34 import android.telephony.CellInfo;
     35 import android.telephony.CellLocation;
     36 import android.telephony.Rlog;
     37 import android.telephony.ServiceState;
     38 import android.telephony.SignalStrength;
     39 import android.telephony.SubscriptionManager;
     40 
     41 import com.android.internal.telephony.cdma.CDMAPhone;
     42 import com.android.internal.telephony.gsm.GSMPhone;
     43 import com.android.internal.telephony.imsphone.ImsPhone;
     44 import com.android.internal.telephony.test.SimulatedRadioControl;
     45 import com.android.internal.telephony.cdma.CDMALTEPhone;
     46 import com.android.internal.telephony.uicc.IccCardProxy;
     47 import com.android.internal.telephony.uicc.IccFileHandler;
     48 import com.android.internal.telephony.uicc.IsimRecords;
     49 import com.android.internal.telephony.uicc.UiccCard;
     50 import com.android.internal.telephony.uicc.UsimServiceTable;
     51 
     52 import java.io.FileDescriptor;
     53 import java.io.PrintWriter;
     54 import java.util.List;
     55 import java.util.Locale;
     56 
     57 import com.android.internal.telephony.dataconnection.DctController;
     58 
     59 public class PhoneProxy extends Handler implements Phone {
     60     public final static Object lockForRadioTechnologyChange = new Object();
     61 
     62     private Phone mActivePhone;
     63     private CommandsInterface mCommandsInterface;
     64     private IccSmsInterfaceManager mIccSmsInterfaceManager;
     65     private IccPhoneBookInterfaceManagerProxy mIccPhoneBookInterfaceManagerProxy;
     66     private PhoneSubInfoProxy mPhoneSubInfoProxy;
     67     private IccCardProxy mIccCardProxy;
     68 
     69     private boolean mResetModemOnRadioTechnologyChange = false;
     70 
     71     private int mRilVersion;
     72 
     73     private static final int EVENT_VOICE_RADIO_TECH_CHANGED = 1;
     74     private static final int EVENT_RADIO_ON = 2;
     75     private static final int EVENT_REQUEST_VOICE_RADIO_TECH_DONE = 3;
     76     private static final int EVENT_RIL_CONNECTED = 4;
     77     private static final int EVENT_UPDATE_PHONE_OBJECT = 5;
     78     private static final int EVENT_SIM_RECORDS_LOADED = 6;
     79 
     80     private int mPhoneId = 0;
     81 
     82     private static final String LOG_TAG = "PhoneProxy";
     83 
     84     //***** Class Methods
     85     public PhoneProxy(PhoneBase phone) {
     86         mActivePhone = phone;
     87         mResetModemOnRadioTechnologyChange = SystemProperties.getBoolean(
     88                 TelephonyProperties.PROPERTY_RESET_ON_RADIO_TECH_CHANGE, false);
     89         mIccPhoneBookInterfaceManagerProxy = new IccPhoneBookInterfaceManagerProxy(
     90                 phone.getIccPhoneBookInterfaceManager());
     91         mPhoneSubInfoProxy = new PhoneSubInfoProxy(phone.getPhoneSubInfo());
     92         mCommandsInterface = ((PhoneBase)mActivePhone).mCi;
     93 
     94         mCommandsInterface.registerForRilConnected(this, EVENT_RIL_CONNECTED, null);
     95         mCommandsInterface.registerForOn(this, EVENT_RADIO_ON, null);
     96         mCommandsInterface.registerForVoiceRadioTechChanged(
     97                              this, EVENT_VOICE_RADIO_TECH_CHANGED, null);
     98         mPhoneId = phone.getPhoneId();
     99         mIccSmsInterfaceManager =
    100                 new IccSmsInterfaceManager((PhoneBase)this.mActivePhone);
    101         mIccCardProxy = new IccCardProxy(mActivePhone.getContext(), mCommandsInterface, mActivePhone.getPhoneId());
    102 
    103         if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
    104             // For the purpose of IccCardProxy we only care about the technology family
    105             mIccCardProxy.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS);
    106         } else if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
    107             mIccCardProxy.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT);
    108         }
    109     }
    110 
    111     @Override
    112     public void handleMessage(Message msg) {
    113         AsyncResult ar = (AsyncResult) msg.obj;
    114         switch(msg.what) {
    115         case EVENT_RADIO_ON:
    116             /* Proactively query voice radio technologies */
    117             mCommandsInterface.getVoiceRadioTechnology(
    118                     obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE));
    119             break;
    120 
    121         case EVENT_RIL_CONNECTED:
    122             if (ar.exception == null && ar.result != null) {
    123                 mRilVersion = (Integer) ar.result;
    124             } else {
    125                 logd("Unexpected exception on EVENT_RIL_CONNECTED");
    126                 mRilVersion = -1;
    127             }
    128             break;
    129 
    130         case EVENT_VOICE_RADIO_TECH_CHANGED:
    131         case EVENT_REQUEST_VOICE_RADIO_TECH_DONE:
    132             String what = (msg.what == EVENT_VOICE_RADIO_TECH_CHANGED) ?
    133                     "EVENT_VOICE_RADIO_TECH_CHANGED" : "EVENT_REQUEST_VOICE_RADIO_TECH_DONE";
    134             if (ar.exception == null) {
    135                 if ((ar.result != null) && (((int[]) ar.result).length != 0)) {
    136                     int newVoiceTech = ((int[]) ar.result)[0];
    137                     logd(what + ": newVoiceTech=" + newVoiceTech);
    138                     phoneObjectUpdater(newVoiceTech);
    139                 } else {
    140                     loge(what + ": has no tech!");
    141                 }
    142             } else {
    143                 loge(what + ": exception=" + ar.exception);
    144             }
    145             break;
    146 
    147         case EVENT_UPDATE_PHONE_OBJECT:
    148             phoneObjectUpdater(msg.arg1);
    149             break;
    150 
    151         case EVENT_SIM_RECORDS_LOADED:
    152             // Only check for the voice radio tech if it not going to be updated by the voice
    153             // registration changes.
    154             if (!mActivePhone.getContext().getResources().getBoolean(
    155                     com.android.internal.R.bool.config_switch_phone_on_voice_reg_state_change)) {
    156                 mCommandsInterface.getVoiceRadioTechnology(obtainMessage(
    157                         EVENT_REQUEST_VOICE_RADIO_TECH_DONE));
    158             }
    159             break;
    160 
    161         default:
    162             loge("Error! This handler was not registered for this message type. Message: "
    163                     + msg.what);
    164             break;
    165         }
    166         super.handleMessage(msg);
    167     }
    168 
    169     private static void logd(String msg) {
    170         Rlog.d(LOG_TAG, "[PhoneProxy] " + msg);
    171     }
    172 
    173     private void loge(String msg) {
    174         Rlog.e(LOG_TAG, "[PhoneProxy] " + msg);
    175     }
    176 
    177     private void phoneObjectUpdater(int newVoiceRadioTech) {
    178         logd("phoneObjectUpdater: newVoiceRadioTech=" + newVoiceRadioTech);
    179 
    180         if (mActivePhone != null) {
    181             // Check for a voice over lte replacement
    182             if ((newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_LTE)
    183                     || (newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN)) {
    184                 CarrierConfigManager configMgr = (CarrierConfigManager)
    185                         mActivePhone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
    186                 PersistableBundle b = configMgr.getConfigForSubId(mActivePhone.getSubId());
    187                 if (b != null) {
    188                     int volteReplacementRat =
    189                             b.getInt(CarrierConfigManager.KEY_VOLTE_REPLACEMENT_RAT_INT);
    190                     logd("phoneObjectUpdater: volteReplacementRat=" + volteReplacementRat);
    191                     if (volteReplacementRat != ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) {
    192                         newVoiceRadioTech = volteReplacementRat;
    193                     }
    194                 } else {
    195                     loge("phoneObjectUpdater: didn't get volteReplacementRat from carrier config");
    196                 }
    197             }
    198 
    199             if(mRilVersion == 6 && getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE) {
    200                 /*
    201                  * On v6 RIL, when LTE_ON_CDMA is TRUE, always create CDMALTEPhone
    202                  * irrespective of the voice radio tech reported.
    203                  */
    204                 if (mActivePhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
    205                     logd("phoneObjectUpdater: LTE ON CDMA property is set. Use CDMA Phone" +
    206                             " newVoiceRadioTech=" + newVoiceRadioTech +
    207                             " mActivePhone=" + mActivePhone.getPhoneName());
    208                     return;
    209                 } else {
    210                     logd("phoneObjectUpdater: LTE ON CDMA property is set. Switch to CDMALTEPhone" +
    211                             " newVoiceRadioTech=" + newVoiceRadioTech +
    212                             " mActivePhone=" + mActivePhone.getPhoneName());
    213                     newVoiceRadioTech = ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT;
    214                 }
    215             } else {
    216                 boolean matchCdma = ServiceState.isCdma(newVoiceRadioTech);
    217                 boolean matchGsm = ServiceState.isGsm(newVoiceRadioTech);
    218                 if ((matchCdma  &&
    219                         mActivePhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) ||
    220                         (matchGsm &&
    221                                 mActivePhone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM)) {
    222                     // Nothing changed. Keep phone as it is.
    223                     logd("phoneObjectUpdater: No change ignore," +
    224                             " newVoiceRadioTech=" + newVoiceRadioTech +
    225                             " mActivePhone=" + mActivePhone.getPhoneName());
    226                     return;
    227                 }
    228                 if (!matchCdma && !matchGsm) {
    229                     loge("phoneObjectUpdater: newVoiceRadioTech=" + newVoiceRadioTech +
    230                         " doesn't match either CDMA or GSM - error! No phone change");
    231                     return;
    232                 }
    233             }
    234         }
    235 
    236         if (newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) {
    237             // We need some voice phone object to be active always, so never
    238             // delete the phone without anything to replace it with!
    239             logd("phoneObjectUpdater: Unknown rat ignore, "
    240                     + " newVoiceRadioTech=Unknown. mActivePhone=" + mActivePhone.getPhoneName());
    241             return;
    242         }
    243 
    244         boolean oldPowerState = false; // old power state to off
    245         if (mResetModemOnRadioTechnologyChange) {
    246             if (mCommandsInterface.getRadioState().isOn()) {
    247                 oldPowerState = true;
    248                 logd("phoneObjectUpdater: Setting Radio Power to Off");
    249                 mCommandsInterface.setRadioPower(false, null);
    250             }
    251         }
    252 
    253         deleteAndCreatePhone(newVoiceRadioTech);
    254 
    255         if (mResetModemOnRadioTechnologyChange && oldPowerState) { // restore power state
    256             logd("phoneObjectUpdater: Resetting Radio");
    257             mCommandsInterface.setRadioPower(oldPowerState, null);
    258         }
    259 
    260         // Set the new interfaces in the proxy's
    261         mIccSmsInterfaceManager.updatePhoneObject((PhoneBase) mActivePhone);
    262         mIccPhoneBookInterfaceManagerProxy.setmIccPhoneBookInterfaceManager(mActivePhone
    263                 .getIccPhoneBookInterfaceManager());
    264         mPhoneSubInfoProxy.setmPhoneSubInfo(mActivePhone.getPhoneSubInfo());
    265 
    266         mCommandsInterface = ((PhoneBase)mActivePhone).mCi;
    267         mIccCardProxy.setVoiceRadioTech(newVoiceRadioTech);
    268 
    269         // Send an Intent to the PhoneApp that we had a radio technology change
    270         Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED);
    271         intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
    272         intent.putExtra(PhoneConstants.PHONE_NAME_KEY, mActivePhone.getPhoneName());
    273         SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhoneId);
    274         ActivityManagerNative.broadcastStickyIntent(intent, null, UserHandle.USER_ALL);
    275 
    276         DctController.getInstance().updatePhoneObject(this);
    277 
    278     }
    279 
    280     private void deleteAndCreatePhone(int newVoiceRadioTech) {
    281 
    282         String outgoingPhoneName = "Unknown";
    283         Phone oldPhone = mActivePhone;
    284         ImsPhone imsPhone = null;
    285 
    286         if (oldPhone != null) {
    287             outgoingPhoneName = ((PhoneBase) oldPhone).getPhoneName();
    288             oldPhone.unregisterForSimRecordsLoaded(this);
    289         }
    290 
    291         logd("Switching Voice Phone : " + outgoingPhoneName + " >>> "
    292                 + (ServiceState.isGsm(newVoiceRadioTech) ? "GSM" : "CDMA"));
    293 
    294         if (ServiceState.isCdma(newVoiceRadioTech)) {
    295             mActivePhone = PhoneFactory.getCdmaPhone(mPhoneId);
    296         } else if (ServiceState.isGsm(newVoiceRadioTech)) {
    297             mActivePhone = PhoneFactory.getGsmPhone(mPhoneId);
    298         } else {
    299             loge("deleteAndCreatePhone: newVoiceRadioTech=" + newVoiceRadioTech +
    300                 " is not CDMA or GSM (error) - aborting!");
    301             return;
    302         }
    303 
    304         if (oldPhone != null) {
    305             imsPhone = oldPhone.relinquishOwnershipOfImsPhone();
    306         }
    307 
    308         if(mActivePhone != null) {
    309             CallManager.getInstance().registerPhone(mActivePhone);
    310             if (imsPhone != null) {
    311                 mActivePhone.acquireOwnershipOfImsPhone(imsPhone);
    312             }
    313             mActivePhone.startMonitoringImsService();
    314             mActivePhone.registerForSimRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
    315         }
    316 
    317         if (oldPhone != null) {
    318             CallManager.getInstance().unregisterPhone(oldPhone);
    319             logd("Disposing old phone..");
    320             oldPhone.dispose();
    321             // Potential GC issues: however, callers may have references to old
    322             // phone on which they perform hierarchical funcs: phone.getA().getB()
    323             // HENCE: do not delete references.
    324             //oldPhone.removeReferences();
    325         }
    326         oldPhone = null;
    327     }
    328 
    329     public IccSmsInterfaceManager getIccSmsInterfaceManager(){
    330         return mIccSmsInterfaceManager;
    331     }
    332 
    333     public PhoneSubInfoProxy getPhoneSubInfoProxy(){
    334         return mPhoneSubInfoProxy;
    335     }
    336 
    337     public IccPhoneBookInterfaceManagerProxy getIccPhoneBookInterfaceManagerProxy() {
    338         return mIccPhoneBookInterfaceManagerProxy;
    339     }
    340 
    341     public IccFileHandler getIccFileHandler() {
    342         return ((PhoneBase)mActivePhone).getIccFileHandler();
    343     }
    344 
    345     @Override
    346     public boolean isVideoCallPresent() {
    347         return mActivePhone.isVideoCallPresent();
    348     }
    349 
    350     @Override
    351     public void updatePhoneObject(int voiceRadioTech) {
    352         logd("updatePhoneObject: radioTechnology=" + voiceRadioTech);
    353         sendMessage(obtainMessage(EVENT_UPDATE_PHONE_OBJECT, voiceRadioTech, 0, null));
    354     }
    355 
    356     @Override
    357     public ServiceState getServiceState() {
    358         return mActivePhone.getServiceState();
    359     }
    360 
    361     @Override
    362     public CellLocation getCellLocation() {
    363         return mActivePhone.getCellLocation();
    364     }
    365 
    366     /**
    367      * @return all available cell information or null if none.
    368      */
    369     @Override
    370     public List<CellInfo> getAllCellInfo() {
    371         return mActivePhone.getAllCellInfo();
    372     }
    373 
    374     /**
    375      * {@inheritDoc}
    376      */
    377     @Override
    378     public void setCellInfoListRate(int rateInMillis) {
    379         mActivePhone.setCellInfoListRate(rateInMillis);
    380     }
    381 
    382     @Override
    383     public PhoneConstants.DataState getDataConnectionState() {
    384         return mActivePhone.getDataConnectionState(PhoneConstants.APN_TYPE_DEFAULT);
    385     }
    386 
    387     @Override
    388     public PhoneConstants.DataState getDataConnectionState(String apnType) {
    389         return mActivePhone.getDataConnectionState(apnType);
    390     }
    391 
    392     @Override
    393     public DataActivityState getDataActivityState() {
    394         return mActivePhone.getDataActivityState();
    395     }
    396 
    397     @Override
    398     public Context getContext() {
    399         return mActivePhone.getContext();
    400     }
    401 
    402     @Override
    403     public void disableDnsCheck(boolean b) {
    404         mActivePhone.disableDnsCheck(b);
    405     }
    406 
    407     @Override
    408     public boolean isDnsCheckDisabled() {
    409         return mActivePhone.isDnsCheckDisabled();
    410     }
    411 
    412     @Override
    413     public PhoneConstants.State getState() {
    414         return mActivePhone.getState();
    415     }
    416 
    417     @Override
    418     public String getPhoneName() {
    419         return mActivePhone.getPhoneName();
    420     }
    421 
    422     @Override
    423     public int getPhoneType() {
    424         return mActivePhone.getPhoneType();
    425     }
    426 
    427     @Override
    428     public String[] getActiveApnTypes() {
    429         return mActivePhone.getActiveApnTypes();
    430     }
    431 
    432     @Override
    433     public boolean hasMatchedTetherApnSetting() {
    434         return mActivePhone.hasMatchedTetherApnSetting();
    435     }
    436 
    437     @Override
    438     public String getActiveApnHost(String apnType) {
    439         return mActivePhone.getActiveApnHost(apnType);
    440     }
    441 
    442     @Override
    443     public LinkProperties getLinkProperties(String apnType) {
    444         return mActivePhone.getLinkProperties(apnType);
    445     }
    446 
    447     @Override
    448     public NetworkCapabilities getNetworkCapabilities(String apnType) {
    449         return mActivePhone.getNetworkCapabilities(apnType);
    450     }
    451 
    452     @Override
    453     public SignalStrength getSignalStrength() {
    454         return mActivePhone.getSignalStrength();
    455     }
    456 
    457     @Override
    458     public void registerForUnknownConnection(Handler h, int what, Object obj) {
    459         mActivePhone.registerForUnknownConnection(h, what, obj);
    460     }
    461 
    462     @Override
    463     public void unregisterForUnknownConnection(Handler h) {
    464         mActivePhone.unregisterForUnknownConnection(h);
    465     }
    466 
    467     @Override
    468     public void registerForHandoverStateChanged(Handler h, int what, Object obj) {
    469         mActivePhone.registerForHandoverStateChanged(h, what, obj);
    470     }
    471 
    472     @Override
    473     public void unregisterForHandoverStateChanged(Handler h) {
    474         mActivePhone.unregisterForHandoverStateChanged(h);
    475     }
    476 
    477     @Override
    478     public void registerForPreciseCallStateChanged(Handler h, int what, Object obj) {
    479         mActivePhone.registerForPreciseCallStateChanged(h, what, obj);
    480     }
    481 
    482     @Override
    483     public void unregisterForPreciseCallStateChanged(Handler h) {
    484         mActivePhone.unregisterForPreciseCallStateChanged(h);
    485     }
    486 
    487     @Override
    488     public void registerForNewRingingConnection(Handler h, int what, Object obj) {
    489         mActivePhone.registerForNewRingingConnection(h, what, obj);
    490     }
    491 
    492     @Override
    493     public void unregisterForNewRingingConnection(Handler h) {
    494         mActivePhone.unregisterForNewRingingConnection(h);
    495     }
    496 
    497     @Override
    498     public void registerForVideoCapabilityChanged(
    499             Handler h, int what, Object obj) {
    500         mActivePhone.registerForVideoCapabilityChanged(h, what, obj);
    501     }
    502 
    503     @Override
    504     public void unregisterForVideoCapabilityChanged(Handler h) {
    505         mActivePhone.unregisterForVideoCapabilityChanged(h);
    506     }
    507 
    508     @Override
    509     public void registerForIncomingRing(Handler h, int what, Object obj) {
    510         mActivePhone.registerForIncomingRing(h, what, obj);
    511     }
    512 
    513     @Override
    514     public void unregisterForIncomingRing(Handler h) {
    515         mActivePhone.unregisterForIncomingRing(h);
    516     }
    517 
    518     @Override
    519     public void registerForDisconnect(Handler h, int what, Object obj) {
    520         mActivePhone.registerForDisconnect(h, what, obj);
    521     }
    522 
    523     @Override
    524     public void unregisterForDisconnect(Handler h) {
    525         mActivePhone.unregisterForDisconnect(h);
    526     }
    527 
    528     @Override
    529     public void registerForMmiInitiate(Handler h, int what, Object obj) {
    530         mActivePhone.registerForMmiInitiate(h, what, obj);
    531     }
    532 
    533     @Override
    534     public void unregisterForMmiInitiate(Handler h) {
    535         mActivePhone.unregisterForMmiInitiate(h);
    536     }
    537 
    538     @Override
    539     public void registerForMmiComplete(Handler h, int what, Object obj) {
    540         mActivePhone.registerForMmiComplete(h, what, obj);
    541     }
    542 
    543     @Override
    544     public void unregisterForMmiComplete(Handler h) {
    545         mActivePhone.unregisterForMmiComplete(h);
    546     }
    547 
    548     @Override
    549     public List<? extends MmiCode> getPendingMmiCodes() {
    550         return mActivePhone.getPendingMmiCodes();
    551     }
    552 
    553     @Override
    554     public void sendUssdResponse(String ussdMessge) {
    555         mActivePhone.sendUssdResponse(ussdMessge);
    556     }
    557 
    558     @Override
    559     public void registerForServiceStateChanged(Handler h, int what, Object obj) {
    560         mActivePhone.registerForServiceStateChanged(h, what, obj);
    561     }
    562 
    563     @Override
    564     public void unregisterForServiceStateChanged(Handler h) {
    565         mActivePhone.unregisterForServiceStateChanged(h);
    566     }
    567 
    568     @Override
    569     public void registerForSuppServiceNotification(Handler h, int what, Object obj) {
    570         mActivePhone.registerForSuppServiceNotification(h, what, obj);
    571     }
    572 
    573     @Override
    574     public void unregisterForSuppServiceNotification(Handler h) {
    575         mActivePhone.unregisterForSuppServiceNotification(h);
    576     }
    577 
    578     @Override
    579     public void registerForSuppServiceFailed(Handler h, int what, Object obj) {
    580         mActivePhone.registerForSuppServiceFailed(h, what, obj);
    581     }
    582 
    583     @Override
    584     public void unregisterForSuppServiceFailed(Handler h) {
    585         mActivePhone.unregisterForSuppServiceFailed(h);
    586     }
    587 
    588     @Override
    589     public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){
    590         mActivePhone.registerForInCallVoicePrivacyOn(h,what,obj);
    591     }
    592 
    593     @Override
    594     public void unregisterForInCallVoicePrivacyOn(Handler h){
    595         mActivePhone.unregisterForInCallVoicePrivacyOn(h);
    596     }
    597 
    598     @Override
    599     public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){
    600         mActivePhone.registerForInCallVoicePrivacyOff(h,what,obj);
    601     }
    602 
    603     @Override
    604     public void unregisterForInCallVoicePrivacyOff(Handler h){
    605         mActivePhone.unregisterForInCallVoicePrivacyOff(h);
    606     }
    607 
    608     @Override
    609     public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) {
    610         mActivePhone.registerForCdmaOtaStatusChange(h,what,obj);
    611     }
    612 
    613     @Override
    614     public void unregisterForCdmaOtaStatusChange(Handler h) {
    615          mActivePhone.unregisterForCdmaOtaStatusChange(h);
    616     }
    617 
    618     @Override
    619     public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) {
    620         mActivePhone.registerForSubscriptionInfoReady(h, what, obj);
    621     }
    622 
    623     @Override
    624     public void unregisterForSubscriptionInfoReady(Handler h) {
    625         mActivePhone.unregisterForSubscriptionInfoReady(h);
    626     }
    627 
    628     @Override
    629     public void registerForEcmTimerReset(Handler h, int what, Object obj) {
    630         mActivePhone.registerForEcmTimerReset(h,what,obj);
    631     }
    632 
    633     @Override
    634     public void unregisterForEcmTimerReset(Handler h) {
    635         mActivePhone.unregisterForEcmTimerReset(h);
    636     }
    637 
    638     @Override
    639     public void registerForRingbackTone(Handler h, int what, Object obj) {
    640         mActivePhone.registerForRingbackTone(h,what,obj);
    641     }
    642 
    643     @Override
    644     public void unregisterForRingbackTone(Handler h) {
    645         mActivePhone.unregisterForRingbackTone(h);
    646     }
    647 
    648     @Override
    649     public void registerForOnHoldTone(Handler h, int what, Object obj) {
    650         mActivePhone.registerForOnHoldTone(h,what,obj);
    651     }
    652 
    653     @Override
    654     public void unregisterForOnHoldTone(Handler h) {
    655         mActivePhone.unregisterForOnHoldTone(h);
    656     }
    657 
    658     @Override
    659     public void registerForResendIncallMute(Handler h, int what, Object obj) {
    660         mActivePhone.registerForResendIncallMute(h,what,obj);
    661     }
    662 
    663     @Override
    664     public void unregisterForResendIncallMute(Handler h) {
    665         mActivePhone.unregisterForResendIncallMute(h);
    666     }
    667 
    668     @Override
    669     public void registerForSimRecordsLoaded(Handler h, int what, Object obj) {
    670         mActivePhone.registerForSimRecordsLoaded(h,what,obj);
    671     }
    672 
    673     public void unregisterForSimRecordsLoaded(Handler h) {
    674         mActivePhone.unregisterForSimRecordsLoaded(h);
    675     }
    676 
    677     @Override
    678     public void registerForTtyModeReceived(Handler h, int what, Object obj) {
    679         mActivePhone.registerForTtyModeReceived(h, what, obj);
    680     }
    681 
    682     @Override
    683     public void unregisterForTtyModeReceived(Handler h) {
    684         mActivePhone.unregisterForTtyModeReceived(h);
    685     }
    686 
    687     @Override
    688     public boolean getIccRecordsLoaded() {
    689         return mIccCardProxy.getIccRecordsLoaded();
    690     }
    691 
    692     @Override
    693     public IccCard getIccCard() {
    694         return mIccCardProxy;
    695     }
    696 
    697     @Override
    698     public void acceptCall(int videoState) throws CallStateException {
    699         mActivePhone.acceptCall(videoState);
    700     }
    701 
    702     @Override
    703     public void rejectCall() throws CallStateException {
    704         mActivePhone.rejectCall();
    705     }
    706 
    707     @Override
    708     public void switchHoldingAndActive() throws CallStateException {
    709         mActivePhone.switchHoldingAndActive();
    710     }
    711 
    712     @Override
    713     public boolean canConference() {
    714         return mActivePhone.canConference();
    715     }
    716 
    717     @Override
    718     public void conference() throws CallStateException {
    719         mActivePhone.conference();
    720     }
    721 
    722     @Override
    723     public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) {
    724         mActivePhone.enableEnhancedVoicePrivacy(enable, onComplete);
    725     }
    726 
    727     @Override
    728     public void getEnhancedVoicePrivacy(Message onComplete) {
    729         mActivePhone.getEnhancedVoicePrivacy(onComplete);
    730     }
    731 
    732     @Override
    733     public boolean canTransfer() {
    734         return mActivePhone.canTransfer();
    735     }
    736 
    737     @Override
    738     public void explicitCallTransfer() throws CallStateException {
    739         mActivePhone.explicitCallTransfer();
    740     }
    741 
    742     @Override
    743     public void clearDisconnected() {
    744         mActivePhone.clearDisconnected();
    745     }
    746 
    747     @Override
    748     public Call getForegroundCall() {
    749         return mActivePhone.getForegroundCall();
    750     }
    751 
    752     @Override
    753     public Call getBackgroundCall() {
    754         return mActivePhone.getBackgroundCall();
    755     }
    756 
    757     @Override
    758     public Call getRingingCall() {
    759         return mActivePhone.getRingingCall();
    760     }
    761 
    762     @Override
    763     public Connection dial(String dialString, int videoState) throws CallStateException {
    764         return mActivePhone.dial(dialString, videoState);
    765     }
    766 
    767     @Override
    768     public Connection dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras)
    769             throws CallStateException {
    770         return mActivePhone.dial(dialString, uusInfo, videoState, intentExtras);
    771     }
    772 
    773     @Override
    774     public boolean handlePinMmi(String dialString) {
    775         return mActivePhone.handlePinMmi(dialString);
    776     }
    777 
    778     @Override
    779     public boolean handleInCallMmiCommands(String command) throws CallStateException {
    780         return mActivePhone.handleInCallMmiCommands(command);
    781     }
    782 
    783     @Override
    784     public void sendDtmf(char c) {
    785         mActivePhone.sendDtmf(c);
    786     }
    787 
    788     @Override
    789     public void startDtmf(char c) {
    790         mActivePhone.startDtmf(c);
    791     }
    792 
    793     @Override
    794     public void stopDtmf() {
    795         mActivePhone.stopDtmf();
    796     }
    797 
    798     @Override
    799     public void setRadioPower(boolean power) {
    800         mActivePhone.setRadioPower(power);
    801     }
    802 
    803     @Override
    804     public boolean getMessageWaitingIndicator() {
    805         return mActivePhone.getMessageWaitingIndicator();
    806     }
    807 
    808     @Override
    809     public boolean getCallForwardingIndicator() {
    810         return mActivePhone.getCallForwardingIndicator();
    811     }
    812 
    813     @Override
    814     public String getLine1Number() {
    815         return mActivePhone.getLine1Number();
    816     }
    817 
    818     @Override
    819     public String getCdmaMin() {
    820         return mActivePhone.getCdmaMin();
    821     }
    822 
    823     @Override
    824     public boolean isMinInfoReady() {
    825         return mActivePhone.isMinInfoReady();
    826     }
    827 
    828     @Override
    829     public String getCdmaPrlVersion() {
    830         return mActivePhone.getCdmaPrlVersion();
    831     }
    832 
    833     @Override
    834     public String getLine1AlphaTag() {
    835         return mActivePhone.getLine1AlphaTag();
    836     }
    837 
    838     @Override
    839     public boolean setLine1Number(String alphaTag, String number, Message onComplete) {
    840         return mActivePhone.setLine1Number(alphaTag, number, onComplete);
    841     }
    842 
    843     @Override
    844     public String getVoiceMailNumber() {
    845         return mActivePhone.getVoiceMailNumber();
    846     }
    847 
    848      /** @hide */
    849     @Override
    850     public int getVoiceMessageCount(){
    851         return mActivePhone.getVoiceMessageCount();
    852     }
    853 
    854     @Override
    855     public String getVoiceMailAlphaTag() {
    856         return mActivePhone.getVoiceMailAlphaTag();
    857     }
    858 
    859     @Override
    860     public void setVoiceMailNumber(String alphaTag,String voiceMailNumber,
    861             Message onComplete) {
    862         mActivePhone.setVoiceMailNumber(alphaTag, voiceMailNumber, onComplete);
    863     }
    864 
    865     @Override
    866     public void getCallForwardingOption(int commandInterfaceCFReason,
    867             Message onComplete) {
    868         mActivePhone.getCallForwardingOption(commandInterfaceCFReason,
    869                 onComplete);
    870     }
    871 
    872     @Override
    873     public void setCallForwardingOption(int commandInterfaceCFReason,
    874             int commandInterfaceCFAction, String dialingNumber,
    875             int timerSeconds, Message onComplete) {
    876         mActivePhone.setCallForwardingOption(commandInterfaceCFReason,
    877             commandInterfaceCFAction, dialingNumber, timerSeconds, onComplete);
    878     }
    879 
    880     @Override
    881     public void getOutgoingCallerIdDisplay(Message onComplete) {
    882         mActivePhone.getOutgoingCallerIdDisplay(onComplete);
    883     }
    884 
    885     @Override
    886     public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
    887             Message onComplete) {
    888         mActivePhone.setOutgoingCallerIdDisplay(commandInterfaceCLIRMode,
    889                 onComplete);
    890     }
    891 
    892     @Override
    893     public void getCallWaiting(Message onComplete) {
    894         mActivePhone.getCallWaiting(onComplete);
    895     }
    896 
    897     @Override
    898     public void setCallWaiting(boolean enable, Message onComplete) {
    899         mActivePhone.setCallWaiting(enable, onComplete);
    900     }
    901 
    902     @Override
    903     public void getAvailableNetworks(Message response) {
    904         mActivePhone.getAvailableNetworks(response);
    905     }
    906 
    907     @Override
    908     public void setNetworkSelectionModeAutomatic(Message response) {
    909         mActivePhone.setNetworkSelectionModeAutomatic(response);
    910     }
    911 
    912     @Override
    913     public void getNetworkSelectionMode(Message response) {
    914         mActivePhone.getNetworkSelectionMode(response);
    915     }
    916 
    917     @Override
    918     public void selectNetworkManually(OperatorInfo network, Message response) {
    919         mActivePhone.selectNetworkManually(network, response);
    920     }
    921 
    922     @Override
    923     public void setPreferredNetworkType(int networkType, Message response) {
    924         mActivePhone.setPreferredNetworkType(networkType, response);
    925     }
    926 
    927     @Override
    928     public void getPreferredNetworkType(Message response) {
    929         mActivePhone.getPreferredNetworkType(response);
    930     }
    931 
    932     @Override
    933     public void getNeighboringCids(Message response) {
    934         mActivePhone.getNeighboringCids(response);
    935     }
    936 
    937     @Override
    938     public void setOnPostDialCharacter(Handler h, int what, Object obj) {
    939         mActivePhone.setOnPostDialCharacter(h, what, obj);
    940     }
    941 
    942     @Override
    943     public void setMute(boolean muted) {
    944         mActivePhone.setMute(muted);
    945     }
    946 
    947     @Override
    948     public boolean getMute() {
    949         return mActivePhone.getMute();
    950     }
    951 
    952     @Override
    953     public void setEchoSuppressionEnabled() {
    954         mActivePhone.setEchoSuppressionEnabled();
    955     }
    956 
    957     @Override
    958     public void invokeOemRilRequestRaw(byte[] data, Message response) {
    959         mActivePhone.invokeOemRilRequestRaw(data, response);
    960     }
    961 
    962     @Override
    963     public void invokeOemRilRequestStrings(String[] strings, Message response) {
    964         mActivePhone.invokeOemRilRequestStrings(strings, response);
    965     }
    966 
    967     @Override
    968     public void getDataCallList(Message response) {
    969         mActivePhone.getDataCallList(response);
    970     }
    971 
    972     @Override
    973     public void updateServiceLocation() {
    974         mActivePhone.updateServiceLocation();
    975     }
    976 
    977     @Override
    978     public void enableLocationUpdates() {
    979         mActivePhone.enableLocationUpdates();
    980     }
    981 
    982     @Override
    983     public void disableLocationUpdates() {
    984         mActivePhone.disableLocationUpdates();
    985     }
    986 
    987     @Override
    988     public void setUnitTestMode(boolean f) {
    989         mActivePhone.setUnitTestMode(f);
    990     }
    991 
    992     @Override
    993     public boolean getUnitTestMode() {
    994         return mActivePhone.getUnitTestMode();
    995     }
    996 
    997     @Override
    998     public void setBandMode(int bandMode, Message response) {
    999         mActivePhone.setBandMode(bandMode, response);
   1000     }
   1001 
   1002     @Override
   1003     public void queryAvailableBandMode(Message response) {
   1004         mActivePhone.queryAvailableBandMode(response);
   1005     }
   1006 
   1007     @Override
   1008     public boolean getDataRoamingEnabled() {
   1009         return mActivePhone.getDataRoamingEnabled();
   1010     }
   1011 
   1012     @Override
   1013     public void setDataRoamingEnabled(boolean enable) {
   1014         mActivePhone.setDataRoamingEnabled(enable);
   1015     }
   1016 
   1017     @Override
   1018     public boolean getDataEnabled() {
   1019         return mActivePhone.getDataEnabled();
   1020     }
   1021 
   1022     @Override
   1023     public void setDataEnabled(boolean enable) {
   1024         mActivePhone.setDataEnabled(enable);
   1025     }
   1026 
   1027     @Override
   1028     public void queryCdmaRoamingPreference(Message response) {
   1029         mActivePhone.queryCdmaRoamingPreference(response);
   1030     }
   1031 
   1032     @Override
   1033     public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) {
   1034         mActivePhone.setCdmaRoamingPreference(cdmaRoamingType, response);
   1035     }
   1036 
   1037     @Override
   1038     public void setCdmaSubscription(int cdmaSubscriptionType, Message response) {
   1039         mActivePhone.setCdmaSubscription(cdmaSubscriptionType, response);
   1040     }
   1041 
   1042     @Override
   1043     public SimulatedRadioControl getSimulatedRadioControl() {
   1044         return mActivePhone.getSimulatedRadioControl();
   1045     }
   1046 
   1047     @Override
   1048     public boolean isDataConnectivityPossible() {
   1049         return mActivePhone.isDataConnectivityPossible(PhoneConstants.APN_TYPE_DEFAULT);
   1050     }
   1051 
   1052     @Override
   1053     public boolean isDataConnectivityPossible(String apnType) {
   1054         return mActivePhone.isDataConnectivityPossible(apnType);
   1055     }
   1056 
   1057     @Override
   1058     public String getDeviceId() {
   1059         return mActivePhone.getDeviceId();
   1060     }
   1061 
   1062     @Override
   1063     public String getDeviceSvn() {
   1064         return mActivePhone.getDeviceSvn();
   1065     }
   1066 
   1067     @Override
   1068     public String getSubscriberId() {
   1069         return mActivePhone.getSubscriberId();
   1070     }
   1071 
   1072     @Override
   1073     public String getGroupIdLevel1() {
   1074         return mActivePhone.getGroupIdLevel1();
   1075     }
   1076 
   1077     @Override
   1078     public String getGroupIdLevel2() {
   1079         return mActivePhone.getGroupIdLevel2();
   1080     }
   1081 
   1082     @Override
   1083     public String getIccSerialNumber() {
   1084         return mActivePhone.getIccSerialNumber();
   1085     }
   1086 
   1087     @Override
   1088     public String getEsn() {
   1089         return mActivePhone.getEsn();
   1090     }
   1091 
   1092     @Override
   1093     public String getMeid() {
   1094         return mActivePhone.getMeid();
   1095     }
   1096 
   1097     @Override
   1098     public String getMsisdn() {
   1099         return mActivePhone.getMsisdn();
   1100     }
   1101 
   1102     @Override
   1103     public String getImei() {
   1104         return mActivePhone.getImei();
   1105     }
   1106 
   1107     @Override
   1108     public String getNai() {
   1109         return mActivePhone.getNai();
   1110     }
   1111 
   1112     @Override
   1113     public PhoneSubInfo getPhoneSubInfo(){
   1114         return mActivePhone.getPhoneSubInfo();
   1115     }
   1116 
   1117     @Override
   1118     public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
   1119         return mActivePhone.getIccPhoneBookInterfaceManager();
   1120     }
   1121 
   1122     @Override
   1123     public void setUiTTYMode(int uiTtyMode, Message onComplete) {
   1124         mActivePhone.setUiTTYMode(uiTtyMode, onComplete);
   1125     }
   1126 
   1127     @Override
   1128     public void setTTYMode(int ttyMode, Message onComplete) {
   1129         mActivePhone.setTTYMode(ttyMode, onComplete);
   1130     }
   1131 
   1132     @Override
   1133     public void queryTTYMode(Message onComplete) {
   1134         mActivePhone.queryTTYMode(onComplete);
   1135     }
   1136 
   1137     @Override
   1138     public void activateCellBroadcastSms(int activate, Message response) {
   1139         mActivePhone.activateCellBroadcastSms(activate, response);
   1140     }
   1141 
   1142     @Override
   1143     public void getCellBroadcastSmsConfig(Message response) {
   1144         mActivePhone.getCellBroadcastSmsConfig(response);
   1145     }
   1146 
   1147     @Override
   1148     public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) {
   1149         mActivePhone.setCellBroadcastSmsConfig(configValuesArray, response);
   1150     }
   1151 
   1152     @Override
   1153     public void notifyDataActivity() {
   1154          mActivePhone.notifyDataActivity();
   1155     }
   1156 
   1157     @Override
   1158     public void getSmscAddress(Message result) {
   1159         mActivePhone.getSmscAddress(result);
   1160     }
   1161 
   1162     @Override
   1163     public void setSmscAddress(String address, Message result) {
   1164         mActivePhone.setSmscAddress(address, result);
   1165     }
   1166 
   1167     @Override
   1168     public int getCdmaEriIconIndex() {
   1169         return mActivePhone.getCdmaEriIconIndex();
   1170     }
   1171 
   1172     @Override
   1173     public String getCdmaEriText() {
   1174         return mActivePhone.getCdmaEriText();
   1175     }
   1176 
   1177     @Override
   1178     public int getCdmaEriIconMode() {
   1179         return mActivePhone.getCdmaEriIconMode();
   1180     }
   1181 
   1182     public Phone getActivePhone() {
   1183         return mActivePhone;
   1184     }
   1185 
   1186     @Override
   1187     public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){
   1188         mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete);
   1189     }
   1190 
   1191     @Override
   1192     public void exitEmergencyCallbackMode(){
   1193         mActivePhone.exitEmergencyCallbackMode();
   1194     }
   1195 
   1196     @Override
   1197     public boolean needsOtaServiceProvisioning(){
   1198         return mActivePhone.needsOtaServiceProvisioning();
   1199     }
   1200 
   1201     @Override
   1202     public boolean isOtaSpNumber(String dialStr){
   1203         return mActivePhone.isOtaSpNumber(dialStr);
   1204     }
   1205 
   1206     @Override
   1207     public void registerForCallWaiting(Handler h, int what, Object obj){
   1208         mActivePhone.registerForCallWaiting(h,what,obj);
   1209     }
   1210 
   1211     @Override
   1212     public void unregisterForCallWaiting(Handler h){
   1213         mActivePhone.unregisterForCallWaiting(h);
   1214     }
   1215 
   1216     @Override
   1217     public void registerForSignalInfo(Handler h, int what, Object obj) {
   1218         mActivePhone.registerForSignalInfo(h,what,obj);
   1219     }
   1220 
   1221     @Override
   1222     public void unregisterForSignalInfo(Handler h) {
   1223         mActivePhone.unregisterForSignalInfo(h);
   1224     }
   1225 
   1226     @Override
   1227     public void registerForDisplayInfo(Handler h, int what, Object obj) {
   1228         mActivePhone.registerForDisplayInfo(h,what,obj);
   1229     }
   1230 
   1231     @Override
   1232     public void unregisterForDisplayInfo(Handler h) {
   1233         mActivePhone.unregisterForDisplayInfo(h);
   1234     }
   1235 
   1236     @Override
   1237     public void registerForNumberInfo(Handler h, int what, Object obj) {
   1238         mActivePhone.registerForNumberInfo(h, what, obj);
   1239     }
   1240 
   1241     @Override
   1242     public void unregisterForNumberInfo(Handler h) {
   1243         mActivePhone.unregisterForNumberInfo(h);
   1244     }
   1245 
   1246     @Override
   1247     public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) {
   1248         mActivePhone.registerForRedirectedNumberInfo(h, what, obj);
   1249     }
   1250 
   1251     @Override
   1252     public void unregisterForRedirectedNumberInfo(Handler h) {
   1253         mActivePhone.unregisterForRedirectedNumberInfo(h);
   1254     }
   1255 
   1256     @Override
   1257     public void registerForLineControlInfo(Handler h, int what, Object obj) {
   1258         mActivePhone.registerForLineControlInfo( h, what, obj);
   1259     }
   1260 
   1261     @Override
   1262     public void unregisterForLineControlInfo(Handler h) {
   1263         mActivePhone.unregisterForLineControlInfo(h);
   1264     }
   1265 
   1266     @Override
   1267     public void registerFoT53ClirlInfo(Handler h, int what, Object obj) {
   1268         mActivePhone.registerFoT53ClirlInfo(h, what, obj);
   1269     }
   1270 
   1271     @Override
   1272     public void unregisterForT53ClirInfo(Handler h) {
   1273         mActivePhone.unregisterForT53ClirInfo(h);
   1274     }
   1275 
   1276     @Override
   1277     public void registerForT53AudioControlInfo(Handler h, int what, Object obj) {
   1278         mActivePhone.registerForT53AudioControlInfo( h, what, obj);
   1279     }
   1280 
   1281     @Override
   1282     public void unregisterForT53AudioControlInfo(Handler h) {
   1283         mActivePhone.unregisterForT53AudioControlInfo(h);
   1284     }
   1285 
   1286     public void registerForRadioOffOrNotAvailable(Handler h, int what, Object obj) {
   1287         mActivePhone.registerForRadioOffOrNotAvailable( h, what, obj);
   1288     }
   1289 
   1290     public void unregisterForRadioOffOrNotAvailable(Handler h) {
   1291         mActivePhone.unregisterForRadioOffOrNotAvailable(h);
   1292     }
   1293 
   1294     @Override
   1295     public void setOnEcbModeExitResponse(Handler h, int what, Object obj){
   1296         mActivePhone.setOnEcbModeExitResponse(h,what,obj);
   1297     }
   1298 
   1299     @Override
   1300     public void unsetOnEcbModeExitResponse(Handler h){
   1301         mActivePhone.unsetOnEcbModeExitResponse(h);
   1302     }
   1303 
   1304     @Override
   1305     public boolean isCspPlmnEnabled() {
   1306         return mActivePhone.isCspPlmnEnabled();
   1307     }
   1308 
   1309     @Override
   1310     public IsimRecords getIsimRecords() {
   1311         return mActivePhone.getIsimRecords();
   1312     }
   1313 
   1314     /**
   1315      * {@inheritDoc}
   1316      */
   1317     @Override
   1318     public int getLteOnCdmaMode() {
   1319         return mActivePhone.getLteOnCdmaMode();
   1320     }
   1321 
   1322     @Override
   1323     public void setVoiceMessageWaiting(int line, int countWaiting) {
   1324         mActivePhone.setVoiceMessageWaiting(line, countWaiting);
   1325     }
   1326 
   1327     @Override
   1328     public UsimServiceTable getUsimServiceTable() {
   1329         return mActivePhone.getUsimServiceTable();
   1330     }
   1331 
   1332     @Override
   1333     public UiccCard getUiccCard() {
   1334         return mActivePhone.getUiccCard();
   1335     }
   1336 
   1337     @Override
   1338     public void nvReadItem(int itemID, Message response) {
   1339         mActivePhone.nvReadItem(itemID, response);
   1340     }
   1341 
   1342     @Override
   1343     public void nvWriteItem(int itemID, String itemValue, Message response) {
   1344         mActivePhone.nvWriteItem(itemID, itemValue, response);
   1345     }
   1346 
   1347     @Override
   1348     public void nvWriteCdmaPrl(byte[] preferredRoamingList, Message response) {
   1349         mActivePhone.nvWriteCdmaPrl(preferredRoamingList, response);
   1350     }
   1351 
   1352     @Override
   1353     public void nvResetConfig(int resetType, Message response) {
   1354         mActivePhone.nvResetConfig(resetType, response);
   1355     }
   1356 
   1357     @Override
   1358     public void dispose() {
   1359         if (mActivePhone != null) {
   1360             mActivePhone.unregisterForSimRecordsLoaded(this);
   1361         }
   1362         mCommandsInterface.unregisterForOn(this);
   1363         mCommandsInterface.unregisterForVoiceRadioTechChanged(this);
   1364         mCommandsInterface.unregisterForRilConnected(this);
   1365     }
   1366 
   1367     @Override
   1368     public void removeReferences() {
   1369         mActivePhone = null;
   1370         mCommandsInterface = null;
   1371     }
   1372 
   1373     public boolean updateCurrentCarrierInProvider() {
   1374         if (mActivePhone instanceof CDMALTEPhone) {
   1375             return ((CDMALTEPhone)mActivePhone).updateCurrentCarrierInProvider();
   1376         } else if (mActivePhone instanceof GSMPhone) {
   1377             return ((GSMPhone)mActivePhone).updateCurrentCarrierInProvider();
   1378         } else {
   1379            loge("Phone object is not MultiSim. This should not hit!!!!");
   1380            return false;
   1381         }
   1382     }
   1383 
   1384     public void updateDataConnectionTracker() {
   1385         logd("Updating Data Connection Tracker");
   1386         if (mActivePhone instanceof CDMALTEPhone) {
   1387             ((CDMALTEPhone)mActivePhone).updateDataConnectionTracker();
   1388         } else if (mActivePhone instanceof GSMPhone) {
   1389             ((GSMPhone)mActivePhone).updateDataConnectionTracker();
   1390         } else {
   1391            loge("Phone object is not MultiSim. This should not hit!!!!");
   1392         }
   1393     }
   1394 
   1395     public void setInternalDataEnabled(boolean enable) {
   1396         setInternalDataEnabled(enable, null);
   1397     }
   1398 
   1399     public boolean setInternalDataEnabledFlag(boolean enable) {
   1400         boolean flag = false;
   1401         if (mActivePhone instanceof CDMALTEPhone) {
   1402             flag = ((CDMALTEPhone)mActivePhone).setInternalDataEnabledFlag(enable);
   1403         } else if (mActivePhone instanceof GSMPhone) {
   1404             flag = ((GSMPhone)mActivePhone).setInternalDataEnabledFlag(enable);
   1405         } else {
   1406            loge("Phone object is not MultiSim. This should not hit!!!!");
   1407         }
   1408         return flag;
   1409     }
   1410 
   1411     public void setInternalDataEnabled(boolean enable, Message onCompleteMsg) {
   1412         if (mActivePhone instanceof CDMALTEPhone) {
   1413             ((CDMALTEPhone)mActivePhone).setInternalDataEnabled(enable, onCompleteMsg);
   1414         } else if (mActivePhone instanceof GSMPhone) {
   1415             ((GSMPhone)mActivePhone).setInternalDataEnabled(enable, onCompleteMsg);
   1416         } else {
   1417            loge("Phone object is not MultiSim. This should not hit!!!!");
   1418         }
   1419     }
   1420 
   1421     public void registerForAllDataDisconnected(Handler h, int what, Object obj) {
   1422         if (mActivePhone instanceof CDMALTEPhone) {
   1423             ((CDMALTEPhone)mActivePhone).registerForAllDataDisconnected(h, what, obj);
   1424         } else if (mActivePhone instanceof GSMPhone) {
   1425             ((GSMPhone)mActivePhone).registerForAllDataDisconnected(h, what, obj);
   1426         } else {
   1427            loge("Phone object is not MultiSim. This should not hit!!!!");
   1428         }
   1429     }
   1430 
   1431     public void unregisterForAllDataDisconnected(Handler h) {
   1432         if (mActivePhone instanceof CDMALTEPhone) {
   1433             ((CDMALTEPhone)mActivePhone).unregisterForAllDataDisconnected(h);
   1434         } else if (mActivePhone instanceof GSMPhone) {
   1435             ((GSMPhone)mActivePhone).unregisterForAllDataDisconnected(h);
   1436         } else {
   1437            loge("Phone object is not MultiSim. This should not hit!!!!");
   1438         }
   1439     }
   1440 
   1441 
   1442     public int getSubId() {
   1443         return mActivePhone.getSubId();
   1444     }
   1445 
   1446     public int getPhoneId() {
   1447         return mActivePhone.getPhoneId();
   1448     }
   1449 
   1450     @Override
   1451     public String[] getPcscfAddress(String apnType) {
   1452         return mActivePhone.getPcscfAddress(apnType);
   1453     }
   1454 
   1455     @Override
   1456     public void setImsRegistrationState(boolean registered){
   1457         logd("setImsRegistrationState - registered: " + registered);
   1458 
   1459         mActivePhone.setImsRegistrationState(registered);
   1460 
   1461         if ((mActivePhone.getPhoneName()).equals("GSM")) {
   1462             GSMPhone GP = (GSMPhone)mActivePhone;
   1463             GP.getServiceStateTracker().setImsRegistrationState(registered);
   1464         } else if ((mActivePhone.getPhoneName()).equals("CDMA")) {
   1465             CDMAPhone CP = (CDMAPhone)mActivePhone;
   1466             CP.getServiceStateTracker().setImsRegistrationState(registered);
   1467         }
   1468     }
   1469 
   1470     @Override
   1471     public Phone getImsPhone() {
   1472         return mActivePhone.getImsPhone();
   1473     }
   1474 
   1475     @Override
   1476     public ImsPhone relinquishOwnershipOfImsPhone() { return null; }
   1477 
   1478     @Override
   1479     public void startMonitoringImsService() {}
   1480 
   1481     @Override
   1482     public void acquireOwnershipOfImsPhone(ImsPhone imsPhone) { }
   1483 
   1484     @Override
   1485     public int getVoicePhoneServiceState() {
   1486         return mActivePhone.getVoicePhoneServiceState();
   1487     }
   1488 
   1489     @Override
   1490     public boolean setOperatorBrandOverride(String brand) {
   1491         return mActivePhone.setOperatorBrandOverride(brand);
   1492     }
   1493 
   1494     @Override
   1495     public boolean setRoamingOverride(List<String> gsmRoamingList,
   1496             List<String> gsmNonRoamingList, List<String> cdmaRoamingList,
   1497             List<String> cdmaNonRoamingList) {
   1498         return mActivePhone.setRoamingOverride(gsmRoamingList, gsmNonRoamingList,
   1499                 cdmaRoamingList, cdmaNonRoamingList);
   1500     }
   1501 
   1502     @Override
   1503     public boolean isRadioAvailable() {
   1504         return mCommandsInterface.getRadioState().isAvailable();
   1505     }
   1506 
   1507     @Override
   1508     public boolean isRadioOn() {
   1509         return mCommandsInterface.getRadioState().isOn();
   1510     }
   1511 
   1512     @Override
   1513     public void shutdownRadio() {
   1514         mActivePhone.shutdownRadio();
   1515     }
   1516 
   1517     @Override
   1518     public void setRadioCapability(RadioCapability rc, Message response) {
   1519         mActivePhone.setRadioCapability(rc, response);
   1520     }
   1521 
   1522     @Override
   1523     public int getRadioAccessFamily() {
   1524         return mActivePhone.getRadioAccessFamily();
   1525     }
   1526 
   1527     @Override
   1528     public String getModemUuId() {
   1529         return mActivePhone.getModemUuId();
   1530     }
   1531 
   1532     @Override
   1533     public RadioCapability getRadioCapability() {
   1534         return mActivePhone.getRadioCapability();
   1535     }
   1536 
   1537     @Override
   1538     public void radioCapabilityUpdated(RadioCapability rc) {
   1539         mActivePhone.radioCapabilityUpdated(rc);
   1540     }
   1541 
   1542     @Override
   1543     public void registerForRadioCapabilityChanged(Handler h, int what, Object obj) {
   1544         mActivePhone.registerForRadioCapabilityChanged(h, what, obj);
   1545     }
   1546 
   1547     @Override
   1548     public void unregisterForRadioCapabilityChanged(Handler h) {
   1549         mActivePhone.unregisterForRadioCapabilityChanged(h);
   1550     }
   1551 
   1552     public IccCardProxy getPhoneIccCardProxy() {
   1553         return mIccCardProxy;
   1554     }
   1555 
   1556     public boolean isImsRegistered() {
   1557         return mActivePhone.isImsRegistered();
   1558     }
   1559 
   1560     /**
   1561      * Determines if video calling is enabled for the IMS phone.
   1562      *
   1563      * @return {@code true} if video calling is enabled.
   1564      */
   1565     @Override
   1566     public boolean isVideoEnabled() {
   1567         return mActivePhone.isVideoEnabled();
   1568     }
   1569 
   1570     /**
   1571      * Returns the status of Link Capacity Estimation (LCE) service.
   1572      */
   1573     @Override
   1574     public int getLceStatus() {
   1575         return mActivePhone.getLceStatus();
   1576     }
   1577 
   1578     @Override
   1579     public Locale getLocaleFromSimAndCarrierPrefs() {
   1580         return mActivePhone.getLocaleFromSimAndCarrierPrefs();
   1581     }
   1582 
   1583     @Override
   1584     public void getModemActivityInfo(Message response)  {
   1585         mActivePhone.getModemActivityInfo(response);
   1586     }
   1587 
   1588     /**
   1589      * @return true if we are in the emergency call back mode. This is a period where
   1590      * the phone should be using as little power as possible and be ready to receive an
   1591      * incoming call from the emergency operator.
   1592      */
   1593     @Override
   1594     public boolean isInEcm() {
   1595         return mActivePhone.isInEcm();
   1596     }
   1597 
   1598     public boolean isVolteEnabled() {
   1599         return mActivePhone.isVolteEnabled();
   1600     }
   1601 
   1602     public boolean isWifiCallingEnabled() {
   1603         return mActivePhone.isWifiCallingEnabled();
   1604     }
   1605 
   1606     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
   1607         try {
   1608             ((PhoneBase)mActivePhone).dump(fd, pw, args);
   1609         } catch (Exception e) {
   1610             e.printStackTrace();
   1611         }
   1612         pw.flush();
   1613         pw.println("++++++++++++++++++++++++++++++++");
   1614 
   1615         try {
   1616             mPhoneSubInfoProxy.dump(fd, pw, args);
   1617         } catch (Exception e) {
   1618             e.printStackTrace();
   1619         }
   1620         pw.flush();
   1621         pw.println("++++++++++++++++++++++++++++++++");
   1622 
   1623         try {
   1624             mIccCardProxy.dump(fd, pw, args);
   1625         } catch (Exception e) {
   1626             e.printStackTrace();
   1627         }
   1628         pw.flush();
   1629         pw.println("++++++++++++++++++++++++++++++++");
   1630     }
   1631 }
   1632