Add availability query method to TintController
Bug: 123352608
Test: atest FrameworksServicesTests:ColorDisplayServiceTest
Change-Id: I514d8e78dff678994bf5746ce08b1ecae675f76d
diff --git a/services/core/java/com/android/server/display/ColorDisplayService.java b/services/core/java/com/android/server/display/ColorDisplayService.java
index 591ce8d..b3a1a06 100644
--- a/services/core/java/com/android/server/display/ColorDisplayService.java
+++ b/services/core/java/com/android/server/display/ColorDisplayService.java
@@ -23,6 +23,7 @@
import static android.hardware.display.ColorDisplayManager.COLOR_MODE_BOOSTED;
import static android.hardware.display.ColorDisplayManager.COLOR_MODE_NATURAL;
import static android.hardware.display.ColorDisplayManager.COLOR_MODE_SATURATED;
+
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_NIGHT_DISPLAY;
import static com.android.server.display.DisplayTransformManager.LEVEL_COLOR_MATRIX_SATURATION;
@@ -65,10 +66,9 @@
import android.util.MathUtils;
import android.util.Slog;
import android.view.SurfaceControl;
+import android.view.SurfaceControl.DisplayPrimaries;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.AnimationUtils;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.DisplayPrimaries;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -79,6 +79,7 @@
import com.android.server.twilight.TwilightListener;
import com.android.server.twilight.TwilightManager;
import com.android.server.twilight.TwilightState;
+
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
@@ -145,6 +146,7 @@
private float[] mCurrentColorTemperatureXYZ;
private boolean mSetUp = false;
private float[] mMatrixDisplayWhiteBalance = new float[16];
+ private Boolean mIsAvailable;
@Override
public void setUp(Context context, boolean needsLinear) {
@@ -255,6 +257,14 @@
return LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE;
}
+ @Override
+ public boolean isAvailable(Context context) {
+ if (mIsAvailable == null) {
+ mIsAvailable = ColorDisplayManager.isDisplayWhiteBalanceAvailable(context);
+ }
+ return mIsAvailable;
+ }
+
/**
* Format a given matrix into a string.
*
@@ -280,9 +290,7 @@
@Override
public void dump(PrintWriter pw) {
synchronized (mLock) {
- pw.println("ColorDisplayService");
pw.println(" mSetUp = " + mSetUp);
-
if (!mSetUp) {
return;
}
@@ -402,6 +410,11 @@
public int getLevel() {
return LEVEL_COLOR_MATRIX_SATURATION;
}
+
+ @Override
+ public boolean isAvailable(Context context) {
+ return ColorDisplayManager.isColorTransformAccelerated(context);
+ }
};
/**
@@ -623,7 +636,7 @@
// existing activated state. This ensures consistency of tint across the color mode change.
onDisplayColorModeChanged(mNightDisplayController.getColorMode());
- if (ColorDisplayManager.isNightDisplayAvailable(getContext())) {
+ if (mNightDisplayTintController.isAvailable(getContext())) {
// Reset the activated state.
mNightDisplayTintController.setActivated(null);
@@ -641,7 +654,7 @@
}
}
- if (ColorDisplayManager.isDisplayWhiteBalanceAvailable(getContext())) {
+ if (mDisplayWhiteBalanceTintController.isAvailable(getContext())) {
// Prepare the display white balance transform matrix.
mDisplayWhiteBalanceTintController.setUp(getContext(), true /* needsLinear */);
@@ -658,7 +671,7 @@
mNightDisplayController = null;
}
- if (ColorDisplayManager.isNightDisplayAvailable(getContext())) {
+ if (mNightDisplayTintController.isAvailable(getContext())) {
if (mNightDisplayAutoMode != null) {
mNightDisplayAutoMode.onStop();
mNightDisplayAutoMode = null;
@@ -666,7 +679,7 @@
mNightDisplayTintController.endAnimator();
}
- if (ColorDisplayManager.isDisplayWhiteBalanceAvailable(getContext())) {
+ if (mDisplayWhiteBalanceTintController.isAvailable(getContext())) {
mDisplayWhiteBalanceTintController.endAnimator();
}
}
@@ -714,9 +727,11 @@
mNightDisplayTintController.cancelAnimator();
mDisplayWhiteBalanceTintController.cancelAnimator();
- mNightDisplayTintController
- .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix(mode));
- mNightDisplayTintController.setMatrix(getNightDisplayColorTemperatureSetting());
+ if (mNightDisplayTintController.isAvailable(getContext())) {
+ mNightDisplayTintController
+ .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix(mode));
+ mNightDisplayTintController.setMatrix(getNightDisplayColorTemperatureSetting());
+ }
updateDisplayWhiteBalanceStatus();
@@ -1064,13 +1079,32 @@
private void dumpInternal(PrintWriter pw) {
pw.println("COLOR DISPLAY MANAGER dumpsys (color_display)");
+
pw.println("Night Display:");
- if (ColorDisplayManager.isNightDisplayAvailable(getContext())) {
+ if (mNightDisplayTintController.isAvailable(getContext())) {
pw.println(" Activated: " + mNightDisplayTintController.isActivated());
+ pw.println(" Color temp: " + mNightDisplayTintController.getColorTemperature());
} else {
pw.println(" Not available");
}
+
+ pw.println("Global saturation:");
+ if (mGlobalSaturationTintController.isAvailable(getContext())) {
+ pw.println(" Activated: " + mGlobalSaturationTintController.isActivated());
+ } else {
+ pw.println(" Not available");
+ }
+
mAppSaturationController.dump(pw);
+
+ pw.println("Display white balance:");
+ if (mDisplayWhiteBalanceTintController.isAvailable(getContext())) {
+ pw.println(" Activated: " + mDisplayWhiteBalanceTintController.isActivated());
+ } else {
+ pw.println(" Not available");
+ }
+
+ pw.println("Color mode: " + getColorModeInternal());
}
private boolean isNightDisplayActivatedSetting() {
@@ -1368,12 +1402,19 @@
* Get the color transform level to apply the matrix.
*/
public abstract int getLevel();
+
+ /**
+ * Returns whether or not this transform type is available on this device.
+ */
+ public abstract boolean isAvailable(Context context);
}
private final class NightDisplayTintController extends TintController {
- private float[] mMatrix = new float[16];
+ private final float[] mMatrix = new float[16];
private final float[] mColorTempCoefficients = new float[9];
+
+ private Boolean mIsAvailable;
private Integer mColorTemp;
/**
@@ -1446,13 +1487,21 @@
return LEVEL_COLOR_MATRIX_NIGHT_DISPLAY;
}
+ @Override
+ public boolean isAvailable(Context context) {
+ if (mIsAvailable == null) {
+ mIsAvailable = ColorDisplayManager.isNightDisplayAvailable(context);
+ }
+ return mIsAvailable;
+ }
+
void onActivated(boolean activated) {
Slog.i(TAG, activated ? "Turning on night display" : "Turning off night display");
if (mNightDisplayAutoMode != null) {
mNightDisplayAutoMode.onActivated(activated);
}
- if (ColorDisplayManager.isDisplayWhiteBalanceAvailable(getContext())) {
+ if (mDisplayWhiteBalanceTintController.isAvailable(getContext())) {
updateDisplayWhiteBalanceStatus();
}