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:
@@ -331,7 +331,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
@@ -420,6 +422,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
||||
*/
|
||||
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. */
|
||||
final private InternalHandler mHandler;
|
||||
@@ -3290,6 +3301,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
||||
if (nai.networkRequests.get(mDefaultRequest.requestId) != null) {
|
||||
removeDataActivityTracking(nai);
|
||||
mActiveDefaultNetwork = ConnectivityManager.TYPE_NONE;
|
||||
requestNetworkTransitionWakelock(nai.name());
|
||||
}
|
||||
for (NetworkAgentInfo networkToActivate : toActivate) {
|
||||
networkToActivate.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
|
||||
@@ -3391,6 +3403,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
||||
public void handleMessage(Message msg) {
|
||||
NetworkInfo info;
|
||||
switch (msg.what) {
|
||||
case EVENT_EXPIRE_NET_TRANSITION_WAKELOCK:
|
||||
case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: {
|
||||
String causedBy = null;
|
||||
synchronized (ConnectivityService.this) {
|
||||
@@ -3398,10 +3411,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
||||
mNetTransitionWakeLock.isHeld()) {
|
||||
mNetTransitionWakeLock.release();
|
||||
causedBy = mNetTransitionWakeLockCausedBy;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (causedBy != null) {
|
||||
log("NetTransition Wakelock for " + causedBy + " released by timeout");
|
||||
if (msg.what == EVENT_EXPIRE_NET_TRANSITION_WAKELOCK) {
|
||||
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;
|
||||
}
|
||||
@@ -3602,15 +3620,15 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
||||
// restarted by subsequent callers.
|
||||
public void requestNetworkTransitionWakelock(String forWhom) {
|
||||
enforceConnectivityInternalPermission();
|
||||
int serialNum = 0;
|
||||
synchronized (this) {
|
||||
if (mNetTransitionWakeLock.isHeld()) return;
|
||||
mNetTransitionWakeLockSerialNumber++;
|
||||
serialNum = ++mNetTransitionWakeLockSerialNumber;
|
||||
mNetTransitionWakeLock.acquire();
|
||||
mNetTransitionWakeLockCausedBy = forWhom;
|
||||
}
|
||||
mHandler.sendMessageDelayed(mHandler.obtainMessage(
|
||||
EVENT_CLEAR_NET_TRANSITION_WAKELOCK,
|
||||
mNetTransitionWakeLockSerialNumber, 0),
|
||||
EVENT_EXPIRE_NET_TRANSITION_WAKELOCK, serialNum, 0),
|
||||
mNetTransitionWakeLockTimeout);
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user