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);