Cleanup ConnectivityServices network configuration

Don't instantiate objects not needed for the device.

bug: 2226064
This commit is contained in:
Robert Greenwalt
2009-10-30 14:17:42 -07:00
parent 312b4e2421
commit ec05b3cd06

View File

@@ -114,45 +114,24 @@ public class ConnectivityService extends IConnectivityManager.Stub {
public NetworkAttributes(String init) { public NetworkAttributes(String init) {
String fragments[] = init.split(","); String fragments[] = init.split(",");
mName = fragments[0].toLowerCase(); mName = fragments[0].toLowerCase();
if (fragments[1].toLowerCase().equals("wifi")) { mType = Integer.parseInt(fragments[1]);
mRadio = ConnectivityManager.TYPE_WIFI; mRadio = Integer.parseInt(fragments[2]);
} else { mPriority = Integer.parseInt(fragments[3]);
mRadio = ConnectivityManager.TYPE_MOBILE;
}
if (mName.equals("default")) {
mType = mRadio;
} else if (mName.equals("mms")) {
mType = ConnectivityManager.TYPE_MOBILE_MMS;
} else if (mName.equals("supl")) {
mType = ConnectivityManager.TYPE_MOBILE_SUPL;
} else if (mName.equals("dun")) {
mType = ConnectivityManager.TYPE_MOBILE_DUN;
} else if (mName.equals("hipri")) {
mType = ConnectivityManager.TYPE_MOBILE_HIPRI;
}
mPriority = Integer.parseInt(fragments[2]);
} }
public boolean isDefault() { public boolean isDefault() {
return (mType == mRadio); return (mType == mRadio);
} }
} }
NetworkAttributes[] mNetAttributes; NetworkAttributes[] mNetAttributes;
int mNetworksDefined;
private class RadioAttributes { private class RadioAttributes {
public String mName;
public int mPriority;
public int mSimultaneity; public int mSimultaneity;
public int mType; public int mType;
public RadioAttributes(String init) { public RadioAttributes(String init) {
String fragments[] = init.split(","); String fragments[] = init.split(",");
mName = fragments[0].toLowerCase(); mType = Integer.parseInt(fragments[0]);
mPriority = Integer.parseInt(fragments[1]); mSimultaneity = Integer.parseInt(fragments[1]);
mSimultaneity = Integer.parseInt(fragments[2]);
if (mName.equals("wifi")) {
mType = ConnectivityManager.TYPE_WIFI;
} else {
mType = ConnectivityManager.TYPE_MOBILE;
}
} }
} }
RadioAttributes[] mRadioAttributes; RadioAttributes[] mRadioAttributes;
@@ -209,48 +188,87 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetworkPreference = getPersistedNetworkPreference(); mNetworkPreference = getPersistedNetworkPreference();
mRadioAttributes = new RadioAttributes[ConnectivityManager.MAX_RADIO_TYPE+1];
mNetAttributes = new NetworkAttributes[ConnectivityManager.MAX_NETWORK_TYPE+1];
// Load device network attributes from resources // Load device network attributes from resources
mNetAttributes = new NetworkAttributes[
ConnectivityManager.MAX_NETWORK_TYPE+1];
mRadioAttributes = new RadioAttributes[
ConnectivityManager.MAX_RADIO_TYPE+1];
String[] naStrings = context.getResources().getStringArray(
com.android.internal.R.array.networkAttributes);
// TODO - what if the setting has gaps/unknown types?
for (String a : naStrings) {
NetworkAttributes n = new NetworkAttributes(a);
mNetAttributes[n.mType] = n;
}
String[] raStrings = context.getResources().getStringArray( String[] raStrings = context.getResources().getStringArray(
com.android.internal.R.array.radioAttributes); com.android.internal.R.array.radioAttributes);
for (String a : raStrings) { for (String raString : raStrings) {
RadioAttributes r = new RadioAttributes(a); RadioAttributes r = new RadioAttributes(raString);
if (r.mType > ConnectivityManager.MAX_RADIO_TYPE) {
Log.e(TAG, "Error in radioAttributes - ignoring attempt to define type " + r.mType);
continue;
}
if (mRadioAttributes[r.mType] != null) {
Log.e(TAG, "Error in radioAttributes - ignoring attempt to redefine type " +
r.mType);
continue;
}
mRadioAttributes[r.mType] = r; mRadioAttributes[r.mType] = r;
} }
// high priority first String[] naStrings = context.getResources().getStringArray(
mPriorityList = new int[naStrings.length]; com.android.internal.R.array.networkAttributes);
{ for (String naString : naStrings) {
int priority = 0; //lowest try {
int nextPos = naStrings.length-1; NetworkAttributes n = new NetworkAttributes(naString);
while (nextPos>-1) { if (n.mType > ConnectivityManager.MAX_NETWORK_TYPE) {
for (int i = 0; i < mNetAttributes.length; i++) { Log.e(TAG, "Error in networkAttributes - ignoring attempt to define type " +
if(mNetAttributes[i].mPriority == priority) { n.mType);
mPriorityList[nextPos--] = i; continue;
}
} }
priority++; if (mNetAttributes[n.mType] != null) {
Log.e(TAG, "Error in networkAttributes - ignoring attempt to redefine type " +
n.mType);
continue;
}
if (mRadioAttributes[n.mRadio] == null) {
Log.e(TAG, "Error in networkAttributes - ignoring attempt to use undefined " +
"radio " + n.mRadio + " in network type " + n.mType);
continue;
}
mNetAttributes[n.mType] = n;
mNetworksDefined++;
} catch(Exception e) {
// ignore it - leave the entry null
} }
} }
mNetRequestersPids = // high priority first
new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1]; mPriorityList = new int[mNetworksDefined];
for (int i=0; i<=ConnectivityManager.MAX_NETWORK_TYPE; i++) { {
int insertionPoint = mNetworksDefined-1;
int currentLowest = 0;
int nextLowest = 0;
while (insertionPoint > -1) {
for (NetworkAttributes na : mNetAttributes) {
if (na == null) continue;
if (na.mPriority < currentLowest) continue;
if (na.mPriority > currentLowest) {
if (na.mPriority < nextLowest || nextLowest == 0) {
nextLowest = na.mPriority;
}
continue;
}
mPriorityList[insertionPoint--] = na.mType;
}
currentLowest = nextLowest;
nextLowest = 0;
}
}
mNetRequestersPids = new ArrayList[ConnectivityManager.MAX_NETWORK_TYPE+1];
for (int i : mPriorityList) {
mNetRequestersPids[i] = new ArrayList(); mNetRequestersPids[i] = new ArrayList();
} }
mFeatureUsers = new ArrayList(); mFeatureUsers = new ArrayList();
mNumDnsEntries = 0;
mTestMode = SystemProperties.get("cm.test.mode").equals("true")
&& SystemProperties.get("ro.build.type").equals("eng");
/* /*
* Create the network state trackers for Wi-Fi and mobile * Create the network state trackers for Wi-Fi and mobile
* data. Maybe this could be done with a factory class, * data. Maybe this could be done with a factory class,
@@ -258,49 +276,33 @@ public class ConnectivityService extends IConnectivityManager.Stub {
* the number of different network types is not going * the number of different network types is not going
* to change very often. * to change very often.
*/ */
if (DBG) Log.v(TAG, "Starting Wifi Service."); for (int netType : mPriorityList) {
WifiStateTracker wst = new WifiStateTracker(context, mHandler); switch (mNetAttributes[netType].mRadio) {
WifiService wifiService = new WifiService(context, wst); case ConnectivityManager.TYPE_WIFI:
ServiceManager.addService(Context.WIFI_SERVICE, wifiService); if (DBG) Log.v(TAG, "Starting Wifi Service.");
mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst; WifiStateTracker wst = new WifiStateTracker(context, mHandler);
WifiService wifiService = new WifiService(context, wst);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);
mNetTrackers[ConnectivityManager.TYPE_WIFI] = wst;
wst.startMonitoring();
mNetTrackers[ConnectivityManager.TYPE_MOBILE] = // Constructing this starts it too
new MobileDataStateTracker(context, mHandler, mWifiWatchdogService = new WifiWatchdogService(context, wst);
ConnectivityManager.TYPE_MOBILE, Phone.APN_TYPE_DEFAULT, break;
"MOBILE"); case ConnectivityManager.TYPE_MOBILE:
mNetTrackers[netType] = new MobileDataStateTracker(context, mHandler,
mNetTrackers[ConnectivityManager.TYPE_MOBILE_MMS] = netType, mNetAttributes[netType].mName);
new MobileDataStateTracker(context, mHandler, mNetTrackers[netType].startMonitoring();
ConnectivityManager.TYPE_MOBILE_MMS, Phone.APN_TYPE_MMS, break;
"MOBILE_MMS"); default:
Log.e(TAG, "Trying to create a DataStateTracker for an unknown radio type " +
mNetTrackers[ConnectivityManager.TYPE_MOBILE_SUPL] = mNetAttributes[netType].mRadio);
new MobileDataStateTracker(context, mHandler, continue;
ConnectivityManager.TYPE_MOBILE_SUPL, Phone.APN_TYPE_SUPL, }
"MOBILE_SUPL"); }
mNetTrackers[ConnectivityManager.TYPE_MOBILE_DUN] =
new MobileDataStateTracker(context, mHandler,
ConnectivityManager.TYPE_MOBILE_DUN, Phone.APN_TYPE_DUN,
"MOBILE_DUN");
mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI] =
new MobileDataStateTracker(context, mHandler,
ConnectivityManager.TYPE_MOBILE_HIPRI, Phone.APN_TYPE_HIPRI,
"MOBILE_HIPRI");
mNumDnsEntries = 0;
mTestMode = SystemProperties.get("cm.test.mode").equals("true")
&& SystemProperties.get("ro.build.type").equals("eng");
for (NetworkStateTracker t : mNetTrackers)
t.startMonitoring();
// Constructing this starts it too
mWifiWatchdogService = new WifiWatchdogService(context, wst);
} }
/** /**
* Sets the preferred network. * Sets the preferred network.
* @param preference the new preference * @param preference the new preference
@@ -308,6 +310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
public synchronized void setNetworkPreference(int preference) { public synchronized void setNetworkPreference(int preference) {
enforceChangePermission(); enforceChangePermission();
if (ConnectivityManager.isNetworkTypeValid(preference) && if (ConnectivityManager.isNetworkTypeValid(preference) &&
mNetAttributes[preference] != null &&
mNetAttributes[preference].isDefault()) { mNetAttributes[preference].isDefault()) {
if (mNetworkPreference != preference) { if (mNetworkPreference != preference) {
persistNetworkPreference(preference); persistNetworkPreference(preference);
@@ -355,7 +358,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
return; return;
for (int t=0; t <= ConnectivityManager.MAX_RADIO_TYPE; t++) { for (int t=0; t <= ConnectivityManager.MAX_RADIO_TYPE; t++) {
if (t != mNetworkPreference && if (t != mNetworkPreference && mNetTrackers[t] != null &&
mNetTrackers[t].getNetworkInfo().isConnected()) { mNetTrackers[t].getNetworkInfo().isConnected()) {
if (DBG) { if (DBG) {
Log.d(TAG, "tearing down " + Log.d(TAG, "tearing down " +
@@ -386,7 +389,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
public NetworkInfo getActiveNetworkInfo() { public NetworkInfo getActiveNetworkInfo() {
enforceAccessPermission(); enforceAccessPermission();
for (int type=0; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) { for (int type=0; type <= ConnectivityManager.MAX_NETWORK_TYPE; type++) {
if (!mNetAttributes[type].isDefault()) { if (mNetAttributes[type] == null || !mNetAttributes[type].isDefault()) {
continue; continue;
} }
NetworkStateTracker t = mNetTrackers[type]; NetworkStateTracker t = mNetTrackers[type];
@@ -413,10 +416,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
public NetworkInfo[] getAllNetworkInfo() { public NetworkInfo[] getAllNetworkInfo() {
enforceAccessPermission(); enforceAccessPermission();
NetworkInfo[] result = new NetworkInfo[mNetTrackers.length]; NetworkInfo[] result = new NetworkInfo[mNetworksDefined];
int i = 0; int i = 0;
for (NetworkStateTracker t : mNetTrackers) { for (NetworkStateTracker t : mNetTrackers) {
result[i++] = t.getNetworkInfo(); if(t != null) result[i++] = t.getNetworkInfo();
} }
return result; return result;
} }
@@ -425,7 +428,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
boolean result = true; boolean result = true;
enforceChangePermission(); enforceChangePermission();
for (NetworkStateTracker t : mNetTrackers) { for (NetworkStateTracker t : mNetTrackers) {
result = t.setRadio(turnOn) && result; if (t != null) result = t.setRadio(turnOn) && result;
} }
return result; return result;
} }
@@ -493,7 +496,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
": " + feature); ": " + feature);
} }
enforceChangePermission(); enforceChangePermission();
if (!ConnectivityManager.isNetworkTypeValid(networkType)) { if (!ConnectivityManager.isNetworkTypeValid(networkType) ||
mNetAttributes[networkType] == null) {
return Phone.APN_REQUEST_FAILED; return Phone.APN_REQUEST_FAILED;
} }
@@ -659,7 +663,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
} }
tracker = mNetTrackers[usedNetworkType]; tracker = mNetTrackers[usedNetworkType];
if(usedNetworkType != networkType) { if (tracker == null) {
return -1;
}
if (usedNetworkType != networkType) {
Integer currentPid = new Integer(pid); Integer currentPid = new Integer(pid);
reassessPidDns(pid, true); reassessPidDns(pid, true);
mNetRequestersPids[usedNetworkType].remove(currentPid); mNetRequestersPids[usedNetworkType].remove(currentPid);
@@ -697,9 +704,10 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
NetworkStateTracker tracker = mNetTrackers[networkType]; NetworkStateTracker tracker = mNetTrackers[networkType];
if (!tracker.getNetworkInfo().isConnected() || tracker.isTeardownRequested()) { if (tracker == null || !tracker.getNetworkInfo().isConnected() ||
tracker.isTeardownRequested()) {
if (DBG) { if (DBG) {
Log.d(TAG, "requestRouteToHost on down network (" + networkType + " - dropped"); Log.d(TAG, "requestRouteToHost on down network (" + networkType + ") - dropped");
} }
return false; return false;
} }
@@ -737,7 +745,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
int numConnectedNets = 0; int numConnectedNets = 0;
for (NetworkStateTracker nt : mNetTrackers) { for (NetworkStateTracker nt : mNetTrackers) {
if (nt.getNetworkInfo().isConnected() && if (nt != null && nt.getNetworkInfo().isConnected() &&
!nt.isTeardownRequested()) { !nt.isTeardownRequested()) {
++numConnectedNets; ++numConnectedNets;
} }
@@ -814,9 +822,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
int newPriority = -1; int newPriority = -1;
for (int checkType=0; checkType <= for (int checkType=0; checkType <=
ConnectivityManager.MAX_NETWORK_TYPE; checkType++) { ConnectivityManager.MAX_NETWORK_TYPE; checkType++) {
if (checkType == prevNetType) { if (checkType == prevNetType) continue;
continue; if (mNetAttributes[checkType] == null) continue;
}
if (mNetAttributes[checkType].isDefault()) { if (mNetAttributes[checkType].isDefault()) {
/* TODO - if we have multiple nets we could use /* TODO - if we have multiple nets we could use
* we may want to put more thought into which we choose * we may want to put more thought into which we choose
@@ -825,11 +832,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
newType = checkType; newType = checkType;
break; break;
} }
if (mRadioAttributes[mNetAttributes[checkType].mRadio]. if (mNetAttributes[checkType].mPriority > newPriority) {
mPriority > newPriority) {
newType = checkType; newType = checkType;
newPriority = mRadioAttributes[mNetAttributes[newType]. newPriority = mNetAttributes[newType].mPriority;
mRadio].mPriority;
} }
} }
} }
@@ -1198,7 +1203,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
pw.println(); pw.println();
for (NetworkStateTracker nst : mNetTrackers) { for (NetworkStateTracker nst : mNetTrackers) {
if (nst.getNetworkInfo().isConnected()) { if (nst != null && nst.getNetworkInfo().isConnected()) {
pw.println("Active network: " + nst.getNetworkInfo(). pw.println("Active network: " + nst.getNetworkInfo().
getTypeName()); getTypeName());
} }