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

Commit a380572c authored by Calin Tataru's avatar Calin Tataru
Browse files

Keep track of the last sleep reason

This is needed to implement Doze for Android TV. The DeviceIdleController needs to know whether the screen turned off due to a timeout and adjust its own timeouts accordingly. This is particularly important if the screen off timeout is longer than 30 minutes which is how long the DeviceIdleController normally waits before going from STATE_INACTIVE to STATE_IDLE_PENDING.

Test: make -j
Bug: 111443261
Change-Id: Icd6a7ba43077fed3ac6ac9f77b5a017c42138337
parent f989a15e
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -56,6 +56,7 @@ interface IPowerManager
    void shutdown(boolean confirm, String reason, boolean wait);
    void shutdown(boolean confirm, String reason, boolean wait);
    void crash(String message);
    void crash(String message);
    int getLastShutdownReason();
    int getLastShutdownReason();
    int getLastSleepReason();


    void setStayOnSetting(int val);
    void setStayOnSetting(int val);
    void boostScreenBrightness(long time);
    void boostScreenBrightness(long time);
+33 −0
Original line number Original line Diff line number Diff line
@@ -396,6 +396,23 @@ public final class PowerManager {
     */
     */
    public static final int GO_TO_SLEEP_REASON_ACCESSIBILITY = 7;
    public static final int GO_TO_SLEEP_REASON_ACCESSIBILITY = 7;


    /**
     * @hide
     */
    public static String sleepReasonToString(int sleepReason) {
        switch (sleepReason) {
            case GO_TO_SLEEP_REASON_APPLICATION: return "application";
            case GO_TO_SLEEP_REASON_DEVICE_ADMIN: return "device_admin";
            case GO_TO_SLEEP_REASON_TIMEOUT: return "timeout";
            case GO_TO_SLEEP_REASON_LID_SWITCH: return "lid_switch";
            case GO_TO_SLEEP_REASON_POWER_BUTTON: return "power_button";
            case GO_TO_SLEEP_REASON_HDMI: return "hdmi";
            case GO_TO_SLEEP_REASON_SLEEP_BUTTON: return "sleep_button";
            case GO_TO_SLEEP_REASON_ACCESSIBILITY: return "accessibility";
            default: return Integer.toString(sleepReason);
        }
    }

    /**
    /**
     * Go to sleep flag: Skip dozing state and directly go to full sleep.
     * Go to sleep flag: Skip dozing state and directly go to full sleep.
     * @hide
     * @hide
@@ -1309,6 +1326,22 @@ public final class PowerManager {
        }
        }
    }
    }


    /**
     * Returns the reason the device last went to sleep (i.e. the last value of
     * the second argument of {@link #goToSleep(long, int, int) goToSleep}).
     *
     * @return One of the {@code GO_TO_SLEEP_REASON_*} constants.
     *
     * @hide
     */
    public int getLastSleepReason() {
        try {
            return mService.getLastSleepReason();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
    /**
     * Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
     * Intent that is broadcast when the state of {@link #isPowerSaveMode()} changes.
     * This broadcast is only sent to registered receivers.
     * This broadcast is only sent to registered receivers.
+24 −0
Original line number Original line Diff line number Diff line
@@ -288,6 +288,9 @@ public final class PowerManagerService extends SystemService
    private long mLastWakeTime;
    private long mLastWakeTime;
    private long mLastSleepTime;
    private long mLastSleepTime;


    // Last reason the device went to sleep.
    private int mLastSleepReason;

    // Timestamp of the last call to user activity.
    // Timestamp of the last call to user activity.
    private long mLastUserActivityTime;
    private long mLastUserActivityTime;
    private long mLastUserActivityTimeNoChangeLights;
    private long mLastUserActivityTimeNoChangeLights;
@@ -1433,6 +1436,7 @@ public final class PowerManagerService extends SystemService
            }
            }


            mLastSleepTime = eventTime;
            mLastSleepTime = eventTime;
            mLastSleepReason = reason;
            mSandmanSummoned = true;
            mSandmanSummoned = true;
            setWakefulnessLocked(WAKEFULNESS_DOZING, reason);
            setWakefulnessLocked(WAKEFULNESS_DOZING, reason);


@@ -3266,6 +3270,7 @@ public final class PowerManagerService extends SystemService
            pw.println("  mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist));
            pw.println("  mDeviceIdleTempWhitelist=" + Arrays.toString(mDeviceIdleTempWhitelist));
            pw.println("  mLastWakeTime=" + TimeUtils.formatUptime(mLastWakeTime));
            pw.println("  mLastWakeTime=" + TimeUtils.formatUptime(mLastWakeTime));
            pw.println("  mLastSleepTime=" + TimeUtils.formatUptime(mLastSleepTime));
            pw.println("  mLastSleepTime=" + TimeUtils.formatUptime(mLastSleepTime));
            pw.println("  mLastSleepReason=" + PowerManager.sleepReasonToString(mLastSleepReason));
            pw.println("  mLastUserActivityTime=" + TimeUtils.formatUptime(mLastUserActivityTime));
            pw.println("  mLastUserActivityTime=" + TimeUtils.formatUptime(mLastUserActivityTime));
            pw.println("  mLastUserActivityTimeNoChangeLights="
            pw.println("  mLastUserActivityTimeNoChangeLights="
                    + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights));
                    + TimeUtils.formatUptime(mLastUserActivityTimeNoChangeLights));
@@ -4404,6 +4409,19 @@ public final class PowerManagerService extends SystemService
            }
            }
        }
        }


        @Override // Binder call
        public int getLastSleepReason() {
            mContext.enforceCallingOrSelfPermission(
                    android.Manifest.permission.DEVICE_POWER, null);

            final long ident = Binder.clearCallingIdentity();
            try {
                return getLastSleepReasonInternal();
            } finally {
                Binder.restoreCallingIdentity(ident);
            }
        }

        /**
        /**
         * Reboots the device.
         * Reboots the device.
         *
         *
@@ -4619,6 +4637,12 @@ public final class PowerManagerService extends SystemService
        }
        }
    }
    }


    private int getLastSleepReasonInternal() {
        synchronized (mLock) {
            return mLastSleepReason;
        }
    }

    private final class LocalService extends PowerManagerInternal {
    private final class LocalService extends PowerManagerInternal {
        @Override
        @Override
        public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) {
        public void setScreenBrightnessOverrideFromWindowManager(int screenBrightness) {