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

Commit e454a698 authored by Galia Peycheva's avatar Galia Peycheva
Browse files

Handle dream restart

When a startDream is called directly after a stopDream for the same
DreamService, the old instance should be stopped and the state
should be cleared. Otherwise, the old dream's
mStopStubbornDreamRunnable messes up the state in the dream manager
and power manager.

In this CL we stop the old dream immediately if a startDream is
called for the same dream component while the old dream is gently
waking. This ensures that the dream state is cleared.

Bug: 260205205
Bug: 260094933
Bug: 265110360
Test: 2x adb shell cmd dreams start-dreaming - verify the device is
      dreaming afterwards
Change-Id: Ibd261038430a38f2fa519549372ddbf19d7cb36b
(cherry picked from commit 4bd7a879)
Merged-In: Ibd261038430a38f2fa519549372ddbf19d7cb36b
parent 5adb6255
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Objects;

/**
 * Internal controller for starting and stopping the current dream and managing related state.
@@ -119,10 +120,20 @@ final class DreamController {
                    + ", isPreviewMode=" + isPreviewMode + ", canDoze=" + canDoze
                    + ", userId=" + userId + ", reason='" + reason + "'");

            if (mCurrentDream != null) {
                mPreviousDreams.add(mCurrentDream);
            }
            final DreamRecord oldDream = mCurrentDream;
            mCurrentDream = new DreamRecord(token, name, isPreviewMode, canDoze, userId, wakeLock);
            if (oldDream != null) {
                if (!oldDream.mWakingGently) {
                    // We will stop these previous dreams once the new dream is started.
                    mPreviousDreams.add(oldDream);
                } else if (Objects.equals(oldDream.mName, mCurrentDream.mName)) {
                    // We are attempting to start a dream that is currently waking up gently.
                    // Let's silently stop the old instance here to clear the dream state.
                    // This should happen after the new mCurrentDream is set to avoid announcing
                    // a "dream stopped" state.
                    stopDreamInstance(/* immediately */ true, "restarting same dream", oldDream);
                }
            }

            mCurrentDream.mDreamStartTime = SystemClock.elapsedRealtime();
            MetricsLogger.visible(mContext,