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