diff --git a/server/src/main/java/com/genymobile/scrcpy/Controller.java b/server/src/main/java/com/genymobile/scrcpy/Controller.java index b0b0c787..6147e36a 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Controller.java +++ b/server/src/main/java/com/genymobile/scrcpy/Controller.java @@ -24,6 +24,8 @@ public class Controller { private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(); + private Thread thread; + private final Device device; private final DesktopConnection connection; private final DeviceMessageSender sender; @@ -62,7 +64,7 @@ public class Controller { } } - public void control() throws IOException { + private void control() throws IOException { // on start, power on the device if (powerOn && !Device.isScreenOn()) { device.pressReleaseKeycode(KeyEvent.KEYCODE_POWER, Device.INJECT_MODE_ASYNC); @@ -82,6 +84,27 @@ public class Controller { } } + public void start() { + thread = new Thread(() -> { + try { + control(); + } catch (IOException e) { + // this is expected on close + Ln.d("Controller stopped"); + } + }); + thread.start(); + sender.start(); + } + + public void stop() { + if (thread != null) { + thread.interrupt(); + thread = null; + } + sender.stop(); + } + public DeviceMessageSender getSender() { return sender; } diff --git a/server/src/main/java/com/genymobile/scrcpy/DeviceMessageSender.java b/server/src/main/java/com/genymobile/scrcpy/DeviceMessageSender.java index 2630652a..7ec4ab41 100644 --- a/server/src/main/java/com/genymobile/scrcpy/DeviceMessageSender.java +++ b/server/src/main/java/com/genymobile/scrcpy/DeviceMessageSender.java @@ -6,6 +6,8 @@ public final class DeviceMessageSender { private final DesktopConnection connection; + private Thread thread; + private String clipboardText; private long ack; @@ -24,7 +26,7 @@ public final class DeviceMessageSender { notify(); } - public void loop() throws IOException, InterruptedException { + private void loop() throws IOException, InterruptedException { while (!Thread.currentThread().isInterrupted()) { String text; long sequence; @@ -49,4 +51,22 @@ public final class DeviceMessageSender { } } } + public void start() { + thread = new Thread(() -> { + try { + loop(); + } catch (IOException | InterruptedException e) { + // this is expected on close + Ln.d("Device message sender stopped"); + } + }); + thread.start(); + } + + public void stop() { + if (thread != null) { + thread.interrupt(); + thread = null; + } + } } diff --git a/server/src/main/java/com/genymobile/scrcpy/Server.java b/server/src/main/java/com/genymobile/scrcpy/Server.java index 4a371e5b..dc14d7c9 100644 --- a/server/src/main/java/com/genymobile/scrcpy/Server.java +++ b/server/src/main/java/com/genymobile/scrcpy/Server.java @@ -79,16 +79,13 @@ public final class Server { ScreenEncoder screenEncoder = new ScreenEncoder(options.getSendFrameMeta(), options.getBitRate(), options.getMaxFps(), codecOptions, options.getEncoderName(), options.getDownsizeOnError()); - Thread controllerThread = null; - Thread deviceMessageSenderThread = null; + Controller controller = null; if (control) { - final Controller controller = new Controller(device, connection, options.getClipboardAutosync(), options.getPowerOn()); + controller = new Controller(device, connection, options.getClipboardAutosync(), options.getPowerOn()); + controller.start(); - // asynchronous - controllerThread = startController(controller); - deviceMessageSenderThread = startDeviceMessageSender(controller.getSender()); - - device.setClipboardListener(text -> controller.getSender().pushClipboardText(text)); + final Controller controllerRef = controller; + device.setClipboardListener(text -> controllerRef.getSender().pushClipboardText(text)); } try { @@ -99,11 +96,8 @@ public final class Server { Ln.d("Screen streaming stopped"); } finally { initThread.interrupt(); - if (controllerThread != null) { - controllerThread.interrupt(); - } - if (deviceMessageSenderThread != null) { - deviceMessageSenderThread.interrupt(); + if (controller != null) { + controller.stop(); } } } @@ -115,32 +109,6 @@ public final class Server { return thread; } - private static Thread startController(final Controller controller) { - Thread thread = new Thread(() -> { - try { - controller.control(); - } catch (IOException e) { - // this is expected on close - Ln.d("Controller stopped"); - } - }); - thread.start(); - return thread; - } - - private static Thread startDeviceMessageSender(final DeviceMessageSender sender) { - Thread thread = new Thread(() -> { - try { - sender.loop(); - } catch (IOException | InterruptedException e) { - // this is expected on close - Ln.d("Device message sender stopped"); - } - }); - thread.start(); - return thread; - } - private static Options createOptions(String... args) { if (args.length < 1) { throw new IllegalArgumentException("Missing client version");