am d4c0b52e: am 1e05bc6f: am 5ca842ae: am 5d05a24c: Merge "Fix wifi disable during restore" into mnc-dev
* commit 'd4c0b52e2a425dbc6e3794aae33595959453e777': Fix wifi disable during restore
This commit is contained in:
@@ -148,7 +148,10 @@ public class SettingsBackupAgent extends BackupAgentHelper {
|
|||||||
private WifiManager mWfm;
|
private WifiManager mWfm;
|
||||||
private static String mWifiConfigFile;
|
private static String mWifiConfigFile;
|
||||||
|
|
||||||
|
// Chain of asynchronous operations used when rewriting the wifi supplicant config file
|
||||||
|
WifiDisableRunnable mWifiDisable = null;
|
||||||
WifiRestoreRunnable mWifiRestore = null;
|
WifiRestoreRunnable mWifiRestore = null;
|
||||||
|
int mRetainedWifiState; // used only during config file rewrite
|
||||||
|
|
||||||
// Class for capturing a network definition from the wifi supplicant config file
|
// Class for capturing a network definition from the wifi supplicant config file
|
||||||
static class Network {
|
static class Network {
|
||||||
@@ -407,9 +410,47 @@ public class SettingsBackupAgent extends BackupAgentHelper {
|
|||||||
writeNewChecksums(stateChecksums, newState);
|
writeNewChecksums(stateChecksums, newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class WifiDisableRunnable implements Runnable {
|
||||||
|
final WifiRestoreRunnable mNextPhase;
|
||||||
|
|
||||||
|
public WifiDisableRunnable(WifiRestoreRunnable next) {
|
||||||
|
mNextPhase = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (DEBUG_BACKUP) {
|
||||||
|
Log.v(TAG, "Disabling wifi during restore");
|
||||||
|
}
|
||||||
|
final ContentResolver cr = getContentResolver();
|
||||||
|
final int scanAlways = Settings.Global.getInt(cr,
|
||||||
|
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
|
||||||
|
final int retainedWifiState = enableWifi(false);
|
||||||
|
if (scanAlways != 0) {
|
||||||
|
Settings.Global.putInt(cr,
|
||||||
|
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tell the final stage how to clean up after itself
|
||||||
|
mNextPhase.setPriorState(retainedWifiState, scanAlways);
|
||||||
|
|
||||||
|
// And run it after a modest pause to give broadcasts and content
|
||||||
|
// observers time an opportunity to run on this looper thread, so
|
||||||
|
// that the wifi stack actually goes all the way down.
|
||||||
|
new Handler(getMainLooper()).postDelayed(mNextPhase, 2500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class WifiRestoreRunnable implements Runnable {
|
class WifiRestoreRunnable implements Runnable {
|
||||||
private byte[] restoredSupplicantData;
|
private byte[] restoredSupplicantData;
|
||||||
private byte[] restoredWifiConfigFile;
|
private byte[] restoredWifiConfigFile;
|
||||||
|
private int retainedWifiState; // provided by disable stage
|
||||||
|
private int scanAlways; // provided by disable stage
|
||||||
|
|
||||||
|
void setPriorState(int retainedState, int always) {
|
||||||
|
retainedWifiState = retainedState;
|
||||||
|
scanAlways = always;
|
||||||
|
}
|
||||||
|
|
||||||
void incorporateWifiSupplicant(BackupDataInput data) {
|
void incorporateWifiSupplicant(BackupDataInput data) {
|
||||||
restoredSupplicantData = new byte[data.getDataSize()];
|
restoredSupplicantData = new byte[data.getDataSize()];
|
||||||
@@ -437,20 +478,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
|
|||||||
public void run() {
|
public void run() {
|
||||||
if (restoredSupplicantData != null || restoredWifiConfigFile != null) {
|
if (restoredSupplicantData != null || restoredWifiConfigFile != null) {
|
||||||
if (DEBUG_BACKUP) {
|
if (DEBUG_BACKUP) {
|
||||||
Log.v(TAG, "Starting deferred restore of wifi data");
|
Log.v(TAG, "Applying restored wifi data");
|
||||||
}
|
}
|
||||||
final ContentResolver cr = getContentResolver();
|
|
||||||
final int scanAlways = Settings.Global.getInt(cr,
|
|
||||||
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
|
|
||||||
final int retainedWifiState = enableWifi(false);
|
|
||||||
if (scanAlways != 0) {
|
|
||||||
Settings.Global.putInt(cr,
|
|
||||||
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0);
|
|
||||||
}
|
|
||||||
// !!! Give the wifi stack a moment to quiesce. We've observed the
|
|
||||||
// response to disabling WIFI_SCAN_ALWAYS_AVAILABLE taking more
|
|
||||||
// than 1500ms, so we wait a generous 2500 here before proceeding.
|
|
||||||
try { Thread.sleep(2500); } catch (InterruptedException e) {}
|
|
||||||
if (restoredSupplicantData != null) {
|
if (restoredSupplicantData != null) {
|
||||||
restoreWifiSupplicant(FILE_WIFI_SUPPLICANT,
|
restoreWifiSupplicant(FILE_WIFI_SUPPLICANT,
|
||||||
restoredSupplicantData, restoredSupplicantData.length);
|
restoredSupplicantData, restoredSupplicantData.length);
|
||||||
@@ -465,7 +494,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
|
|||||||
}
|
}
|
||||||
// restore the previous WIFI state.
|
// restore the previous WIFI state.
|
||||||
if (scanAlways != 0) {
|
if (scanAlways != 0) {
|
||||||
Settings.Global.putInt(cr,
|
Settings.Global.putInt(getContentResolver(),
|
||||||
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, scanAlways);
|
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, scanAlways);
|
||||||
}
|
}
|
||||||
enableWifi(retainedWifiState == WifiManager.WIFI_STATE_ENABLED ||
|
enableWifi(retainedWifiState == WifiManager.WIFI_STATE_ENABLED ||
|
||||||
@@ -479,6 +508,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
|
|||||||
void initWifiRestoreIfNecessary() {
|
void initWifiRestoreIfNecessary() {
|
||||||
if (mWifiRestore == null) {
|
if (mWifiRestore == null) {
|
||||||
mWifiRestore = new WifiRestoreRunnable();
|
mWifiRestore = new WifiRestoreRunnable();
|
||||||
|
mWifiDisable = new WifiDisableRunnable(mWifiRestore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,13 +548,16 @@ public class SettingsBackupAgent extends BackupAgentHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If we have wifi data to restore, post a runnable to perform the
|
// If we have wifi data to restore, post a runnable to perform the
|
||||||
// bounce-and-update operation a little ways in the future.
|
// bounce-and-update operation a little ways in the future. The
|
||||||
|
// 'disable' runnable brings down the stack and remembers its state,
|
||||||
|
// and in turn schedules the 'restore' runnable to do the rewrite
|
||||||
|
// and cleanup operations.
|
||||||
if (mWifiRestore != null) {
|
if (mWifiRestore != null) {
|
||||||
long wifiBounceDelayMillis = Settings.Global.getLong(
|
long wifiBounceDelayMillis = Settings.Global.getLong(
|
||||||
getContentResolver(),
|
getContentResolver(),
|
||||||
Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS,
|
Settings.Global.WIFI_BOUNCE_DELAY_OVERRIDE_MS,
|
||||||
WIFI_BOUNCE_DELAY_MILLIS);
|
WIFI_BOUNCE_DELAY_MILLIS);
|
||||||
new Handler(getMainLooper()).postDelayed(mWifiRestore, wifiBounceDelayMillis);
|
new Handler(getMainLooper()).postDelayed(mWifiDisable, wifiBounceDelayMillis);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user