From 9c1722f42846859866d26823a8f6cf07495ab803 Mon Sep 17 00:00:00 2001 From: Derek Wu Date: Tue, 16 Aug 2022 23:52:08 +0200 Subject: [PATCH] Use DisplayManagerGlobal instance Use the client instance to communicate with the DisplayManager server. Fixes #3446 Signed-off-by: Romain Vimont --- .../com/genymobile/scrcpy/wrappers/DisplayManager.java | 6 ++---- .../com/genymobile/scrcpy/wrappers/ServiceManager.java | 9 ++++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/DisplayManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/DisplayManager.java index cedb3f47..3f4f897d 100644 --- a/server/src/main/java/com/genymobile/scrcpy/wrappers/DisplayManager.java +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/DisplayManager.java @@ -3,12 +3,10 @@ package com.genymobile.scrcpy.wrappers; import com.genymobile.scrcpy.DisplayInfo; import com.genymobile.scrcpy.Size; -import android.os.IInterface; - public final class DisplayManager { - private final IInterface manager; + private final Object manager; // instance of hidden class android.hardware.display.DisplayManagerGlobal - public DisplayManager(IInterface manager) { + public DisplayManager(Object manager) { this.manager = manager; } diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java index ea2a0784..68f6817d 100644 --- a/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/ServiceManager.java @@ -50,7 +50,14 @@ public final class ServiceManager { public DisplayManager getDisplayManager() { if (displayManager == null) { - displayManager = new DisplayManager(getService("display", "android.hardware.display.IDisplayManager")); + try { + Class clazz = Class.forName("android.hardware.display.DisplayManagerGlobal"); + Method getInstanceMethod = clazz.getDeclaredMethod("getInstance"); + Object dmg = getInstanceMethod.invoke(null); + displayManager = new DisplayManager(dmg); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + throw new AssertionError(e); + } } return displayManager; }