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