| /* |
| * 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; |
| |
| |
| 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.util.Log; |
| |
| import java.io.FileInputStream; |
| import java.io.IOException; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| /** |
| * {@hide} |
| */ |
| public abstract class BaseCommands implements CommandsInterface { |
| static final String LOG_TAG = "RILB"; |
| |
| //***** Instance Variables |
| protected Context mContext; |
| protected RadioState mState = RadioState.RADIO_UNAVAILABLE; |
| protected RadioState mSimState = RadioState.RADIO_UNAVAILABLE; |
| protected RadioState mRuimState = RadioState.RADIO_UNAVAILABLE; |
| protected RadioState mNvState = 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 mRUIMReadyRegistrants = new RegistrantList(); |
| protected RegistrantList mRUIMLockedRegistrants = new RegistrantList(); |
| protected RegistrantList mNVReadyRegistrants = new RegistrantList(); |
| protected RegistrantList mCallStateRegistrants = new RegistrantList(); |
| protected RegistrantList mVoiceNetworkStateRegistrants = new RegistrantList(); |
| protected RegistrantList mDataNetworkStateRegistrants = new RegistrantList(); |
| protected RegistrantList mRadioTechnologyChangedRegistrants = new RegistrantList(); |
| protected RegistrantList mIccStatusChangedRegistrants = new RegistrantList(); |
| protected RegistrantList mVoicePrivacyOnRegistrants = new RegistrantList(); |
| protected RegistrantList mVoicePrivacyOffRegistrants = new RegistrantList(); |
| protected Registrant mUnsolOemHookRawRegistrant; |
| protected RegistrantList mOtaProvisionRegistrants = new RegistrantList(); |
| protected RegistrantList mCallWaitingInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mDisplayInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mSignalInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mNumberInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mRedirNumInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mLineControlInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mT53ClirInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mT53AudCntrlInfoRegistrants = new RegistrantList(); |
| protected RegistrantList mRingbackToneRegistrants = new RegistrantList(); |
| protected RegistrantList mResendIncallMuteRegistrants = new RegistrantList(); |
| protected RegistrantList mCdmaSubscriptionChangedRegistrants = new RegistrantList(); |
| protected RegistrantList mCdmaPrlChangedRegistrants = new RegistrantList(); |
| protected RegistrantList mExitEmergencyCallbackModeRegistrants = new RegistrantList(); |
| protected RegistrantList mRilConnectedRegistrants = new RegistrantList(); |
| protected RegistrantList mIccRefreshRegistrants = new RegistrantList(); |
| |
| protected Registrant mGsmSmsRegistrant; |
| protected Registrant mCdmaSmsRegistrant; |
| protected Registrant mNITZTimeRegistrant; |
| protected Registrant mSignalStrengthRegistrant; |
| protected Registrant mUSSDRegistrant; |
| protected Registrant mSmsOnSimRegistrant; |
| protected Registrant mSmsStatusRegistrant; |
| protected Registrant mSsnRegistrant; |
| protected Registrant mCatSessionEndRegistrant; |
| protected Registrant mCatProCmdRegistrant; |
| protected Registrant mCatEventRegistrant; |
| protected Registrant mCatCallSetUpRegistrant; |
| protected Registrant mIccSmsFullRegistrant; |
| protected Registrant mEmergencyCallbackModeRegistrant; |
| protected Registrant mRingRegistrant; |
| protected Registrant mRestrictedStateRegistrant; |
| protected Registrant mGsmBroadcastSmsRegistrant; |
| |
| // Preferred network type received from PhoneFactory. |
| // This is used when establishing a connection to the |
| // vendor ril so it starts up in the correct mode. |
| protected int mPreferredNetworkType; |
| // CDMA subscription received from PhoneFactory |
| protected int mCdmaSubscription; |
| // Type of Phone, GSM or CDMA. Set by CDMAPhone or GSMPhone. |
| protected int mPhoneType; |
| // RIL Version |
| protected int mRilVersion = -1; |
| |
| public BaseCommands(Context context) { |
| mContext = context; // May be null (if so we won't log statistics) |
| } |
| |
| //***** CommandsInterface implementation |
| |
| public RadioState getRadioState() { |
| return mState; |
| } |
| |
| public RadioState getSimState() { |
| return mSimState; |
| } |
| |
| public RadioState getRuimState() { |
| return mRuimState; |
| } |
| |
| public RadioState getNvState() { |
| return mNvState; |
| } |
| |
| |
| 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 unregisterForRadioStateChanged(Handler h) { |
| synchronized (mStateMonitor) { |
| mRadioStateChangedRegistrants.remove(h); |
| } |
| } |
| |
| 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 unregisterForOn(Handler h) { |
| synchronized (mStateMonitor) { |
| mOnRegistrants.remove(h); |
| } |
| } |
| |
| |
| 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 unregisterForAvailable(Handler h) { |
| synchronized(mStateMonitor) { |
| mAvailRegistrants.remove(h); |
| } |
| } |
| |
| 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 unregisterForNotAvailable(Handler h) { |
| synchronized (mStateMonitor) { |
| mNotAvailRegistrants.remove(h); |
| } |
| } |
| |
| 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)); |
| } |
| } |
| } |
| public void unregisterForOffOrNotAvailable(Handler h) { |
| synchronized(mStateMonitor) { |
| mOffOrNotAvailRegistrants.remove(h); |
| } |
| } |
| |
| |
| /** 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 (mSimState.isSIMReady()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void unregisterForSIMReady(Handler h) { |
| synchronized (mStateMonitor) { |
| mSIMReadyRegistrants.remove(h); |
| } |
| } |
| |
| /** Any transition into RUIM_READY */ |
| public void registerForRUIMReady(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mRUIMReadyRegistrants.add(r); |
| |
| if (mRuimState.isRUIMReady()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void unregisterForRUIMReady(Handler h) { |
| synchronized(mStateMonitor) { |
| mRUIMReadyRegistrants.remove(h); |
| } |
| } |
| |
| /** Any transition into NV_READY */ |
| public void registerForNVReady(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mNVReadyRegistrants.add(r); |
| |
| if (mNvState.isNVReady()) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void unregisterForNVReady(Handler h) { |
| synchronized (mStateMonitor) { |
| mNVReadyRegistrants.remove(h); |
| } |
| } |
| |
| public void registerForSIMLockedOrAbsent(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mSIMLockedRegistrants.add(r); |
| |
| if (mSimState == RadioState.SIM_LOCKED_OR_ABSENT) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void unregisterForSIMLockedOrAbsent(Handler h) { |
| synchronized (mStateMonitor) { |
| mSIMLockedRegistrants.remove(h); |
| } |
| } |
| |
| public void registerForRUIMLockedOrAbsent(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| synchronized (mStateMonitor) { |
| mRUIMLockedRegistrants.add(r); |
| |
| if (mRuimState == RadioState.RUIM_LOCKED_OR_ABSENT) { |
| r.notifyRegistrant(new AsyncResult(null, null, null)); |
| } |
| } |
| } |
| |
| public void unregisterForRUIMLockedOrAbsent(Handler h) { |
| synchronized (mStateMonitor) { |
| mRUIMLockedRegistrants.remove(h); |
| } |
| } |
| |
| public void registerForCallStateChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| mCallStateRegistrants.add(r); |
| } |
| |
| public void unregisterForCallStateChanged(Handler h) { |
| mCallStateRegistrants.remove(h); |
| } |
| |
| public void registerForVoiceNetworkStateChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| mVoiceNetworkStateRegistrants.add(r); |
| } |
| |
| public void unregisterForVoiceNetworkStateChanged(Handler h) { |
| mVoiceNetworkStateRegistrants.remove(h); |
| } |
| |
| public void registerForDataNetworkStateChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| |
| mDataNetworkStateRegistrants.add(r); |
| } |
| |
| public void unregisterForDataNetworkStateChanged(Handler h) { |
| mDataNetworkStateRegistrants.remove(h); |
| } |
| |
| public void registerForRadioTechnologyChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mRadioTechnologyChangedRegistrants.add(r); |
| } |
| |
| public void unregisterForRadioTechnologyChanged(Handler h) { |
| mRadioTechnologyChangedRegistrants.remove(h); |
| } |
| |
| public void registerForIccStatusChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mIccStatusChangedRegistrants.add(r); |
| } |
| |
| public void unregisterForIccStatusChanged(Handler h) { |
| mIccStatusChangedRegistrants.remove(h); |
| } |
| |
| public void setOnNewGsmSms(Handler h, int what, Object obj) { |
| mGsmSmsRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnNewGsmSms(Handler h) { |
| mGsmSmsRegistrant.clear(); |
| } |
| |
| public void setOnNewCdmaSms(Handler h, int what, Object obj) { |
| mCdmaSmsRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnNewCdmaSms(Handler h) { |
| mCdmaSmsRegistrant.clear(); |
| } |
| |
| public void setOnNewGsmBroadcastSms(Handler h, int what, Object obj) { |
| mGsmBroadcastSmsRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnNewGsmBroadcastSms(Handler h) { |
| mGsmBroadcastSmsRegistrant.clear(); |
| } |
| |
| public void setOnSmsOnSim(Handler h, int what, Object obj) { |
| mSmsOnSimRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnSmsOnSim(Handler h) { |
| mSmsOnSimRegistrant.clear(); |
| } |
| |
| public void setOnSmsStatus(Handler h, int what, Object obj) { |
| mSmsStatusRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnSmsStatus(Handler h) { |
| mSmsStatusRegistrant.clear(); |
| } |
| |
| public void setOnSignalStrengthUpdate(Handler h, int what, Object obj) { |
| mSignalStrengthRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnSignalStrengthUpdate(Handler h) { |
| mSignalStrengthRegistrant.clear(); |
| } |
| |
| public void setOnNITZTime(Handler h, int what, Object obj) { |
| mNITZTimeRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnNITZTime(Handler h) { |
| mNITZTimeRegistrant.clear(); |
| } |
| |
| public void setOnUSSD(Handler h, int what, Object obj) { |
| mUSSDRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnUSSD(Handler h) { |
| mUSSDRegistrant.clear(); |
| } |
| |
| public void setOnSuppServiceNotification(Handler h, int what, Object obj) { |
| mSsnRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnSuppServiceNotification(Handler h) { |
| mSsnRegistrant.clear(); |
| } |
| |
| public void setOnCatSessionEnd(Handler h, int what, Object obj) { |
| mCatSessionEndRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnCatSessionEnd(Handler h) { |
| mCatSessionEndRegistrant.clear(); |
| } |
| |
| public void setOnCatProactiveCmd(Handler h, int what, Object obj) { |
| mCatProCmdRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnCatProactiveCmd(Handler h) { |
| mCatProCmdRegistrant.clear(); |
| } |
| |
| public void setOnCatEvent(Handler h, int what, Object obj) { |
| mCatEventRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnCatEvent(Handler h) { |
| mCatEventRegistrant.clear(); |
| } |
| |
| public void setOnCatCallSetUp(Handler h, int what, Object obj) { |
| mCatCallSetUpRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnCatCallSetUp(Handler h) { |
| mCatCallSetUpRegistrant.clear(); |
| } |
| |
| public void setOnIccSmsFull(Handler h, int what, Object obj) { |
| mIccSmsFullRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnIccSmsFull(Handler h) { |
| mIccSmsFullRegistrant.clear(); |
| } |
| |
| public void registerForIccRefresh(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mIccRefreshRegistrants.add(r); |
| } |
| public void setOnIccRefresh(Handler h, int what, Object obj) { |
| registerForIccRefresh(h, what, obj); |
| } |
| |
| public void setEmergencyCallbackMode(Handler h, int what, Object obj) { |
| mEmergencyCallbackModeRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unregisterForIccRefresh(Handler h) { |
| mIccRefreshRegistrants.remove(h); |
| } |
| public void unsetOnIccRefresh(Handler h) { |
| unregisterForIccRefresh(h); |
| } |
| |
| public void setOnCallRing(Handler h, int what, Object obj) { |
| mRingRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnCallRing(Handler h) { |
| mRingRegistrant.clear(); |
| } |
| |
| public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mVoicePrivacyOnRegistrants.add(r); |
| } |
| |
| public void unregisterForInCallVoicePrivacyOn(Handler h){ |
| mVoicePrivacyOnRegistrants.remove(h); |
| } |
| |
| public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mVoicePrivacyOffRegistrants.add(r); |
| } |
| |
| public void unregisterForInCallVoicePrivacyOff(Handler h){ |
| mVoicePrivacyOffRegistrants.remove(h); |
| } |
| |
| public void setOnRestrictedStateChanged(Handler h, int what, Object obj) { |
| mRestrictedStateRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnRestrictedStateChanged(Handler h) { |
| mRestrictedStateRegistrant.clear(); |
| } |
| |
| public void registerForDisplayInfo(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mDisplayInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForDisplayInfo(Handler h) { |
| mDisplayInfoRegistrants.remove(h); |
| } |
| |
| public void registerForCallWaitingInfo(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mCallWaitingInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForCallWaitingInfo(Handler h) { |
| mCallWaitingInfoRegistrants.remove(h); |
| } |
| |
| public void registerForSignalInfo(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mSignalInfoRegistrants.add(r); |
| } |
| |
| public void setOnUnsolOemHookRaw(Handler h, int what, Object obj) { |
| mUnsolOemHookRawRegistrant = new Registrant (h, what, obj); |
| } |
| |
| public void unSetOnUnsolOemHookRaw(Handler h) { |
| mUnsolOemHookRawRegistrant.clear(); |
| } |
| |
| public void unregisterForSignalInfo(Handler h) { |
| mSignalInfoRegistrants.remove(h); |
| } |
| |
| public void registerForCdmaOtaProvision(Handler h,int what, Object obj){ |
| Registrant r = new Registrant (h, what, obj); |
| mOtaProvisionRegistrants.add(r); |
| } |
| |
| public void unregisterForCdmaOtaProvision(Handler h){ |
| mOtaProvisionRegistrants.remove(h); |
| } |
| |
| public void registerForNumberInfo(Handler h,int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mNumberInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForNumberInfo(Handler h){ |
| mNumberInfoRegistrants.remove(h); |
| } |
| |
| public void registerForRedirectedNumberInfo(Handler h,int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mRedirNumInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForRedirectedNumberInfo(Handler h) { |
| mRedirNumInfoRegistrants.remove(h); |
| } |
| |
| public void registerForLineControlInfo(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mLineControlInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForLineControlInfo(Handler h) { |
| mLineControlInfoRegistrants.remove(h); |
| } |
| |
| public void registerFoT53ClirlInfo(Handler h,int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mT53ClirInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForT53ClirInfo(Handler h) { |
| mT53ClirInfoRegistrants.remove(h); |
| } |
| |
| public void registerForT53AudioControlInfo(Handler h,int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mT53AudCntrlInfoRegistrants.add(r); |
| } |
| |
| public void unregisterForT53AudioControlInfo(Handler h) { |
| mT53AudCntrlInfoRegistrants.remove(h); |
| } |
| |
| public void registerForRingbackTone(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mRingbackToneRegistrants.add(r); |
| } |
| |
| public void unregisterForRingbackTone(Handler h) { |
| mRingbackToneRegistrants.remove(h); |
| } |
| |
| public void registerForResendIncallMute(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mResendIncallMuteRegistrants.add(r); |
| } |
| |
| public void unregisterForResendIncallMute(Handler h) { |
| mResendIncallMuteRegistrants.remove(h); |
| } |
| |
| @Override |
| public void registerForCdmaSubscriptionChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mCdmaSubscriptionChangedRegistrants.add(r); |
| } |
| |
| @Override |
| public void unregisterForCdmaSubscriptionChanged(Handler h) { |
| mCdmaSubscriptionChangedRegistrants.remove(h); |
| } |
| |
| @Override |
| public void registerForCdmaPrlChanged(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mCdmaPrlChangedRegistrants.add(r); |
| } |
| |
| @Override |
| public void unregisterForCdmaPrlChanged(Handler h) { |
| mCdmaPrlChangedRegistrants.remove(h); |
| } |
| |
| @Override |
| public void registerForExitEmergencyCallbackMode(Handler h, int what, Object obj) { |
| Registrant r = new Registrant (h, what, obj); |
| mExitEmergencyCallbackModeRegistrants.add(r); |
| } |
| |
| @Override |
| public void unregisterForExitEmergencyCallbackMode(Handler h) { |
| mExitEmergencyCallbackModeRegistrants.remove(h); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void registerForRilConnected(Handler h, int what, Object obj) { |
| Log.d(LOG_TAG, "registerForRilConnected h=" + h + " w=" + what); |
| Registrant r = new Registrant (h, what, obj); |
| mRilConnectedRegistrants.add(r); |
| if (mRilVersion != -1) { |
| Log.d(LOG_TAG, "Notifying: ril connected mRilVersion=" + mRilVersion); |
| r.notifyRegistrant(new AsyncResult(null, new Integer(mRilVersion), null)); |
| } |
| } |
| |
| @Override |
| public void unregisterForRilConnected(Handler h) { |
| mRilConnectedRegistrants.remove(h); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public void setCurrentPreferredNetworkType() { |
| } |
| |
| //***** 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 (false) { |
| Log.v(LOG_TAG, "setRadioState old: " + mState |
| + " new " + newState); |
| } |
| |
| oldState = mState; |
| mState = newState; |
| |
| if (oldState == mState) { |
| // no state transition |
| return; |
| } |
| |
| // FIXME: Use Constants or Enums |
| if(mState.getType() == 0) { |
| mSimState = mState; |
| mRuimState = mState; |
| mNvState = mState; |
| } |
| else if (mState.getType() == 1) { |
| mSimState = mState; |
| } |
| else if (mState.getType() == 2) { |
| mRuimState = mState; |
| } |
| else if (mState.getType() == 3) { |
| mNvState = mState; |
| } |
| |
| 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.isRUIMReady() && !oldState.isRUIMReady()) { |
| Log.d(LOG_TAG,"Notifying: RUIM ready"); |
| mRUIMReadyRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState == RadioState.RUIM_LOCKED_OR_ABSENT) { |
| Log.d(LOG_TAG,"Notifying: RUIM locked or absent"); |
| mRUIMLockedRegistrants.notifyRegistrants(); |
| } |
| if (mState.isNVReady() && !oldState.isNVReady()) { |
| Log.d(LOG_TAG,"Notifying: NV ready"); |
| mNVReadyRegistrants.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(); |
| } |
| |
| /* Radio Technology Change events |
| * NOTE: isGsm and isCdma have no common states in RADIO_OFF or RADIO_UNAVAILABLE; the |
| * current phone is determined by mPhoneType |
| * NOTE: at startup no phone have been created and the RIL determines the mPhoneType |
| * looking based on the networkMode set by the PhoneFactory in the constructor |
| */ |
| |
| if (mState.isGsm() && oldState.isCdma()) { |
| Log.d(LOG_TAG,"Notifying: radio technology change CDMA to GSM"); |
| mRadioTechnologyChangedRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState.isGsm() && !oldState.isOn() && (mPhoneType == Phone.PHONE_TYPE_CDMA)) { |
| Log.d(LOG_TAG,"Notifying: radio technology change CDMA OFF to GSM"); |
| mRadioTechnologyChangedRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState.isCdma() && oldState.isGsm()) { |
| Log.d(LOG_TAG,"Notifying: radio technology change GSM to CDMA"); |
| mRadioTechnologyChangedRegistrants.notifyRegistrants(); |
| } |
| |
| if (mState.isCdma() && !oldState.isOn() && (mPhoneType == Phone.PHONE_TYPE_GSM)) { |
| Log.d(LOG_TAG,"Notifying: radio technology change GSM OFF to CDMA"); |
| mRadioTechnologyChangedRegistrants.notifyRegistrants(); |
| } |
| } |
| } |
| |
| protected void onRadioAvailable() { |
| } |
| |
| /** |
| * The contents of the /proc/cmdline file |
| */ |
| private static String getProcCmdLine() |
| { |
| String cmdline = ""; |
| FileInputStream is = null; |
| try { |
| is = new FileInputStream("/proc/cmdline"); |
| byte [] buffer = new byte[2048]; |
| int count = is.read(buffer); |
| if (count > 0) { |
| cmdline = new String(buffer, 0, count); |
| } |
| } catch (IOException e) { |
| Log.d(LOG_TAG, "No /proc/cmdline exception=" + e); |
| } finally { |
| if (is != null) { |
| try { |
| is.close(); |
| } catch (IOException e) { |
| } |
| } |
| } |
| Log.d(LOG_TAG, "/proc/cmdline=" + cmdline); |
| return cmdline; |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public int getLteOnCdmaMode() { |
| return getLteOnCdmaModeStatic(); |
| } |
| |
| /** Kernel command line */ |
| private static final String sKernelCmdLine = getProcCmdLine(); |
| |
| /** Pattern for selecting the product type from the kernel command line */ |
| private static final Pattern sProductTypePattern = |
| Pattern.compile("\\sproduct_type\\s*=\\s*(\\w+)"); |
| |
| /** The ProductType used for LTE on CDMA devices */ |
| private static final String sLteOnCdmaProductType = |
| SystemProperties.get(TelephonyProperties.PROPERTY_LTE_ON_CDMA_PRODUCT_TYPE, ""); |
| |
| /** |
| * Return if the current radio is LTE on CDMA. This |
| * is a tri-state return value as for a period of time |
| * the mode may be unknown. |
| * |
| * @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE} |
| * or {@link Phone#LTE_ON_CDMA_TRUE} |
| */ |
| public static int getLteOnCdmaModeStatic() { |
| int retVal; |
| int curVal; |
| String productType = ""; |
| |
| curVal = SystemProperties.getInt(TelephonyProperties.PROPERTY_LTE_ON_CDMA_DEVICE, |
| Phone.LTE_ON_CDMA_UNKNOWN); |
| retVal = curVal; |
| if (retVal == Phone.LTE_ON_CDMA_UNKNOWN) { |
| Matcher matcher = sProductTypePattern.matcher(sKernelCmdLine); |
| if (matcher.find()) { |
| productType = matcher.group(1); |
| if (sLteOnCdmaProductType.equals(productType)) { |
| retVal = Phone.LTE_ON_CDMA_TRUE; |
| } else { |
| retVal = Phone.LTE_ON_CDMA_FALSE; |
| } |
| } else { |
| retVal = Phone.LTE_ON_CDMA_FALSE; |
| } |
| } |
| |
| Log.d(LOG_TAG, "getLteOnCdmaMode=" + retVal + " curVal=" + curVal + |
| " product_type='" + productType + |
| "' lteOnCdmaProductType='" + sLteOnCdmaProductType + "'"); |
| return retVal; |
| } |
| } |