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