Implement Phase 3 of per-display power states
In this phase a DisplayPowerController is created per-display. However
each display is still controlled by the default display's
DisplayPowerController.
Bug: 138328918
Test: manual - Boot device and toggle display power
Change-Id: I4c608d1e18476a87d2da4bc1c120d62c39db25eb
diff --git a/core/java/com/android/internal/BrightnessSynchronizer.java b/core/java/com/android/internal/BrightnessSynchronizer.java
index c98477e..15463cb 100644
--- a/core/java/com/android/internal/BrightnessSynchronizer.java
+++ b/core/java/com/android/internal/BrightnessSynchronizer.java
@@ -22,6 +22,7 @@
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.UserHandle;
@@ -55,7 +56,7 @@
private final Queue<Object> mWriteHistory = new LinkedList<>();
- private final Handler mHandler = new Handler() {
+ private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -72,7 +73,6 @@
}
};
-
public BrightnessSynchronizer(Context context) {
final BrightnessSyncObserver mBrightnessSyncObserver;
mContext = context;
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 60c83905e..dd31f04 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -226,8 +226,35 @@
private final CopyOnWriteArrayList<DisplayTransactionListener> mDisplayTransactionListeners =
new CopyOnWriteArrayList<DisplayTransactionListener>();
- // Display power controller.
- private DisplayPowerController mDisplayPowerController;
+ /** All {@link DisplayPowerController}s indexed by {@link LogicalDisplay} ID. */
+ private final SparseArray<DisplayPowerController> mDisplayPowerControllers =
+ new SparseArray<>();
+
+ /** {@link DisplayBlanker} used by all {@link DisplayPowerController}s. */
+ private final DisplayBlanker mDisplayBlanker = new DisplayBlanker() {
+ @Override
+ public void requestDisplayState(int displayId, int state, float brightness) {
+ // The order of operations is important for legacy reasons.
+ if (state == Display.STATE_OFF) {
+ requestGlobalDisplayStateInternal(state, brightness);
+ }
+
+ mDisplayPowerCallbacks.onDisplayStateChange(state);
+
+ if (state != Display.STATE_OFF) {
+ requestGlobalDisplayStateInternal(state, brightness);
+ }
+ }
+ };
+
+ /**
+ * Used to inform {@link com.android.server.power.PowerManagerService} of changes to display
+ * state.
+ */
+ private DisplayManagerInternal.DisplayPowerCallbacks mDisplayPowerCallbacks;
+
+ /** The {@link Handler} used by all {@link DisplayPowerController}s. */
+ private Handler mPowerHandler;
// The overall display state, independent of changes that might influence one
// display or another in particular.
@@ -418,14 +445,16 @@
final int newUserId = to.getUserIdentifier();
final int userSerial = getUserManager().getUserSerialNumber(newUserId);
synchronized (mSyncRoot) {
+ final DisplayPowerController displayPowerController = mDisplayPowerControllers.get(
+ Display.DEFAULT_DISPLAY);
if (mCurrentUserId != newUserId) {
mCurrentUserId = newUserId;
BrightnessConfiguration config =
mPersistentDataStore.getBrightnessConfiguration(userSerial);
- mDisplayPowerController.setBrightnessConfiguration(config);
+ displayPowerController.setBrightnessConfiguration(config);
handleSettingsChange();
}
- mDisplayPowerController.onSwitchUser(newUserId);
+ displayPowerController.onSwitchUser(newUserId);
}
}
@@ -956,6 +985,7 @@
recordStableDisplayStatsIfNeededLocked(display);
recordTopInsetLocked(display);
}
+ addDisplayPowerControllerLocked(displayId);
DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
@@ -989,6 +1019,7 @@
private void handleLogicalDisplayRemovedLocked(@NonNull LogicalDisplay display) {
final int displayId = display.getDisplayIdLocked();
+ mDisplayPowerControllers.delete(displayId);
DisplayManagerGlobal.invalidateLocalDisplayInfoCaches();
sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_REMOVED);
scheduleTraversalLocked(false);
@@ -1110,7 +1141,7 @@
mPersistentDataStore.saveIfNeeded();
}
if (userId == mCurrentUserId) {
- mDisplayPowerController.setBrightnessConfiguration(c);
+ mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY).setBrightnessConfiguration(c);
}
}
}
@@ -1142,7 +1173,8 @@
final int userSerial = getUserManager().getUserSerialNumber(mCurrentUserId);
BrightnessConfiguration config =
mPersistentDataStore.getBrightnessConfiguration(userSerial);
- mDisplayPowerController.setBrightnessConfiguration(config);
+ mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY).setBrightnessConfiguration(
+ config);
}
}
@@ -1348,25 +1380,31 @@
}
void setAutoBrightnessLoggingEnabled(boolean enabled) {
- if (mDisplayPowerController != null) {
- synchronized (mSyncRoot) {
- mDisplayPowerController.setAutoBrightnessLoggingEnabled(enabled);
+ synchronized (mSyncRoot) {
+ final DisplayPowerController displayPowerController = mDisplayPowerControllers.get(
+ Display.DEFAULT_DISPLAY);
+ if (displayPowerController != null) {
+ displayPowerController.setAutoBrightnessLoggingEnabled(enabled);
}
}
}
void setDisplayWhiteBalanceLoggingEnabled(boolean enabled) {
- if (mDisplayPowerController != null) {
- synchronized (mSyncRoot) {
- mDisplayPowerController.setDisplayWhiteBalanceLoggingEnabled(enabled);
+ synchronized (mSyncRoot) {
+ final DisplayPowerController displayPowerController = mDisplayPowerControllers.get(
+ Display.DEFAULT_DISPLAY);
+ if (displayPowerController != null) {
+ displayPowerController.setDisplayWhiteBalanceLoggingEnabled(enabled);
}
}
}
void setAmbientColorTemperatureOverride(float cct) {
- if (mDisplayPowerController != null) {
- synchronized (mSyncRoot) {
- mDisplayPowerController.setAmbientColorTemperatureOverride(cct);
+ synchronized (mSyncRoot) {
+ final DisplayPowerController displayPowerController = mDisplayPowerControllers.get(
+ Display.DEFAULT_DISPLAY);
+ if (displayPowerController != null) {
+ displayPowerController.setAmbientColorTemperatureOverride(cct);
}
}
}
@@ -1592,8 +1630,11 @@
+ ", mWifiDisplayScanRequested=" + callback.mWifiDisplayScanRequested);
}
- if (mDisplayPowerController != null) {
- mDisplayPowerController.dump(pw);
+ final int displayPowerControllerCount = mDisplayPowerControllers.size();
+ pw.println();
+ pw.println("Display Power Controllers: size=" + displayPowerControllerCount);
+ for (int i = 0; i < displayPowerControllerCount; i++) {
+ mDisplayPowerControllers.valueAt(i).dump(pw);
}
pw.println();
@@ -1666,6 +1707,22 @@
}
}
+ private void initializeDisplayPowerControllersLocked() {
+ mLogicalDisplayMapper.forEachLocked((logicalDisplay) -> addDisplayPowerControllerLocked(
+ logicalDisplay.getDisplayIdLocked()));
+ }
+
+ private void addDisplayPowerControllerLocked(int displayId) {
+ if (mPowerHandler == null) {
+ // initPowerManagement has not yet been called.
+ return;
+ }
+ final DisplayPowerController displayPowerController = new DisplayPowerController(
+ mContext, mDisplayPowerCallbacks, mPowerHandler, mSensorManager,
+ mDisplayBlanker, displayId);
+ mDisplayPowerControllers.append(displayId, displayPowerController);
+ }
+
private final class DisplayManagerHandler extends Handler {
public DisplayManagerHandler(Looper looper) {
super(looper, null, true /*async*/);
@@ -2174,7 +2231,8 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- return mDisplayPowerController.getBrightnessEvents(userId, hasUsageStats);
+ return mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .getBrightnessEvents(userId, hasUsageStats);
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -2191,7 +2249,8 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- return mDisplayPowerController.getAmbientBrightnessStats(userId);
+ return mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .getAmbientBrightnessStats(userId);
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -2239,7 +2298,8 @@
BrightnessConfiguration config =
mPersistentDataStore.getBrightnessConfiguration(userSerial);
if (config == null) {
- config = mDisplayPowerController.getDefaultBrightnessConfiguration();
+ config = mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .getDefaultBrightnessConfiguration();
}
return config;
}
@@ -2256,7 +2316,8 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- return mDisplayPowerController.getDefaultBrightnessConfiguration();
+ return mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .getDefaultBrightnessConfiguration();
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -2279,7 +2340,8 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- mDisplayPowerController.setTemporaryBrightness(brightness);
+ mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .setTemporaryBrightness(brightness);
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -2294,7 +2356,8 @@
final long token = Binder.clearCallingIdentity();
try {
synchronized (mSyncRoot) {
- mDisplayPowerController.setTemporaryAutoBrightnessAdjustment(adjustment);
+ mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .setTemporaryAutoBrightnessAdjustment(adjustment);
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -2415,25 +2478,10 @@
public void initPowerManagement(final DisplayPowerCallbacks callbacks, Handler handler,
SensorManager sensorManager) {
synchronized (mSyncRoot) {
- DisplayBlanker blanker = new DisplayBlanker() {
- @Override
- public void requestDisplayState(int displayId, int state, float brightness) {
- // The order of operations is important for legacy reasons.
- if (state == Display.STATE_OFF) {
- requestGlobalDisplayStateInternal(state, brightness);
- }
-
- callbacks.onDisplayStateChange(state);
-
- if (state != Display.STATE_OFF) {
- requestGlobalDisplayStateInternal(state, brightness);
- }
- }
- };
- mDisplayPowerController = new DisplayPowerController(
- mContext, callbacks, handler, sensorManager, blanker,
- Display.DEFAULT_DISPLAY);
+ mDisplayPowerCallbacks = callbacks;
mSensorManager = sensorManager;
+ mPowerHandler = handler;
+ initializeDisplayPowerControllersLocked();
}
mHandler.sendEmptyMessage(MSG_LOAD_BRIGHTNESS_CONFIGURATION);
@@ -2443,14 +2491,16 @@
public boolean requestPowerState(DisplayPowerRequest request,
boolean waitForNegativeProximity) {
synchronized (mSyncRoot) {
- return mDisplayPowerController.requestPowerState(request, waitForNegativeProximity);
+ return mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .requestPowerState(request, waitForNegativeProximity);
}
}
@Override
public boolean isProximitySensorAvailable() {
synchronized (mSyncRoot) {
- return mDisplayPowerController.isProximitySensorAvailable();
+ return mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .isProximitySensorAvailable();
}
}
@@ -2539,7 +2589,8 @@
@Override
public void persistBrightnessTrackerState() {
synchronized (mSyncRoot) {
- mDisplayPowerController.persistBrightnessTrackerState();
+ mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .persistBrightnessTrackerState();
}
}
@@ -2571,7 +2622,8 @@
@Override
public void ignoreProximitySensorUntilChanged() {
- mDisplayPowerController.ignoreProximitySensorUntilChanged();
+ mDisplayPowerControllers.get(Display.DEFAULT_DISPLAY)
+ .ignoreProximitySensorUntilChanged();
}
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 0211876..309271c 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -1815,6 +1815,10 @@
public void dump(final PrintWriter pw) {
synchronized (mLock) {
pw.println();
+ pw.println("Display Power Controller:");
+ pw.println(" mDisplayId=" + mDisplayId);
+
+ pw.println();
pw.println("Display Power Controller Locked State:");
pw.println(" mDisplayReadyLocked=" + mDisplayReadyLocked);
pw.println(" mPendingRequestLocked=" + mPendingRequestLocked);