From f03d62007c252271aa30360de90a50b3a974ee8f Mon Sep 17 00:00:00 2001 From: Irfan Sheriff Date: Thu, 17 May 2012 12:33:46 -0700 Subject: [PATCH] Fix persisting wifi state on setWifiEnabled() call When somebody makes a quick setWifiEnabled calls in back to back succession, we were missing setting the last state because we were only doing that when wifi was in a particular state from a state machine's perspective. This was done to handle the interaction b/w airplane and wifi and was done in the wrong way. That part is now moved to the code which detects airplane mode changes. In the longer term, I want to move the whole persisting code as part of wifi state machine which is more aware of the exact states wifi is in. Bug: 6504534 Change-Id: I452f3f4efdeb84458dcfd280269e09ffa3844f05 --- .../java/com/android/server/WifiService.java | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index bb38cd9fdad5d..0acf776fd2342 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -376,11 +376,7 @@ public class WifiService extends IWifiManager.Stub { @Override public void onReceive(Context context, Intent intent) { mAirplaneModeOn.set(isAirplaneModeOn()); - /* On airplane mode disable, restore wifi state if necessary */ - if (!mAirplaneModeOn.get() && (testAndClearWifiSavedState() || - mPersistWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE)) { - persistWifiState(true); - } + handleAirplaneModeToggled(); updateWifiState(); } }, @@ -447,7 +443,10 @@ public class WifiService extends IWifiManager.Stub { boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState(); Slog.i(TAG, "WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled")); - setWifiEnabled(wifiEnabled); + + // If we are already disabled (could be due to airplane mode), avoid changing persist + // state here + if (wifiEnabled) setWifiEnabled(wifiEnabled); mWifiWatchdogStateMachine = WifiWatchdogStateMachine. makeWifiWatchdogStateMachine(mContext); @@ -485,26 +484,43 @@ public class WifiService extends IWifiManager.Stub { } } - private void persistWifiState(boolean enabled) { - final ContentResolver cr = mContext.getContentResolver(); + private void handleWifiToggled(boolean enabled) { boolean airplane = mAirplaneModeOn.get() && isAirplaneToggleable(); if (enabled) { if (airplane) { - mPersistWifiState.set(WIFI_ENABLED_AIRPLANE_OVERRIDE); + persistWifiState(WIFI_ENABLED_AIRPLANE_OVERRIDE); } else { - mPersistWifiState.set(WIFI_ENABLED); + persistWifiState(WIFI_ENABLED); } } else { - if (airplane) { - mPersistWifiState.set(WIFI_DISABLED_AIRPLANE_ON); - } else { - mPersistWifiState.set(WIFI_DISABLED); - } + // When wifi state is disabled, we do not care + // if airplane mode is on or not. The scenario of + // wifi being disabled due to airplane mode being turned on + // is handled handleAirplaneModeToggled() + persistWifiState(WIFI_DISABLED); } - - Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, mPersistWifiState.get()); } + private void handleAirplaneModeToggled() { + if (mAirplaneModeOn.get()) { + // Wifi disabled due to airplane on + if (mWifiEnabled) { + persistWifiState(WIFI_DISABLED_AIRPLANE_ON); + } + } else { + /* On airplane mode disable, restore wifi state if necessary */ + if (testAndClearWifiSavedState() || + mPersistWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE) { + persistWifiState(WIFI_ENABLED); + } + } + } + + private void persistWifiState(int state) { + final ContentResolver cr = mContext.getContentResolver(); + mPersistWifiState.set(state); + Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, state); + } /** * see {@link android.net.wifi.WifiManager#pingSupplicant()} @@ -576,12 +592,9 @@ public class WifiService extends IWifiManager.Stub { * only CHANGE_WIFI_STATE is enforced */ - /* Avoids overriding of airplane state when wifi is already in the expected state */ - if (enable != mWifiEnabled) { - long ident = Binder.clearCallingIdentity(); - persistWifiState(enable); - Binder.restoreCallingIdentity(ident); - } + long ident = Binder.clearCallingIdentity(); + handleWifiToggled(enable); + Binder.restoreCallingIdentity(ident); if (enable) { if (!mIsReceiverRegistered) {