ColorFade draw should not be called after PowerState stopped

See also ag/25370441 - stop was setting Prepared falg to false and Ready to true before this change.

Bug: b/313038025
Test: atest DisplayPowerStateTest
Change-Id: Iba6eeaec7a813bbd6fa3494beb8b75e54258e0db
diff --git a/services/core/java/com/android/server/display/DisplayPowerState.java b/services/core/java/com/android/server/display/DisplayPowerState.java
index bcf27b4..90bad12 100644
--- a/services/core/java/com/android/server/display/DisplayPowerState.java
+++ b/services/core/java/com/android/server/display/DisplayPowerState.java
@@ -333,6 +333,8 @@
     public void stop() {
         mStopped = true;
         mPhotonicModulator.interrupt();
+        mColorFadePrepared = false;
+        mColorFadeReady = true;
         if (mColorFade != null) {
             mAsyncDestroyExecutor.execute(mColorFade::destroy);
         }
@@ -419,7 +421,8 @@
         }
     };
 
-    private final Runnable mColorFadeDrawRunnable = new Runnable() {
+    @VisibleForTesting
+    final Runnable mColorFadeDrawRunnable = new Runnable() {
         @Override
         public void run() {
             mColorFadeDrawPending = false;
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerStateTest.kt b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerStateTest.kt
index dafbbb3..33d3020 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerStateTest.kt
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerStateTest.kt
@@ -16,16 +16,24 @@
 
 package com.android.server.display
 
+import android.content.Context
+import android.os.Looper
 import android.view.Display
 import androidx.test.filters.SmallTest
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import org.mockito.ArgumentMatchers.anyFloat
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.eq
 import org.mockito.junit.MockitoJUnit
 
 import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.clearInvocations
 import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
 import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
 import java.util.concurrent.Executor
 
 @SmallTest
@@ -39,11 +47,16 @@
     private val mockBlanker = mock<DisplayBlanker>()
     private val mockColorFade = mock<ColorFade>()
     private val mockExecutor = mock<Executor>()
+    private val mockContext = mock<Context>()
 
     @Before
     fun setUp() {
+        if (Looper.myLooper() == null) {
+            Looper.prepare()
+        }
         displayPowerState = DisplayPowerState(mockBlanker, mockColorFade, 123, Display.STATE_ON,
                 mockExecutor)
+        whenever(mockColorFade.prepare(eq(mockContext), anyInt())).thenReturn(true)
     }
 
     @Test
@@ -56,4 +69,31 @@
 
         verify(mockColorFade).destroy()
     }
+
+    @Test
+    fun `GIVEN not prepared WHEN draw runnable is called THEN colorFade not drawn`() {
+        displayPowerState.mColorFadeDrawRunnable.run()
+
+        verify(mockColorFade, never()).draw(anyFloat())
+    }
+    @Test
+    fun `GIVEN prepared WHEN draw runnable is called THEN colorFade is drawn`() {
+        displayPowerState.prepareColorFade(mockContext, ColorFade.MODE_FADE)
+        clearInvocations(mockColorFade)
+
+        displayPowerState.mColorFadeDrawRunnable.run()
+
+        verify(mockColorFade).draw(anyFloat())
+    }
+
+    @Test
+    fun `GIVEN prepared AND stopped WHEN draw runnable is called THEN colorFade is not drawn`() {
+        displayPowerState.prepareColorFade(mockContext, ColorFade.MODE_FADE)
+        clearInvocations(mockColorFade)
+        displayPowerState.stop()
+
+        displayPowerState.mColorFadeDrawRunnable.run()
+
+        verify(mockColorFade, never()).draw(anyFloat())
+    }
 }
\ No newline at end of file