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