Keep screen info in cache
Currently, we only use screen information (width, height, rotation) once at initialization, to send the device size to the client. To be able to scale mouse events, make it accessible in memory. For this purpose, replace the "static" DeviceUtil to a singleton Device, and update it on every screen rotation.
This commit is contained in:
parent
d7b00a9bab
commit
11a60e5767
6 changed files with 86 additions and 44 deletions
|
@ -23,7 +23,7 @@ SRC := com/genymobile/scrcpy/ScrCpyServer.java \
|
||||||
com/genymobile/scrcpy/ControlEvent.java \
|
com/genymobile/scrcpy/ControlEvent.java \
|
||||||
com/genymobile/scrcpy/ControlEventReader.java \
|
com/genymobile/scrcpy/ControlEventReader.java \
|
||||||
com/genymobile/scrcpy/DesktopConnection.java \
|
com/genymobile/scrcpy/DesktopConnection.java \
|
||||||
com/genymobile/scrcpy/DeviceUtil.java \
|
com/genymobile/scrcpy/Device.java \
|
||||||
com/genymobile/scrcpy/EventController.java \
|
com/genymobile/scrcpy/EventController.java \
|
||||||
com/genymobile/scrcpy/ScreenInfo.java \
|
com/genymobile/scrcpy/ScreenInfo.java \
|
||||||
com/genymobile/scrcpy/ScreenStreamer.java \
|
com/genymobile/scrcpy/ScreenStreamer.java \
|
||||||
|
|
70
server/src/com/genymobile/scrcpy/Device.java
Normal file
70
server/src/com/genymobile/scrcpy/Device.java
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
package com.genymobile.scrcpy;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.view.IRotationWatcher;
|
||||||
|
|
||||||
|
import com.genymobile.scrcpy.wrappers.InputManager;
|
||||||
|
import com.genymobile.scrcpy.wrappers.ServiceManager;
|
||||||
|
|
||||||
|
public class Device {
|
||||||
|
|
||||||
|
public interface RotationListener {
|
||||||
|
void onRotationChanged(int rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Device INSTANCE = new Device();
|
||||||
|
private final ServiceManager serviceManager = new ServiceManager();
|
||||||
|
|
||||||
|
private ScreenInfo screenInfo;
|
||||||
|
private RotationListener rotationListener;
|
||||||
|
|
||||||
|
private Device() {
|
||||||
|
screenInfo = readScreenInfo();
|
||||||
|
registerRotationWatcher(new IRotationWatcher.Stub() {
|
||||||
|
@Override
|
||||||
|
public void onRotationChanged(int rotation) throws RemoteException {
|
||||||
|
synchronized (Device.this) {
|
||||||
|
// update screenInfo cache
|
||||||
|
screenInfo = screenInfo.withRotation(rotation);
|
||||||
|
|
||||||
|
// notify
|
||||||
|
if (rotationListener != null) {
|
||||||
|
rotationListener.onRotationChanged(rotation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Device getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized ScreenInfo getScreenInfo() {
|
||||||
|
if (screenInfo == null) {
|
||||||
|
screenInfo = readScreenInfo();
|
||||||
|
}
|
||||||
|
return screenInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScreenInfo readScreenInfo() {
|
||||||
|
return serviceManager.getDisplayManager().getScreenInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getDeviceName() {
|
||||||
|
return Build.MODEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputManager getInputManager() {
|
||||||
|
return serviceManager.getInputManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerRotationWatcher(IRotationWatcher rotationWatcher) {
|
||||||
|
serviceManager.getWindowManager().registerRotationWatcher(rotationWatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void setRotationListener(RotationListener rotationListener) {
|
||||||
|
this.rotationListener = rotationListener;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,28 +0,0 @@
|
||||||
package com.genymobile.scrcpy;
|
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
import android.view.IRotationWatcher;
|
|
||||||
|
|
||||||
import com.genymobile.scrcpy.wrappers.InputManager;
|
|
||||||
import com.genymobile.scrcpy.wrappers.ServiceManager;
|
|
||||||
|
|
||||||
public class DeviceUtil {
|
|
||||||
|
|
||||||
private static final ServiceManager serviceManager = new ServiceManager();
|
|
||||||
|
|
||||||
public static ScreenInfo getScreenInfo() {
|
|
||||||
return serviceManager.getDisplayManager().getScreenInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void registerRotationWatcher(IRotationWatcher rotationWatcher) {
|
|
||||||
serviceManager.getWindowManager().registerRotationWatcher(rotationWatcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getDeviceName() {
|
|
||||||
return Build.MODEL;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static InputManager getInputManager() {
|
|
||||||
return serviceManager.getInputManager();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -24,7 +24,7 @@ public class EventController {
|
||||||
|
|
||||||
public EventController(DesktopConnection connection) {
|
public EventController(DesktopConnection connection) {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
inputManager = DeviceUtil.getInputManager();
|
inputManager = Device.getInstance().getInputManager();
|
||||||
initPointer();
|
initPointer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,16 +7,25 @@ public class ScrCpyServer {
|
||||||
private static final String TAG = "scrcpy";
|
private static final String TAG = "scrcpy";
|
||||||
|
|
||||||
private static void scrcpy() throws IOException {
|
private static void scrcpy() throws IOException {
|
||||||
String deviceName = DeviceUtil.getDeviceName();
|
String deviceName = Device.getDeviceName();
|
||||||
ScreenInfo initialScreenInfo = DeviceUtil.getScreenInfo();
|
ScreenInfo initialScreenInfo = Device.getInstance().getScreenInfo();
|
||||||
int width = initialScreenInfo.getLogicalWidth();
|
int width = initialScreenInfo.getLogicalWidth();
|
||||||
int height = initialScreenInfo.getLogicalHeight();
|
int height = initialScreenInfo.getLogicalHeight();
|
||||||
try (DesktopConnection connection = DesktopConnection.open(deviceName, width, height)) {
|
try (DesktopConnection connection = DesktopConnection.open(deviceName, width, height)) {
|
||||||
try {
|
final ScreenStreamer streamer = new ScreenStreamer(connection);
|
||||||
|
Device.getInstance().setRotationListener(new Device.RotationListener() {
|
||||||
|
@Override
|
||||||
|
public void onRotationChanged(int rotation) {
|
||||||
|
streamer.reset();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// asynchronous
|
// asynchronous
|
||||||
startEventController(connection);
|
startEventController(connection);
|
||||||
|
|
||||||
|
try {
|
||||||
// synchronous
|
// synchronous
|
||||||
new ScreenStreamer(connection).streamScreen();
|
streamer.streamScreen();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Ln.e("Screen streaming interrupted", e);
|
Ln.e("Screen streaming interrupted", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
package com.genymobile.scrcpy;
|
package com.genymobile.scrcpy;
|
||||||
|
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.view.IRotationWatcher;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
|
|
||||||
|
@ -13,12 +10,6 @@ public class ScreenStreamer {
|
||||||
|
|
||||||
public ScreenStreamer(DesktopConnection connection) {
|
public ScreenStreamer(DesktopConnection connection) {
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
DeviceUtil.registerRotationWatcher(new IRotationWatcher.Stub() {
|
|
||||||
@Override
|
|
||||||
public void onRotationChanged(int rotation) throws RemoteException {
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized ScreenStreamerSession newScreenStreamerSession() {
|
private synchronized ScreenStreamerSession newScreenStreamerSession() {
|
||||||
|
|
Loading…
Reference in a new issue