am 29418e98: Merge change 22529 into eclair

Merge commit '29418e98731b4a5f94d9ac5f4a0df9d5d21bca55' into eclair-plus-aosp

* commit '29418e98731b4a5f94d9ac5f4a0df9d5d21bca55':
  Track apn Enable synchronously and notice failures
This commit is contained in:
Robert Greenwalt
2009-08-27 16:20:24 -07:00
committed by Android Git Automerger
3 changed files with 58 additions and 42 deletions

View File

@@ -71,7 +71,7 @@ public abstract class DataConnectionTracker extends Handler {
DORMANT DORMANT
} }
//***** Event Codes /***** Event Codes *****/
protected static final int EVENT_DATA_SETUP_COMPLETE = 1; protected static final int EVENT_DATA_SETUP_COMPLETE = 1;
protected static final int EVENT_RADIO_AVAILABLE = 3; protected static final int EVENT_RADIO_AVAILABLE = 3;
protected static final int EVENT_RECORDS_LOADED = 4; protected static final int EVENT_RECORDS_LOADED = 4;
@@ -100,8 +100,9 @@ public abstract class DataConnectionTracker extends Handler {
public static final int EVENT_CLEAN_UP_CONNECTION = 34; public static final int EVENT_CLEAN_UP_CONNECTION = 34;
protected static final int EVENT_CDMA_OTA_PROVISION = 35; protected static final int EVENT_CDMA_OTA_PROVISION = 35;
protected static final int EVENT_RESTART_RADIO = 36; protected static final int EVENT_RESTART_RADIO = 36;
private static final int EVENT_ENABLE_APN_REQUEST = 37;
//***** Constants /***** Constants *****/
protected static final int APN_INVALID_ID = -1; protected static final int APN_INVALID_ID = -1;
protected static final int APN_DEFAULT_ID = 0; protected static final int APN_DEFAULT_ID = 0;
@@ -111,6 +112,9 @@ public abstract class DataConnectionTracker extends Handler {
protected static final int APN_HIPRI_ID = 4; protected static final int APN_HIPRI_ID = 4;
protected static final int APN_NUM_TYPES = 5; protected static final int APN_NUM_TYPES = 5;
protected static final int APN_DISABLED = 0;
protected static final int APN_ENABLED = 1;
protected boolean[] dataEnabled = new boolean[APN_NUM_TYPES]; protected boolean[] dataEnabled = new boolean[APN_NUM_TYPES];
protected int enabledCount = 0; protected int enabledCount = 0;
@@ -247,7 +251,7 @@ public abstract class DataConnectionTracker extends Handler {
} }
// abstract handler methods // abstract handler methods
protected abstract void onTrySetupData(String reason); protected abstract boolean onTrySetupData(String reason);
protected abstract void onRoamingOff(); protected abstract void onRoamingOff();
protected abstract void onRoamingOn(); protected abstract void onRoamingOn();
protected abstract void onRadioAvailable(); protected abstract void onRadioAvailable();
@@ -258,10 +262,47 @@ public abstract class DataConnectionTracker extends Handler {
protected abstract void onVoiceCallEnded(); protected abstract void onVoiceCallEnded();
protected abstract void onCleanUpConnection(boolean tearDown, String reason); protected abstract void onCleanUpConnection(boolean tearDown, String reason);
//***** Overridden from Handler @Override
public void handleMessage (Message msg) { public void handleMessage (Message msg) {
switch (msg.what) { switch (msg.what) {
case EVENT_ENABLE_APN_REQUEST:
int apnId = msg.arg1;
synchronized (this) {
if (DBG) {
Log.d(LOG_TAG, "got EVENT_ENABLE_APN_REQUEST with apnType = " + apnId +
" and enable = " + msg.arg2);
Log.d(LOG_TAG, "dataEnabled[apnId] = " + dataEnabled[apnId] +
", enabledCount = " + enabledCount);
}
if (msg.arg2 == APN_ENABLED) {
// enable
if (!dataEnabled[apnId]) {
dataEnabled[apnId] = true;
enabledCount++;
if (enabledCount == 1) {
if (onTrySetupData(null) == false) {
// failed to setup data - note we can't optimize by only adj
// these after a successfull call. dataEnabled must be set
// prior or we think data is not available.
dataEnabled[apnId] = false;
enabledCount--;
}
}
}
} else {
// disable
if (dataEnabled[apnId]) {
dataEnabled[apnId] = false;
enabledCount--;
if (enabledCount == 0) {
onCleanUpConnection(true, Phone.REASON_DATA_DISABLED);
}
}
}
}
break;
case EVENT_TRY_SETUP_DATA: case EVENT_TRY_SETUP_DATA:
String reason = null; String reason = null;
if (msg.obj instanceof String) { if (msg.obj instanceof String) {
@@ -322,7 +363,7 @@ public abstract class DataConnectionTracker extends Handler {
* @return {@code false} if data connectivity has been explicitly disabled, * @return {@code false} if data connectivity has been explicitly disabled,
* {@code true} otherwise. * {@code true} otherwise.
*/ */
public boolean getDataEnabled() { public synchronized boolean getDataEnabled() {
return dataEnabled[APN_DEFAULT_ID]; return dataEnabled[APN_DEFAULT_ID];
} }
@@ -379,7 +420,7 @@ public abstract class DataConnectionTracker extends Handler {
protected abstract void setState(State s); protected abstract void setState(State s);
protected boolean isEnabled(int id) { protected synchronized boolean isEnabled(int id) {
if (id != APN_INVALID_ID) { if (id != APN_INVALID_ID) {
return dataEnabled[id]; return dataEnabled[id];
} }
@@ -429,7 +470,7 @@ public abstract class DataConnectionTracker extends Handler {
* {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}. * {@link Phone#APN_TYPE_MMS} and {@link Phone#APN_TYPE_SUPL}.
* @return * @return
*/ */
public int disableApnType(String type) { public synchronized int disableApnType(String type) {
if (DBG) Log.d(LOG_TAG, "disableApnType("+type+")"); if (DBG) Log.d(LOG_TAG, "disableApnType("+type+")");
int id = apnTypeToId(type); int id = apnTypeToId(type);
if (id == APN_INVALID_ID) { if (id == APN_INVALID_ID) {
@@ -452,27 +493,14 @@ public abstract class DataConnectionTracker extends Handler {
} }
} }
protected synchronized void setEnabled(int id, boolean enable) { protected void setEnabled(int id, boolean enable) {
if (DBG) Log.d(LOG_TAG, "setEnabled(" + id + ", " + enable + ") with old state = " + if (DBG) Log.d(LOG_TAG, "setEnabled(" + id + ", " + enable + ") with old state = " +
dataEnabled[id] + " and enabledCount = " + enabledCount); dataEnabled[id] + " and enabledCount = " + enabledCount);
if (dataEnabled[id] != enable) {
dataEnabled[id] = enable;
// count the total number of enabled APN's Message msg = obtainMessage(EVENT_ENABLE_APN_REQUEST);
// if we just enabled the first APN, start our Data connection, msg.arg1 = id;
// if we disabled the last, stop our data connection msg.arg2 = (enable ? APN_ENABLED : APN_DISABLED);
if (enable) { sendMessage(msg);
enabledCount++;
if (enabledCount == 1) {
setPrivateDataEnabled(true);
}
} else {
enabledCount--;
if (enabledCount == 0) {
setPrivateDataEnabled(false);
}
}
}
} }
/** /**
@@ -487,21 +515,9 @@ public abstract class DataConnectionTracker extends Handler {
* @return {@code true} if the operation succeeded * @return {@code true} if the operation succeeded
*/ */
public boolean setDataEnabled(boolean enable) { public boolean setDataEnabled(boolean enable) {
if (DBG) Log.d(LOG_TAG, "setDataEnabled("+enable+")"); if (DBG) Log.d(LOG_TAG, "setDataEnabled(" + enable + ")");
setEnabled(APN_DEFAULT_ID, enable); setEnabled(APN_DEFAULT_ID, enable);
return true; return true;
} }
private void setPrivateDataEnabled(boolean enable) {
if (DBG) Log.d(LOG_TAG, "setPrivateDataEnabled("+enable+")");
if (enable) {
sendMessage(obtainMessage(EVENT_TRY_SETUP_DATA));
} else {
Message msg = obtainMessage(EVENT_CLEAN_UP_CONNECTION);
msg.arg1 = 1; // tearDown is true
msg.obj = Phone.REASON_DATA_DISABLED;
sendMessage(msg);
}
}
} }

View File

@@ -627,8 +627,8 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
/** /**
* @override com.android.internal.telephony.DataConnectionTracker * @override com.android.internal.telephony.DataConnectionTracker
*/ */
protected void onTrySetupData(String reason) { protected boolean onTrySetupData(String reason) {
trySetupData(reason); return trySetupData(reason);
} }
/** /**

View File

@@ -1074,8 +1074,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
cleanUpConnection(true, Phone.REASON_APN_SWITCHED); cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
} }
protected void onTrySetupData(String reason) { protected boolean onTrySetupData(String reason) {
trySetupData(reason); return trySetupData(reason);
} }
/** /**