From a7efa379ebf0a8d0e90ff7a072e982ea77ba440b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 16 Sep 2022 18:21:56 -0500 Subject: [PATCH] Switch to a Handler for OSC retransmission --- .../virtual_controller/VirtualController.java | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java index f20fc912..683873b1 100644 --- a/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java +++ b/app/src/main/java/com/limelight/binding/input/virtual_controller/VirtualController.java @@ -19,8 +19,6 @@ import com.limelight.binding.input.ControllerHandler; import java.util.ArrayList; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; public class VirtualController { public static class ControllerInputContext { @@ -43,10 +41,26 @@ public class VirtualController { private final ControllerHandler controllerHandler; private final Context context; - private final Timer timer; private final Handler handler; - private TimerTask retransmitTimerTask; + // HACK: GFE sometimes discards gamepad packets when they are received + // very shortly after another. This can be critical if an axis zeroing packet + // is lost and causes an analog stick to get stuck. To avoid this, we send + // a gamepad input packet every 100 ms to ensure any loss can be recovered. + private static final int RETRANSMIT_PERIOD_MS = 100; + private final Runnable retransmitRunnable = new Runnable() { + @Override + public void run() { + if (hidden) { + return; + } + + sendControllerInputContext(); + handler.postDelayed(this, RETRANSMIT_PERIOD_MS); + } + }; + private boolean hidden; + private FrameLayout frame_layout = null; ControllerMode currentMode = ControllerMode.Active; @@ -60,7 +74,6 @@ public class VirtualController { this.controllerHandler = controllerHandler; this.frame_layout = layout; this.context = context; - this.timer = new Timer("OSC timer", true); this.handler = new Handler(Looper.getMainLooper()); buttonConfigure = new Button(context); @@ -101,7 +114,8 @@ public class VirtualController { } public void hide() { - retransmitTimerTask.cancel(); + hidden = true; + handler.removeCallbacks(retransmitRunnable); for (VirtualControllerElement element : elements) { element.setVisibility(View.INVISIBLE); @@ -111,23 +125,15 @@ public class VirtualController { } public void show() { + hidden = false; + for (VirtualControllerElement element : elements) { element.setVisibility(View.VISIBLE); } buttonConfigure.setVisibility(View.VISIBLE); - // HACK: GFE sometimes discards gamepad packets when they are received - // very shortly after another. This can be critical if an axis zeroing packet - // is lost and causes an analog stick to get stuck. To avoid this, we send - // a gamepad input packet every 100 ms to ensure any loss can be recovered. - retransmitTimerTask = new TimerTask() { - @Override - public void run() { - sendControllerInputContext(); - } - }; - timer.schedule(retransmitTimerTask, 100, 100); + handler.postDelayed(retransmitRunnable, RETRANSMIT_PERIOD_MS); } public void removeElements() {