Home | History | Annotate | Download | only in telephony
      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