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

Commit 11b2912a authored by Oleg Petšjonkin's avatar Oleg Petšjonkin Committed by Android (Google) Code Review
Browse files

Merge "ColorFade: asyncronous cleanup on display remove" into main

parents 6c5e2411 6d0cf968
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -26,9 +26,12 @@ import android.util.Slog;
import android.view.Choreographer;
import android.view.Display;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.BackgroundThread;
import com.android.server.display.utils.DebugUtils;

import java.io.PrintWriter;
import java.util.concurrent.Executor;

/**
 * Controls the display power state.
@@ -75,10 +78,19 @@ final class DisplayPowerState {

    private Runnable mCleanListener;

    private Executor mAsyncDestroyExecutor;

    private volatile boolean mStopped;

    DisplayPowerState(
            DisplayBlanker blanker, ColorFade colorFade, int displayId, int displayState) {
        this(blanker, colorFade, displayId, displayState, BackgroundThread.getExecutor());
    }

    @VisibleForTesting
    DisplayPowerState(
            DisplayBlanker blanker, ColorFade colorFade, int displayId, int displayState,
            Executor asyncDestroyExecutor) {
        mHandler = new Handler(true /*async*/);
        mChoreographer = Choreographer.getInstance();
        mBlanker = blanker;
@@ -86,6 +98,7 @@ final class DisplayPowerState {
        mPhotonicModulator = new PhotonicModulator();
        mPhotonicModulator.start();
        mDisplayId = displayId;
        mAsyncDestroyExecutor = asyncDestroyExecutor;

        // At boot time, we don't know the screen's brightness,
        // so prepare to set it to a known state when the state is next applied.
@@ -321,7 +334,7 @@ final class DisplayPowerState {
        mStopped = true;
        mPhotonicModulator.interrupt();
        if (mColorFade != null) {
            mColorFade.destroy();
            mAsyncDestroyExecutor.execute(mColorFade::destroy);
        }
        mCleanListener = null;
        mHandler.removeCallbacksAndMessages(null);
+9 −1
Original line number Diff line number Diff line
@@ -23,8 +23,10 @@ import org.junit.Rule
import org.junit.Test
import org.mockito.junit.MockitoJUnit

import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import java.util.concurrent.Executor

@SmallTest
class DisplayPowerStateTest {
@@ -36,15 +38,21 @@ class DisplayPowerStateTest {

    private val mockBlanker = mock<DisplayBlanker>()
    private val mockColorFade = mock<ColorFade>()
    private val mockExecutor = mock<Executor>()

    @Before
    fun setUp() {
        displayPowerState = DisplayPowerState(mockBlanker, mockColorFade, 123, Display.STATE_ON)
        displayPowerState = DisplayPowerState(mockBlanker, mockColorFade, 123, Display.STATE_ON,
                mockExecutor)
    }

    @Test
    fun `destroys ColorFade on stop`() {
        displayPowerState.stop()
        val runnableCaptor = argumentCaptor<Runnable>()

        verify(mockExecutor).execute(runnableCaptor.capture())
        runnableCaptor.firstValue.run()

        verify(mockColorFade).destroy()
    }