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

Commit 06689aad authored by Valentin Iftime's avatar Valentin Iftime
Browse files

Start HOME intent when waking up TV device

 Add wakeup reason to HOME intent as extra.

Test: Put device to sleep (remote power button). Press remote POWER or HOME button.
  adb logcat | grep startReason
   => startDockOrHome startReason= WAKE_REASON_POWER_BUTTON or startDockOrHome startReason= WAKE_REASON_WAKE_KEY

Bug: 168223486
Change-Id: Ic7f98b802faeacebb9416fcb20ca183a553c105d
parent 677c97dd
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -612,12 +612,14 @@ public final class PowerManager {
     * @hide
     */
    public static class WakeData {
        public WakeData(long wakeTime, @WakeReason int wakeReason) {
        public WakeData(long wakeTime, @WakeReason int wakeReason, long sleepDuration) {
            this.wakeTime = wakeTime;
            this.wakeReason = wakeReason;
            this.sleepDuration = sleepDuration;
        }
        public long wakeTime;
        public @WakeReason int wakeReason;
        public long sleepDuration;
    }

    /**
+9 −0
Original line number Diff line number Diff line
@@ -89,6 +89,15 @@ public interface WindowManagerPolicyConstants {
     */
    String EXTRA_FROM_HOME_KEY = "android.intent.extra.FROM_HOME_KEY";

    /**
     * Extra for the start reason of the HOME intent.
     * Will be {@link PowerManager#WAKE_REASON_WAKE_KEY} or
     * {@link PowerManager#WAKE_REASON_POWER_BUTTON} when intent was sent through
     * {@link PhoneWindowManager#shouldWakeUpWithHomeIntent}.
     * @hide
     */
    String EXTRA_START_REASON = "android.intent.extra.EXTRA_START_REASON";

    // TODO: move this to a more appropriate place.
    interface PointerEventListener {
        /**
+5 −0
Original line number Diff line number Diff line
@@ -987,6 +987,11 @@
    <!-- Time to wait while a button is pressed before triggering a very long press. -->
    <integer name="config_veryLongPressTimeout">3500</integer>

    <!-- Time to wait before sending a HOME intent when waking up from power/home button.
         (0 - do not send HOME intent on wakeup)
    -->
    <integer name="config_wakeUpToLastStateTimeoutMillis">0</integer>

    <!-- Package name for default keyguard appwidget [DO NOT TRANSLATE] -->
    <string name="widget_default_package_name" translatable="false"></string>

+1 −0
Original line number Diff line number Diff line
@@ -438,6 +438,7 @@
  <java-symbol type="integer" name="config_veryLongPressTimeout" />
  <java-symbol type="integer" name="config_longPressOnBackBehavior" />
  <java-symbol type="bool" name="config_allowStartActivityForLongPressOnPowerInSetup" />
  <java-symbol type="integer" name="config_wakeUpToLastStateTimeoutMillis" />
  <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAdjust" />
  <java-symbol type="integer" name="config_lowMemoryKillerMinFreeKbytesAbsolute" />
  <java-symbol type="integer" name="config_max_pan_devices" />
+52 −9
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import static android.view.Display.STATE_OFF;
import static android.view.KeyEvent.KEYCODE_BACK;
import static android.view.KeyEvent.KEYCODE_DPAD_CENTER;
import static android.view.KeyEvent.KEYCODE_DPAD_DOWN;
import static android.view.KeyEvent.KEYCODE_HOME;
import static android.view.KeyEvent.KEYCODE_POWER;
import static android.view.KeyEvent.KEYCODE_UNKNOWN;
import static android.view.KeyEvent.KEYCODE_VOLUME_DOWN;
@@ -489,6 +490,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    boolean mWakeOnDpadKeyPress;
    boolean mWakeOnAssistKeyPress;
    boolean mWakeOnBackKeyPress;
    long mWakeUpToLastStateTimeout;

    private boolean mHandleVolumeKeysInWM;

@@ -1845,6 +1847,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mPerDisplayFocusEnabled = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_perDisplayFocusEnabled);

        mWakeUpToLastStateTimeout = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_wakeUpToLastStateTimeoutMillis);

        readConfigurationDependentBehaviors();

        mDisplayFoldController = DisplayFoldController.create(context, DEFAULT_DISPLAY);
@@ -2594,7 +2599,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        // can never break it, although if keyguard is on, we do let
        // it handle it, because that gives us the correct 5 second
        // timeout.
        if (keyCode == KeyEvent.KEYCODE_HOME) {
        if (keyCode == KEYCODE_HOME) {
            DisplayHomeButtonHandler handler = mDisplayHomeButtonHandlers.get(displayId);
            if (handler == null) {
                handler = new DisplayHomeButtonHandler(displayId);
@@ -3550,8 +3555,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        if (isValidGlobalKey(keyCode)
                && mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
            if (isWakeKey) {
                wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey,
                        PowerManager.WAKE_REASON_WAKE_KEY, "android.policy:KEY");
                wakeUpFromWakeKey(event);
            }
            return result;
        }
@@ -3847,8 +3851,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }

        if (isWakeKey) {
            wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey,
                    PowerManager.WAKE_REASON_WAKE_KEY, "android.policy:KEY");
            wakeUpFromWakeKey(event);
        }

        if ((result & ACTION_PASS_TO_USER) != 0) {
@@ -4287,9 +4290,39 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private boolean shouldWakeUpWithHomeIntent() {
        if (mWakeUpToLastStateTimeout <= 0) {
            return false;
        }

        final long sleepDuration = mPowerManagerInternal.getLastWakeup().sleepDuration;
        if (DEBUG_WAKEUP) {
            Log.i(TAG, "shouldWakeUpWithHomeIntent: sleepDuration= " + sleepDuration
                    + " mWakeUpToLastStateTimeout= " + mWakeUpToLastStateTimeout);
        }
        return sleepDuration > mWakeUpToLastStateTimeout;
    }

    private void wakeUpFromPowerKey(long eventTime) {
        wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey,
                PowerManager.WAKE_REASON_POWER_BUTTON, "android.policy:POWER");
        if (wakeUp(eventTime, mAllowTheaterModeWakeFromPowerKey,
                PowerManager.WAKE_REASON_POWER_BUTTON, "android.policy:POWER")) {
            // Start HOME with "reason" extra if sleeping for more than mWakeUpToLastStateTimeout
            if (shouldWakeUpWithHomeIntent()) {
                startDockOrHome(DEFAULT_DISPLAY, /*fromHomeKey*/ false, /*wakenFromDreams*/ true,
                        PowerManager.wakeReasonToString(PowerManager.WAKE_REASON_POWER_BUTTON));
            }
        }
    }

    private void wakeUpFromWakeKey(KeyEvent event) {
        if (wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey,
                PowerManager.WAKE_REASON_WAKE_KEY, "android.policy:KEY")) {
            // Start HOME with "reason" extra if sleeping for more than mWakeUpToLastStateTimeout
            if (shouldWakeUpWithHomeIntent() && event.getKeyCode() == KEYCODE_HOME) {
                startDockOrHome(DEFAULT_DISPLAY, /*fromHomeKey*/ true, /*wakenFromDreams*/ true,
                        PowerManager.wakeReasonToString(PowerManager.WAKE_REASON_WAKE_KEY));
            }
        }
    }

    private boolean wakeUp(long wakeTime, boolean wakeInTheaterMode, @WakeReason int reason,
@@ -4972,7 +5005,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        return null;
    }

    void startDockOrHome(int displayId, boolean fromHomeKey, boolean awakenFromDreams) {
    void startDockOrHome(int displayId, boolean fromHomeKey, boolean awakenFromDreams,
            String startReason) {
        try {
            ActivityManager.getService().stopAppSwitches();
        } catch (RemoteException e) {}
@@ -5000,11 +5034,20 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
        }

        if (DEBUG_WAKEUP) {
            Log.d(TAG, "startDockOrHome: startReason= " + startReason);
        }

        // Start home.
        mActivityTaskManagerInternal.startHomeOnDisplay(mCurrentUserId, "startDockOrHome",
        mActivityTaskManagerInternal.startHomeOnDisplay(mCurrentUserId, startReason,
                displayId, true /* allowInstrumenting */, fromHomeKey);
    }

    void startDockOrHome(int displayId, boolean fromHomeKey, boolean awakenFromDreams) {
        startDockOrHome(displayId, fromHomeKey, awakenFromDreams, /*startReason*/
                "startDockOrHome");
    }

    /**
     * goes to the home screen
     * @return whether it did anything
Loading