1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.internal.telephony; 18 19 20import android.app.ActivityManagerNative; 21import android.content.Context; 22import android.content.Intent; 23import android.net.LinkCapabilities; 24import android.net.LinkProperties; 25import android.os.AsyncResult; 26import android.os.Handler; 27import android.os.Message; 28import android.os.SystemProperties; 29import android.telephony.CellLocation; 30import android.telephony.ServiceState; 31import android.telephony.SignalStrength; 32import android.util.Log; 33 34import com.android.internal.telephony.cdma.CDMAPhone; 35import com.android.internal.telephony.gsm.GSMPhone; 36import com.android.internal.telephony.gsm.UsimServiceTable; 37import com.android.internal.telephony.ims.IsimRecords; 38import com.android.internal.telephony.test.SimulatedRadioControl; 39import com.android.internal.telephony.CallManager; 40 41import java.util.List; 42 43public class PhoneProxy extends Handler implements Phone { 44 public final static Object lockForRadioTechnologyChange = new Object(); 45 46 private Phone mActivePhone; 47 private CommandsInterface mCommandsInterface; 48 private IccSmsInterfaceManagerProxy mIccSmsInterfaceManagerProxy; 49 private IccPhoneBookInterfaceManagerProxy mIccPhoneBookInterfaceManagerProxy; 50 private PhoneSubInfoProxy mPhoneSubInfoProxy; 51 52 private boolean mResetModemOnRadioTechnologyChange = false; 53 54 private int mRilVersion; 55 56 private static final int EVENT_VOICE_RADIO_TECH_CHANGED = 1; 57 private static final int EVENT_RADIO_ON = 2; 58 private static final int EVENT_REQUEST_VOICE_RADIO_TECH_DONE = 3; 59 private static final int EVENT_RIL_CONNECTED = 4; 60 61 private static final String LOG_TAG = "PHONE"; 62 63 //***** Class Methods 64 public PhoneProxy(Phone phone) { 65 mActivePhone = phone; 66 mResetModemOnRadioTechnologyChange = SystemProperties.getBoolean( 67 TelephonyProperties.PROPERTY_RESET_ON_RADIO_TECH_CHANGE, false); 68 mIccSmsInterfaceManagerProxy = new IccSmsInterfaceManagerProxy( 69 phone.getIccSmsInterfaceManager()); 70 mIccPhoneBookInterfaceManagerProxy = new IccPhoneBookInterfaceManagerProxy( 71 phone.getIccPhoneBookInterfaceManager()); 72 mPhoneSubInfoProxy = new PhoneSubInfoProxy(phone.getPhoneSubInfo()); 73 mCommandsInterface = ((PhoneBase)mActivePhone).mCM; 74 75 mCommandsInterface.registerForRilConnected(this, EVENT_RIL_CONNECTED, null); 76 mCommandsInterface.registerForOn(this, EVENT_RADIO_ON, null); 77 mCommandsInterface.registerForVoiceRadioTechChanged( 78 this, EVENT_VOICE_RADIO_TECH_CHANGED, null); 79 } 80 81 @Override 82 public void handleMessage(Message msg) { 83 AsyncResult ar = (AsyncResult) msg.obj; 84 switch(msg.what) { 85 case EVENT_RADIO_ON: 86 /* Proactively query voice radio technologies */ 87 mCommandsInterface.getVoiceRadioTechnology( 88 this.obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE)); 89 break; 90 91 case EVENT_RIL_CONNECTED: 92 if (ar.exception == null && ar.result != null) { 93 mRilVersion = (Integer) ar.result; 94 } else { 95 logd("Unexpected exception on EVENT_RIL_CONNECTED"); 96 mRilVersion = -1; 97 } 98 break; 99 100 case EVENT_VOICE_RADIO_TECH_CHANGED: 101 case EVENT_REQUEST_VOICE_RADIO_TECH_DONE: 102 103 if (ar.exception == null) { 104 if ((ar.result != null) && (((int[]) ar.result).length != 0)) { 105 int newVoiceTech = ((int[]) ar.result)[0]; 106 updatePhoneObject(newVoiceTech); 107 } else { 108 loge("Voice Radio Technology event " + msg.what + " has no tech!"); 109 } 110 } else { 111 loge("Voice Radio Technology event " + msg.what + " exception!" + ar.exception); 112 } 113 break; 114 115 default: 116 loge("Error! This handler was not registered for this message type. Message: " 117 + msg.what); 118 break; 119 } 120 super.handleMessage(msg); 121 } 122 123 private static void logd(String msg) { 124 Log.d(LOG_TAG, "[PhoneProxy] " + msg); 125 } 126 127 private void logw(String msg) { 128 Log.w(LOG_TAG, "[PhoneProxy] " + msg); 129 } 130 131 private void loge(String msg) { 132 Log.e(LOG_TAG, "[PhoneProxy] " + msg); 133 } 134 135 private void updatePhoneObject(int newVoiceRadioTech) { 136 137 if (mActivePhone != null) { 138 if(mRilVersion == 6 && getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE) { 139 /* 140 * On v6 RIL, when LTE_ON_CDMA is TRUE, always create CDMALTEPhone 141 * irrespective of the voice radio tech reported. 142 */ 143 if (mActivePhone.getPhoneType() == PHONE_TYPE_CDMA) { 144 logd("LTE ON CDMA property is set. Use CDMA Phone" + 145 " newVoiceRadioTech = " + newVoiceRadioTech + 146 " Active Phone = " + mActivePhone.getPhoneName()); 147 return; 148 } else { 149 logd("LTE ON CDMA property is set. Switch to CDMALTEPhone" + 150 " newVoiceRadioTech = " + newVoiceRadioTech + 151 " Active Phone = " + mActivePhone.getPhoneName()); 152 newVoiceRadioTech = ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT; 153 } 154 } else { 155 if ((ServiceState.isCdma(newVoiceRadioTech) && 156 mActivePhone.getPhoneType() == PHONE_TYPE_CDMA) || 157 (ServiceState.isGsm(newVoiceRadioTech) && 158 mActivePhone.getPhoneType() == PHONE_TYPE_GSM)) { 159 // Nothing changed. Keep phone as it is. 160 logd("Ignoring voice radio technology changed message." + 161 " newVoiceRadioTech = " + newVoiceRadioTech + 162 " Active Phone = " + mActivePhone.getPhoneName()); 163 return; 164 } 165 } 166 } 167 168 if (newVoiceRadioTech == ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { 169 // We need some voice phone object to be active always, so never 170 // delete the phone without anything to replace it with! 171 logd("Ignoring voice radio technology changed message. newVoiceRadioTech = Unknown." 172 + " Active Phone = " + mActivePhone.getPhoneName()); 173 return; 174 } 175 176 boolean oldPowerState = false; // old power state to off 177 if (mResetModemOnRadioTechnologyChange) { 178 if (mCommandsInterface.getRadioState().isOn()) { 179 oldPowerState = true; 180 logd("Setting Radio Power to Off"); 181 mCommandsInterface.setRadioPower(false, null); 182 } 183 } 184 185 deleteAndCreatePhone(newVoiceRadioTech); 186 187 if (mResetModemOnRadioTechnologyChange && oldPowerState) { // restore power state 188 logd("Resetting Radio"); 189 mCommandsInterface.setRadioPower(oldPowerState, null); 190 } 191 192 // Set the new interfaces in the proxy's 193 mIccSmsInterfaceManagerProxy.setmIccSmsInterfaceManager( 194 mActivePhone.getIccSmsInterfaceManager()); 195 mIccPhoneBookInterfaceManagerProxy.setmIccPhoneBookInterfaceManager(mActivePhone 196 .getIccPhoneBookInterfaceManager()); 197 mPhoneSubInfoProxy.setmPhoneSubInfo(this.mActivePhone.getPhoneSubInfo()); 198 199 mCommandsInterface = ((PhoneBase)mActivePhone).mCM; 200 201 // Send an Intent to the PhoneApp that we had a radio technology change 202 Intent intent = new Intent(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); 203 intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 204 intent.putExtra(Phone.PHONE_NAME_KEY, mActivePhone.getPhoneName()); 205 ActivityManagerNative.broadcastStickyIntent(intent, null); 206 207 } 208 209 private void deleteAndCreatePhone(int newVoiceRadioTech) { 210 211 String outgoingPhoneName = "Unknown"; 212 Phone oldPhone = mActivePhone; 213 214 if (oldPhone != null) { 215 outgoingPhoneName = ((PhoneBase) oldPhone).getPhoneName(); 216 } 217 218 logd("Switching Voice Phone : " + outgoingPhoneName + " >>> " 219 + (ServiceState.isGsm(newVoiceRadioTech) ? "GSM" : "CDMA")); 220 221 if (oldPhone != null) { 222 CallManager.getInstance().unregisterPhone(oldPhone); 223 logd("Disposing old phone.."); 224 oldPhone.dispose(); 225 } 226 227 // Give the garbage collector a hint to start the garbage collection 228 // asap NOTE this has been disabled since radio technology change could 229 // happen during e.g. a multimedia playing and could slow the system. 230 // Tests needs to be done to see the effects of the GC call here when 231 // system is busy. 232 // System.gc(); 233 234 if (ServiceState.isCdma(newVoiceRadioTech)) { 235 mActivePhone = PhoneFactory.getCdmaPhone(); 236 } else if (ServiceState.isGsm(newVoiceRadioTech)) { 237 mActivePhone = PhoneFactory.getGsmPhone(); 238 } 239 240 if (oldPhone != null) { 241 oldPhone.removeReferences(); 242 } 243 244 if(mActivePhone != null) { 245 CallManager.getInstance().registerPhone(mActivePhone); 246 } 247 248 oldPhone = null; 249 } 250 251 public ServiceState getServiceState() { 252 return mActivePhone.getServiceState(); 253 } 254 255 public CellLocation getCellLocation() { 256 return mActivePhone.getCellLocation(); 257 } 258 259 public DataState getDataConnectionState() { 260 return mActivePhone.getDataConnectionState(Phone.APN_TYPE_DEFAULT); 261 } 262 263 public DataState getDataConnectionState(String apnType) { 264 return mActivePhone.getDataConnectionState(apnType); 265 } 266 267 public DataActivityState getDataActivityState() { 268 return mActivePhone.getDataActivityState(); 269 } 270 271 public Context getContext() { 272 return mActivePhone.getContext(); 273 } 274 275 public void disableDnsCheck(boolean b) { 276 mActivePhone.disableDnsCheck(b); 277 } 278 279 public boolean isDnsCheckDisabled() { 280 return mActivePhone.isDnsCheckDisabled(); 281 } 282 283 public State getState() { 284 return mActivePhone.getState(); 285 } 286 287 public String getPhoneName() { 288 return mActivePhone.getPhoneName(); 289 } 290 291 public int getPhoneType() { 292 return mActivePhone.getPhoneType(); 293 } 294 295 public String[] getActiveApnTypes() { 296 return mActivePhone.getActiveApnTypes(); 297 } 298 299 public String getActiveApnHost(String apnType) { 300 return mActivePhone.getActiveApnHost(apnType); 301 } 302 303 public LinkProperties getLinkProperties(String apnType) { 304 return mActivePhone.getLinkProperties(apnType); 305 } 306 307 public LinkCapabilities getLinkCapabilities(String apnType) { 308 return mActivePhone.getLinkCapabilities(apnType); 309 } 310 311 public SignalStrength getSignalStrength() { 312 return mActivePhone.getSignalStrength(); 313 } 314 315 public void registerForUnknownConnection(Handler h, int what, Object obj) { 316 mActivePhone.registerForUnknownConnection(h, what, obj); 317 } 318 319 public void unregisterForUnknownConnection(Handler h) { 320 mActivePhone.unregisterForUnknownConnection(h); 321 } 322 323 public void registerForPreciseCallStateChanged(Handler h, int what, Object obj) { 324 mActivePhone.registerForPreciseCallStateChanged(h, what, obj); 325 } 326 327 public void unregisterForPreciseCallStateChanged(Handler h) { 328 mActivePhone.unregisterForPreciseCallStateChanged(h); 329 } 330 331 public void registerForNewRingingConnection(Handler h, int what, Object obj) { 332 mActivePhone.registerForNewRingingConnection(h, what, obj); 333 } 334 335 public void unregisterForNewRingingConnection(Handler h) { 336 mActivePhone.unregisterForNewRingingConnection(h); 337 } 338 339 public void registerForIncomingRing(Handler h, int what, Object obj) { 340 mActivePhone.registerForIncomingRing(h, what, obj); 341 } 342 343 public void unregisterForIncomingRing(Handler h) { 344 mActivePhone.unregisterForIncomingRing(h); 345 } 346 347 public void registerForDisconnect(Handler h, int what, Object obj) { 348 mActivePhone.registerForDisconnect(h, what, obj); 349 } 350 351 public void unregisterForDisconnect(Handler h) { 352 mActivePhone.unregisterForDisconnect(h); 353 } 354 355 public void registerForMmiInitiate(Handler h, int what, Object obj) { 356 mActivePhone.registerForMmiInitiate(h, what, obj); 357 } 358 359 public void unregisterForMmiInitiate(Handler h) { 360 mActivePhone.unregisterForMmiInitiate(h); 361 } 362 363 public void registerForMmiComplete(Handler h, int what, Object obj) { 364 mActivePhone.registerForMmiComplete(h, what, obj); 365 } 366 367 public void unregisterForMmiComplete(Handler h) { 368 mActivePhone.unregisterForMmiComplete(h); 369 } 370 371 public List<? extends MmiCode> getPendingMmiCodes() { 372 return mActivePhone.getPendingMmiCodes(); 373 } 374 375 public void sendUssdResponse(String ussdMessge) { 376 mActivePhone.sendUssdResponse(ussdMessge); 377 } 378 379 public void registerForServiceStateChanged(Handler h, int what, Object obj) { 380 mActivePhone.registerForServiceStateChanged(h, what, obj); 381 } 382 383 public void unregisterForServiceStateChanged(Handler h) { 384 mActivePhone.unregisterForServiceStateChanged(h); 385 } 386 387 public void registerForSuppServiceNotification(Handler h, int what, Object obj) { 388 mActivePhone.registerForSuppServiceNotification(h, what, obj); 389 } 390 391 public void unregisterForSuppServiceNotification(Handler h) { 392 mActivePhone.unregisterForSuppServiceNotification(h); 393 } 394 395 public void registerForSuppServiceFailed(Handler h, int what, Object obj) { 396 mActivePhone.registerForSuppServiceFailed(h, what, obj); 397 } 398 399 public void unregisterForSuppServiceFailed(Handler h) { 400 mActivePhone.unregisterForSuppServiceFailed(h); 401 } 402 403 public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){ 404 mActivePhone.registerForInCallVoicePrivacyOn(h,what,obj); 405 } 406 407 public void unregisterForInCallVoicePrivacyOn(Handler h){ 408 mActivePhone.unregisterForInCallVoicePrivacyOn(h); 409 } 410 411 public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){ 412 mActivePhone.registerForInCallVoicePrivacyOff(h,what,obj); 413 } 414 415 public void unregisterForInCallVoicePrivacyOff(Handler h){ 416 mActivePhone.unregisterForInCallVoicePrivacyOff(h); 417 } 418 419 public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj) { 420 mActivePhone.registerForCdmaOtaStatusChange(h,what,obj); 421 } 422 423 public void unregisterForCdmaOtaStatusChange(Handler h) { 424 mActivePhone.unregisterForCdmaOtaStatusChange(h); 425 } 426 427 public void registerForSubscriptionInfoReady(Handler h, int what, Object obj) { 428 mActivePhone.registerForSubscriptionInfoReady(h, what, obj); 429 } 430 431 public void unregisterForSubscriptionInfoReady(Handler h) { 432 mActivePhone.unregisterForSubscriptionInfoReady(h); 433 } 434 435 public void registerForEcmTimerReset(Handler h, int what, Object obj) { 436 mActivePhone.registerForEcmTimerReset(h,what,obj); 437 } 438 439 public void unregisterForEcmTimerReset(Handler h) { 440 mActivePhone.unregisterForEcmTimerReset(h); 441 } 442 443 public void registerForRingbackTone(Handler h, int what, Object obj) { 444 mActivePhone.registerForRingbackTone(h,what,obj); 445 } 446 447 public void unregisterForRingbackTone(Handler h) { 448 mActivePhone.unregisterForRingbackTone(h); 449 } 450 451 public void registerForResendIncallMute(Handler h, int what, Object obj) { 452 mActivePhone.registerForResendIncallMute(h,what,obj); 453 } 454 455 public void unregisterForResendIncallMute(Handler h) { 456 mActivePhone.unregisterForResendIncallMute(h); 457 } 458 459 public boolean getIccRecordsLoaded() { 460 return mActivePhone.getIccRecordsLoaded(); 461 } 462 463 public IccCard getIccCard() { 464 return mActivePhone.getIccCard(); 465 } 466 467 public void acceptCall() throws CallStateException { 468 mActivePhone.acceptCall(); 469 } 470 471 public void rejectCall() throws CallStateException { 472 mActivePhone.rejectCall(); 473 } 474 475 public void switchHoldingAndActive() throws CallStateException { 476 mActivePhone.switchHoldingAndActive(); 477 } 478 479 public boolean canConference() { 480 return mActivePhone.canConference(); 481 } 482 483 public void conference() throws CallStateException { 484 mActivePhone.conference(); 485 } 486 487 public void enableEnhancedVoicePrivacy(boolean enable, Message onComplete) { 488 mActivePhone.enableEnhancedVoicePrivacy(enable, onComplete); 489 } 490 491 public void getEnhancedVoicePrivacy(Message onComplete) { 492 mActivePhone.getEnhancedVoicePrivacy(onComplete); 493 } 494 495 public boolean canTransfer() { 496 return mActivePhone.canTransfer(); 497 } 498 499 public void explicitCallTransfer() throws CallStateException { 500 mActivePhone.explicitCallTransfer(); 501 } 502 503 public void clearDisconnected() { 504 mActivePhone.clearDisconnected(); 505 } 506 507 public Call getForegroundCall() { 508 return mActivePhone.getForegroundCall(); 509 } 510 511 public Call getBackgroundCall() { 512 return mActivePhone.getBackgroundCall(); 513 } 514 515 public Call getRingingCall() { 516 return mActivePhone.getRingingCall(); 517 } 518 519 public Connection dial(String dialString) throws CallStateException { 520 return mActivePhone.dial(dialString); 521 } 522 523 public Connection dial(String dialString, UUSInfo uusInfo) throws CallStateException { 524 return mActivePhone.dial(dialString, uusInfo); 525 } 526 527 public boolean handlePinMmi(String dialString) { 528 return mActivePhone.handlePinMmi(dialString); 529 } 530 531 public boolean handleInCallMmiCommands(String command) throws CallStateException { 532 return mActivePhone.handleInCallMmiCommands(command); 533 } 534 535 public void sendDtmf(char c) { 536 mActivePhone.sendDtmf(c); 537 } 538 539 public void startDtmf(char c) { 540 mActivePhone.startDtmf(c); 541 } 542 543 public void stopDtmf() { 544 mActivePhone.stopDtmf(); 545 } 546 547 public void setRadioPower(boolean power) { 548 mActivePhone.setRadioPower(power); 549 } 550 551 public boolean getMessageWaitingIndicator() { 552 return mActivePhone.getMessageWaitingIndicator(); 553 } 554 555 public boolean getCallForwardingIndicator() { 556 return mActivePhone.getCallForwardingIndicator(); 557 } 558 559 public String getLine1Number() { 560 return mActivePhone.getLine1Number(); 561 } 562 563 public String getCdmaMin() { 564 return mActivePhone.getCdmaMin(); 565 } 566 567 public boolean isMinInfoReady() { 568 return mActivePhone.isMinInfoReady(); 569 } 570 571 public String getCdmaPrlVersion() { 572 return mActivePhone.getCdmaPrlVersion(); 573 } 574 575 public String getLine1AlphaTag() { 576 return mActivePhone.getLine1AlphaTag(); 577 } 578 579 public void setLine1Number(String alphaTag, String number, Message onComplete) { 580 mActivePhone.setLine1Number(alphaTag, number, onComplete); 581 } 582 583 public String getVoiceMailNumber() { 584 return mActivePhone.getVoiceMailNumber(); 585 } 586 587 /** @hide */ 588 public int getVoiceMessageCount(){ 589 return mActivePhone.getVoiceMessageCount(); 590 } 591 592 public String getVoiceMailAlphaTag() { 593 return mActivePhone.getVoiceMailAlphaTag(); 594 } 595 596 public void setVoiceMailNumber(String alphaTag,String voiceMailNumber, 597 Message onComplete) { 598 mActivePhone.setVoiceMailNumber(alphaTag, voiceMailNumber, onComplete); 599 } 600 601 public void getCallForwardingOption(int commandInterfaceCFReason, 602 Message onComplete) { 603 mActivePhone.getCallForwardingOption(commandInterfaceCFReason, 604 onComplete); 605 } 606 607 public void setCallForwardingOption(int commandInterfaceCFReason, 608 int commandInterfaceCFAction, String dialingNumber, 609 int timerSeconds, Message onComplete) { 610 mActivePhone.setCallForwardingOption(commandInterfaceCFReason, 611 commandInterfaceCFAction, dialingNumber, timerSeconds, onComplete); 612 } 613 614 public void getOutgoingCallerIdDisplay(Message onComplete) { 615 mActivePhone.getOutgoingCallerIdDisplay(onComplete); 616 } 617 618 public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode, 619 Message onComplete) { 620 mActivePhone.setOutgoingCallerIdDisplay(commandInterfaceCLIRMode, 621 onComplete); 622 } 623 624 public void getCallWaiting(Message onComplete) { 625 mActivePhone.getCallWaiting(onComplete); 626 } 627 628 public void setCallWaiting(boolean enable, Message onComplete) { 629 mActivePhone.setCallWaiting(enable, onComplete); 630 } 631 632 public void getAvailableNetworks(Message response) { 633 mActivePhone.getAvailableNetworks(response); 634 } 635 636 public void setNetworkSelectionModeAutomatic(Message response) { 637 mActivePhone.setNetworkSelectionModeAutomatic(response); 638 } 639 640 public void selectNetworkManually(OperatorInfo network, Message response) { 641 mActivePhone.selectNetworkManually(network, response); 642 } 643 644 public void setPreferredNetworkType(int networkType, Message response) { 645 mActivePhone.setPreferredNetworkType(networkType, response); 646 } 647 648 public void getPreferredNetworkType(Message response) { 649 mActivePhone.getPreferredNetworkType(response); 650 } 651 652 public void getNeighboringCids(Message response) { 653 mActivePhone.getNeighboringCids(response); 654 } 655 656 public void setOnPostDialCharacter(Handler h, int what, Object obj) { 657 mActivePhone.setOnPostDialCharacter(h, what, obj); 658 } 659 660 public void setMute(boolean muted) { 661 mActivePhone.setMute(muted); 662 } 663 664 public boolean getMute() { 665 return mActivePhone.getMute(); 666 } 667 668 public void setEchoSuppressionEnabled(boolean enabled) { 669 mActivePhone.setEchoSuppressionEnabled(enabled); 670 } 671 672 public void invokeOemRilRequestRaw(byte[] data, Message response) { 673 mActivePhone.invokeOemRilRequestRaw(data, response); 674 } 675 676 public void invokeOemRilRequestStrings(String[] strings, Message response) { 677 mActivePhone.invokeOemRilRequestStrings(strings, response); 678 } 679 680 public void getDataCallList(Message response) { 681 mActivePhone.getDataCallList(response); 682 } 683 684 public void updateServiceLocation() { 685 mActivePhone.updateServiceLocation(); 686 } 687 688 public void enableLocationUpdates() { 689 mActivePhone.enableLocationUpdates(); 690 } 691 692 public void disableLocationUpdates() { 693 mActivePhone.disableLocationUpdates(); 694 } 695 696 public void setUnitTestMode(boolean f) { 697 mActivePhone.setUnitTestMode(f); 698 } 699 700 public boolean getUnitTestMode() { 701 return mActivePhone.getUnitTestMode(); 702 } 703 704 public void setBandMode(int bandMode, Message response) { 705 mActivePhone.setBandMode(bandMode, response); 706 } 707 708 public void queryAvailableBandMode(Message response) { 709 mActivePhone.queryAvailableBandMode(response); 710 } 711 712 public boolean getDataRoamingEnabled() { 713 return mActivePhone.getDataRoamingEnabled(); 714 } 715 716 public void setDataRoamingEnabled(boolean enable) { 717 mActivePhone.setDataRoamingEnabled(enable); 718 } 719 720 public void queryCdmaRoamingPreference(Message response) { 721 mActivePhone.queryCdmaRoamingPreference(response); 722 } 723 724 public void setCdmaRoamingPreference(int cdmaRoamingType, Message response) { 725 mActivePhone.setCdmaRoamingPreference(cdmaRoamingType, response); 726 } 727 728 public void setCdmaSubscription(int cdmaSubscriptionType, Message response) { 729 mActivePhone.setCdmaSubscription(cdmaSubscriptionType, response); 730 } 731 732 public SimulatedRadioControl getSimulatedRadioControl() { 733 return mActivePhone.getSimulatedRadioControl(); 734 } 735 736 public int enableApnType(String type) { 737 return mActivePhone.enableApnType(type); 738 } 739 740 public int disableApnType(String type) { 741 return mActivePhone.disableApnType(type); 742 } 743 744 public boolean isDataConnectivityPossible() { 745 return mActivePhone.isDataConnectivityPossible(Phone.APN_TYPE_DEFAULT); 746 } 747 748 public boolean isDataConnectivityPossible(String apnType) { 749 return mActivePhone.isDataConnectivityPossible(apnType); 750 } 751 752 public String getDeviceId() { 753 return mActivePhone.getDeviceId(); 754 } 755 756 public String getDeviceSvn() { 757 return mActivePhone.getDeviceSvn(); 758 } 759 760 public String getSubscriberId() { 761 return mActivePhone.getSubscriberId(); 762 } 763 764 public String getIccSerialNumber() { 765 return mActivePhone.getIccSerialNumber(); 766 } 767 768 public String getEsn() { 769 return mActivePhone.getEsn(); 770 } 771 772 public String getMeid() { 773 return mActivePhone.getMeid(); 774 } 775 776 public String getMsisdn() { 777 return mActivePhone.getMsisdn(); 778 } 779 780 public String getImei() { 781 return mActivePhone.getImei(); 782 } 783 784 public PhoneSubInfo getPhoneSubInfo(){ 785 return mActivePhone.getPhoneSubInfo(); 786 } 787 788 public IccSmsInterfaceManager getIccSmsInterfaceManager(){ 789 return mActivePhone.getIccSmsInterfaceManager(); 790 } 791 792 public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){ 793 return mActivePhone.getIccPhoneBookInterfaceManager(); 794 } 795 796 public void setTTYMode(int ttyMode, Message onComplete) { 797 mActivePhone.setTTYMode(ttyMode, onComplete); 798 } 799 800 public void queryTTYMode(Message onComplete) { 801 mActivePhone.queryTTYMode(onComplete); 802 } 803 804 public void activateCellBroadcastSms(int activate, Message response) { 805 mActivePhone.activateCellBroadcastSms(activate, response); 806 } 807 808 public void getCellBroadcastSmsConfig(Message response) { 809 mActivePhone.getCellBroadcastSmsConfig(response); 810 } 811 812 public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response) { 813 mActivePhone.setCellBroadcastSmsConfig(configValuesArray, response); 814 } 815 816 public void notifyDataActivity() { 817 mActivePhone.notifyDataActivity(); 818 } 819 820 public void getSmscAddress(Message result) { 821 mActivePhone.getSmscAddress(result); 822 } 823 824 public void setSmscAddress(String address, Message result) { 825 mActivePhone.setSmscAddress(address, result); 826 } 827 828 public int getCdmaEriIconIndex() { 829 return mActivePhone.getCdmaEriIconIndex(); 830 } 831 832 public String getCdmaEriText() { 833 return mActivePhone.getCdmaEriText(); 834 } 835 836 public int getCdmaEriIconMode() { 837 return mActivePhone.getCdmaEriIconMode(); 838 } 839 840 public Phone getActivePhone() { 841 return mActivePhone; 842 } 843 844 public void sendBurstDtmf(String dtmfString, int on, int off, Message onComplete){ 845 mActivePhone.sendBurstDtmf(dtmfString, on, off, onComplete); 846 } 847 848 public void exitEmergencyCallbackMode(){ 849 mActivePhone.exitEmergencyCallbackMode(); 850 } 851 852 public boolean needsOtaServiceProvisioning(){ 853 return mActivePhone.needsOtaServiceProvisioning(); 854 } 855 856 public boolean isOtaSpNumber(String dialStr){ 857 return mActivePhone.isOtaSpNumber(dialStr); 858 } 859 860 public void registerForCallWaiting(Handler h, int what, Object obj){ 861 mActivePhone.registerForCallWaiting(h,what,obj); 862 } 863 864 public void unregisterForCallWaiting(Handler h){ 865 mActivePhone.unregisterForCallWaiting(h); 866 } 867 868 public void registerForSignalInfo(Handler h, int what, Object obj) { 869 mActivePhone.registerForSignalInfo(h,what,obj); 870 } 871 872 public void unregisterForSignalInfo(Handler h) { 873 mActivePhone.unregisterForSignalInfo(h); 874 } 875 876 public void registerForDisplayInfo(Handler h, int what, Object obj) { 877 mActivePhone.registerForDisplayInfo(h,what,obj); 878 } 879 880 public void unregisterForDisplayInfo(Handler h) { 881 mActivePhone.unregisterForDisplayInfo(h); 882 } 883 884 public void registerForNumberInfo(Handler h, int what, Object obj) { 885 mActivePhone.registerForNumberInfo(h, what, obj); 886 } 887 888 public void unregisterForNumberInfo(Handler h) { 889 mActivePhone.unregisterForNumberInfo(h); 890 } 891 892 public void registerForRedirectedNumberInfo(Handler h, int what, Object obj) { 893 mActivePhone.registerForRedirectedNumberInfo(h, what, obj); 894 } 895 896 public void unregisterForRedirectedNumberInfo(Handler h) { 897 mActivePhone.unregisterForRedirectedNumberInfo(h); 898 } 899 900 public void registerForLineControlInfo(Handler h, int what, Object obj) { 901 mActivePhone.registerForLineControlInfo( h, what, obj); 902 } 903 904 public void unregisterForLineControlInfo(Handler h) { 905 mActivePhone.unregisterForLineControlInfo(h); 906 } 907 908 public void registerFoT53ClirlInfo(Handler h, int what, Object obj) { 909 mActivePhone.registerFoT53ClirlInfo(h, what, obj); 910 } 911 912 public void unregisterForT53ClirInfo(Handler h) { 913 mActivePhone.unregisterForT53ClirInfo(h); 914 } 915 916 public void registerForT53AudioControlInfo(Handler h, int what, Object obj) { 917 mActivePhone.registerForT53AudioControlInfo( h, what, obj); 918 } 919 920 public void unregisterForT53AudioControlInfo(Handler h) { 921 mActivePhone.unregisterForT53AudioControlInfo(h); 922 } 923 924 public void setOnEcbModeExitResponse(Handler h, int what, Object obj){ 925 mActivePhone.setOnEcbModeExitResponse(h,what,obj); 926 } 927 928 public void unsetOnEcbModeExitResponse(Handler h){ 929 mActivePhone.unsetOnEcbModeExitResponse(h); 930 } 931 932 public boolean isCspPlmnEnabled() { 933 return mActivePhone.isCspPlmnEnabled(); 934 } 935 936 public IsimRecords getIsimRecords() { 937 return mActivePhone.getIsimRecords(); 938 } 939 940 public void requestIsimAuthentication(String nonce, Message response) { 941 mActivePhone.requestIsimAuthentication(nonce, response); 942 } 943 944 /** 945 * {@inheritDoc} 946 */ 947 @Override 948 public int getLteOnCdmaMode() { 949 return mActivePhone.getLteOnCdmaMode(); 950 } 951 952 @Override 953 public void setVoiceMessageWaiting(int line, int countWaiting) { 954 mActivePhone.setVoiceMessageWaiting(line, countWaiting); 955 } 956 957 @Override 958 public UsimServiceTable getUsimServiceTable() { 959 return mActivePhone.getUsimServiceTable(); 960 } 961 962 public void dispose() { 963 mCommandsInterface.unregisterForOn(this); 964 mCommandsInterface.unregisterForVoiceRadioTechChanged(this); 965 mCommandsInterface.unregisterForRilConnected(this); 966 } 967 968 public void removeReferences() { 969 mActivePhone = null; 970 mCommandsInterface = null; 971 } 972} 973