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