diff --git a/server/src/main/java/com/genymobile/scrcpy/video/DisplaySizeMonitor.java b/server/src/main/java/com/genymobile/scrcpy/video/DisplaySizeMonitor.java index 3d7cccfe..a8abbd9f 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/DisplaySizeMonitor.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/DisplaySizeMonitor.java @@ -15,8 +15,35 @@ import android.os.Handler; import android.os.HandlerThread; import android.view.IDisplayWindowListener; +import java.util.Objects; + public class DisplaySizeMonitor { + private static class SessionInfo { + private Size size; + private int rotation; + + public SessionInfo(Size size, int rotation) { + this.size = size; + this.rotation = rotation; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof SessionInfo)) + return false; + SessionInfo that = (SessionInfo) o; + return rotation == that.rotation && Objects.equals(size, that.size); + } + + @Override + public String toString() { + return "{" + "size=" + size + ", rotation=" + rotation + '}'; + } + } + public interface Listener { void onDisplaySizeChanged(); } @@ -34,7 +61,7 @@ public class DisplaySizeMonitor { private int displayId = Device.DISPLAY_ID_NONE; - private Size sessionDisplaySize; + private SessionInfo sessionInfo; private Listener listener; @@ -98,12 +125,16 @@ public class DisplaySizeMonitor { } } - private synchronized Size getSessionDisplaySize() { - return sessionDisplaySize; + private synchronized SessionInfo getSessionInfo() { + return sessionInfo; } - public synchronized void setSessionDisplaySize(Size sessionDisplaySize) { - this.sessionDisplaySize = sessionDisplaySize; + private synchronized void setSessionInfo(SessionInfo sessionInfo) { + this.sessionInfo = sessionInfo; + } + + public void setSessionInfo(Size size, int rotation) { + setSessionInfo(new SessionInfo(size, rotation)); } private void checkDisplaySizeChanged() { @@ -112,29 +143,29 @@ public class DisplaySizeMonitor { Ln.w("DisplayInfo for " + displayId + " cannot be retrieved"); // We can't compare with the current size, so reset unconditionally if (Ln.isEnabled(Ln.Level.VERBOSE)) { - Ln.v("DisplaySizeMonitor: requestReset(): " + getSessionDisplaySize() + " -> (unknown)"); + Ln.v("DisplaySizeMonitor: requestReset(): " + getSessionInfo() + " -> (unknown)"); } - setSessionDisplaySize(null); + setSessionInfo(null); listener.onDisplaySizeChanged(); } else { - Size size = di.getSize(); + SessionInfo si = new SessionInfo(di.getSize(), di.getRotation()); // The field is hidden on purpose, to read it with synchronization @SuppressWarnings("checkstyle:HiddenField") - Size sessionDisplaySize = getSessionDisplaySize(); // synchronized + SessionInfo sessionInfo = getSessionInfo(); // synchronized // .equals() also works if sessionDisplaySize == null - if (!size.equals(sessionDisplaySize)) { + if (!si.equals(sessionInfo)) { // Reset only if the size is different if (Ln.isEnabled(Ln.Level.VERBOSE)) { - Ln.v("DisplaySizeMonitor: requestReset(): " + sessionDisplaySize + " -> " + size); + Ln.v("DisplaySizeMonitor: requestReset(): " + sessionInfo + " -> " + si); } // Set the new size immediately, so that a future onDisplayChanged() event called before the asynchronous prepare() // considers that the current size is the requested size (to avoid a duplicate requestReset()) - setSessionDisplaySize(size); + setSessionInfo(si); listener.onDisplaySizeChanged(); } else if (Ln.isEnabled(Ln.Level.VERBOSE)) { - Ln.v("DisplaySizeMonitor: Size not changed (" + size + "): do not requestReset()"); + Ln.v("DisplaySizeMonitor: Size and rotation not changed (" + sessionInfo + "): do not requestReset()"); } } } diff --git a/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java index 792b3a8a..9290a07e 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/NewDisplayCapture.java @@ -114,7 +114,7 @@ public class NewDisplayCapture extends SurfaceCapture { videoSize = displaySize; displayRotation = 0; // Set the current display size to avoid an unnecessary call to invalidate() - displaySizeMonitor.setSessionDisplaySize(displaySize); + displaySizeMonitor.setSessionInfo(displaySize, displayRotation); } else { DisplayInfo displayInfo = ServiceManager.getDisplayManager().getDisplayInfo(virtualDisplay.getDisplay().getDisplayId()); displaySize = displayInfo.getSize(); diff --git a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java index 5f4e1803..342eaeea 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java @@ -77,7 +77,7 @@ public class ScreenCapture extends SurfaceCapture { } Size displaySize = displayInfo.getSize(); - displaySizeMonitor.setSessionDisplaySize(displaySize); + displaySizeMonitor.setSessionInfo(displaySize, displayInfo.getRotation()); if (captureOrientationLock == Orientation.Lock.LockedInitial) { // The user requested to lock the video orientation to the current orientation