Generate ACTION_CANCEL event when screen turned off by proximity sensor.
When using PROXIMITY_SCREEN_OFF_WAKE_LOCK and screen was turned off by proximity sensor,
input service should generate ACTION_CANCEL, same as display turned off by pressing power button.
Add power state in display view port and notify input service for
display power state change.
Bug: 154074380
Test: atest libgui_test
Change-Id: Icb65aead4b5544182c46101f4ba535f5955ebd6c
Merged-In: Icb65aead4b5544182c46101f4ba535f5955ebd6c
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 02d499f..dee6cd0 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -111,6 +111,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -971,6 +972,18 @@
if (diff == DisplayDeviceInfo.DIFF_STATE) {
Slog.i(TAG, "Display device changed state: \"" + info.name
+ "\", " + Display.stateToString(info.state));
+ final Optional<Integer> viewportType = getViewportType(info);
+ if (viewportType.isPresent()) {
+ for (DisplayViewport d : mViewports) {
+ if (d.type == viewportType.get() && info.uniqueId.equals(d.uniqueId)) {
+ // Update display view port power state
+ d.isActive = Display.isActiveState(info.state);
+ }
+ }
+ if (mInputManagerInternal != null) {
+ mHandler.sendEmptyMessage(MSG_UPDATE_VIEWPORT);
+ }
+ }
} else if (diff != 0) {
Slog.i(TAG, "Display device changed: " + info);
}
@@ -1507,6 +1520,23 @@
mViewports.clear();
}
+ private Optional<Integer> getViewportType(DisplayDeviceInfo info) {
+ // Get the corresponding viewport type.
+ if ((info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) {
+ return Optional.of(VIEWPORT_INTERNAL);
+ } else if (info.touch == DisplayDeviceInfo.TOUCH_EXTERNAL) {
+ return Optional.of(VIEWPORT_EXTERNAL);
+ } else if (info.touch == DisplayDeviceInfo.TOUCH_VIRTUAL
+ && !TextUtils.isEmpty(info.uniqueId)) {
+ return Optional.of(VIEWPORT_VIRTUAL);
+ } else {
+ if (DEBUG) {
+ Slog.i(TAG, "Display " + info + " does not support input device matching.");
+ }
+ }
+ return Optional.empty();
+ }
+
private void configureDisplayLocked(SurfaceControl.Transaction t, DisplayDevice device) {
final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
final boolean ownContent = (info.flags & DisplayDeviceInfo.FLAG_OWN_CONTENT_ONLY) != 0;
@@ -1533,21 +1563,10 @@
return;
}
display.configureDisplayLocked(t, device, info.state == Display.STATE_OFF);
- final int viewportType;
- // Update the corresponding viewport.
- if ((info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) {
- viewportType = VIEWPORT_INTERNAL;
- } else if (info.touch == DisplayDeviceInfo.TOUCH_EXTERNAL) {
- viewportType = VIEWPORT_EXTERNAL;
- } else if (info.touch == DisplayDeviceInfo.TOUCH_VIRTUAL
- && !TextUtils.isEmpty(info.uniqueId)) {
- viewportType = VIEWPORT_VIRTUAL;
- } else {
- Slog.i(TAG, "Display " + info + " does not support input device matching.");
- return;
+ final Optional<Integer> viewportType = getViewportType(info);
+ if (viewportType.isPresent()) {
+ populateViewportLocked(viewportType.get(), display.getDisplayIdLocked(), device, info);
}
-
- populateViewportLocked(viewportType, display.getDisplayIdLocked(), device, info.uniqueId);
}
/**
@@ -1587,12 +1606,13 @@
return viewport;
}
- private void populateViewportLocked(int viewportType,
- int displayId, DisplayDevice device, String uniqueId) {
- final DisplayViewport viewport = getViewportLocked(viewportType, uniqueId);
+ private void populateViewportLocked(int viewportType, int displayId, DisplayDevice device,
+ DisplayDeviceInfo info) {
+ final DisplayViewport viewport = getViewportLocked(viewportType, info.uniqueId);
device.populateViewportLocked(viewport);
viewport.valid = true;
viewport.displayId = displayId;
+ viewport.isActive = Display.isActiveState(info.state);
}
private LogicalDisplay findLogicalDisplayForDeviceLocked(DisplayDevice device) {