Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9c32bc8 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

WifiService: Wifi power management change



Put Wifi into an idle state immediately if the screen is turned off and the Wifi interface has no IP address.
We will continue to keep Wifi up for 15 minutes in the case where the screen is turned off when Wifi is fully connected.
This will allow us to go into a low power mode faster when Wifi is not actively being used.
It also avoids bringing up Wifi if the user just turns on the screen for a few seconds to check the clock, etc.

Fixes bug b/1736920

Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent 6342d393
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -1449,10 +1449,12 @@ public class WifiService extends IWifiManager.Stub {
                    Settings.System.getInt(mContext.getContentResolver(),
                                           Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0);
            if (action.equals(Intent.ACTION_SCREEN_ON)) {
                Log.d(TAG, "ACTION_SCREEN_ON");
                mAlarmManager.cancel(mIdleIntent);
                mDeviceIdle = false;
                mScreenOff = false;
            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                Log.d(TAG, "ACTION_SCREEN_OFF");
                mScreenOff = true;
                /*
                 * Set a timer to put Wi-Fi to sleep, but only if the screen is off
@@ -1461,12 +1463,20 @@ public class WifiService extends IWifiManager.Stub {
                 * or plugged in to AC).
                 */
                if (!shouldWifiStayAwake(stayAwakeConditions, mPluggedType)) {
                    if (!mWifiStateTracker.hasIpAddress()) {
                        // do not keep Wifi awake when screen is off if Wifi is not fully active
                        mDeviceIdle = true;
                        updateWifiState();
                    } else {
                        long triggerTime = System.currentTimeMillis() + idleMillis;
                        Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
                        mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                    }
                }
                /* we can return now -- there's nothing to do until we get the idle intent back */
                return;
            } else if (action.equals(ACTION_DEVICE_IDLE)) {
                Log.d(TAG, "got ACTION_DEVICE_IDLE");
                mDeviceIdle = true;
            } else if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
                /*
@@ -1477,9 +1487,11 @@ public class WifiService extends IWifiManager.Stub {
                 * the already-set timer.
                 */
                int pluggedType = intent.getIntExtra("plugged", 0);
                Log.d(TAG, "ACTION_BATTERY_CHANGED pluggedType: " + pluggedType);
                if (mScreenOff && shouldWifiStayAwake(stayAwakeConditions, mPluggedType) &&
                        !shouldWifiStayAwake(stayAwakeConditions, pluggedType)) {
                    long triggerTime = System.currentTimeMillis() + idleMillis;
                    Log.d(TAG, "setting ACTION_DEVICE_IDLE timer for " + idleMillis + "ms");
                    mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                    mPluggedType = pluggedType;
                    return;
+29 −21
Original line number Diff line number Diff line
@@ -161,8 +161,8 @@ public class WifiStateTracker extends NetworkStateTracker {
    private WifiInfo mWifiInfo;
    private List<ScanResult> mScanResults;
    private WifiManager mWM;
    private boolean mHaveIPAddress;
    private boolean mObtainingIPAddress;
    private boolean mHaveIpAddress;
    private boolean mObtainingIpAddress;
    private boolean mTornDownByConnMgr;
    /**
     * A DISCONNECT event has been received, but processing it
@@ -303,8 +303,8 @@ public class WifiStateTracker extends NetworkStateTracker {
        
        mWifiInfo = new WifiInfo();
        mWifiMonitor = new WifiMonitor(this);
        mHaveIPAddress = false;
        mObtainingIPAddress = false;
        mHaveIpAddress = false;
        mObtainingIpAddress = false;
        setTornDownByConnMgr(false);
        mDisconnectPending = false;
        mScanResults = new ArrayList<ScanResult>();
@@ -443,6 +443,14 @@ public class WifiStateTracker extends NetworkStateTracker {
        return mWifiInfo.getSupplicantState() == SupplicantState.COMPLETED;
    }

    /**
     * Report whether the Wi-Fi connection has successfully acquired an IP address.
     * @return {@code true} if the Wi-Fi connection has been assigned an IP address.
     */
    public boolean hasIpAddress() {
        return mHaveIpAddress;
    }

    /**
     * Send the tracker a notification that a user-entered password key
     * may be incorrect (i.e., caused authentication to fail).
@@ -724,7 +732,7 @@ public class WifiStateTracker extends NetworkStateTracker {
                    intent.putExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, true);
                    mContext.sendBroadcast(intent);
                }
                if (supplState == SupplicantState.COMPLETED && mHaveIPAddress) {
                if (supplState == SupplicantState.COMPLETED && mHaveIpAddress) {
                    setDetailedState(DetailedState.CONNECTED);
                } else {
                    setDetailedState(WifiInfo.getDetailedStateOf(supplState));
@@ -783,8 +791,8 @@ public class WifiStateTracker extends NetworkStateTracker {
                }
                setDetailedState(DetailedState.DISCONNECTED);
                setSupplicantState(SupplicantState.UNINITIALIZED);
                mHaveIPAddress = false;
                mObtainingIPAddress = false;
                mHaveIpAddress = false;
                mObtainingIpAddress = false;
                if (died) {
                    mWM.setWifiEnabled(false);
                }
@@ -954,7 +962,7 @@ public class WifiStateTracker extends NetworkStateTracker {
                }
                requestConnectionStatus(mWifiInfo);
                if (!(result.state == DetailedState.CONNECTED &&
                        (!mHaveIPAddress || mDisconnectPending))) {
                        (!mHaveIpAddress || mDisconnectPending))) {
                    setDetailedState(result.state);
                }

@@ -983,7 +991,7 @@ public class WifiStateTracker extends NetworkStateTracker {
                    mLastBssid = result.BSSID;
                    mLastSsid = mWifiInfo.getSSID();
                    mLastNetworkId = result.networkId;
                    if (mHaveIPAddress) {
                    if (mHaveIpAddress) {
                        setDetailedState(DetailedState.CONNECTED);
                    } else {
                        setDetailedState(DetailedState.OBTAINING_IPADDR);
@@ -1051,8 +1059,8 @@ public class WifiStateTracker extends NetworkStateTracker {
                    break;
                }
                mReconnectCount = 0;
                mHaveIPAddress = true;
                mObtainingIPAddress = false;
                mHaveIpAddress = true;
                mObtainingIpAddress = false;
                mWifiInfo.setIpAddress(mDhcpInfo.ipAddress);
                mLastSignalLevel = -1; // force update of signal strength
                if (mNetworkInfo.getDetailedState() != DetailedState.CONNECTED) {
@@ -1078,9 +1086,9 @@ public class WifiStateTracker extends NetworkStateTracker {
                    // [ 0- 0] Interface configuration succeeded (1) or failed (0)
                    EventLog.writeEvent(EVENTLOG_INTERFACE_CONFIGURATION_STATE_CHANGED, 0);
                
                    mHaveIPAddress = false;
                    mHaveIpAddress = false;
                    mWifiInfo.setIpAddress(0);
                    mObtainingIPAddress = false;
                    mObtainingIpAddress = false;
                    synchronized(this) {
                        WifiNative.disconnectCommand();
                    }
@@ -1156,18 +1164,18 @@ public class WifiStateTracker extends NetworkStateTracker {
        setPollTimer();
        mLastSignalLevel = -1;
        if (!mUseStaticIp) {
            if (!mHaveIPAddress && !mObtainingIPAddress) {
                mObtainingIPAddress = true;
            if (!mHaveIpAddress && !mObtainingIpAddress) {
                mObtainingIpAddress = true;
                mDhcpTarget.sendEmptyMessage(EVENT_DHCP_START);
            }
        } else {
            int event;
            if (NetworkUtils.configureInterface(mInterfaceName, mDhcpInfo)) {
                mHaveIPAddress = true;
                mHaveIpAddress = true;
                event = EVENT_INTERFACE_CONFIGURATION_SUCCEEDED;
                if (LOCAL_LOGD) Log.v(TAG, "Static IP configuration succeeded");
            } else {
                mHaveIPAddress = false;
                mHaveIpAddress = false;
                event = EVENT_INTERFACE_CONFIGURATION_FAILED;
                if (LOCAL_LOGD) Log.v(TAG, "Static IP configuration failed");
            }
@@ -1200,8 +1208,8 @@ public class WifiStateTracker extends NetworkStateTracker {
     * using the interface, stopping DHCP, and disabling the interface.
     */
    public void resetInterface() {
        mHaveIPAddress = false;
        mObtainingIPAddress = false;
        mHaveIpAddress = false;
        mObtainingIpAddress = false;
        mWifiInfo.setIpAddress(0);

        /*
@@ -1612,8 +1620,8 @@ public class WifiStateTracker extends NetworkStateTracker {
        }
        sb.append(LS).append(mWifiInfo).append(LS);
        sb.append(mDhcpInfo).append(LS);
        sb.append("haveIpAddress=").append(mHaveIPAddress).
                append(", obtainingIpAddress=").append(mObtainingIPAddress).
        sb.append("haveIpAddress=").append(mHaveIpAddress).
                append(", obtainingIpAddress=").append(mObtainingIpAddress).
                append(", scanModeActive=").append(mIsScanModeActive).append(LS).
                append("lastSignalLevel=").append(mLastSignalLevel).
                append(", explicitlyDisabled=").append(mTornDownByConnMgr);