Merge "Added support to reset offload brightness in post processor" into main
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 896670e4..e88ace1 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -1404,7 +1404,6 @@
             if (mScreenOffBrightnessSensorController != null) {
                 mScreenOffBrightnessSensorController.setLightSensorEnabled(false);
             }
-            setBrightnessFromOffload(PowerManager.BRIGHTNESS_INVALID_FLOAT);
         }
 
         if (!mFlags.isRefactorDisplayPowerControllerEnabled()) {
diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java
index da66879..282083f 100644
--- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java
+++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java
@@ -121,7 +121,8 @@
                 (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled())
                         ? mAutomaticBrightnessStrategy1 : mAutomaticBrightnessStrategy2;
         if (flags.isDisplayOffloadEnabled()) {
-            mOffloadBrightnessStrategy = injector.getOffloadBrightnessStrategy();
+            mOffloadBrightnessStrategy = injector
+                    .getOffloadBrightnessStrategy(mDisplayManagerFlags);
         } else {
             mOffloadBrightnessStrategy = null;
         }
@@ -314,8 +315,9 @@
             return new AutomaticBrightnessStrategy2(context, displayId);
         }
 
-        OffloadBrightnessStrategy getOffloadBrightnessStrategy() {
-            return new OffloadBrightnessStrategy();
+        OffloadBrightnessStrategy getOffloadBrightnessStrategy(
+                DisplayManagerFlags displayManagerFlags) {
+            return new OffloadBrightnessStrategy(displayManagerFlags);
         }
     }
 }
diff --git a/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategyConstants.java b/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategyConstants.java
new file mode 100644
index 0000000..504683a
--- /dev/null
+++ b/services/core/java/com/android/server/display/brightness/strategy/DisplayBrightnessStrategyConstants.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display.brightness.strategy;
+
+public class DisplayBrightnessStrategyConstants {
+    static final String INVALID_BRIGHTNESS_STRATEGY_NAME = "InvalidBrightnessStrategy";
+}
diff --git a/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
index 4abd028..dfd47a3 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/InvalidBrightnessStrategy.java
@@ -40,7 +40,7 @@
 
     @Override
     public String getName() {
-        return "InvalidBrightnessStrategy";
+        return DisplayBrightnessStrategyConstants.INVALID_BRIGHTNESS_STRATEGY_NAME;
     }
 
     @Override
diff --git a/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
index 64dc47c..60e5eb0 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/OffloadBrightnessStrategy.java
@@ -22,6 +22,7 @@
 import com.android.server.display.DisplayBrightnessState;
 import com.android.server.display.brightness.BrightnessReason;
 import com.android.server.display.brightness.StrategySelectionNotifyRequest;
+import com.android.server.display.feature.DisplayManagerFlags;
 
 import java.io.PrintWriter;
 
@@ -32,19 +33,29 @@
 public class OffloadBrightnessStrategy implements DisplayBrightnessStrategy {
 
     private float mOffloadScreenBrightness;
+    private final DisplayManagerFlags mDisplayManagerFlags;
 
-    public OffloadBrightnessStrategy() {
+    public OffloadBrightnessStrategy(DisplayManagerFlags displayManagerFlags) {
+        mDisplayManagerFlags = displayManagerFlags;
         mOffloadScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
     }
 
     @Override
     public DisplayBrightnessState updateBrightness(
             DisplayManagerInternal.DisplayPowerRequest displayPowerRequest) {
+        float offloadBrightness = mOffloadScreenBrightness;
+        if (mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()) {
+            // We reset the offload brightness to invalid so that there is no stale value lingering
+            // around. After this request is processed, the current brightness will be set to
+            // offload brightness. Hence even if the lux values don't become valid for the next
+            // request, we will fallback to the current brightness anyways.
+            mOffloadScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+        }
         BrightnessReason brightnessReason = new BrightnessReason();
         brightnessReason.setReason(BrightnessReason.REASON_OFFLOAD);
         return new DisplayBrightnessState.Builder()
-                .setBrightness(mOffloadScreenBrightness)
-                .setSdrBrightness(mOffloadScreenBrightness)
+                .setBrightness(offloadBrightness)
+                .setSdrBrightness(offloadBrightness)
                 .setBrightnessReason(brightnessReason)
                 .setDisplayBrightnessStrategyName(getName())
                 .setIsSlowChange(false)
@@ -77,7 +88,15 @@
     @Override
     public void strategySelectionPostProcessor(
             StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
-        // DO NOTHING
+        // We reset the offload brightness only if the selected strategy is not offload or invalid,
+        // as we are yet to use the brightness to evaluate the brightness state.
+        if (!strategySelectionNotifyRequest.getSelectedDisplayBrightnessStrategy().getName()
+                .equals(getName())
+                && !strategySelectionNotifyRequest.getSelectedDisplayBrightnessStrategy().getName()
+                .equals(
+                DisplayBrightnessStrategyConstants.INVALID_BRIGHTNESS_STRATEGY_NAME)) {
+            mOffloadScreenBrightness = PowerManager.BRIGHTNESS_INVALID_FLOAT;
+        }
     }
 
     @Override
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java
index b8858cc..f270650 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java
@@ -142,7 +142,8 @@
                 }
 
                 @Override
-                OffloadBrightnessStrategy getOffloadBrightnessStrategy() {
+                OffloadBrightnessStrategy getOffloadBrightnessStrategy(
+                        DisplayManagerFlags displayManagerFlags) {
                     return mOffloadBrightnessStrategy;
                 }
             };
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java
index 36719af..c2fa4eb 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/OffloadBrightnessStrategyTest.java
@@ -17,32 +17,44 @@
 package com.android.server.display.brightness.strategy;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import android.hardware.display.DisplayManagerInternal;
+import android.os.PowerManager;
 
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.server.display.DisplayBrightnessState;
 import com.android.server.display.brightness.BrightnessReason;
+import com.android.server.display.brightness.StrategySelectionNotifyRequest;
+import com.android.server.display.feature.DisplayManagerFlags;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 @SmallTest
 @RunWith(AndroidJUnit4.class)
 public class OffloadBrightnessStrategyTest {
 
+    @Mock
+    private DisplayManagerFlags mDisplayManagerFlags;
+
     private OffloadBrightnessStrategy mOffloadBrightnessStrategy;
 
     @Before
     public void before() {
-        mOffloadBrightnessStrategy = new OffloadBrightnessStrategy();
+        MockitoAnnotations.initMocks(this);
+        mOffloadBrightnessStrategy = new OffloadBrightnessStrategy(mDisplayManagerFlags);
     }
 
     @Test
     public void testUpdateBrightnessWhenOffloadBrightnessIsSet() {
+        when(mDisplayManagerFlags.isRefactorDisplayPowerControllerEnabled()).thenReturn(true);
         DisplayManagerInternal.DisplayPowerRequest
                 displayPowerRequest = new DisplayManagerInternal.DisplayPowerRequest();
         float brightness = 0.2f;
@@ -60,5 +72,41 @@
         DisplayBrightnessState updatedDisplayBrightnessState =
                 mOffloadBrightnessStrategy.updateBrightness(displayPowerRequest);
         assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
+        assertEquals(PowerManager.BRIGHTNESS_INVALID_FLOAT, mOffloadBrightnessStrategy
+                .getOffloadScreenBrightness(), 0.0f);
+    }
+
+    @Test
+    public void strategySelectionPostProcessor_resetsOffloadBrightness() {
+        StrategySelectionNotifyRequest strategySelectionNotifyRequest =
+                mock(StrategySelectionNotifyRequest.class);
+        DisplayBrightnessStrategy displayBrightnessStrategy = mock(DisplayBrightnessStrategy.class);
+        when(strategySelectionNotifyRequest.getSelectedDisplayBrightnessStrategy())
+                .thenReturn(displayBrightnessStrategy);
+
+        float offloadBrightness = 0.3f;
+        mOffloadBrightnessStrategy.setOffloadScreenBrightness(offloadBrightness);
+
+        // Brightness is not reset if offload strategy is selected
+        when(displayBrightnessStrategy.getName())
+                .thenReturn(mOffloadBrightnessStrategy.getName());
+        mOffloadBrightnessStrategy.strategySelectionPostProcessor(strategySelectionNotifyRequest);
+        assertEquals(offloadBrightness,
+                mOffloadBrightnessStrategy.getOffloadScreenBrightness(), 0.0f);
+
+        // Brightness is not reset if invalid strategy is selected
+        when(displayBrightnessStrategy.getName())
+                .thenReturn(DisplayBrightnessStrategyConstants.INVALID_BRIGHTNESS_STRATEGY_NAME);
+        mOffloadBrightnessStrategy.strategySelectionPostProcessor(strategySelectionNotifyRequest);
+        assertEquals(offloadBrightness,
+                mOffloadBrightnessStrategy.getOffloadScreenBrightness(), 0.0f);
+
+
+        // Brightness is reset if neither of invalid or offload strategy is selected
+        when(displayBrightnessStrategy.getName())
+                .thenReturn("DisplayBrightnessStrategy");
+        mOffloadBrightnessStrategy.strategySelectionPostProcessor(strategySelectionNotifyRequest);
+        assertEquals(PowerManager.BRIGHTNESS_INVALID_FLOAT,
+                mOffloadBrightnessStrategy.getOffloadScreenBrightness(), 0.0f);
     }
 }