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