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