From ee6620d123e87d4af8e51cd272de5eafb677122a Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Mon, 1 Apr 2024 15:17:31 +0200 Subject: [PATCH] Refactor WindowManager methods Select the available method to invoke the same way as in other wrappers (using a version field). Refs d894e270a7719b92e38b4f5e0294b9d55e90a6df Refs #4740 --- .../scrcpy/wrappers/WindowManager.java | 125 +++++++++--------- 1 file changed, 64 insertions(+), 61 deletions(-) diff --git a/server/src/main/java/com/genymobile/scrcpy/wrappers/WindowManager.java b/server/src/main/java/com/genymobile/scrcpy/wrappers/WindowManager.java index d9654b1b..2fc7ee02 100644 --- a/server/src/main/java/com/genymobile/scrcpy/wrappers/WindowManager.java +++ b/server/src/main/java/com/genymobile/scrcpy/wrappers/WindowManager.java @@ -12,12 +12,15 @@ import java.lang.reflect.Method; public final class WindowManager { private final IInterface manager; private Method getRotationMethod; - private Method freezeRotationMethod; + private Method freezeDisplayRotationMethod; - private Method isRotationFrozenMethod; + private int freezeDisplayRotationMethodVersion; + private Method isDisplayRotationFrozenMethod; - private Method thawRotationMethod; + private int isDisplayRotationFrozenMethodVersion; + private Method thawDisplayRotationMethod; + private int thawDisplayRotationMethodVersion; static WindowManager create() { IInterface manager = ServiceManager.getService("window", "android.view.IWindowManager"); @@ -43,50 +46,47 @@ public final class WindowManager { return getRotationMethod; } - private Method getFreezeRotationMethod() throws NoSuchMethodException { - if (freezeRotationMethod == null) { - freezeRotationMethod = manager.getClass().getMethod("freezeRotation", int.class); - } - return freezeRotationMethod; - } - - // New method added by this commit: - // private Method getFreezeDisplayRotationMethod() throws NoSuchMethodException { if (freezeDisplayRotationMethod == null) { - freezeDisplayRotationMethod = manager.getClass().getMethod("freezeDisplayRotation", int.class, int.class); + try { + freezeDisplayRotationMethod = manager.getClass().getMethod("freezeRotation", int.class); + freezeDisplayRotationMethodVersion = 0; + } catch (NoSuchMethodException e) { + // New method added by this commit: + // + freezeDisplayRotationMethod = manager.getClass().getMethod("freezeDisplayRotation", int.class, int.class); + freezeDisplayRotationMethodVersion = 1; + } } return freezeDisplayRotationMethod; } - private Method getIsRotationFrozenMethod() throws NoSuchMethodException { - if (isRotationFrozenMethod == null) { - isRotationFrozenMethod = manager.getClass().getMethod("isRotationFrozen"); - } - return isRotationFrozenMethod; - } - - // New method added by this commit: - // private Method getIsDisplayRotationFrozenMethod() throws NoSuchMethodException { if (isDisplayRotationFrozenMethod == null) { - isDisplayRotationFrozenMethod = manager.getClass().getMethod("isDisplayRotationFrozen", int.class); + try { + isDisplayRotationFrozenMethod = manager.getClass().getMethod("isRotationFrozen"); + isDisplayRotationFrozenMethodVersion = 0; + } catch (NoSuchMethodException e) { + // New method added by this commit: + // + isDisplayRotationFrozenMethod = manager.getClass().getMethod("isDisplayRotationFrozen", int.class); + isDisplayRotationFrozenMethodVersion = 1; + } } return isDisplayRotationFrozenMethod; } - private Method getThawRotationMethod() throws NoSuchMethodException { - if (thawRotationMethod == null) { - thawRotationMethod = manager.getClass().getMethod("thawRotation"); - } - return thawRotationMethod; - } - - // New method added by this commit: - // private Method getThawDisplayRotationMethod() throws NoSuchMethodException { if (thawDisplayRotationMethod == null) { - thawDisplayRotationMethod = manager.getClass().getMethod("thawDisplayRotation", int.class); + try { + thawDisplayRotationMethod = manager.getClass().getMethod("thawRotation"); + thawDisplayRotationMethodVersion = 0; + } catch (NoSuchMethodException e) { + // New method added by this commit: + // + thawDisplayRotationMethod = manager.getClass().getMethod("thawDisplayRotation", int.class); + thawDisplayRotationMethodVersion = 1; + } } return thawDisplayRotationMethod; } @@ -103,16 +103,18 @@ public final class WindowManager { public void freezeRotation(int displayId, int rotation) { try { - try { - Method method = getFreezeDisplayRotationMethod(); - method.invoke(manager, displayId, rotation); - } catch (ReflectiveOperationException e) { - if (displayId == 0) { - Method method = getFreezeRotationMethod(); + Method method = getFreezeDisplayRotationMethod(); + switch (freezeDisplayRotationMethodVersion) { + case 0: + if (displayId != 0) { + Ln.e("Secondary display rotation not supported on this device"); + return; + } method.invoke(manager, rotation); - } else { - Ln.e("Could not invoke method", e); - } + break; + default: + method.invoke(manager, displayId, rotation); + break; } } catch (ReflectiveOperationException e) { Ln.e("Could not invoke method", e); @@ -121,17 +123,16 @@ public final class WindowManager { public boolean isRotationFrozen(int displayId) { try { - try { - Method method = getIsDisplayRotationFrozenMethod(); - return (boolean) method.invoke(manager, displayId); - } catch (ReflectiveOperationException e) { - if (displayId == 0) { - Method method = getIsRotationFrozenMethod(); + Method method = getIsDisplayRotationFrozenMethod(); + switch (isDisplayRotationFrozenMethodVersion) { + case 0: + if (displayId != 0) { + Ln.e("Secondary display rotation not supported on this device"); + return false; + } return (boolean) method.invoke(manager); - } else { - Ln.e("Could not invoke method", e); - return false; - } + default: + return (boolean) method.invoke(manager, displayId); } } catch (ReflectiveOperationException e) { Ln.e("Could not invoke method", e); @@ -141,16 +142,18 @@ public final class WindowManager { public void thawRotation(int displayId) { try { - try { - Method method = getThawDisplayRotationMethod(); - method.invoke(manager, displayId); - } catch (ReflectiveOperationException e) { - if (displayId == 0) { - Method method = getThawRotationMethod(); + Method method = getThawDisplayRotationMethod(); + switch (thawDisplayRotationMethodVersion) { + case 0: + if (displayId != 0) { + Ln.e("Secondary display rotation not supported on this device"); + return; + } method.invoke(manager); - } else { - Ln.e("Could not invoke method", e); - } + break; + default: + method.invoke(manager, displayId); + break; } } catch (ReflectiveOperationException e) { Ln.e("Could not invoke method", e);