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