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;
/**
* Maintain the Apn context
*/
-public class ApnContext extends NetworkAgent {
+public class ApnContext {
public final String LOG_TAG;
- protected static final boolean DBG = true;
+ protected static final boolean DBG = false;
private final Context mContext;
DcAsyncChannel mDcAc;
+ String mReason;
PendingIntent mReconnectAlarmIntent;
*/
AtomicBoolean mDependencyMet;
- 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;
+ public ApnContext(Context context, String apnType, String logTag, NetworkConfig config) {
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() {
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) {
if (DBG) {
log("set reason as " + reason + ",current state " + mState);
}
- networkInfo.setDetailedState(networkInfo.getDetailedState(), reason,
- networkInfo.getExtraInfo());
+ mReason = reason;
}
public synchronized String getReason() {
- return networkInfo.getReason();
+ return mReason;
}
public boolean isReady() {
}
public boolean isProvisioningApn() {
- 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);
+ String provisioningApn = mContext.getResources()
+ .getString(R.string.mobile_provisioning_apn);
+ if ((mApnSetting != null) && (mApnSetting.apn != null)) {
+ return (mApnSetting.apn.equals(provisioningApn));
+ } else {
+ return false;
}
}
// We don't print mDataConnection because its recursive.
return "{mApnType=" + mApnType + " mState=" + getState() + " mWaitingApns={" + mWaitingApns +
"} mWaitingApnsPermanentFailureCountDown=" + mWaitingApnsPermanentFailureCountDown +
- " mApnSetting={" + mApnSetting + "} mReason=" + networkInfo.getReason() +
+ " mApnSetting={" + mApnSetting + "} mReason=" + mReason +
" mDataEnabled=" + mDataEnabled + " mDependencyMet=" + mDependencyMet + "}";
}
private PhoneBase mPhone;
private LinkProperties mLinkProperties = new LinkProperties();
+ private NetworkCapabilities mNetworkCapabilities = new NetworkCapabilities();
private long mCreateTime;
private long mLastFailTime;
private DcFailCause mLastFailCause;
/* Getter functions */
+ NetworkCapabilities getCopyNetworkCapabilities() {
+ return new NetworkCapabilities(mNetworkCapabilities);
+ }
+
LinkProperties getCopyLinkProperties() {
return new LinkProperties(mLinkProperties);
}
void setLinkPropertiesHttpProxy(ProxyInfo proxy) {
mLinkProperties.setHttpProxy(proxy);
- for (ApnContext ac : mApnContexts) ac.sendLinkProperties(mLinkProperties);
}
static class UpdateLinkPropertyResult {
log("updateLinkProperty new LP=" + result.newLp);
}
mLinkProperties = result.newLp;
- for (ApnContext ac : mApnContexts) ac.sendLinkProperties(mLinkProperties);
+
return result;
}
}
private void notifyAllWithEvent(ApnContext alreadySent, int event, String reason) {
- for (ApnContext ac : mApnContexts) {
- if (ac == alreadySent) continue;
- if (reason != null) ac.setReason(reason);
- Message msg = mDct.obtainMessage(event, ac);
+ for (ApnContext apnContext : mApnContexts) {
+ if (apnContext == alreadySent) continue;
+ if (reason != null) apnContext.setReason(reason);
+ Message msg = mDct.obtainMessage(event, apnContext);
AsyncResult.forMessage(msg);
msg.sendToTarget();
}
if (!mApnContexts.contains(apnContext)) {
mApnContexts.add(apnContext);
- apnContext.sendRat(mRilRat);
- apnContext.sendLinkProperties(mLinkProperties);
}
configureRetry(mApnSetting.canHandleType(PhoneConstants.APN_TYPE_DEFAULT));
mRetryManager.setRetryCount(0);
mApnSetting = null;
mPhone = null;
mLinkProperties = null;
+ mNetworkCapabilities = null;
mLastFailCause = null;
mUserData = null;
mDcController = null;
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);
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
}
mDataRegState = drs;
mRilRat = rat;
- for (ApnContext ac : mApnContexts) ac.sendRat(rat);
}
retVal = HANDLED;
break;
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());
+ " mLastFailCause=" + mLastFailCause
+ " mTag=" + mTag
+ " mRetryManager=" + mRetryManager
- + " mLinkProperties=" + mLinkProperties;
+ + " mLinkProperties=" + mLinkProperties
+ + " mNetworkCapabilities=" + mNetworkCapabilities;
}
@Override
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);
import com.android.internal.util.Protocol;
import android.net.LinkProperties;
+import android.net.NetworkCapabilities;
import android.net.ProxyInfo;
import android.os.Message;
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_RESET = BASE + 10;
- public static final int RSP_RESET = BASE + 11;
+ 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;
private static final int CMD_TO_STRING_COUNT = RSP_RESET - BASE + 1;
private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT];
"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";
}
}
}
+ /**
+ * 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
*/
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.ConnectivityManager;
-import static android.net.ConnectivityServiceProtocol.NetworkFactoryProtocol;
import android.net.LinkProperties;
import android.net.NetworkCapabilities;
import android.net.NetworkConfig;
-import android.net.NetworkInfo;
-import android.net.NetworkRequest;
import android.net.NetworkUtils;
import android.net.ProxyInfo;
import android.net.Uri;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
import android.util.EventLog;
-import android.util.Pair;
import android.telephony.Rlog;
import com.android.internal.telephony.Phone;
p.getContext().getContentResolver().registerContentObserver(
Telephony.Carriers.CONTENT_URI, true, mApnObserver);
+ initApnContexts();
+
+ for (ApnContext apnContext : mApnContexts.values()) {
+ // Register the reconnect and restart actions.
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(INTENT_RECONNECT_ALARM + '.' + apnContext.getApnType());
+ filter.addAction(INTENT_RESTART_TRYSETUP_ALARM + '.' + apnContext.getApnType());
+ mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
+ }
+
ConnectivityManager cm = (ConnectivityManager)p.getContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
- mNetworkFactoryMessenger = new Messenger(this);
- cm.registerNetworkFactory(mNetworkFactoryMessenger, "Telephony");
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_MMS, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_SUPL, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_DUN, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_HIPRI, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_FOTA, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_IMS, new Messenger(this));
+ cm.supplyMessenger(ConnectivityManager.TYPE_MOBILE_CBS, new Messenger(this));
}
@Override
}
private ApnContext addApnContext(String type, NetworkConfig networkConfig) {
- ApnContext apnContext = new ApnContext(getLooper(), mPhone.getContext(), type, LOG_TAG,
- networkConfig, this, networkConfig.type);
- // TODO - make the score dynamic and/or depend on NetworkScore class
- // for now, be less than 60 in WifiStateMachine.java
- apnContext.sendNetworkScore(50);
+ ApnContext apnContext = new ApnContext(mPhone.getContext(), type, LOG_TAG, networkConfig);
mApnContexts.put(type, apnContext);
mPrioritySortedApnContexts.add(apnContext);
-
- // Register the reconnect and restart actions.
- IntentFilter filter = new IntentFilter();
- filter.addAction(INTENT_RECONNECT_ALARM + '.' + apnContext.getApnType());
- filter.addAction(INTENT_RESTART_TRYSETUP_ALARM + '.' + apnContext.getApnType());
- mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
return apnContext;
}
+ protected void initApnContexts() {
+ log("initApnContexts: E");
+ boolean defaultEnabled = SystemProperties.getBoolean(DEFALUT_DATA_ON_BOOT_PROP, true);
+ // Load device network attributes from resources
+ String[] networkConfigStrings = mPhone.getContext().getResources().getStringArray(
+ com.android.internal.R.array.networkAttributes);
+ for (String networkConfigString : networkConfigStrings) {
+ NetworkConfig networkConfig = new NetworkConfig(networkConfigString);
+ ApnContext apnContext = null;
+
+ switch (networkConfig.type) {
+ case ConnectivityManager.TYPE_MOBILE:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_DEFAULT, networkConfig);
+ apnContext.setEnabled(defaultEnabled);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_MMS:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_MMS, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_SUPL:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_SUPL, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_DUN:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_DUN, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_HIPRI:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_HIPRI, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_FOTA:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_FOTA, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_IMS:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_IMS, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_CBS:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_CBS, networkConfig);
+ break;
+ case ConnectivityManager.TYPE_MOBILE_IA:
+ apnContext = addApnContext(PhoneConstants.APN_TYPE_IA, networkConfig);
+ break;
+ default:
+ log("initApnContexts: skipping unknown type=" + networkConfig.type);
+ continue;
+ }
+ log("initApnContexts: apnContext=" + apnContext);
+ }
+ log("initApnContexts: X mApnContexts=" + mApnContexts);
+ }
+
@Override
public LinkProperties getLinkProperties(String apnType) {
ApnContext apnContext = mApnContexts.get(apnType);
return new LinkProperties();
}
+ @Override
+ public NetworkCapabilities getNetworkCapabilities(String apnType) {
+ ApnContext apnContext = mApnContexts.get(apnType);
+ if (apnContext!=null) {
+ DcAsyncChannel dataConnectionAc = apnContext.getDcAc();
+ if (dataConnectionAc != null) {
+ if (DBG) {
+ log("get active pdp is not null, return NetworkCapabilities for " + apnType);
+ }
+ return dataConnectionAc.getNetworkCapabilitiesSync();
+ }
+ }
+ if (DBG) log("return new NetworkCapabilities");
+ return new NetworkCapabilities();
+ }
@Override
// Return all active apn types
mIsProvisioning = false;
mProvisioningUrl = null;
- apnContext.networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED,
- apnContext.getReason(), null);
- apnContext.sendNetworkInfo();
-
mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
startNetStatPoll();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
*/
@Override
protected void onDataSetupComplete(AsyncResult ar) {
+
DcFailCause cause = DcFailCause.UNKNOWN;
boolean handleError = false;
ApnContext apnContext = null;
intent.putExtra(PhoneConstants.DATA_IFACE_NAME_KEY, iface);
}
}
- NetworkCapabilities networkCapabilities = apnContext.getNetworkCapabilities();
+ NetworkCapabilities networkCapabilities = getNetworkCapabilities(apnType);
if (networkCapabilities != null) {
intent.putExtra(PhoneConstants.DATA_NETWORK_CAPABILITIES_KEY,
networkCapabilities);
if(DBG) log("onDisconnectDone: EVENT_DISCONNECT_DONE apnContext=" + apnContext);
apnContext.setState(DctConstants.State.IDLE);
- apnContext.networkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED,
- apnContext.getReason(), null);
- apnContext.sendNetworkInfo();
mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
return null;
}
- private Pair<String, Integer> apnInfoForNetworkRequest(NetworkRequest nr) {
- NetworkCapabilities nc = nr.networkCapabilities;
- // for now, ignore the bandwidth stuff
- if (nc.getTransportTypes().size() > 0 &&
- nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == false) {
- return null;
- }
-
- // in the near term just do 1-1 matches.
- // TODO - actually try to match the set of capabilities
- Pair<String, Integer> result = null;
- boolean error = false;
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_DEFAULT,
- new Integer(ConnectivityManager.TYPE_MOBILE));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_MMS,
- new Integer(ConnectivityManager.TYPE_MOBILE_MMS));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_SUPL,
- new Integer(ConnectivityManager.TYPE_MOBILE_SUPL));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_DUN,
- new Integer(ConnectivityManager.TYPE_MOBILE_DUN));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_FOTA)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_FOTA,
- new Integer(ConnectivityManager.TYPE_MOBILE_FOTA));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IMS)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_IMS,
- new Integer(ConnectivityManager.TYPE_MOBILE_IMS));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_CBS)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_CBS,
- new Integer(ConnectivityManager.TYPE_MOBILE_CBS));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_IA)) {
- if (result != null) error = true;
- result = new Pair(PhoneConstants.APN_TYPE_IA,
- new Integer(ConnectivityManager.TYPE_MOBILE_IA));
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_RCS)) {
- if (result != null) error = true;
- result = null;
- loge("RCS APN type not yet supported");
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_XCAP)) {
- if (result != null) error = true;
- result = null;
- loge("XCAP APN type not yet supported");
- }
- if (nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_EIMS)) {
- if (result != null) error = true;
- result = null;
- loge("EIMS APN type not yet supported");
- }
- if (error) {
- loge("Multiple apn types specified in request - result is unspecified!");
- }
- return result;
- }
-
- private void onNetworkRequest(NetworkRequest nr, int score) {
- if (DBG) log("Cellular got networkRequest " + nr + " with score " + score);
- Pair<String, Integer> apnInfo = apnInfoForNetworkRequest(nr);
- ApnContext apnContext = null;
- if (apnInfo != null) {
- String apnType = apnInfo.first;
- int connType = apnInfo.second.intValue();
- if (DBG) log("Cellular using " + apnType + " for NetworkRequest " + nr);
- apnContext = mApnContexts.get(apnType);
- if (apnContext == null) {
- if (DBG) log("Attempting to create new ApnContext for " + apnType);
-
- // Load device network attributes from resources
- String[] networkConfigStrings = mPhone.getContext().getResources().getStringArray(
- com.android.internal.R.array.networkAttributes);
- for (String networkConfigString : networkConfigStrings) {
- NetworkConfig networkConfig = new NetworkConfig(networkConfigString);
- if (networkConfig.type == connType) {
- apnContext = addApnContext(apnType, networkConfig);
- break;
- }
- }
- }
- if (apnContext != null) {
- apnContext.addNetworkRequest(nr, score);
- } else {
- if (DBG) log("Cellular can't satisfy request " + nr);
- }
- } else {
- if (DBG) log("Cellular can't satisfy request " + nr);
- }
- }
-
- private void onNetworkRequestCancel(NetworkRequest nr) {
- Pair<String, Integer> apnInfo = apnInfoForNetworkRequest(nr);
- if (apnInfo != null) {
- if (DBG) log("Cellular turning off " + apnInfo.first + " for NetworkRequest " + nr);
- ApnContext apnContext = mApnContexts.get(apnInfo.first);
- apnContext.removeNetworkRequest(nr);
- if (apnContext.hasRequests() == false) {
- mApnContexts.remove(apnInfo.first);
- mPrioritySortedApnContexts.remove(apnContext);
- }
- } else {
- if (DBG) log("Cellular can't cancel request " + nr);
- }
- }
-
@Override
public void handleMessage (Message msg) {
if (DBG) log("handleMessage msg=" + msg);
}
switch (msg.what) {
- case NetworkFactoryProtocol.CMD_REQUEST_NETWORK:
- onNetworkRequest((NetworkRequest)msg.obj, msg.arg1);
- break;
-
- case NetworkFactoryProtocol.CMD_CANCEL_REQUEST:
- onNetworkRequestCancel((NetworkRequest)msg.obj);
- break;
-
case DctConstants.EVENT_RECORDS_LOADED:
onRecordsLoaded();
break;
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 +
" mDataConnectionAsyncChannels=" + mDataConnectionAcHashMap);
}
- if (apnContext.isEnabled()) {
+ if ((apnContext != null) && (apnContext.isEnabled())) {
apnContext.setReason(reason);
DctConstants.State apnContextState = apnContext.getState();
if (DBG) {
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 +
}
public NetworkCapabilities getNetworkCapabilities(String apnType) {
- ApnContext apnContext = mApnContexts.get(apnType);
- if (apnContext != null) {
- return apnContext.getNetworkCapabilities();
+ int id = apnTypeToId(apnType);
+ if (isApnIdEnabled(id)) {
+ DcAsyncChannel dcac = mDataConnectionAcHashMap.get(0);
+ return dcac.getNetworkCapabilitiesSync();
} else {
return new NetworkCapabilities();
}