Periodically scan wifi when wifi is not connected and wifi lock is

grabbed in SipService.

bug: http://b/3077454
Change-Id: I153974325c29e0f927c8eb7fdbc4725aaf10087d
This commit is contained in:
Chung-yih Wang
2010-10-19 17:39:51 +08:00
committed by jsh
parent 0a6e717fb6
commit 4944fdd771

View File

@@ -79,6 +79,7 @@ public final class SipService extends ISipService.Stub {
private String mNetworkType; private String mNetworkType;
private boolean mConnected; private boolean mConnected;
private WakeupTimer mTimer; private WakeupTimer mTimer;
private WifiScanProcess mWifiScanProcess;
private WifiManager.WifiLock mWifiLock; private WifiManager.WifiLock mWifiLock;
private boolean mWifiOnly; private boolean mWifiOnly;
@@ -371,6 +372,7 @@ public final class SipService extends ISipService.Stub {
mContext.getSystemService(Context.WIFI_SERVICE)) mContext.getSystemService(Context.WIFI_SERVICE))
.createWifiLock(WifiManager.WIFI_MODE_FULL, TAG); .createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);
mWifiLock.acquire(); mWifiLock.acquire();
if (!mConnected) startWifiScanner();
} }
} }
@@ -379,6 +381,20 @@ public final class SipService extends ISipService.Stub {
if (DEBUG) Log.d(TAG, "~~~~~~~~~~~~~~~~~~~~~ release wifi lock"); if (DEBUG) Log.d(TAG, "~~~~~~~~~~~~~~~~~~~~~ release wifi lock");
mWifiLock.release(); mWifiLock.release();
mWifiLock = null; mWifiLock = null;
stopWifiScanner();
}
}
private synchronized void startWifiScanner() {
if (mWifiScanProcess == null) {
mWifiScanProcess = new WifiScanProcess();
}
mWifiScanProcess.start();
}
private synchronized void stopWifiScanner() {
if (mWifiScanProcess != null) {
mWifiScanProcess.stop();
} }
} }
@@ -413,8 +429,10 @@ public final class SipService extends ISipService.Stub {
for (SipSessionGroupExt group : mSipGroups.values()) { for (SipSessionGroupExt group : mSipGroups.values()) {
group.onConnectivityChanged(true); group.onConnectivityChanged(true);
} }
if (isWifi && (mWifiLock != null)) stopWifiScanner();
} else { } else {
mMyWakeLock.reset(); // in case there's a leak mMyWakeLock.reset(); // in case there's a leak
if (isWifi && (mWifiLock != null)) startWifiScanner();
} }
} catch (SipException e) { } catch (SipException e) {
Log.e(TAG, "onConnectivityChanged()", e); Log.e(TAG, "onConnectivityChanged()", e);
@@ -611,6 +629,36 @@ public final class SipService extends ISipService.Stub {
} }
} }
private class WifiScanProcess implements Runnable {
private static final String TAG = "\\WIFI_SCAN/";
private static final int INTERVAL = 60;
private boolean mRunning = false;
private WifiManager mWifiManager;
public void start() {
if (mRunning) return;
mRunning = true;
mTimer.set(INTERVAL * 1000, this);
}
WifiScanProcess() {
mWifiManager = (WifiManager)
mContext.getSystemService(Context.WIFI_SERVICE);
}
public void run() {
// scan and associate now
if (DEBUGV) Log.v(TAG, "just wake up here for wifi scanning...");
mWifiManager.startScanActive();
}
public void stop() {
mRunning = false;
mTimer.cancel(this);
}
}
// KeepAliveProcess is controlled by AutoRegistrationProcess. // KeepAliveProcess is controlled by AutoRegistrationProcess.
// All methods will be invoked in sync with SipService.this. // All methods will be invoked in sync with SipService.this.
private class KeepAliveProcess implements Runnable { private class KeepAliveProcess implements Runnable {