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
|
* 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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user