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

Commit b6683c42 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #20494208: Go out of device idle when headset button is pressed

Rework how we record active transitions in battery stats to be
more general, and add an API that others can call in to
DeviceIdleController to request that we go out of idle mode.
use this for VOICE_SEARCH_HANDS_FREE.

Change-Id: Ie58de60e63036a4142881283835961fbcceec892
parent 22433a33
Loading
Loading
Loading
Loading
+10 −12
Original line number Original line Diff line number Diff line
@@ -1165,25 +1165,23 @@ public abstract class BatteryStats implements Parcelable {
        public static final int EVENT_USER_FOREGROUND = 0x0008;
        public static final int EVENT_USER_FOREGROUND = 0x0008;
        // Event for connectivity changed.
        // Event for connectivity changed.
        public static final int EVENT_CONNECTIVITY_CHANGED = 0x0009;
        public static final int EVENT_CONNECTIVITY_CHANGED = 0x0009;
        // Event for significant motion taking us out of idle mode.
        public static final int EVENT_SIGNIFICANT_MOTION = 0x000a;
        // Event for becoming active taking us out of idle mode.
        // Event for becoming active taking us out of idle mode.
        public static final int EVENT_ACTIVE = 0x000b;
        public static final int EVENT_ACTIVE = 0x000a;
        // Event for a package being installed.
        // Event for a package being installed.
        public static final int EVENT_PACKAGE_INSTALLED = 0x000c;
        public static final int EVENT_PACKAGE_INSTALLED = 0x000b;
        // Event for a package being uninstalled.
        // Event for a package being uninstalled.
        public static final int EVENT_PACKAGE_UNINSTALLED = 0x000d;
        public static final int EVENT_PACKAGE_UNINSTALLED = 0x000c;
        // Event for a package being uninstalled.
        // Event for a package being uninstalled.
        public static final int EVENT_ALARM = 0x000e;
        public static final int EVENT_ALARM = 0x000d;
        // Record that we have decided we need to collect new stats data.
        // Record that we have decided we need to collect new stats data.
        public static final int EVENT_COLLECT_EXTERNAL_STATS = 0x000f;
        public static final int EVENT_COLLECT_EXTERNAL_STATS = 0x000e;
        // Event for a package becoming inactive due to being unused for a period of time.
        // Event for a package becoming inactive due to being unused for a period of time.
        public static final int EVENT_PACKAGE_INACTIVE = 0x0010;
        public static final int EVENT_PACKAGE_INACTIVE = 0x000f;
        // Event for a package becoming active due to an interaction.
        // Event for a package becoming active due to an interaction.
        public static final int EVENT_PACKAGE_ACTIVE = 0x0011;
        public static final int EVENT_PACKAGE_ACTIVE = 0x0010;


        // Number of event types.
        // Number of event types.
        public static final int EVENT_COUNT = 0x0012;
        public static final int EVENT_COUNT = 0x0011;
        // Mask to extract out only the type part of the event.
        // Mask to extract out only the type part of the event.
        public static final int EVENT_TYPE_MASK = ~(EVENT_FLAG_START|EVENT_FLAG_FINISH);
        public static final int EVENT_TYPE_MASK = ~(EVENT_FLAG_START|EVENT_FLAG_FINISH);


@@ -1840,12 +1838,12 @@ public abstract class BatteryStats implements Parcelable {


    public static final String[] HISTORY_EVENT_NAMES = new String[] {
    public static final String[] HISTORY_EVENT_NAMES = new String[] {
            "null", "proc", "fg", "top", "sync", "wake_lock_in", "job", "user", "userfg", "conn",
            "null", "proc", "fg", "top", "sync", "wake_lock_in", "job", "user", "userfg", "conn",
            "motion", "active", "pkginst", "pkgunin", "alarm", "stats", "inactive", "active"
            "active", "pkginst", "pkgunin", "alarm", "stats", "inactive", "active"
    };
    };


    public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] {
    public static final String[] HISTORY_EVENT_CHECKIN_NAMES = new String[] {
            "Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
            "Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
            "Esm", "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa"
            "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa"
    };
    };


    /**
    /**
+1 −0
Original line number Original line Diff line number Diff line
@@ -28,4 +28,5 @@ interface IDeviceIdleController {
    int[] getAppIdTempWhitelist();
    int[] getAppIdTempWhitelist();
    boolean isPowerSaveWhitelistApp(String name);
    boolean isPowerSaveWhitelistApp(String name);
    void addPowerSaveTempWhitelistApp(String name, long duration, int userId);
    void addPowerSaveTempWhitelistApp(String name, long duration, int userId);
    void exitIdle(String reason);
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -116,7 +116,7 @@ interface IBatteryStats {
    void noteWifiRadioPowerState(int powerState, long timestampNs);
    void noteWifiRadioPowerState(int powerState, long timestampNs);
    void noteNetworkInterfaceType(String iface, int type);
    void noteNetworkInterfaceType(String iface, int type);
    void noteNetworkStatsEnabled();
    void noteNetworkStatsEnabled();
    void noteDeviceIdleMode(boolean enabled, boolean fromActive, boolean fromMotion);
    void noteDeviceIdleMode(boolean enabled, String activeReason, int activeUid);
    void setBatteryState(int status, int health, int plugType, int level, int temp, int volt);
    void setBatteryState(int status, int health, int plugType, int level, int temp, int volt);
    long getAwakeTimeBattery();
    long getAwakeTimeBattery();
    long getAwakeTimePlugged();
    long getAwakeTimePlugged();
+5 −11
Original line number Original line Diff line number Diff line
@@ -105,7 +105,7 @@ public final class BatteryStatsImpl extends BatteryStats {
    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
    private static final int MAGIC = 0xBA757475; // 'BATSTATS'


    // Current on-disk Parcel version
    // Current on-disk Parcel version
    private static final int VERSION = 127 + (USE_OLD_HISTORY ? 1000 : 0);
    private static final int VERSION = 128 + (USE_OLD_HISTORY ? 1000 : 0);


    // Maximum number of items we will record in the history.
    // Maximum number of items we will record in the history.
    private static final int MAX_HISTORY_ITEMS = 2000;
    private static final int MAX_HISTORY_ITEMS = 2000;
@@ -3271,11 +3271,11 @@ public final class BatteryStatsImpl extends BatteryStats {
        }
        }
    }
    }


    public void noteDeviceIdleModeLocked(boolean enabled, boolean fromActive, boolean fromMotion) {
    public void noteDeviceIdleModeLocked(boolean enabled, String activeReason, int activeUid) {
        final long elapsedRealtime = SystemClock.elapsedRealtime();
        final long elapsedRealtime = SystemClock.elapsedRealtime();
        final long uptime = SystemClock.uptimeMillis();
        final long uptime = SystemClock.uptimeMillis();
        boolean nowIdling = enabled;
        boolean nowIdling = enabled;
        if (mDeviceIdling && !enabled && !fromActive && !fromMotion) {
        if (mDeviceIdling && !enabled && activeReason == null) {
            // We don't go out of general idling mode until explicitly taken out of
            // We don't go out of general idling mode until explicitly taken out of
            // device idle through going active or significant motion.
            // device idle through going active or significant motion.
            nowIdling = true;
            nowIdling = true;
@@ -3293,14 +3293,8 @@ public final class BatteryStatsImpl extends BatteryStats {
        }
        }
        if (mDeviceIdleModeEnabled != enabled) {
        if (mDeviceIdleModeEnabled != enabled) {
            mDeviceIdleModeEnabled = enabled;
            mDeviceIdleModeEnabled = enabled;
            if (fromMotion) {
                addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_SIGNIFICANT_MOTION,
                        "", 0);
            }
            if (fromActive) {
            addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ACTIVE,
            addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ACTIVE,
                        "", 0);
                    activeReason != null ? activeReason : "", activeUid);
            }
            if (enabled) {
            if (enabled) {
                mHistoryCur.states2 |= HistoryItem.STATE2_DEVICE_IDLE_FLAG;
                mHistoryCur.states2 |= HistoryItem.STATE2_DEVICE_IDLE_FLAG;
                if (DEBUG_HISTORY) Slog.v(TAG, "Device idle mode enabled to: "
                if (DEBUG_HISTORY) Slog.v(TAG, "Device idle mode enabled to: "
+30 −16
Original line number Original line Diff line number Diff line
@@ -45,6 +45,7 @@ import android.os.Looper;
import android.os.Message;
import android.os.Message;
import android.os.PowerManager;
import android.os.PowerManager;
import android.os.PowerManagerInternal;
import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemClock;
@@ -487,7 +488,7 @@ public class DeviceIdleController extends SystemService
                    mLocalPowerManager.setDeviceIdleMode(true);
                    mLocalPowerManager.setDeviceIdleMode(true);
                    try {
                    try {
                        mNetworkPolicyManager.setDeviceIdleMode(true);
                        mNetworkPolicyManager.setDeviceIdleMode(true);
                        mBatteryStats.noteDeviceIdleMode(true, false, false);
                        mBatteryStats.noteDeviceIdleMode(true, null, Process.myUid());
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                    }
                    }
                    getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL);
                    getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL);
@@ -496,18 +497,19 @@ public class DeviceIdleController extends SystemService
                    mLocalPowerManager.setDeviceIdleMode(false);
                    mLocalPowerManager.setDeviceIdleMode(false);
                    try {
                    try {
                        mNetworkPolicyManager.setDeviceIdleMode(false);
                        mNetworkPolicyManager.setDeviceIdleMode(false);
                        mBatteryStats.noteDeviceIdleMode(false, false, false);
                        mBatteryStats.noteDeviceIdleMode(false, null, Process.myUid());
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                    }
                    }
                    getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL);
                    getContext().sendBroadcastAsUser(mIdleIntent, UserHandle.ALL);
                } break;
                } break;
                case MSG_REPORT_ACTIVE: {
                case MSG_REPORT_ACTIVE: {
                    boolean fromMotion = msg.arg1 != 0;
                    String activeReason = (String)msg.obj;
                    int activeUid = msg.arg1;
                    boolean needBroadcast = msg.arg2 != 0;
                    boolean needBroadcast = msg.arg2 != 0;
                    mLocalPowerManager.setDeviceIdleMode(false);
                    mLocalPowerManager.setDeviceIdleMode(false);
                    try {
                    try {
                        mNetworkPolicyManager.setDeviceIdleMode(false);
                        mNetworkPolicyManager.setDeviceIdleMode(false);
                        mBatteryStats.noteDeviceIdleMode(false, !fromMotion, fromMotion);
                        mBatteryStats.noteDeviceIdleMode(false, activeReason, activeUid);
                    } catch (RemoteException e) {
                    } catch (RemoteException e) {
                    }
                    }
                    if (needBroadcast) {
                    if (needBroadcast) {
@@ -578,6 +580,12 @@ public class DeviceIdleController extends SystemService
            }
            }
        }
        }


        @Override public void exitIdle(String reason) {
            getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER,
                    null);
            exitIdleInternal(reason);
        }

        @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
            DeviceIdleController.this.dump(fd, pw, args);
            DeviceIdleController.this.dump(fd, pw, args);
        }
        }
@@ -818,6 +826,12 @@ public class DeviceIdleController extends SystemService
        }
        }
    }
    }


    public void exitIdleInternal(String reason) {
        synchronized (this) {
            becomeActiveLocked(reason, Binder.getCallingUid());
        }
    }

    void updateDisplayLocked() {
    void updateDisplayLocked() {
        mCurDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
        mCurDisplay = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
        // We consider any situation where the display is showing something to be it on,
        // We consider any situation where the display is showing something to be it on,
@@ -830,7 +844,7 @@ public class DeviceIdleController extends SystemService
            becomeInactiveIfAppropriateLocked();
            becomeInactiveIfAppropriateLocked();
        } else if (screenOn) {
        } else if (screenOn) {
            mScreenOn = true;
            mScreenOn = true;
            becomeActiveLocked("screen");
            becomeActiveLocked("screen", Process.myUid());
        }
        }
    }
    }


@@ -841,21 +855,21 @@ public class DeviceIdleController extends SystemService
            becomeInactiveIfAppropriateLocked();
            becomeInactiveIfAppropriateLocked();
        } else if (charging) {
        } else if (charging) {
            mCharging = charging;
            mCharging = charging;
            becomeActiveLocked("charging");
            becomeActiveLocked("charging", Process.myUid());
        }
        }
    }
    }


    void scheduleReportActiveLocked(boolean fromMotion) {
    void scheduleReportActiveLocked(String activeReason, int activeUid) {
        Message msg = mHandler.obtainMessage(MSG_REPORT_ACTIVE, fromMotion ? 1 : 0,
        Message msg = mHandler.obtainMessage(MSG_REPORT_ACTIVE, activeUid,
                mState == STATE_IDLE ? 1 : 0);
                mState == STATE_IDLE ? 1 : 0, activeReason);
        mHandler.sendMessage(msg);
        mHandler.sendMessage(msg);
    }
    }


    void becomeActiveLocked(String reason) {
    void becomeActiveLocked(String activeReason, int activeUid) {
        if (DEBUG) Slog.i(TAG, "becomeActiveLocked, reason = " + reason);
        if (DEBUG) Slog.i(TAG, "becomeActiveLocked, reason = " + activeReason);
        if (mState != STATE_ACTIVE) {
        if (mState != STATE_ACTIVE) {
            EventLogTags.writeDeviceIdle(STATE_ACTIVE, reason);
            EventLogTags.writeDeviceIdle(STATE_ACTIVE, activeReason);
            scheduleReportActiveLocked(false);
            scheduleReportActiveLocked(activeReason, activeUid);
            mState = STATE_ACTIVE;
            mState = STATE_ACTIVE;
            mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
            mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
            mNextIdlePendingDelay = 0;
            mNextIdlePendingDelay = 0;
@@ -896,7 +910,7 @@ public class DeviceIdleController extends SystemService
        if ((now+mConstants.MIN_TIME_TO_ALARM) > mAlarmManager.getNextWakeFromIdleTime()) {
        if ((now+mConstants.MIN_TIME_TO_ALARM) > mAlarmManager.getNextWakeFromIdleTime()) {
            // Whoops, there is an upcoming alarm.  We don't actually want to go idle.
            // Whoops, there is an upcoming alarm.  We don't actually want to go idle.
            if (mState != STATE_ACTIVE) {
            if (mState != STATE_ACTIVE) {
                becomeActiveLocked("alarm");
                becomeActiveLocked("alarm", Process.myUid());
            }
            }
            return;
            return;
        }
        }
@@ -954,7 +968,7 @@ public class DeviceIdleController extends SystemService
        // state to wait again for no motion.  Note that we only monitor for significant
        // state to wait again for no motion.  Note that we only monitor for significant
        // motion after moving out of the inactive state, so no need to worry about that.
        // motion after moving out of the inactive state, so no need to worry about that.
        if (mState != STATE_ACTIVE) {
        if (mState != STATE_ACTIVE) {
            scheduleReportActiveLocked(true);
            scheduleReportActiveLocked("motion", Process.myUid());
            mState = STATE_ACTIVE;
            mState = STATE_ACTIVE;
            mInactiveTimeout = mConstants.MOTION_INACTIVE_TIMEOUT;
            mInactiveTimeout = mConstants.MOTION_INACTIVE_TIMEOUT;
            EventLogTags.writeDeviceIdle(mState, "motion");
            EventLogTags.writeDeviceIdle(mState, "motion");
@@ -1240,7 +1254,7 @@ public class DeviceIdleController extends SystemService
                    synchronized (this) {
                    synchronized (this) {
                        if (!mIdleDisabled) {
                        if (!mIdleDisabled) {
                            mIdleDisabled = true;
                            mIdleDisabled = true;
                            becomeActiveLocked("disabled");
                            becomeActiveLocked("disabled", Process.myUid());
                            pw.println("Idle mode disabled");
                            pw.println("Idle mode disabled");
                        }
                        }
                    }
                    }
Loading