Loading services/core/java/com/android/server/display/DisplayManagerService.java +30 −58 Original line number Diff line number Diff line Loading @@ -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; } } viewport = new DisplayViewport(); viewport.uniqueId = uniqueId; viewport.type = VIEWPORT_VIRTUAL; mViewports.add(viewport); return viewport; } private DisplayViewport getInternalViewportLocked() { return getViewportByTypeLocked(VIEWPORT_INTERNAL); 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; } private DisplayViewport getExternalViewportLocked() { return getViewportByTypeLocked(VIEWPORT_EXTERNAL); populateViewportLocked(viewportType, display.getDisplayIdLocked(), device, info.uniqueId); } /** Loading @@ -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) { Loading services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +11 −37 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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: { Loading @@ -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); Loading Loading @@ -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 Loading Loading
services/core/java/com/android/server/display/DisplayManagerService.java +30 −58 Original line number Diff line number Diff line Loading @@ -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; } } viewport = new DisplayViewport(); viewport.uniqueId = uniqueId; viewport.type = VIEWPORT_VIRTUAL; mViewports.add(viewport); return viewport; } private DisplayViewport getInternalViewportLocked() { return getViewportByTypeLocked(VIEWPORT_INTERNAL); 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; } private DisplayViewport getExternalViewportLocked() { return getViewportByTypeLocked(VIEWPORT_EXTERNAL); populateViewportLocked(viewportType, display.getDisplayIdLocked(), device, info.uniqueId); } /** Loading @@ -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) { Loading
services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +11 −37 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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: { Loading @@ -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); Loading Loading @@ -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 Loading