1 2/* 3 * Copyright (C) 2006 The Android Open Source Project 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 20import android.content.Context; 21import android.os.Message; 22import android.os.RegistrantList; 23import android.os.Registrant; 24import android.os.Handler; 25import android.os.AsyncResult; 26import android.telephony.RadioAccessFamily; 27import android.telephony.TelephonyManager; 28 29import com.android.internal.telephony.RadioCapability; 30 31/** 32 * {@hide} 33 */ 34public abstract class BaseCommands implements CommandsInterface { 35 //***** Instance Variables 36 protected Context mContext; 37 protected RadioState mState = RadioState.RADIO_UNAVAILABLE; 38 protected Object mStateMonitor = new Object(); 39 40 protected RegistrantList mRadioStateChangedRegistrants = new RegistrantList(); 41 protected RegistrantList mOnRegistrants = new RegistrantList(); 42 protected RegistrantList mAvailRegistrants = new RegistrantList(); 43 protected RegistrantList mOffOrNotAvailRegistrants = new RegistrantList(); 44 protected RegistrantList mNotAvailRegistrants = new RegistrantList(); 45 protected RegistrantList mCallStateRegistrants = new RegistrantList(); 46 protected RegistrantList mVoiceNetworkStateRegistrants = new RegistrantList(); 47 protected RegistrantList mDataNetworkStateRegistrants = new RegistrantList(); 48 protected RegistrantList mVoiceRadioTechChangedRegistrants = new RegistrantList(); 49 protected RegistrantList mImsNetworkStateChangedRegistrants = new RegistrantList(); 50 protected RegistrantList mIccStatusChangedRegistrants = new RegistrantList(); 51 protected RegistrantList mVoicePrivacyOnRegistrants = new RegistrantList(); 52 protected RegistrantList mVoicePrivacyOffRegistrants = new RegistrantList(); 53 protected Registrant mUnsolOemHookRawRegistrant; 54 protected RegistrantList mOtaProvisionRegistrants = new RegistrantList(); 55 protected RegistrantList mCallWaitingInfoRegistrants = new RegistrantList(); 56 protected RegistrantList mDisplayInfoRegistrants = new RegistrantList(); 57 protected RegistrantList mSignalInfoRegistrants = new RegistrantList(); 58 protected RegistrantList mNumberInfoRegistrants = new RegistrantList(); 59 protected RegistrantList mRedirNumInfoRegistrants = new RegistrantList(); 60 protected RegistrantList mLineControlInfoRegistrants = new RegistrantList(); 61 protected RegistrantList mT53ClirInfoRegistrants = new RegistrantList(); 62 protected RegistrantList mT53AudCntrlInfoRegistrants = new RegistrantList(); 63 protected RegistrantList mRingbackToneRegistrants = new RegistrantList(); 64 protected RegistrantList mResendIncallMuteRegistrants = new RegistrantList(); 65 protected RegistrantList mCdmaSubscriptionChangedRegistrants = new RegistrantList(); 66 protected RegistrantList mCdmaPrlChangedRegistrants = new RegistrantList(); 67 protected RegistrantList mExitEmergencyCallbackModeRegistrants = new RegistrantList(); 68 protected RegistrantList mRilConnectedRegistrants = new RegistrantList(); 69 protected RegistrantList mIccRefreshRegistrants = new RegistrantList(); 70 protected RegistrantList mRilCellInfoListRegistrants = new RegistrantList(); 71 protected RegistrantList mSubscriptionStatusRegistrants = new RegistrantList(); 72 protected RegistrantList mSrvccStateRegistrants = new RegistrantList(); 73 protected RegistrantList mHardwareConfigChangeRegistrants = new RegistrantList(); 74 protected RegistrantList mPhoneRadioCapabilityChangedRegistrants = 75 new RegistrantList(); 76 77 protected Registrant mGsmSmsRegistrant; 78 protected Registrant mCdmaSmsRegistrant; 79 protected Registrant mNITZTimeRegistrant; 80 protected Registrant mSignalStrengthRegistrant; 81 protected Registrant mUSSDRegistrant; 82 protected Registrant mSmsOnSimRegistrant; 83 protected Registrant mSmsStatusRegistrant; 84 protected Registrant mSsnRegistrant; 85 protected Registrant mCatSessionEndRegistrant; 86 protected Registrant mCatProCmdRegistrant; 87 protected Registrant mCatEventRegistrant; 88 protected Registrant mCatCallSetUpRegistrant; 89 protected Registrant mIccSmsFullRegistrant; 90 protected Registrant mEmergencyCallbackModeRegistrant; 91 protected Registrant mRingRegistrant; 92 protected Registrant mRestrictedStateRegistrant; 93 protected Registrant mGsmBroadcastSmsRegistrant; 94 protected Registrant mCatCcAlphaRegistrant; 95 protected Registrant mSsRegistrant; 96 protected Registrant mLceInfoRegistrant; 97 98 // Preferred network type received from PhoneFactory. 99 // This is used when establishing a connection to the 100 // vendor ril so it starts up in the correct mode. 101 protected int mPreferredNetworkType; 102 // CDMA subscription received from PhoneFactory 103 protected int mCdmaSubscription; 104 // Type of Phone, GSM or CDMA. Set by GsmCdmaPhone. 105 protected int mPhoneType; 106 // RIL Version 107 protected int mRilVersion = -1; 108 109 public BaseCommands(Context context) { 110 mContext = context; // May be null (if so we won't log statistics) 111 } 112 113 //***** CommandsInterface implementation 114 115 @Override 116 public RadioState getRadioState() { 117 return mState; 118 } 119 120 @Override 121 public void registerForRadioStateChanged(Handler h, int what, Object obj) { 122 Registrant r = new Registrant (h, what, obj); 123 124 synchronized (mStateMonitor) { 125 mRadioStateChangedRegistrants.add(r); 126 r.notifyRegistrant(); 127 } 128 } 129 130 @Override 131 public void unregisterForRadioStateChanged(Handler h) { 132 synchronized (mStateMonitor) { 133 mRadioStateChangedRegistrants.remove(h); 134 } 135 } 136 137 public void registerForImsNetworkStateChanged(Handler h, int what, Object obj) { 138 Registrant r = new Registrant (h, what, obj); 139 mImsNetworkStateChangedRegistrants.add(r); 140 } 141 142 public void unregisterForImsNetworkStateChanged(Handler h) { 143 mImsNetworkStateChangedRegistrants.remove(h); 144 } 145 146 @Override 147 public void registerForOn(Handler h, int what, Object obj) { 148 Registrant r = new Registrant (h, what, obj); 149 150 synchronized (mStateMonitor) { 151 mOnRegistrants.add(r); 152 153 if (mState.isOn()) { 154 r.notifyRegistrant(new AsyncResult(null, null, null)); 155 } 156 } 157 } 158 @Override 159 public void unregisterForOn(Handler h) { 160 synchronized (mStateMonitor) { 161 mOnRegistrants.remove(h); 162 } 163 } 164 165 166 @Override 167 public void registerForAvailable(Handler h, int what, Object obj) { 168 Registrant r = new Registrant (h, what, obj); 169 170 synchronized (mStateMonitor) { 171 mAvailRegistrants.add(r); 172 173 if (mState.isAvailable()) { 174 r.notifyRegistrant(new AsyncResult(null, null, null)); 175 } 176 } 177 } 178 179 @Override 180 public void unregisterForAvailable(Handler h) { 181 synchronized(mStateMonitor) { 182 mAvailRegistrants.remove(h); 183 } 184 } 185 186 @Override 187 public void registerForNotAvailable(Handler h, int what, Object obj) { 188 Registrant r = new Registrant (h, what, obj); 189 190 synchronized (mStateMonitor) { 191 mNotAvailRegistrants.add(r); 192 193 if (!mState.isAvailable()) { 194 r.notifyRegistrant(new AsyncResult(null, null, null)); 195 } 196 } 197 } 198 199 @Override 200 public void unregisterForNotAvailable(Handler h) { 201 synchronized (mStateMonitor) { 202 mNotAvailRegistrants.remove(h); 203 } 204 } 205 206 @Override 207 public void registerForOffOrNotAvailable(Handler h, int what, Object obj) { 208 Registrant r = new Registrant (h, what, obj); 209 210 synchronized (mStateMonitor) { 211 mOffOrNotAvailRegistrants.add(r); 212 213 if (mState == RadioState.RADIO_OFF || !mState.isAvailable()) { 214 r.notifyRegistrant(new AsyncResult(null, null, null)); 215 } 216 } 217 } 218 @Override 219 public void unregisterForOffOrNotAvailable(Handler h) { 220 synchronized(mStateMonitor) { 221 mOffOrNotAvailRegistrants.remove(h); 222 } 223 } 224 225 @Override 226 public void registerForCallStateChanged(Handler h, int what, Object obj) { 227 Registrant r = new Registrant (h, what, obj); 228 229 mCallStateRegistrants.add(r); 230 } 231 232 @Override 233 public void unregisterForCallStateChanged(Handler h) { 234 mCallStateRegistrants.remove(h); 235 } 236 237 @Override 238 public void registerForVoiceNetworkStateChanged(Handler h, int what, Object obj) { 239 Registrant r = new Registrant (h, what, obj); 240 241 mVoiceNetworkStateRegistrants.add(r); 242 } 243 244 @Override 245 public void unregisterForVoiceNetworkStateChanged(Handler h) { 246 mVoiceNetworkStateRegistrants.remove(h); 247 } 248 249 @Override 250 public void registerForDataNetworkStateChanged(Handler h, int what, Object obj) { 251 Registrant r = new Registrant (h, what, obj); 252 253 mDataNetworkStateRegistrants.add(r); 254 } 255 256 @Override 257 public void unregisterForDataNetworkStateChanged(Handler h) { 258 mDataNetworkStateRegistrants.remove(h); 259 } 260 261 @Override 262 public void registerForVoiceRadioTechChanged(Handler h, int what, Object obj) { 263 Registrant r = new Registrant (h, what, obj); 264 mVoiceRadioTechChangedRegistrants.add(r); 265 } 266 267 @Override 268 public void unregisterForVoiceRadioTechChanged(Handler h) { 269 mVoiceRadioTechChangedRegistrants.remove(h); 270 } 271 272 @Override 273 public void registerForIccStatusChanged(Handler h, int what, Object obj) { 274 Registrant r = new Registrant (h, what, obj); 275 mIccStatusChangedRegistrants.add(r); 276 } 277 278 @Override 279 public void unregisterForIccStatusChanged(Handler h) { 280 mIccStatusChangedRegistrants.remove(h); 281 } 282 283 @Override 284 public void setOnNewGsmSms(Handler h, int what, Object obj) { 285 mGsmSmsRegistrant = new Registrant (h, what, obj); 286 } 287 288 @Override 289 public void unSetOnNewGsmSms(Handler h) { 290 if (mGsmSmsRegistrant != null && mGsmSmsRegistrant.getHandler() == h) { 291 mGsmSmsRegistrant.clear(); 292 mGsmSmsRegistrant = null; 293 } 294 } 295 296 @Override 297 public void setOnNewCdmaSms(Handler h, int what, Object obj) { 298 mCdmaSmsRegistrant = new Registrant (h, what, obj); 299 } 300 301 @Override 302 public void unSetOnNewCdmaSms(Handler h) { 303 if (mCdmaSmsRegistrant != null && mCdmaSmsRegistrant.getHandler() == h) { 304 mCdmaSmsRegistrant.clear(); 305 mCdmaSmsRegistrant = null; 306 } 307 } 308 309 @Override 310 public void setOnNewGsmBroadcastSms(Handler h, int what, Object obj) { 311 mGsmBroadcastSmsRegistrant = new Registrant (h, what, obj); 312 } 313 314 @Override 315 public void unSetOnNewGsmBroadcastSms(Handler h) { 316 if (mGsmBroadcastSmsRegistrant != null && mGsmBroadcastSmsRegistrant.getHandler() == h) { 317 mGsmBroadcastSmsRegistrant.clear(); 318 mGsmBroadcastSmsRegistrant = null; 319 } 320 } 321 322 @Override 323 public void setOnSmsOnSim(Handler h, int what, Object obj) { 324 mSmsOnSimRegistrant = new Registrant (h, what, obj); 325 } 326 327 @Override 328 public void unSetOnSmsOnSim(Handler h) { 329 if (mSmsOnSimRegistrant != null && mSmsOnSimRegistrant.getHandler() == h) { 330 mSmsOnSimRegistrant.clear(); 331 mSmsOnSimRegistrant = null; 332 } 333 } 334 335 @Override 336 public void setOnSmsStatus(Handler h, int what, Object obj) { 337 mSmsStatusRegistrant = new Registrant (h, what, obj); 338 } 339 340 @Override 341 public void unSetOnSmsStatus(Handler h) { 342 if (mSmsStatusRegistrant != null && mSmsStatusRegistrant.getHandler() == h) { 343 mSmsStatusRegistrant.clear(); 344 mSmsStatusRegistrant = null; 345 } 346 } 347 348 @Override 349 public void setOnSignalStrengthUpdate(Handler h, int what, Object obj) { 350 mSignalStrengthRegistrant = new Registrant (h, what, obj); 351 } 352 353 @Override 354 public void unSetOnSignalStrengthUpdate(Handler h) { 355 if (mSignalStrengthRegistrant != null && mSignalStrengthRegistrant.getHandler() == h) { 356 mSignalStrengthRegistrant.clear(); 357 mSignalStrengthRegistrant = null; 358 } 359 } 360 361 @Override 362 public void setOnNITZTime(Handler h, int what, Object obj) { 363 mNITZTimeRegistrant = new Registrant (h, what, obj); 364 } 365 366 @Override 367 public void unSetOnNITZTime(Handler h) { 368 if (mNITZTimeRegistrant != null && mNITZTimeRegistrant.getHandler() == h) { 369 mNITZTimeRegistrant.clear(); 370 mNITZTimeRegistrant = null; 371 } 372 } 373 374 @Override 375 public void setOnUSSD(Handler h, int what, Object obj) { 376 mUSSDRegistrant = new Registrant (h, what, obj); 377 } 378 379 @Override 380 public void unSetOnUSSD(Handler h) { 381 if (mUSSDRegistrant != null && mUSSDRegistrant.getHandler() == h) { 382 mUSSDRegistrant.clear(); 383 mUSSDRegistrant = null; 384 } 385 } 386 387 @Override 388 public void setOnSuppServiceNotification(Handler h, int what, Object obj) { 389 mSsnRegistrant = new Registrant (h, what, obj); 390 } 391 392 @Override 393 public void unSetOnSuppServiceNotification(Handler h) { 394 if (mSsnRegistrant != null && mSsnRegistrant.getHandler() == h) { 395 mSsnRegistrant.clear(); 396 mSsnRegistrant = null; 397 } 398 } 399 400 @Override 401 public void setOnCatSessionEnd(Handler h, int what, Object obj) { 402 mCatSessionEndRegistrant = new Registrant (h, what, obj); 403 } 404 405 @Override 406 public void unSetOnCatSessionEnd(Handler h) { 407 if (mCatSessionEndRegistrant != null && mCatSessionEndRegistrant.getHandler() == h) { 408 mCatSessionEndRegistrant.clear(); 409 mCatSessionEndRegistrant = null; 410 } 411 } 412 413 @Override 414 public void setOnCatProactiveCmd(Handler h, int what, Object obj) { 415 mCatProCmdRegistrant = new Registrant (h, what, obj); 416 } 417 418 @Override 419 public void unSetOnCatProactiveCmd(Handler h) { 420 if (mCatProCmdRegistrant != null && mCatProCmdRegistrant.getHandler() == h) { 421 mCatProCmdRegistrant.clear(); 422 mCatProCmdRegistrant = null; 423 } 424 } 425 426 @Override 427 public void setOnCatEvent(Handler h, int what, Object obj) { 428 mCatEventRegistrant = new Registrant (h, what, obj); 429 } 430 431 @Override 432 public void unSetOnCatEvent(Handler h) { 433 if (mCatEventRegistrant != null && mCatEventRegistrant.getHandler() == h) { 434 mCatEventRegistrant.clear(); 435 mCatEventRegistrant = null; 436 } 437 } 438 439 @Override 440 public void setOnCatCallSetUp(Handler h, int what, Object obj) { 441 mCatCallSetUpRegistrant = new Registrant (h, what, obj); 442 } 443 444 @Override 445 public void unSetOnCatCallSetUp(Handler h) { 446 if (mCatCallSetUpRegistrant != null && mCatCallSetUpRegistrant.getHandler() == h) { 447 mCatCallSetUpRegistrant.clear(); 448 mCatCallSetUpRegistrant = null; 449 } 450 } 451 452 @Override 453 public void setOnIccSmsFull(Handler h, int what, Object obj) { 454 mIccSmsFullRegistrant = new Registrant (h, what, obj); 455 } 456 457 @Override 458 public void unSetOnIccSmsFull(Handler h) { 459 if (mIccSmsFullRegistrant != null && mIccSmsFullRegistrant.getHandler() == h) { 460 mIccSmsFullRegistrant.clear(); 461 mIccSmsFullRegistrant = null; 462 } 463 } 464 465 @Override 466 public void registerForIccRefresh(Handler h, int what, Object obj) { 467 Registrant r = new Registrant (h, what, obj); 468 mIccRefreshRegistrants.add(r); 469 } 470 @Override 471 public void setOnIccRefresh(Handler h, int what, Object obj) { 472 registerForIccRefresh(h, what, obj); 473 } 474 475 @Override 476 public void setEmergencyCallbackMode(Handler h, int what, Object obj) { 477 mEmergencyCallbackModeRegistrant = new Registrant (h, what, obj); 478 } 479 480 @Override 481 public void unregisterForIccRefresh(Handler h) { 482 mIccRefreshRegistrants.remove(h); 483 } 484 @Override 485 public void unsetOnIccRefresh(Handler h) { 486 unregisterForIccRefresh(h); 487 } 488 489 @Override 490 public void setOnCallRing(Handler h, int what, Object obj) { 491 mRingRegistrant = new Registrant (h, what, obj); 492 } 493 494 @Override 495 public void unSetOnCallRing(Handler h) { 496 if (mRingRegistrant != null && mRingRegistrant.getHandler() == h) { 497 mRingRegistrant.clear(); 498 mRingRegistrant = null; 499 } 500 } 501 502 @Override 503 public void setOnSs(Handler h, int what, Object obj) { 504 mSsRegistrant = new Registrant (h, what, obj); 505 } 506 507 @Override 508 public void unSetOnSs(Handler h) { 509 mSsRegistrant.clear(); 510 } 511 512 @Override 513 public void setOnCatCcAlphaNotify(Handler h, int what, Object obj) { 514 mCatCcAlphaRegistrant = new Registrant (h, what, obj); 515 } 516 517 @Override 518 public void unSetOnCatCcAlphaNotify(Handler h) { 519 mCatCcAlphaRegistrant.clear(); 520 } 521 522 @Override 523 public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj) { 524 Registrant r = new Registrant (h, what, obj); 525 mVoicePrivacyOnRegistrants.add(r); 526 } 527 528 @Override 529 public void unregisterForInCallVoicePrivacyOn(Handler h){ 530 mVoicePrivacyOnRegistrants.remove(h); 531 } 532 533 @Override 534 public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj) { 535 Registrant r = new Registrant (h, what, obj); 536 mVoicePrivacyOffRegistrants.add(r); 537 } 538 539 @Override 540 public void unregisterForInCallVoicePrivacyOff(Handler h){ 541 mVoicePrivacyOffRegistrants.remove(h); 542 } 543 544 @Override 545 public void setOnRestrictedStateChanged(Handler h, int what, Object obj) { 546 mRestrictedStateRegistrant = new Registrant (h, what, obj); 547 } 548 549 @Override 550 public void unSetOnRestrictedStateChanged(Handler h) { 551 if (mRestrictedStateRegistrant != null && mRestrictedStateRegistrant.getHandler() == h) { 552 mRestrictedStateRegistrant.clear(); 553 mRestrictedStateRegistrant = null; 554 } 555 } 556 557 @Override 558 public void registerForDisplayInfo(Handler h, int what, Object obj) { 559 Registrant r = new Registrant (h, what, obj); 560 mDisplayInfoRegistrants.add(r); 561 } 562 563 @Override 564 public void unregisterForDisplayInfo(Handler h) { 565 mDisplayInfoRegistrants.remove(h); 566 } 567 568 @Override 569 public void registerForCallWaitingInfo(Handler h, int what, Object obj) { 570 Registrant r = new Registrant (h, what, obj); 571 mCallWaitingInfoRegistrants.add(r); 572 } 573 574 @Override 575 public void unregisterForCallWaitingInfo(Handler h) { 576 mCallWaitingInfoRegistrants.remove(h); 577 } 578 579 @Override 580 public void registerForSignalInfo(Handler h, int what, Object obj) { 581 Registrant r = new Registrant (h, what, obj); 582 mSignalInfoRegistrants.add(r); 583 } 584 585 public void setOnUnsolOemHookRaw(Handler h, int what, Object obj) { 586 mUnsolOemHookRawRegistrant = new Registrant (h, what, obj); 587 } 588 589 public void unSetOnUnsolOemHookRaw(Handler h) { 590 if (mUnsolOemHookRawRegistrant != null && mUnsolOemHookRawRegistrant.getHandler() == h) { 591 mUnsolOemHookRawRegistrant.clear(); 592 mUnsolOemHookRawRegistrant = null; 593 } 594 } 595 596 @Override 597 public void unregisterForSignalInfo(Handler h) { 598 mSignalInfoRegistrants.remove(h); 599 } 600 601 @Override 602 public void registerForCdmaOtaProvision(Handler h,int what, Object obj){ 603 Registrant r = new Registrant (h, what, obj); 604 mOtaProvisionRegistrants.add(r); 605 } 606 607 @Override 608 public void unregisterForCdmaOtaProvision(Handler h){ 609 mOtaProvisionRegistrants.remove(h); 610 } 611 612 @Override 613 public void registerForNumberInfo(Handler h,int what, Object obj) { 614 Registrant r = new Registrant (h, what, obj); 615 mNumberInfoRegistrants.add(r); 616 } 617 618 @Override 619 public void unregisterForNumberInfo(Handler h){ 620 mNumberInfoRegistrants.remove(h); 621 } 622 623 @Override 624 public void registerForRedirectedNumberInfo(Handler h,int what, Object obj) { 625 Registrant r = new Registrant (h, what, obj); 626 mRedirNumInfoRegistrants.add(r); 627 } 628 629 @Override 630 public void unregisterForRedirectedNumberInfo(Handler h) { 631 mRedirNumInfoRegistrants.remove(h); 632 } 633 634 @Override 635 public void registerForLineControlInfo(Handler h, int what, Object obj) { 636 Registrant r = new Registrant (h, what, obj); 637 mLineControlInfoRegistrants.add(r); 638 } 639 640 @Override 641 public void unregisterForLineControlInfo(Handler h) { 642 mLineControlInfoRegistrants.remove(h); 643 } 644 645 @Override 646 public void registerFoT53ClirlInfo(Handler h,int what, Object obj) { 647 Registrant r = new Registrant (h, what, obj); 648 mT53ClirInfoRegistrants.add(r); 649 } 650 651 @Override 652 public void unregisterForT53ClirInfo(Handler h) { 653 mT53ClirInfoRegistrants.remove(h); 654 } 655 656 @Override 657 public void registerForT53AudioControlInfo(Handler h,int what, Object obj) { 658 Registrant r = new Registrant (h, what, obj); 659 mT53AudCntrlInfoRegistrants.add(r); 660 } 661 662 @Override 663 public void unregisterForT53AudioControlInfo(Handler h) { 664 mT53AudCntrlInfoRegistrants.remove(h); 665 } 666 667 @Override 668 public void registerForRingbackTone(Handler h, int what, Object obj) { 669 Registrant r = new Registrant (h, what, obj); 670 mRingbackToneRegistrants.add(r); 671 } 672 673 @Override 674 public void unregisterForRingbackTone(Handler h) { 675 mRingbackToneRegistrants.remove(h); 676 } 677 678 @Override 679 public void registerForResendIncallMute(Handler h, int what, Object obj) { 680 Registrant r = new Registrant (h, what, obj); 681 mResendIncallMuteRegistrants.add(r); 682 } 683 684 @Override 685 public void unregisterForResendIncallMute(Handler h) { 686 mResendIncallMuteRegistrants.remove(h); 687 } 688 689 @Override 690 public void registerForCdmaSubscriptionChanged(Handler h, int what, Object obj) { 691 Registrant r = new Registrant (h, what, obj); 692 mCdmaSubscriptionChangedRegistrants.add(r); 693 } 694 695 @Override 696 public void unregisterForCdmaSubscriptionChanged(Handler h) { 697 mCdmaSubscriptionChangedRegistrants.remove(h); 698 } 699 700 @Override 701 public void registerForCdmaPrlChanged(Handler h, int what, Object obj) { 702 Registrant r = new Registrant (h, what, obj); 703 mCdmaPrlChangedRegistrants.add(r); 704 } 705 706 @Override 707 public void unregisterForCdmaPrlChanged(Handler h) { 708 mCdmaPrlChangedRegistrants.remove(h); 709 } 710 711 @Override 712 public void registerForExitEmergencyCallbackMode(Handler h, int what, Object obj) { 713 Registrant r = new Registrant (h, what, obj); 714 mExitEmergencyCallbackModeRegistrants.add(r); 715 } 716 717 @Override 718 public void unregisterForExitEmergencyCallbackMode(Handler h) { 719 mExitEmergencyCallbackModeRegistrants.remove(h); 720 } 721 722 @Override 723 public void registerForHardwareConfigChanged(Handler h, int what, Object obj) { 724 Registrant r = new Registrant (h, what, obj); 725 mHardwareConfigChangeRegistrants.add(r); 726 } 727 728 @Override 729 public void unregisterForHardwareConfigChanged(Handler h) { 730 mHardwareConfigChangeRegistrants.remove(h); 731 } 732 733 /** 734 * {@inheritDoc} 735 */ 736 @Override 737 public void registerForRilConnected(Handler h, int what, Object obj) { 738 Registrant r = new Registrant (h, what, obj); 739 mRilConnectedRegistrants.add(r); 740 if (mRilVersion != -1) { 741 r.notifyRegistrant(new AsyncResult(null, new Integer(mRilVersion), null)); 742 } 743 } 744 745 @Override 746 public void unregisterForRilConnected(Handler h) { 747 mRilConnectedRegistrants.remove(h); 748 } 749 750 public void registerForSubscriptionStatusChanged(Handler h, int what, Object obj) { 751 Registrant r = new Registrant (h, what, obj); 752 mSubscriptionStatusRegistrants.add(r); 753 } 754 755 public void unregisterForSubscriptionStatusChanged(Handler h) { 756 mSubscriptionStatusRegistrants.remove(h); 757 } 758 759 //***** Protected Methods 760 /** 761 * Store new RadioState and send notification based on the changes 762 * 763 * This function is called only by RIL.java when receiving unsolicited 764 * RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED 765 * 766 * RadioState has 3 values : RADIO_OFF, RADIO_UNAVAILABLE, RADIO_ON. 767 * 768 * @param newState new RadioState decoded from RIL_UNSOL_RADIO_STATE_CHANGED 769 */ 770 protected void setRadioState(RadioState newState) { 771 RadioState oldState; 772 773 synchronized (mStateMonitor) { 774 oldState = mState; 775 mState = newState; 776 777 if (oldState == mState) { 778 // no state transition 779 return; 780 } 781 782 mRadioStateChangedRegistrants.notifyRegistrants(); 783 784 if (mState.isAvailable() && !oldState.isAvailable()) { 785 mAvailRegistrants.notifyRegistrants(); 786 onRadioAvailable(); 787 } 788 789 if (!mState.isAvailable() && oldState.isAvailable()) { 790 mNotAvailRegistrants.notifyRegistrants(); 791 } 792 793 if (mState.isOn() && !oldState.isOn()) { 794 mOnRegistrants.notifyRegistrants(); 795 } 796 797 if ((!mState.isOn() || !mState.isAvailable()) 798 && !((!oldState.isOn() || !oldState.isAvailable())) 799 ) { 800 mOffOrNotAvailRegistrants.notifyRegistrants(); 801 } 802 } 803 } 804 805 protected void onRadioAvailable() { 806 } 807 808 /** 809 * {@inheritDoc} 810 */ 811 @Override 812 public int getLteOnCdmaMode() { 813 return TelephonyManager.getLteOnCdmaModeStatic(); 814 } 815 816 /** 817 * {@inheritDoc} 818 */ 819 @Override 820 public void registerForCellInfoList(Handler h, int what, Object obj) { 821 Registrant r = new Registrant (h, what, obj); 822 mRilCellInfoListRegistrants.add(r); 823 } 824 @Override 825 public void unregisterForCellInfoList(Handler h) { 826 mRilCellInfoListRegistrants.remove(h); 827 } 828 829 @Override 830 public void registerForSrvccStateChanged(Handler h, int what, Object obj) { 831 Registrant r = new Registrant (h, what, obj); 832 833 mSrvccStateRegistrants.add(r); 834 } 835 836 @Override 837 public void unregisterForSrvccStateChanged(Handler h) { 838 mSrvccStateRegistrants.remove(h); 839 } 840 841 @Override 842 public void testingEmergencyCall() {} 843 844 @Override 845 public int getRilVersion() { 846 return mRilVersion; 847 } 848 849 public void setUiccSubscription(int slotId, int appIndex, int subId, int subStatus, 850 Message response) { 851 } 852 853 public void setDataAllowed(boolean allowed, Message response) { 854 } 855 856 @Override 857 public void requestShutdown(Message result) { 858 } 859 860 @Override 861 public void getRadioCapability(Message result) { 862 } 863 864 @Override 865 public void setRadioCapability(RadioCapability rc, Message response) { 866 } 867 868 @Override 869 public void registerForRadioCapabilityChanged(Handler h, int what, Object obj) { 870 Registrant r = new Registrant(h, what, obj); 871 mPhoneRadioCapabilityChangedRegistrants.add(r); 872 } 873 874 @Override 875 public void unregisterForRadioCapabilityChanged(Handler h) { 876 mPhoneRadioCapabilityChangedRegistrants.remove(h); 877 } 878 879 @Override 880 public void startLceService(int reportIntervalMs, boolean pullMode, Message result) { 881 } 882 883 @Override 884 public void stopLceService(Message result) { 885 } 886 887 @Override 888 public void pullLceData(Message result) { 889 } 890 891 @Override 892 public void registerForLceInfo(Handler h, int what, Object obj) { 893 mLceInfoRegistrant = new Registrant(h, what, obj); 894 } 895 896 @Override 897 public void unregisterForLceInfo(Handler h) { 898 if (mLceInfoRegistrant != null && mLceInfoRegistrant.getHandler() == h) { 899 mLceInfoRegistrant.clear(); 900 mLceInfoRegistrant = null; 901 } 902 } 903} 904