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