diff options
| -rw-r--r-- | services/core/java/com/android/server/display/DisplayManagerService.java | 88 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java | 48 |
2 files changed, 41 insertions, 95 deletions
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index cf8d21b66417..0a1a9a20e0da 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1296,58 +1296,21 @@ public final class DisplayManagerService extends SystemService { return; } display.configureDisplayLocked(t, device, info.state == Display.STATE_OFF); - + final int viewportType; // Update the corresponding viewport. - DisplayViewport internalViewport = getInternalViewportLocked(); if ((info.flags & DisplayDeviceInfo.FLAG_DEFAULT_DISPLAY) != 0) { - populateViewportLocked(internalViewport, display, device); - } - DisplayViewport externalViewport = getExternalViewportLocked(); - if (info.touch == DisplayDeviceInfo.TOUCH_EXTERNAL) { - populateViewportLocked(externalViewport, display, device); - } else if (!externalViewport.valid) { - // TODO (b/116850516) move this logic into InputReader - externalViewport.copyFrom(internalViewport); - externalViewport.type = DisplayViewport.VIEWPORT_EXTERNAL; - } - - if (info.touch == DisplayDeviceInfo.TOUCH_VIRTUAL && !TextUtils.isEmpty(info.uniqueId)) { - final DisplayViewport viewport = getVirtualViewportLocked(info.uniqueId); - populateViewportLocked(viewport, display, device); - } - } - - /** Get the virtual device viewport that has the specified uniqueId. - * If such viewport does not exist, create it. */ - private DisplayViewport getVirtualViewportLocked(@NonNull String uniqueId) { - DisplayViewport viewport; - final int count = mViewports.size(); - for (int i = 0; i < count; i++) { - viewport = mViewports.get(i); - if (uniqueId.equals(viewport.uniqueId)) { - if (viewport.type != VIEWPORT_VIRTUAL) { - Slog.wtf(TAG, "Found a viewport with uniqueId '" + uniqueId - + "' but it has type " + DisplayViewport.typeToString(viewport.type) - + " (expected VIRTUAL)"); - continue; - } - return viewport; - } + 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.wtf(TAG, "Unable to populate viewport for display device: " + info); + return; } - viewport = new DisplayViewport(); - viewport.uniqueId = uniqueId; - viewport.type = VIEWPORT_VIRTUAL; - mViewports.add(viewport); - return viewport; - } - - private DisplayViewport getInternalViewportLocked() { - return getViewportByTypeLocked(VIEWPORT_INTERNAL); - } - - private DisplayViewport getExternalViewportLocked() { - return getViewportByTypeLocked(VIEWPORT_EXTERNAL); + populateViewportLocked(viewportType, display.getDisplayIdLocked(), device, info.uniqueId); } /** @@ -1355,35 +1318,44 @@ public final class DisplayManagerService extends SystemService { * @param viewportType - either INTERNAL or EXTERNAL * @return the viewport with the requested type */ - private DisplayViewport getViewportByTypeLocked(int viewportType) { - // Only allow a single INTERNAL or EXTERNAL viewport, which makes this function possible. - // TODO (b/116824030) allow multiple EXTERNAL viewports and remove this function. - // Creates the viewport if none exists. - if (viewportType != VIEWPORT_INTERNAL && viewportType != VIEWPORT_EXTERNAL) { + private DisplayViewport getViewportLocked(int viewportType, String uniqueId) { + if (viewportType != VIEWPORT_INTERNAL && viewportType != VIEWPORT_EXTERNAL + && viewportType != VIEWPORT_VIRTUAL) { Slog.wtf(TAG, "Cannot call getViewportByTypeLocked for type " + DisplayViewport.typeToString(viewportType)); return null; } + + // Only allow a single INTERNAL or EXTERNAL viewport by forcing their uniqueIds + // to be identical (in particular, empty). + // TODO (b/116824030) allow multiple EXTERNAL viewports and remove this function. + if (viewportType != VIEWPORT_VIRTUAL) { + uniqueId = ""; + } + DisplayViewport viewport; final int count = mViewports.size(); for (int i = 0; i < count; i++) { viewport = mViewports.get(i); - if (viewport.type == viewportType) { + if (viewport.type == viewportType && uniqueId.equals(viewport.uniqueId)) { return viewport; } } + // Creates the viewport if none exists. viewport = new DisplayViewport(); viewport.type = viewportType; + viewport.uniqueId = uniqueId; mViewports.add(viewport); return viewport; } - private static void populateViewportLocked(DisplayViewport viewport, - LogicalDisplay display, DisplayDevice device) { - viewport.valid = true; - viewport.displayId = display.getDisplayIdLocked(); + private void populateViewportLocked(int viewportType, + int displayId, DisplayDevice device, String uniqueId) { + final DisplayViewport viewport = getViewportLocked(viewportType, uniqueId); device.populateViewportLocked(viewport); + viewport.valid = true; + viewport.displayId = displayId; } private LogicalDisplay findLogicalDisplayForDeviceLocked(DisplayDevice device) { diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java index e9bfa8f4e0c8..abf90402250c 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -149,12 +149,11 @@ public class DisplayManagerServiceTest { verify(mMockInputManagerInternal).setDisplayViewports(viewportCaptor.capture()); List<DisplayViewport> viewports = viewportCaptor.getValue(); - // Expect to receive 3 viewports: internal, external, and virtual - assertEquals(3, viewports.size()); + // Expect to receive 2 viewports: internal, and virtual + assertEquals(2, viewports.size()); DisplayViewport virtualViewport = null; DisplayViewport internalViewport = null; - DisplayViewport externalViewport = null; for (int i = 0; i < viewports.size(); i++) { DisplayViewport v = viewports.get(i); switch (v.type) { @@ -163,7 +162,7 @@ public class DisplayManagerServiceTest { break; } case DisplayViewport.VIEWPORT_EXTERNAL: { - externalViewport = v; + fail("EXTERNAL viewport should not exist."); break; } case DisplayViewport.VIEWPORT_VIRTUAL: { @@ -172,14 +171,12 @@ public class DisplayManagerServiceTest { } } } - // INTERNAL and EXTERNAL viewports get created upon access + // INTERNAL viewport gets created upon access. assertNotNull(internalViewport); - assertNotNull(externalViewport); assertNotNull(virtualViewport); - // INTERNAL and EXTERNAL + // INTERNAL assertTrue(internalViewport.valid); - assertTrue(externalViewport.valid); // VIRTUAL assertEquals(height, virtualViewport.deviceHeight); @@ -216,39 +213,16 @@ public class DisplayManagerServiceTest { verify(mMockInputManagerInternal).setDisplayViewports(viewportCaptor.capture()); List<DisplayViewport> viewports = viewportCaptor.getValue(); - // Expect to receive 2 viewports: 1 internal, 1 external - assertEquals(2, viewports.size()); + // Expect to receive actual viewports: 1 internal + assertEquals(1, viewports.size()); - DisplayViewport internalViewport = null; - DisplayViewport externalViewport = null; - for (int i = 0; i < viewports.size(); i++) { - DisplayViewport v = viewports.get(i); - switch (v.type) { - case DisplayViewport.VIEWPORT_INTERNAL: { - internalViewport = v; - break; - } - case DisplayViewport.VIEWPORT_EXTERNAL: { - externalViewport = v; - break; - } - default: { - fail("Unexpected viewport type: " + DisplayViewport.typeToString(v.type)); - break; - } - } - } - // INTERNAL and EXTERNAL viewports get created upon access + DisplayViewport internalViewport = viewports.get(0); + + // INTERNAL is the only one actual display. assertNotNull(internalViewport); - assertNotNull(externalViewport); + assertEquals(DisplayViewport.VIEWPORT_INTERNAL, internalViewport.type); assertTrue(internalViewport.valid); assertEquals(displayId, internalViewport.displayId); - - // To simplify comparison, override the type for external Viewport - // TODO (b/116850516) remove this - externalViewport.type = internalViewport.type; - assertEquals(internalViewport, externalViewport); - externalViewport.type = DisplayViewport.VIEWPORT_EXTERNAL; // undo the changes above } @Test |