Merge "Persist wifi override in airplane mode" into honeycomb-mr1

This commit is contained in:
Irfan Sheriff
2011-03-09 09:30:28 -08:00
committed by Android (Google) Code Review

View File

@ -62,6 +62,7 @@ import android.util.Slog;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicBoolean;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@ -99,9 +100,6 @@ public class WifiService extends IWifiManager.Stub {
/* Chipset supports background scan */
private final boolean mBackgroundScanSupported;
// true if the user enabled Wifi while in airplane mode
private AtomicBoolean mAirplaneModeOverwridden = new AtomicBoolean(false);
private final LockList mLocks = new LockList();
// some wifi lock statistics
private int mFullHighPerfLocksAcquired;
@ -144,6 +142,14 @@ public class WifiService extends IWifiManager.Stub {
private static final String ACTION_DEVICE_IDLE =
"com.android.server.WifiManager.action.DEVICE_IDLE";
private static final int WIFI_DISABLED = 0;
private static final int WIFI_ENABLED = 1;
/* Wifi enabled while in airplane mode */
private static final int WIFI_ENABLED_AIRPLANE_OVERRIDE = 2;
private AtomicInteger mWifiState = new AtomicInteger(WIFI_DISABLED);
private AtomicBoolean mAirplaneModeOn = new AtomicBoolean(false);
private boolean mIsReceiverRegistered = false;
@ -338,10 +344,10 @@ public class WifiService extends IWifiManager.Stub {
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// clear our flag indicating the user has overwridden airplane mode
mAirplaneModeOverwridden.set(false);
// on airplane disable, restore Wifi if the saved state indicates so
if (!isAirplaneModeOn() && testAndClearWifiSavedState()) {
mAirplaneModeOn.set(isAirplaneModeOn());
/* On airplane mode disable, restore wifi state if necessary */
if (!mAirplaneModeOn.get() && (testAndClearWifiSavedState() ||
mWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE)) {
persistWifiEnabled(true);
}
updateWifiState();
@ -402,9 +408,10 @@ public class WifiService extends IWifiManager.Stub {
* This function is used only at boot time
*/
public void checkAndStartWifi() {
/* Start if Wi-Fi is enabled or the saved state indicates Wi-Fi was on */
boolean wifiEnabled = !isAirplaneModeOn()
&& (getPersistedWifiEnabled() || testAndClearWifiSavedState());
mAirplaneModeOn.set(isAirplaneModeOn());
mWifiState.set(getPersistedWifiState());
/* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */
boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
Slog.i(TAG, "WifiService starting up with Wi-Fi " +
(wifiEnabled ? "enabled" : "disabled"));
setWifiEnabled(wifiEnabled);
@ -423,20 +430,38 @@ public class WifiService extends IWifiManager.Stub {
return (wifiSavedState == 1);
}
private boolean getPersistedWifiEnabled() {
private int getPersistedWifiState() {
final ContentResolver cr = mContext.getContentResolver();
try {
return Settings.Secure.getInt(cr, Settings.Secure.WIFI_ON) == 1;
return Settings.Secure.getInt(cr, Settings.Secure.WIFI_ON);
} catch (Settings.SettingNotFoundException e) {
Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, 0);
return false;
Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, WIFI_DISABLED);
return WIFI_DISABLED;
}
}
private boolean shouldWifiBeEnabled() {
if (mAirplaneModeOn.get()) {
return mWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE;
} else {
return mWifiState.get() != WIFI_DISABLED;
}
}
private void persistWifiEnabled(boolean enabled) {
final ContentResolver cr = mContext.getContentResolver();
Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, enabled ? 1 : 0);
if (enabled) {
if (isAirplaneModeOn() && isAirplaneToggleable()) {
mWifiState.set(WIFI_ENABLED_AIRPLANE_OVERRIDE);
} else {
mWifiState.set(WIFI_ENABLED);
}
} else {
mWifiState.set(WIFI_DISABLED);
}
Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, mWifiState.get());
}
/**
* see {@link android.net.wifi.WifiManager#pingSupplicant()}
@ -490,11 +515,6 @@ public class WifiService extends IWifiManager.Stub {
Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
}
// set a flag if the user is enabling Wifi while in airplane mode
if (enable && isAirplaneModeOn() && isAirplaneToggleable()) {
mAirplaneModeOverwridden.set(true);
}
if (enable) {
reportStartWorkSource();
}
@ -1037,11 +1057,8 @@ public class WifiService extends IWifiManager.Stub {
}
private void updateWifiState() {
boolean wifiEnabled = getPersistedWifiEnabled();
boolean airplaneMode = isAirplaneModeOn() && !mAirplaneModeOverwridden.get();
boolean lockHeld = mLocks.hasLocks();
int strongestLockMode = WifiManager.WIFI_MODE_FULL;
boolean wifiShouldBeEnabled = wifiEnabled && !airplaneMode;
boolean wifiShouldBeStarted = !mDeviceIdle || lockHeld;
if (lockHeld) {
@ -1053,11 +1070,11 @@ public class WifiService extends IWifiManager.Stub {
}
/* Disable tethering when airplane mode is enabled */
if (airplaneMode) {
if (mAirplaneModeOn.get()) {
mWifiStateMachine.setWifiApEnabled(null, false);
}
if (wifiShouldBeEnabled) {
if (shouldWifiBeEnabled()) {
if (wifiShouldBeStarted) {
reportStartWorkSource();
mWifiStateMachine.setWifiEnabled(true);