Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bce3d257 authored by Robert Greenwalt's avatar Robert Greenwalt
Browse files

Switching to NetworkAgent API

Change-Id: I7bca6f65ba1c616d821db50b0d24772520c787a7
parent 93b9510e
Loading
Loading
Loading
Loading
+123 −14
Original line number Diff line number Diff line
@@ -18,8 +18,15 @@ package com.android.internal.telephony.dataconnection;

import android.app.PendingIntent;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkAgent;
import android.net.NetworkCapabilities;
import android.net.NetworkConfig;
import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.os.Looper;
import android.telephony.Rlog;
import android.telephony.TelephonyManager;

import com.android.internal.R;
import com.android.internal.telephony.DctConstants;
@@ -34,11 +41,11 @@ import java.util.concurrent.atomic.AtomicInteger;
/**
 * Maintain the Apn context
 */
public class ApnContext {
public class ApnContext extends NetworkAgent {

    public final String LOG_TAG;

    protected static final boolean DBG = false;
    protected static final boolean DBG = true;

    private final Context mContext;

@@ -57,7 +64,6 @@ public class ApnContext {

    DcAsyncChannel mDcAc;

    String mReason;

    PendingIntent mReconnectAlarmIntent;

@@ -71,16 +77,72 @@ public class ApnContext {
     */
    AtomicBoolean mDependencyMet;

    public ApnContext(Context context, String apnType, String logTag, NetworkConfig config) {
    private final DcTracker mDcTracker;

    public final NetworkInfo networkInfo;

    public ApnContext(Looper looper, Context context, String apnType, String logTag,
            NetworkConfig config, DcTracker tracker, int netType) {
        super(looper, context, logTag);
        mDcTracker = tracker;
        mContext = context;
        mApnType = apnType;
        mState = DctConstants.State.IDLE;
        setReason(Phone.REASON_DATA_ENABLED);
        mDataEnabled = new AtomicBoolean(false);
        mDependencyMet = new AtomicBoolean(config.dependencyMet);
        mWaitingApnsPermanentFailureCountDown = new AtomicInteger(0);
        priority = config.priority;
        LOG_TAG = logTag;
        // TODO - is there a better way to get the network type/name?
        networkInfo = new NetworkInfo(netType, TelephonyManager.getDefault().getNetworkType(),
                "Cellular", TelephonyManager.getDefault().getNetworkTypeName());
        setReason(Phone.REASON_DATA_ENABLED);
        NetworkCapabilities nc = new NetworkCapabilities();
        nc.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
        switch (netType) {
            case ConnectivityManager.TYPE_MOBILE_HIPRI:
            case ConnectivityManager.TYPE_MOBILE: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_MMS: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_MMS);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_SUPL: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_SUPL);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_DUN: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
                nc.removeNetworkCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_FOTA: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_FOTA);
                nc.removeNetworkCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_IMS: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
                nc.removeNetworkCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_CBS: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_CBS);
                nc.removeNetworkCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
                break;
            }
            case ConnectivityManager.TYPE_MOBILE_IA: {
                nc.addNetworkCapability(NetworkCapabilities.NET_CAPABILITY_IA);
                nc.removeNetworkCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
                break;
            }
        }
        // updated per rat, later
        nc.setLinkUpstreamBandwidthKbps(10 * 1024);
        nc.setLinkDownstreamBandwidthKbps(20 * 1024);
        sendNetworkCapabilities(nc);
    }

    public String getApnType() {
@@ -115,6 +177,13 @@ public class ApnContext {
    public synchronized void setApnSetting(ApnSetting apnSetting) {
        log("setApnSetting: apnSetting=" + apnSetting);
        mApnSetting = apnSetting;
        boolean prov = false;
        if (mApnSetting != null && mApnSetting.apn != null) {
            String provisioningApn = mContext.getResources()
                    .getString(R.string.mobile_provisioning_apn);
            prov = mApnSetting.apn.equals(provisioningApn);
        }
        networkInfo.setIsConnectedToProvisioningNetwork(prov);
    }

    public synchronized void setWaitingApns(ArrayList<ApnSetting> waitingApns) {
@@ -180,11 +249,12 @@ public class ApnContext {
        if (DBG) {
            log("set reason as " + reason + ",current state " + mState);
        }
        mReason = reason;
        networkInfo.setDetailedState(networkInfo.getDetailedState(), reason,
                networkInfo.getExtraInfo());
    }

    public synchronized String getReason() {
        return mReason;
        return networkInfo.getReason();
    }

    public boolean isReady() {
@@ -228,12 +298,51 @@ public class ApnContext {
    }

    public boolean isProvisioningApn() {
        String provisioningApn = mContext.getResources()
                .getString(R.string.mobile_provisioning_apn);
        if ((mApnSetting != null) && (mApnSetting.apn != null)) {
            return (mApnSetting.apn.equals(provisioningApn));
        } else {
            return false;
        return networkInfo.isConnectedToProvisioningNetwork();
    }

    @Override
    protected void connect() {
        if (DBG) log("connect");
        mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), true);
    }

    @Override
    protected void disconnect() {
        if (DBG) log("disconnect");
        mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false);
    }

    public void sendNetworkInfo() {
        sendNetworkInfo(networkInfo);
    }

    public void sendRat(int rilRat) {
        int up, down; // kbps
        switch (rilRat) {
            case TelephonyManager.NETWORK_TYPE_GPRS: up = 80; down = 80; break;
            case TelephonyManager.NETWORK_TYPE_EDGE: up = 59; down = 236; break;
            case TelephonyManager.NETWORK_TYPE_UMTS: up = 384; down = 384; break;
            case TelephonyManager.NETWORK_TYPE_CDMA: up = 14; down = 14; break;
            case TelephonyManager.NETWORK_TYPE_EVDO_0: up = 153; down = 2457; break;
            case TelephonyManager.NETWORK_TYPE_EVDO_A: up = 1843; down = 3174; break;
            case TelephonyManager.NETWORK_TYPE_1xRTT: up = 100; down = 100; break;
            case TelephonyManager.NETWORK_TYPE_HSDPA: up = 2048; down = 14336; break;
            case TelephonyManager.NETWORK_TYPE_HSUPA: up = 5898; down = 14336; break;
            case TelephonyManager.NETWORK_TYPE_HSPA: up = 5898; down = 14336; break;
            case TelephonyManager.NETWORK_TYPE_IDEN: up = 14; down = 14; break;
            case TelephonyManager.NETWORK_TYPE_EVDO_B: up = 1843; down = 5017; break;
            case TelephonyManager.NETWORK_TYPE_LTE: up = 51200; down = 102400; break;
            case TelephonyManager.NETWORK_TYPE_EHRPD: up = 153; down = 2516; break;
            case TelephonyManager.NETWORK_TYPE_HSPAP: up = 11264; down = 43008; break;
            default:
                return;  // unknown
        }
        synchronized (this) {
            NetworkCapabilities nc = getNetworkCapabilities();
            nc.setLinkUpstreamBandwidthKbps(up);
            nc.setLinkDownstreamBandwidthKbps(down);
            sendNetworkCapabilities(nc);
        }
    }

@@ -242,7 +351,7 @@ public class ApnContext {
        // We don't print mDataConnection because its recursive.
        return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns +
                "} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
                " mApnSetting={" + mApnSetting + "} mReason=" + mReason +
                " mApnSetting={" + mApnSetting + "} mReason=" + networkInfo.getReason() +
                " mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
    }

+14 −20
Original line number Diff line number Diff line
@@ -157,7 +157,6 @@ public final class DataConnection extends StateMachine {

    private PhoneBase mPhone;
    private LinkProperties mLinkProperties = new LinkProperties();
    private NetworkCapabilities mNetworkCapabilities = new NetworkCapabilities();
    private long mCreateTime;
    private long mLastFailTime;
    private DcFailCause mLastFailCause;
@@ -246,10 +245,6 @@ public final class DataConnection extends StateMachine {

    /* Getter functions */

    NetworkCapabilities getCopyNetworkCapabilities() {
        return new NetworkCapabilities(mNetworkCapabilities);
    }

    LinkProperties getCopyLinkProperties() {
        return new LinkProperties(mLinkProperties);
    }
@@ -268,6 +263,7 @@ public final class DataConnection extends StateMachine {

    void setLinkPropertiesHttpProxy(ProxyInfo proxy) {
        mLinkProperties.setHttpProxy(proxy);
        for (ApnContext ac : mApnContexts) ac.sendLinkProperties(mLinkProperties);
    }

    static class UpdateLinkPropertyResult {
@@ -302,7 +298,7 @@ public final class DataConnection extends StateMachine {
            log("updateLinkProperty new LP=" + result.newLp);
        }
        mLinkProperties = result.newLp;

        for (ApnContext ac : mApnContexts) ac.sendLinkProperties(mLinkProperties);
        return result;
    }

@@ -488,10 +484,10 @@ public final class DataConnection extends StateMachine {
    }

    private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) {
        for (ApnContext apnContext : mApnContexts) {
            if (apnContext == alreadySent) continue;
            if (reason != null) apnContext.setReason(reason);
            Message msg = mDct.obtainMessage(event, apnContext);
        for (ApnContext ac : mApnContexts) {
            if (ac == alreadySent) continue;
            if (reason != null) ac.setReason(reason);
            Message msg = mDct.obtainMessage(event, ac);
            AsyncResult.forMessage(msg);
            msg.sendToTarget();
        }
@@ -745,6 +741,8 @@ public final class DataConnection extends StateMachine {

        if (!mApnContexts.contains(apnContext)) {
            mApnContexts.add(apnContext);
            apnContext.sendRat(mRilRat);
            apnContext.sendLinkProperties(mLinkProperties);
        }
        configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT));
        mRetryManager.setRetryCount(0);
@@ -797,7 +795,6 @@ public final class DataConnection extends StateMachine {
            mApnSetting = null;
            mPhone = null;
            mLinkProperties = null;
            mNetworkCapabilities = null;
            mLastFailCause = null;
            mUserData = null;
            mDcController = null;
@@ -863,12 +860,6 @@ public final class DataConnection extends StateMachine {
                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_SET_LINK_PROPERTIES_HTTP_PROXY);
                    break;
                }
                case DcAsyncChannel.REQ_GET_NETWORK_CAPABILITIES: {
                    NetworkCapabilities nc = getCopyNetworkCapabilities();
                    if (VDBG) log("REQ_GET_NETWORK_CAPABILITIES networkCapabilities" + nc);
                    mAc.replyToMessage(msg, DcAsyncChannel.RSP_GET_NETWORK_CAPABILITIES, nc);
                    break;
                }
                case DcAsyncChannel.REQ_RESET:
                    if (VDBG) log("DcDefaultState: msg.what=REQ_RESET");
                    transitionTo(mInactiveState);
@@ -921,6 +912,7 @@ public final class DataConnection extends StateMachine {
                    Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>)ar.result;
                    mDataRegState = drsRatPair.first;
                    mRilRat = drsRatPair.second;
                    for (ApnContext ac : mApnContexts) ac.sendRat(mRilRat);
                    if (DBG) {
                        log("DcDefaultState: EVENT_DATA_CONNECTION_DRS_OR_RAT_CHANGED"
                                + " drs=" + mDataRegState
@@ -1121,6 +1113,7 @@ public final class DataConnection extends StateMachine {
                        }
                        mDataRegState = drs;
                        mRilRat = rat;
                        for (ApnContext ac : mApnContexts) ac.sendRat(rat);
                    }
                    retVal = HANDLED;
                    break;
@@ -1428,6 +1421,9 @@ public final class DataConnection extends StateMachine {
                        log("DcActiveState ERROR already added apnContext=" + cp.mApnContext);
                    } else {
                        mApnContexts.add(cp.mApnContext);
                        cp.mApnContext.sendRat(mRilRat);
                        cp.mApnContext.sendLinkProperties(mLinkProperties);

                        if (DBG) {
                            log("DcActiveState msg.what=EVENT_CONNECT RefCount="
                                    + mApnContexts.size());
@@ -1750,8 +1746,7 @@ public final class DataConnection extends StateMachine {
                + " mLastFailCause=" + mLastFailCause
                + " mTag=" + mTag
                + " mRetryManager=" + mRetryManager
                + " mLinkProperties=" + mLinkProperties
                + " mNetworkCapabilities=" + mNetworkCapabilities;
                + " mLinkProperties=" + mLinkProperties;
    }

    @Override
@@ -1788,7 +1783,6 @@ public final class DataConnection extends StateMachine {
        pw.flush();
        pw.println(" mDataRegState=" + mDataRegState);
        pw.println(" mRilRat=" + mRilRat);
        pw.println(" mNetworkCapabilities=" + mNetworkCapabilities);
        pw.println(" mCreateTime=" + TimeUtils.logTimeOfDay(mCreateTime));
        pw.println(" mLastFailTime=" + TimeUtils.logTimeOfDay(mLastFailTime));
        pw.println(" mLastFailCause=" + mLastFailCause);
+2 −49
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import com.android.internal.util.AsyncChannel;
import com.android.internal.util.Protocol;

import android.net.LinkProperties;
import android.net.NetworkCapabilities;
import android.net.ProxyInfo;
import android.os.Message;

@@ -53,11 +52,8 @@ public class DcAsyncChannel extends AsyncChannel {
    public static final int REQ_SET_LINK_PROPERTIES_HTTP_PROXY = BASE + 8;
    public static final int RSP_SET_LINK_PROPERTIES_HTTP_PROXY = BASE + 9;

    public static final int REQ_GET_NETWORK_CAPABILITIES = BASE + 10;
    public static final int RSP_GET_NETWORK_CAPABILITIES = BASE + 11;

    public static final int REQ_RESET = BASE + 12;
    public static final int RSP_RESET = BASE + 13;
    public static final int REQ_RESET = BASE + 10;
    public static final int RSP_RESET = BASE + 11;

    private static final int CMD_TO_STRING_COUNT = RSP_RESET - BASE + 1;
    private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT];
@@ -74,8 +70,6 @@ public class DcAsyncChannel extends AsyncChannel {
                "REQ_SET_LINK_PROPERTIES_HTTP_PROXY";
        sCmdToString[RSP_SET_LINK_PROPERTIES_HTTP_PROXY - BASE] =
                "RSP_SET_LINK_PROPERTIES_HTTP_PROXY";
        sCmdToString[REQ_GET_NETWORK_CAPABILITIES - BASE] = "REQ_GET_NETWORK_CAPABILITIES";
        sCmdToString[RSP_GET_NETWORK_CAPABILITIES - BASE] = "RSP_GET_NETWORK_CAPABILITIES";
        sCmdToString[REQ_RESET - BASE] = "REQ_RESET";
        sCmdToString[RSP_RESET - BASE] = "RSP_RESET";
    }
@@ -306,47 +300,6 @@ public class DcAsyncChannel extends AsyncChannel {
        }
    }

    /**
     * Request the connections NetworkCapabilities.
     * Response {@link #rspNetworkCapabilities}
     */
    public void reqNetworkCapabilities() {
        sendMessage(REQ_GET_NETWORK_CAPABILITIES);
        if (DBG) log("reqNetworkCapabilities");
    }

    /**
     * Evaluate RSP_GET_NETWORK_CAPABILITIES
     *
     * @param response
     * @return NetworkCapabilites, maybe null.
     */
    public NetworkCapabilities rspNetworkCapabilities(Message response) {
        NetworkCapabilities retVal = (NetworkCapabilities) response.obj;
        if (DBG) log("rspNetworkCapabilities=" + retVal);
        return retVal;
    }

    /**
     * Get the connections NetworkCapabilities.
     *
     * @return NetworkCapabilities or null if an error
     */
    public NetworkCapabilities getNetworkCapabilitiesSync() {
        NetworkCapabilities value;
        if (isCallerOnDifferentThread()) {
            Message response = sendMessageSynchronously(REQ_GET_NETWORK_CAPABILITIES);
            if ((response != null) && (response.what == RSP_GET_NETWORK_CAPABILITIES)) {
                value = rspNetworkCapabilities(response);
            } else {
                value = null;
            }
        } else {
            value = mDc.getCopyNetworkCapabilities();
        }
        return value;
    }

    /**
     * Response RSP_RESET when complete
     */
+153 −84

File changed.

Preview size limit exceeded, changes collapsed.

+7 −5
Original line number Diff line number Diff line
@@ -470,6 +470,7 @@ public abstract class DcTrackerBase extends Handler {
        String apnType = intent.getStringExtra(INTENT_RECONNECT_ALARM_EXTRA_TYPE);

        ApnContext apnContext = mApnContexts.get(apnType);
        if (apnContext == null) return;

        if (DBG) {
            log("onActionIntentReconnectAlarm: mState=" + mState + " reason=" + reason +
@@ -477,7 +478,7 @@ public abstract class DcTrackerBase extends Handler {
                    " mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap);
        }

        if ((apnContext != null) && (apnContext.isEnabled())) {
        if (apnContext.isEnabled()) {
            apnContext.setReason(reason);
            DctConstants.State apnContextState = apnContext.getState();
            if (DBG) {
@@ -507,6 +508,8 @@ public abstract class DcTrackerBase extends Handler {
    protected void onActionIntentRestartTrySetupAlarm(Intent intent) {
        String apnType = intent.getStringExtra(INTENT_RESTART_TRYSETUP_ALARM_EXTRA_TYPE);
        ApnContext apnContext = mApnContexts.get(apnType);
        if (apnContext == null) return;

        if (DBG) {
            log("onActionIntentRestartTrySetupAlarm: mState=" + mState +
                    " apnType=" + apnType + " apnContext=" + apnContext +
@@ -1032,10 +1035,9 @@ public abstract class DcTrackerBase extends Handler {
    }

    public NetworkCapabilities getNetworkCapabilities(String apnType) {
        int id = apnTypeToId(apnType);
        if (isApnIdEnabled(id)) {
            DcAsyncChannel dcac = mDataConnectionAcHashMap.get(0);
            return dcac.getNetworkCapabilitiesSync();
        ApnContext apnContext = mApnContexts.get(apnType);
        if (apnContext != null) {
            return apnContext.getNetworkCapabilities();
        } else {
            return new NetworkCapabilities();
        }