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