Skip to content

Commit

Permalink
Fix DisplayInfo parsing for Android Q
Browse files Browse the repository at this point in the history
The DisplayInfo dump format has slightly changed in AOSP:
<https://android.googlesource.com/platform/frameworks/base.git/+/1039ea50f3e1944f5d670cfdeadfdb17b3442ed7>

PR #3573 <#3573>
Ref #3416 <#3416>

Signed-off-by: Romain Vimont <[email protected]>
  • Loading branch information
issess authored and rom1v committed Nov 12, 2022
1 parent 48bb6f2 commit 597703b
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public DisplayManager(Object manager) {
// public to call it from unit tests
public static DisplayInfo parseDisplayInfo(String dumpsysDisplayOutput, int displayId) {
Pattern regex = Pattern.compile(
"^ mOverrideDisplayInfo=DisplayInfo\\{\".*?\", displayId " + displayId + ".*?(, FLAG_.*)?, real ([0-9]+) x ([0-9]+).*?, "
"^ mOverrideDisplayInfo=DisplayInfo\\{\".*?, displayId " + displayId + ".*?(, FLAG_.*)?, real ([0-9]+) x ([0-9]+).*?, "
+ "rotation ([0-9]+).*?, layerStack ([0-9]+)",
Pattern.MULTILINE);
Matcher m = regex.matcher(dumpsysDisplayOutput);
Expand Down
57 changes: 57 additions & 0 deletions server/src/test/java/com/genymobile/scrcpy/CommandParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.genymobile.scrcpy.wrappers.DisplayManager;

import android.view.Display;

import org.junit.Assert;
import org.junit.Test;

Expand Down Expand Up @@ -183,4 +184,60 @@ public void testParseDisplayInfoFromDumpsysDisplayAPI31NoFlags() {
Assert.assertEquals(1080, displayInfo.getSize().getWidth());
Assert.assertEquals(2280, displayInfo.getSize().getHeight());
}

@Test
public void testParseDisplayInfoFromDumpsysDisplayAPI29WithNoFlags() {
/* @formatter:off */
String partialOutput = "Logical Displays: size=2\n" +
" Display 0:\n" +
" mDisplayId=0\n" +
" mLayerStack=0\n" +
" mHasContent=true\n" +
" mAllowedDisplayModes=[1]\n" +
" mRequestedColorMode=0\n" +
" mDisplayOffset=(0, 0)\n" +
" mDisplayScalingDisabled=false\n" +
" mPrimaryDisplayDevice=Built-in Screen\n" +
" mBaseDisplayInfo=DisplayInfo{\"Built-in Screen, displayId 0\", uniqueId \"local:0\", app 3664 x 1920, " +
"real 3664 x 1920, largest app 3664 x 1920, smallest app 3664 x 1920, mode 61, defaultMode 61, modes [" +
"{id=1, width=3664, height=1920, fps=60.000004}, {id=2, width=3664, height=1920, fps=61.000004}, " +
"{id=61, width=3664, height=1920, fps=120.00001}], colorMode 0, supportedColorModes [0], " +
"hdrCapabilities android.view.Display$HdrCapabilities@4a41fe79, rotation 0, density 290 (320.842 x 319.813) dpi, " +
"layerStack 0, appVsyncOff 1000000, presDeadline 8333333, type BUILT_IN, address {port=129, model=0}, " +
"state ON, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, removeMode 0}\n" +
" mOverrideDisplayInfo=DisplayInfo{\"Built-in Screen, displayId 0\", uniqueId \"local:0\", app 3664 x 1920, " +
"real 3664 x 1920, largest app 3664 x 3620, smallest app 1920 x 1876, mode 61, defaultMode 61, modes [" +
"{id=1, width=3664, height=1920, fps=60.000004}, {id=2, width=3664, height=1920, fps=61.000004}, " +
"{id=61, width=3664, height=1920, fps=120.00001}], colorMode 0, supportedColorModes [0], " +
"hdrCapabilities android.view.Display$HdrCapabilities@4a41fe79, rotation 0, density 290 (320.842 x 319.813) dpi, " +
"layerStack 0, appVsyncOff 1000000, presDeadline 8333333, type BUILT_IN, address {port=129, model=0}, " +
"state ON, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, removeMode 0}\n" +
" Display 31:\n" +
" mDisplayId=31\n" +
" mLayerStack=31\n" +
" mHasContent=true\n" +
" mAllowedDisplayModes=[92]\n" +
" mRequestedColorMode=0\n" +
" mDisplayOffset=(0, 0)\n" +
" mDisplayScalingDisabled=false\n" +
" mPrimaryDisplayDevice=PanelLayer-#main\n" +
" mBaseDisplayInfo=DisplayInfo{\"PanelLayer-#main, displayId 31\", uniqueId \"virtual:com.test.system,10040,PanelLayer-#main,0\", " +
"app 800 x 110, real 800 x 110, largest app 800 x 110, smallest app 800 x 110, mode 92, defaultMode 92, modes [" +
"{id=92, width=800, height=110, fps=60.0}], colorMode 0, supportedColorModes [0], " +
"hdrCapabilities null, rotation 0, density 200 (200.0 x 200.0) dpi, layerStack 31, appVsyncOff 0, presDeadline 16666666, " +
"type VIRTUAL, state ON, owner com.test.system (uid 10040), FLAG_PRIVATE, removeMode 1}\n" +
" mOverrideDisplayInfo=DisplayInfo{\"PanelLayer-#main, displayId 31\", uniqueId \"virtual:com.test.system,10040,PanelLayer-#main,0\", " +
"app 800 x 110, real 800 x 110, largest app 800 x 800, smallest app 110 x 110, mode 92, defaultMode 92, modes [" +
"{id=92, width=800, height=110, fps=60.0}], colorMode 0, supportedColorModes [0], " +
"hdrCapabilities null, rotation 0, density 200 (200.0 x 200.0) dpi, layerStack 31, appVsyncOff 0, presDeadline 16666666, " +
"type VIRTUAL, state OFF, owner com.test.system (uid 10040), FLAG_PRIVATE, removeMode 1}\n";
DisplayInfo displayInfo = DisplayManager.parseDisplayInfo(partialOutput, 31);
Assert.assertNotNull(displayInfo);
Assert.assertEquals(31, displayInfo.getDisplayId());
Assert.assertEquals(0, displayInfo.getRotation());
Assert.assertEquals(31, displayInfo.getLayerStack());
Assert.assertEquals(0, displayInfo.getFlags());
Assert.assertEquals(800, displayInfo.getSize().getWidth());
Assert.assertEquals(110, displayInfo.getSize().getHeight());
}
}

0 comments on commit 597703b

Please sign in to comment.