blob: 58a5bba4850302e857876e6ad091365d64d95f6d [file] [log] [blame]
/*
* 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()
{
}
}