Home | History | Annotate | Download | only in dataconnection
      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 
     17 package com.android.internal.telephony.dataconnection;
     18 
     19 import android.app.PendingIntent;
     20 import android.telephony.Rlog;
     21 
     22 import com.android.internal.telephony.DctConstants;
     23 import com.android.internal.telephony.Phone;
     24 
     25 import java.io.FileDescriptor;
     26 import java.io.PrintWriter;
     27 import java.util.ArrayList;
     28 import java.util.concurrent.atomic.AtomicBoolean;
     29 import java.util.concurrent.atomic.AtomicInteger;
     30 
     31 /**
     32  * Maintain the Apn context
     33  */
     34 public class ApnContext {
     35 
     36     public final String LOG_TAG;
     37 
     38     protected static final boolean DBG = false;
     39 
     40     private final String mApnType;
     41 
     42     private DctConstants.State mState;
     43 
     44     private ArrayList<ApnSetting> mWaitingApns = null;
     45 
     46     /** A zero indicates that all waiting APNs had a permanent error */
     47     private AtomicInteger mWaitingApnsPermanentFailureCountDown;
     48 
     49     private ApnSetting mApnSetting;
     50 
     51     DcAsyncChannel mDcAc;
     52 
     53     String mReason;
     54 
     55     PendingIntent mReconnectAlarmIntent;
     56 
     57     /**
     58      * user/app requested connection on this APN
     59      */
     60     AtomicBoolean mDataEnabled;
     61 
     62     /**
     63      * carrier requirements met
     64      */
     65     AtomicBoolean mDependencyMet;
     66 
     67     public ApnContext(String apnType, String logTag) {
     68         mApnType = apnType;
     69         mState = DctConstants.State.IDLE;
     70         setReason(Phone.REASON_DATA_ENABLED);
     71         mDataEnabled = new AtomicBoolean(false);
     72         mDependencyMet = new AtomicBoolean(true);
     73         mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
     74         LOG_TAG = logTag;
     75     }
     76 
     77     public String getApnType() {
     78         return mApnType;
     79     }
     80 
     81     public synchronized DcAsyncChannel getDcAc() {
     82         return mDcAc;
     83     }
     84 
     85     public synchronized void setDataConnectionAc(DcAsyncChannel dcac) {
     86         if (DBG) {
     87             log("setDataConnectionAc: old dcac=" + mDcAc + " new dcac=" + dcac
     88                     + " this=" + this);
     89         }
     90         mDcAc = dcac;
     91     }
     92 
     93     public synchronized PendingIntent getReconnectIntent() {
     94         return mReconnectAlarmIntent;
     95     }
     96 
     97     public synchronized void setReconnectIntent(PendingIntent intent) {
     98         mReconnectAlarmIntent = intent;
     99     }
    100 
    101     public synchronized ApnSetting getApnSetting() {
    102         log("getApnSetting: apnSetting=" + mApnSetting);
    103         return mApnSetting;
    104     }
    105 
    106     public synchronized void setApnSetting(ApnSetting apnSetting) {
    107         log("setApnSetting: apnSetting=" + apnSetting);
    108         mApnSetting = apnSetting;
    109     }
    110 
    111     public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
    112         mWaitingApns = waitingApns;
    113         mWaitingApnsPermanentFailureCountDown.set(mWaitingApns.size());
    114     }
    115 
    116     public int getWaitingApnsPermFailCount() {
    117         return mWaitingApnsPermanentFailureCountDown.get();
    118     }
    119 
    120     public void decWaitingApnsPermFailCount() {
    121         mWaitingApnsPermanentFailureCountDown.decrementAndGet();
    122     }
    123 
    124     public synchronized ApnSetting getNextWaitingApn() {
    125         ArrayList<ApnSetting> list = mWaitingApns;
    126         ApnSetting apn = null;
    127 
    128         if (list != null) {
    129             if (!list.isEmpty()) {
    130                 apn = list.get(0);
    131             }
    132         }
    133         return apn;
    134     }
    135 
    136     public synchronized void removeWaitingApn(ApnSetting apn) {
    137         if (mWaitingApns != null) {
    138             mWaitingApns.remove(apn);
    139         }
    140     }
    141 
    142     public synchronized ArrayList<ApnSetting> getWaitingApns() {
    143         return mWaitingApns;
    144     }
    145 
    146     public synchronized void setState(DctConstants.State s) {
    147         if (DBG) {
    148             log("setState: " + s + ", previous state:" + mState);
    149         }
    150 
    151         mState = s;
    152 
    153         if (mState == DctConstants.State.FAILED) {
    154             if (mWaitingApns != null) {
    155                 mWaitingApns.clear(); // when teardown the connection and set to IDLE
    156             }
    157         }
    158     }
    159 
    160     public synchronized DctConstants.State getState() {
    161         return mState;
    162     }
    163 
    164     public boolean isDisconnected() {
    165         DctConstants.State currentState = getState();
    166         return ((currentState == DctConstants.State.IDLE) ||
    167                     currentState == DctConstants.State.FAILED);
    168     }
    169 
    170     public synchronized void setReason(String reason) {
    171         if (DBG) {
    172             log("set reason as " + reason + ",current state " + mState);
    173         }
    174         mReason = reason;
    175     }
    176 
    177     public synchronized String getReason() {
    178         return mReason;
    179     }
    180 
    181     public boolean isReady() {
    182         return mDataEnabled.get() && mDependencyMet.get();
    183     }
    184 
    185     public boolean isConnectable() {
    186         return isReady() && ((mState == DctConstants.State.IDLE)
    187                                 || (mState == DctConstants.State.SCANNING)
    188                                 || (mState == DctConstants.State.RETRYING)
    189                                 || (mState == DctConstants.State.FAILED));
    190     }
    191 
    192     public void setEnabled(boolean enabled) {
    193         if (DBG) {
    194             log("set enabled as " + enabled + ", current state is " + mDataEnabled.get());
    195         }
    196         mDataEnabled.set(enabled);
    197     }
    198 
    199     public boolean isEnabled() {
    200         return mDataEnabled.get();
    201     }
    202 
    203     public void setDependencyMet(boolean met) {
    204         if (DBG) {
    205             log("set mDependencyMet as " + met + " current state is " + mDependencyMet.get());
    206         }
    207         mDependencyMet.set(met);
    208     }
    209 
    210     public boolean getDependencyMet() {
    211        return mDependencyMet.get();
    212     }
    213 
    214     @Override
    215     public synchronized String toString() {
    216         // We don't print mDataConnection because its recursive.
    217         return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns +
    218                 "} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
    219                 " mApnSetting={" + mApnSetting + "} mReason=" + mReason +
    220                 " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
    221     }
    222 
    223     protected void log(String s) {
    224         Rlog.d(LOG_TAG, "[ApnContext:" + mApnType + "] " + s);
    225     }
    226 
    227     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    228         pw.println("ApnContext: " + this.toString());
    229     }
    230 }
    231