summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/provider/Settings.java12
-rw-r--r--services/java/com/android/server/ConnectivityService.java73
2 files changed, 76 insertions, 9 deletions
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index a6c3387..9a4e0fc 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3166,6 +3166,18 @@ public final class Settings {
public static final String TTY_MODE_ENABLED = "tty_mode_enabled";
/**
+ * The number of milliseconds to delay before sending out Connectivyt Change broadcasts
+ * @hide
+ */
+ public static final String CONNECTIVITY_CHANGE_DELAY = "connectivity_change_delay";
+
+ /**
+ * Default value for CONNECTIVITY_CHANGE_DELAY in milliseconds.
+ * @hide
+ */
+ public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000;
+
+ /**
* Controls whether settings backup is enabled.
* Type: int ( 0 = disabled, 1 = enabled )
* @hide
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index bf9e014..3ae7a3f 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -254,6 +254,12 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private static final int EVENT_RESTORE_DNS =
MAX_NETWORK_STATE_TRACKER_EVENT + 11;
+ /**
+ * used internally to send a sticky broadcast delayed.
+ */
+ private static final int EVENT_SEND_STICKY_BROADCAST_INTENT =
+ MAX_NETWORK_STATE_TRACKER_EVENT + 12;
+
private Handler mHandler;
// list of DeathRecipients used to make sure features are turned off when
@@ -559,6 +565,17 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
+ private int getConnectivityChangeDelay() {
+ final ContentResolver cr = mContext.getContentResolver();
+
+ /** Check system properties for the default value then use secure settings value, if any. */
+ int defaultDelay = SystemProperties.getInt(
+ "conn." + Settings.Secure.CONNECTIVITY_CHANGE_DELAY,
+ Settings.Secure.CONNECTIVITY_CHANGE_DELAY_DEFAULT);
+ return Settings.Secure.getInt(cr, Settings.Secure.CONNECTIVITY_CHANGE_DELAY,
+ defaultDelay);
+ }
+
private int getPersistedNetworkPreference() {
final ContentResolver cr = mContext.getContentResolver();
@@ -1437,13 +1454,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// do this before we broadcast the change
handleConnectivityChange(prevNetType, doReset);
- sendStickyBroadcast(intent);
+ sendStickyBroadcastDelayed(intent, getConnectivityChangeDelay());
/*
* If the failover network is already connected, then immediately send
* out a followup broadcast indicating successful failover
*/
if (mActiveDefaultNetwork != -1) {
- sendConnectedBroadcast(mNetTrackers[mActiveDefaultNetwork].getNetworkInfo());
+ sendConnectedBroadcastDelayed(mNetTrackers[mActiveDefaultNetwork].getNetworkInfo(),
+ getConnectivityChangeDelay());
}
}
@@ -1497,11 +1515,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
sendGeneralBroadcast(info, ConnectivityManager.CONNECTIVITY_ACTION);
}
+ private void sendConnectedBroadcastDelayed(NetworkInfo info, int delayMs) {
+ sendGeneralBroadcastDelayed(info, ConnectivityManager.CONNECTIVITY_ACTION, delayMs);
+ }
+
private void sendInetConditionBroadcast(NetworkInfo info) {
sendGeneralBroadcast(info, ConnectivityManager.INET_CONDITION_ACTION);
}
- private void sendGeneralBroadcast(NetworkInfo info, String bcastType) {
+ private Intent makeGeneralIntent(NetworkInfo info, String bcastType) {
Intent intent = new Intent(bcastType);
intent.putExtra(ConnectivityManager.EXTRA_NETWORK_INFO, info);
if (info.isFailover()) {
@@ -1516,7 +1538,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
info.getExtraInfo());
}
intent.putExtra(ConnectivityManager.EXTRA_INET_CONDITION, mDefaultInetConditionPublished);
- sendStickyBroadcast(intent);
+ return intent;
+ }
+
+ private void sendGeneralBroadcast(NetworkInfo info, String bcastType) {
+ sendStickyBroadcast(makeGeneralIntent(info, bcastType));
+ }
+
+ private void sendGeneralBroadcastDelayed(NetworkInfo info, String bcastType, int delayMs) {
+ sendStickyBroadcastDelayed(makeGeneralIntent(info, bcastType), delayMs);
}
/**
@@ -1581,10 +1611,25 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mInitialBroadcast = new Intent(intent);
}
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ if (DBG) {
+ log("sendStickyBroadcast: NetworkInfo=" +
+ intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO));
+ }
+
mContext.sendStickyBroadcast(intent);
}
}
+ private void sendStickyBroadcastDelayed(Intent intent, int delayMs) {
+ if (delayMs <= 0) {
+ sendStickyBroadcast(intent);
+ } else {
+ if (DBG) log("sendStickyBroadcastDelayed: delayMs=" + delayMs + " intent=" + intent);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(
+ EVENT_SEND_STICKY_BROADCAST_INTENT, intent), delayMs);
+ }
+ }
+
void systemReady() {
synchronized(this) {
mSystemReady = true;
@@ -1658,7 +1703,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
thisNet.setTeardownRequested(false);
updateNetworkSettings(thisNet);
handleConnectivityChange(type, false);
- sendConnectedBroadcast(info);
+ sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay());
}
/**
@@ -2240,6 +2285,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
break;
}
+ case EVENT_SEND_STICKY_BROADCAST_INTENT:
+ {
+ Intent intent = (Intent)msg.obj;
+ log("EVENT_SEND_STICKY_BROADCAST_INTENT: sendStickyBroadcast intent=" + intent);
+ sendStickyBroadcast(intent);
+ break;
+ }
}
}
}
@@ -2435,10 +2487,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (DBG) log("event hold for obsolete network - aborting");
return;
}
- if (mDefaultInetConditionPublished == mDefaultInetCondition) {
- if (DBG) log("no change in condition - aborting");
- return;
- }
+ // TODO: Figure out why this optimization sometimes causes a
+ // change in mDefaultInetCondition to be missed and the
+ // UI to not be updated.
+ //if (mDefaultInetConditionPublished == mDefaultInetCondition) {
+ // if (DBG) log("no change in condition - aborting");
+ // return;
+ //}
NetworkInfo networkInfo = mNetTrackers[mActiveDefaultNetwork].getNetworkInfo();
if (networkInfo.isConnected() == false) {
if (DBG) log("default network not connected - aborting");