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