1package com.genymobile.scrcpy.wrappers;
2
3import com.genymobile.scrcpy.Command;
4import com.genymobile.scrcpy.DisplayInfo;
5import com.genymobile.scrcpy.Ln;
6import com.genymobile.scrcpy.Size;
7
8import android.annotation.SuppressLint;
9import android.view.Display;
10
11import java.lang.reflect.Field;
12import java.lang.reflect.InvocationTargetException;
13import java.lang.reflect.Method;
14import java.util.regex.Matcher;
15import java.util.regex.Pattern;
16
17@SuppressLint("PrivateApi,DiscouragedPrivateApi")
18public final class DisplayManager {
19 private final Object manager; // instance of hidden class android.hardware.display.DisplayManagerGlobal
20
21 static DisplayManager create() {
22 try {
23 Class<?> clazz = Class.forName("android.hardware.display.DisplayManagerGlobal");
24 Method getInstanceMethod = clazz.getDeclaredMethod("getInstance");
25 Object dmg = getInstanceMethod.invoke(null);
26 return new DisplayManager(dmg);
27 } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
28 throw new AssertionError(e);
29 }
30 }
31
32 private DisplayManager(Object manager) {
33 this.manager = manager;
34 }
35
36 // public to call it from unit tests
37 public static DisplayInfo parseDisplayInfo(String dumpsysDisplayOutput, int displayId) {
38 Pattern regex = Pattern.compile(
39 "^ mOverrideDisplayInfo=DisplayInfo\\{\".*?, displayId " + displayId + ".*?(, FLAG_.*)?, real ([0-9]+) x ([0-9]+).*?, "
40 + "rotation ([0-9]+).*?, layerStack ([0-9]+)",
…lines 41–113 unchanged (73 lines)