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