blob: 8aeee87c7be0dbb00cffbab7f742206995a28fd6 [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;
import android.util.Log;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Maintain the Apn context
*/
public class ApnContext {
public final String LOG_TAG;
protected static final boolean DBG = true;
private final String mApnType;
private DataConnectionTracker.State mState;
private ArrayList<ApnSetting> mWaitingApns = null;
/** A zero indicates that all waiting APNs had a permanent error */
private AtomicInteger mWaitingApnsPermanentFailureCountDown;
private ApnSetting mApnSetting;
DataConnection mDataConnection;
DataConnectionAc mDataConnectionAc;
String mReason;
/**
* user/app requested connection on this APN
*/
AtomicBoolean mDataEnabled;
/**
* carrier requirements met
*/
AtomicBoolean mDependencyMet;
public ApnContext(String apnType, String logTag) {
mApnType = apnType;
mState = DataConnectionTracker.State.IDLE;
setReason(Phone.REASON_DATA_ENABLED);
mDataEnabled = new AtomicBoolean(false);
mDependencyMet = new AtomicBoolean(true);
mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
LOG_TAG = logTag;
}
public String getApnType() {
return mApnType;
}
public synchronized DataConnection getDataConnection() {
return mDataConnection;
}
public synchronized void setDataConnection(DataConnection dataConnection) {
mDataConnection = dataConnection;
}
public synchronized DataConnectionAc getDataConnectionAc() {
return mDataConnectionAc;
}
public synchronized void setDataConnectionAc(DataConnectionAc dcac) {
if (dcac != null) {
dcac.addApnContextSync(this);
} else {
if (mDataConnectionAc != null) mDataConnectionAc.removeApnContextSync(this);
}
mDataConnectionAc = dcac;
}
public synchronized ApnSetting getApnSetting() {
return mApnSetting;
}
public synchronized void setApnSetting(ApnSetting apnSetting) {
mApnSetting = apnSetting;
}
public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
mWaitingApns = waitingApns;
mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size());
}
public int getWaitingApnsPermFailCount() {
return mWaitingApnsPermanentFailureCountDown.get();
}
public void decWaitingApnsPermFailCount() {
mWaitingApnsPermanentFailureCountDown.decrementAndGet();
}
public synchronized ApnSetting getNextWaitingApn() {
ArrayList<ApnSetting> list = mWaitingApns;
ApnSetting apn = null;
if (list != null) {
if (!list.isEmpty()) {
apn = list.get(0);
}
}
return apn;
}
public synchronized void removeNextWaitingApn() {
if ((mWaitingApns != null) && (!mWaitingApns.isEmpty())) {
mWaitingApns.remove(0);
}
}
public synchronized ArrayList<ApnSetting> getWaitingApns() {
return mWaitingApns;
}
public synchronized void setState(DataConnectionTracker.State s) {
if (DBG) {
log("setState: " + s + " for type " + mApnType + ", previous state:" + mState);
}
mState = s;
if (mState == DataConnectionTracker.State.FAILED) {
if (mWaitingApns != null) {
mWaitingApns.clear(); // when teardown the connection and set to IDLE
}
}
}
public synchronized DataConnectionTracker.State getState() {
return mState;
}
public boolean isDisconnected() {
DataConnectionTracker.State currentState = getState();
return ((currentState == DataConnectionTracker.State.IDLE) ||
currentState == DataConnectionTracker.State.FAILED);
}
public synchronized void setReason(String reason) {
if (DBG) {
log("set reason as " + reason + ", for type " + mApnType + ",current state " + mState);
}
mReason = reason;
}
public synchronized String getReason() {
return mReason;
}
public boolean isReady() {
return mDataEnabled.get() && mDependencyMet.get();
}
public void setEnabled(boolean enabled) {
if (DBG) {
log("set enabled as " + enabled + ", for type " +
mApnType + ", current state is " + mDataEnabled.get());
}
mDataEnabled.set(enabled);
}
public boolean isEnabled() {
return mDataEnabled.get();
}
public void setDependencyMet(boolean met) {
if (DBG) {
log("set mDependencyMet as " + met + ", for type " + mApnType +
", current state is " + mDependencyMet.get());
}
mDependencyMet.set(met);
}
public boolean getDependencyMet() {
return mDependencyMet.get();
}
@Override
public String toString() {
return "state=" + getState() + " apnType=" + mApnType;
}
protected void log(String s) {
Log.d(LOG_TAG, "[ApnContext] " + s);
}
}