| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.internal.telephony.gsm; |
| |
| import android.content.Context; |
| import android.os.RegistrantList; |
| import android.os.Registrant; |
| import android.os.Handler; |
| import android.os.AsyncResult; |
| import android.os.SystemProperties; |
| import android.provider.Checkin; |
| import android.util.Config; |
| import android.util.Log; |
| |
| /** |
| * {@hide} |
| */ |
| public abstract class BaseCommands implements CommandsInterface |
| { |
| static final String LOG_TAG = "GSM"; |
| |
| //***** Instance Variables |
| protected Context mContext; |
| protected RadioState mState = RadioState.RADIO_UNAVAILABLE; |
| protected Object mStateMonitor = new Object(); |
| |
| protected RegistrantList mRadioStateChangedRegistrants = new RegistrantList(); |
| protected RegistrantList mOnRegistrants = new RegistrantList(); |
| protected RegistrantList mAvailRegistrants = new RegistrantList(); |
| protected RegistrantList mOffOrNotAvailRegistrants = new RegistrantList(); |
| protected RegistrantList mNotAvailRegistrants = new RegistrantList(); |
| protected RegistrantList mSIMReadyRegistrants = new RegistrantList(); |
| protected RegistrantList mSIMLockedRegistrants = new RegistrantList(); |
| protected RegistrantList mCallStateRegistrants = new RegistrantList(); |
| protected RegistrantList mNetworkStateRegistrants = new RegistrantList(); |
| protected RegistrantList mPDPRegistrants = new RegistrantList(); |
| protected Registrant mSMSRegistrant; |
| protected Registrant mNITZTimeRegistrant; |
| protected Registrant mSignalStrengthRegistrant; |
| protected Registrant mUSSDRegistrant; |
| protected Registrant mSmsOnSimRegistrant; |
| /** Registrant for handling SMS Status Reports */ |
| protected Registrant mSmsStatusRegistrant; |
| /** Registrant for handling Supplementary Service Notifications */ |
| protected Registrant mSsnRegistrant; |
| protected Registrant mStkSessionEndRegistrant; |
| protected Registrant mStkProCmdRegistrant; |
| protected Registrant mStkEventRegistrant; |
| protected Registrant mStkCallSetUpRegistrant; |
| /** Registrant for handling SIM SMS storage full messages */ |
| protected Registrant mSimSmsFullRegistrant; |
| /** Registrant for handling SIM Refresh notifications */ |
| protected Registrant mSimRefreshRegistrant; |
| /** Registrant for handling RING notifications */ |
| protected Registrant mRingRegistrant; |
| |
| public BaseCommands(Context context) { |
| mContext = context; // May be null (if so we won't log statistics) |
| } |
| |
| //***** CommandsInterface implementation |
| |
| public RadioState |
| getRadioState() |
| { |
| return mState; |
| } |
| |
| |
| public void |
| registerForRadioStateChanged(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mRadioStateChangedRegistrants.add(r); |
| r.notifyRegistrant(); |
| } |
| } |
| |
| public void |
| registerForOn(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mOnRegistrants.add(r); |
| |
| if (mState.isOn()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| |
| public void |
| registerForAvailable(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mAvailRegistrants.add(r); |
| |
| if (mState.isAvailable()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void |
| registerForNotAvailable(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mNotAvailRegistrants.add(r); |
| |
| if (!mState.isAvailable()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void |
| registerForOffOrNotAvailable(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mOffOrNotAvailRegistrants.add(r); |
| |
| if (mState == RadioState.RADIO_OFF || !mState.isAvailable()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| |
| /** Any transition into SIM_READY */ |
| public void |
| registerForSIMReady(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mSIMReadyRegistrants.add(r); |
| |
| if (mState.isSIMReady()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void |
| registerForSIMLockedOrAbsent(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mSIMLockedRegistrants.add(r); |
| |
| if (mState == RadioState.SIM_LOCKED_OR_ABSENT) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void |
| registerForCallStateChanged(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| mCallStateRegistrants.add(r); |
| } |
| |
| public void |
| registerForNetworkStateChanged(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| mNetworkStateRegistrants.add(r); |
| } |
| |
| public void |
| registerForPDPStateChanged(Handler h, int what, Object obj) |
| { |
| Registrant r = new Registrant (h, what, obj); |
| |
| mPDPRegistrants.add(r); |
| } |
| |
| public void |
| setOnNewSMS(Handler h, int what, Object obj) |
| { |
| mSMSRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnSmsOnSim(Handler h, int what, Object obj) |
| { |
| mSmsOnSimRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void setOnSmsStatus(Handler h, int what, Object obj) { |
| mSmsStatusRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnSignalStrengthUpdate(Handler h, int what, Object obj) |
| { |
| mSignalStrengthRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnNITZTime(Handler h, int what, Object obj) |
| { |
| mNITZTimeRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnUSSD(Handler h, int what, Object obj) |
| { |
| mUSSDRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnSuppServiceNotification(Handler h, int what, Object obj) |
| { |
| mSsnRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnStkSessionEnd(Handler h, int what, Object obj) |
| { |
| mStkSessionEndRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnStkProactiveCmd(Handler h, int what, Object obj) |
| { |
| mStkProCmdRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnStkEvent(Handler h, int what, Object obj) |
| { |
| mStkEventRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void |
| setOnStkCallSetUp(Handler h, int what, Object obj) |
| { |
| mStkCallSetUpRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void setOnSimSmsFull(Handler h, int what, Object obj) { |
| mSimSmsFullRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void setOnSimRefresh(Handler h, int what, Object obj) { |
| mSimRefreshRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void setOnCallRing(Handler h, int what, Object obj) { |
| mRingRegistrant = new Registrant (h, what, obj); |
| } |
| |
| //***** Protected Methods |
| /** |
| * Store new RadioState and send notification based on the changes |
| * |
| * This function is called only by RIL.java when receiving unsolicited |
| * RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED |
| * |
| * RadioState has 5 values : RADIO_OFF, RADIO_UNAVAILABLE, SIM_NOT_READY, |
| * SIM_LOCKED_OR_ABSENT, and SIM_READY. |
| * |
| * @param newState new RadioState decoded from RIL_UNSOL_RADIO_STATE_CHANGED |
| */ |
| protected void setRadioState(RadioState newState) { |
| RadioState oldState; |
| |
| synchronized (mStateMonitor) { |
| if (Config.LOGV) { |
| Log.v(LOG_TAG, "setRadioState old: " + mState |
| + " new " + newState); |
| } |
| |
| oldState = mState; |
| mState = newState; |
| |
| if (oldState == mState) { |
| // no state transition |
| return; |
| } |
| |
| if (mContext != null && |
| newState == RadioState.RADIO_UNAVAILABLE && |
| oldState != RadioState.RADIO_OFF) { |
| Checkin.updateStats(mContext.getContentResolver(), |
| Checkin.Stats.Tag.PHONE_RADIO_RESETS, 1, 0.0); |
| } |
| |
| mRadioStateChangedRegistrants.notifyRegistrants(); |
| |
| if (mState.isAvailable() && !oldState.isAvailable()) { |
| Log.d(LOG_TAG,"Notifying: radio available"); |
| mAvailRegistrants.notifyRegistrants(); |
| onRadioAvailable(); |
| } |
| |
| if (!mState.isAvailable() && oldState.isAvailable()) { |
| Log.d(LOG_TAG,"Notifying: radio not available"); |
| mNotAvailRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState.isSIMReady() && !oldState.isSIMReady()) { |
| Log.d(LOG_TAG,"Notifying: SIM ready"); |
| mSIMReadyRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState == RadioState.SIM_LOCKED_OR_ABSENT) { |
| Log.d(LOG_TAG,"Notifying: SIM locked or absent"); |
| mSIMLockedRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState.isOn() && !oldState.isOn()) { |
| Log.d(LOG_TAG,"Notifying: Radio On"); |
| mOnRegistrants.notifyRegistrants(); |
| } |
| |
| if ((!mState.isOn() || !mState.isAvailable()) |
| && !((!oldState.isOn() || !oldState.isAvailable())) |
| ) { |
| Log.d(LOG_TAG,"Notifying: radio off or not available"); |
| mOffOrNotAvailRegistrants.notifyRegistrants(); |
| } |
| } |
| } |
| |
| protected void |
| onRadioAvailable() |
| { |
| } |
| } |