Simplify the network transition wakelock.

Make it all internal to ConnectivityService - we know when a network
is lost, so grab a wakelock then.
Moves the call out of WifiStateMachine which was grabbing at bad times
like every dhcp renewal or corp-network roam.  These would always
go the full 1 minute and chew up battery.

bug:15595155
Change-Id: I80157a818cc149072cc7706d78c1e79c6e679ab3
This commit is contained in:
Robert Greenwalt
2014-06-25 16:45:57 -07:00
parent bb427685db
commit 520d6dc471

View File

@@ -331,7 +331,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
/** /**
* used internally to clear a wakelock when transitioning * used internally to clear a wakelock when transitioning
* from one net to another * from one net to another. Clear happens when we get a new
* network - EVENT_EXPIRE_NET_TRANSITION_WAKELOCK happens
* after a timeout if no network is found (typically 1 min).
*/ */
private static final int EVENT_CLEAR_NET_TRANSITION_WAKELOCK = 8; private static final int EVENT_CLEAR_NET_TRANSITION_WAKELOCK = 8;
@@ -420,6 +422,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
*/ */
private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23; private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23;
/**
* used internally to expire a wakelock when transitioning
* from one net to another. Expire happens when we fail to find
* a new network (typically after 1 minute) -
* EVENT_CLEAR_NET_TRANSITION_WAKELOCK happens if we had found
* a replacement network.
*/
private static final int EVENT_EXPIRE_NET_TRANSITION_WAKELOCK = 24;
/** Handler used for internal events. */ /** Handler used for internal events. */
final private InternalHandler mHandler; final private InternalHandler mHandler;
@@ -3290,6 +3301,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (nai.networkRequests.get(mDefaultRequest.requestId) != null) { if (nai.networkRequests.get(mDefaultRequest.requestId) != null) {
removeDataActivityTracking(nai); removeDataActivityTracking(nai);
mActiveDefaultNetwork = ConnectivityManager.TYPE_NONE; mActiveDefaultNetwork = ConnectivityManager.TYPE_NONE;
requestNetworkTransitionWakelock(nai.name());
} }
for (NetworkAgentInfo networkToActivate : toActivate) { for (NetworkAgentInfo networkToActivate : toActivate) {
networkToActivate.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED); networkToActivate.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
@@ -3391,6 +3403,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
NetworkInfo info; NetworkInfo info;
switch (msg.what) { switch (msg.what) {
case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK:
case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: {
String causedBy = null; String causedBy = null;
synchronized (ConnectivityService.this) { synchronized (ConnectivityService.this) {
@@ -3398,10 +3411,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetTransitionWakeLock.isHeld()) { mNetTransitionWakeLock.isHeld()) {
mNetTransitionWakeLock.release(); mNetTransitionWakeLock.release();
causedBy = mNetTransitionWakeLockCausedBy; causedBy = mNetTransitionWakeLockCausedBy;
} else {
break;
} }
} }
if (causedBy != null) { if (msg.what == EVENT_EXPIRE_NET_TRANSITION_WAKELOCK) {
log("NetTransition Wakelock for " + causedBy + " released by timeout"); log("Failed to find a new network - expiring NetTransition Wakelock");
} else {
log("NetTransition Wakelock (" + (causedBy == null ? "unknown" : causedBy) +
" cleared because we found a replacement network");
} }
break; break;
} }
@@ -3602,15 +3620,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// restarted by subsequent callers. // restarted by subsequent callers.
public void requestNetworkTransitionWakelock(String forWhom) { public void requestNetworkTransitionWakelock(String forWhom) {
enforceConnectivityInternalPermission(); enforceConnectivityInternalPermission();
int serialNum = 0;
synchronized (this) { synchronized (this) {
if (mNetTransitionWakeLock.isHeld()) return; if (mNetTransitionWakeLock.isHeld()) return;
mNetTransitionWakeLockSerialNumber++; serialNum = ++mNetTransitionWakeLockSerialNumber;
mNetTransitionWakeLock.acquire(); mNetTransitionWakeLock.acquire();
mNetTransitionWakeLockCausedBy = forWhom; mNetTransitionWakeLockCausedBy = forWhom;
} }
mHandler.sendMessageDelayed(mHandler.obtainMessage( mHandler.sendMessageDelayed(mHandler.obtainMessage(
EVENT_CLEAR_NET_TRANSITION_WAKELOCK, EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0),
mNetTransitionWakeLockSerialNumber, 0),
mNetTransitionWakeLockTimeout); mNetTransitionWakeLockTimeout);
return; return;
} }