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