From 09b5284aeed43a147a919c95fa087cbb31b6f264 Mon Sep 17 00:00:00 2001 From: Daniel van Paassen <38658984+danielvanpaass@users.noreply.github.com> Date: Wed, 13 May 2026 01:20:28 +0200 Subject: [PATCH] close and reopen socket on same executor, pause recording on sleep --- .../grabber/HyperionScreenEncoder.java | 10 +++++ .../grabber/HyperionScreenEncoderBase.java | 1 + .../grabber/HyperionScreenService.java | 14 ++----- .../grabber/network/HyperionThread.kt | 40 +++++++++++++++++++ 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoder.java b/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoder.java index 5671c7d..72a4cfd 100644 --- a/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoder.java +++ b/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoder.java @@ -347,6 +347,16 @@ public void stopRecording() { } } + @Override + public void pauseRecording() { + if (DEBUG) Log.i(TAG, "Pausing"); + mRunning = false; + setCapturing(false); + if (mCaptureHandler != null) { + mCaptureHandler.removeCallbacksAndMessages(null); + } + } + @Override public void resumeRecording() { if (DEBUG) Log.i(TAG, "Resuming"); diff --git a/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoderBase.java b/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoderBase.java index 1666d63..6ef2842 100644 --- a/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoderBase.java +++ b/common/src/main/java/com/hyperion/grabber/HyperionScreenEncoderBase.java @@ -111,6 +111,7 @@ protected int getGrabberHeight() { } public abstract void stopRecording(); + public abstract void pauseRecording(); public abstract void resumeRecording(); public abstract void setOrientation(int orientation); } diff --git a/common/src/main/java/com/hyperion/grabber/HyperionScreenService.java b/common/src/main/java/com/hyperion/grabber/HyperionScreenService.java index 49c2d53..9ec14a8 100644 --- a/common/src/main/java/com/hyperion/grabber/HyperionScreenService.java +++ b/common/src/main/java/com/hyperion/grabber/HyperionScreenService.java @@ -100,19 +100,13 @@ public void onReceiveStatus(boolean isCapturing) { public void onReceive(Context context, Intent intent) { switch (Objects.requireNonNull(intent.getAction())) { case Intent.ACTION_SCREEN_ON: - if (DEBUG) Log.v(TAG, "ACTION_SCREEN_ON intent received"); - if (mHyperionEncoder != null && !isCapturing()) { - if (DEBUG) Log.v(TAG, "Encoder not grabbing, attempting to restart"); - mHyperionEncoder.resumeRecording(); - } + if (mHyperionThread != null) mHyperionThread.resumeConnection(); + if (mHyperionEncoder != null) mHyperionEncoder.resumeRecording(); notifyActivity(); break; case Intent.ACTION_SCREEN_OFF: - if (DEBUG) Log.v(TAG, "ACTION_SCREEN_OFF intent received"); - if (mHyperionEncoder != null) { - if (DEBUG) Log.v(TAG, "Clearing current light data"); - mHyperionEncoder.clearLights(); - } + if (mHyperionEncoder != null) mHyperionEncoder.pauseRecording(); + if (mHyperionThread != null) mHyperionThread.pauseConnection(); break; case Intent.ACTION_CONFIGURATION_CHANGED: if (DEBUG) Log.v(TAG, "ACTION_CONFIGURATION_CHANGED intent received"); diff --git a/common/src/main/java/com/hyperion/grabber/network/HyperionThread.kt b/common/src/main/java/com/hyperion/grabber/network/HyperionThread.kt index 8275a6d..afb78e9 100644 --- a/common/src/main/java/com/hyperion/grabber/network/HyperionThread.kt +++ b/common/src/main/java/com/hyperion/grabber/network/HyperionThread.kt @@ -113,6 +113,46 @@ class HyperionThread( connect() } + /** + * Closes the current socket without shutting down the executor. + * Call [resumeConnection] to reconnect (e.g. on screen wake). + */ + fun pauseConnection() { + val pending = pendingTask + if (pending != null) { + pending.cancel(false) + pendingTask = null + } + pendingFrame = null + val client = clientRef.getAndSet(null) + if (client != null) { + try { client.disconnect() } catch (ignored: IOException) {} + } + connected.set(false) + } + + /** + * Opens a fresh socket on the executor thread. + * Call after [pauseConnection] when the screen wakes up. + */ + fun resumeConnection() { + if (executor.isShutdown) return + executor.submit { + try { + val client = createClient() + if (client.isConnected()) { + clientRef.set(client) + connected.set(true) + callback.onConnected() + } else { + callback.onConnectionError(0, "Failed to reconnect") + } + } catch (e: IOException) { + callback.onConnectionError(e.hashCode(), e.message ?: "Unknown error") + } + } + } + private fun createClient(): HyperionClient { return if (wledEnabled && wledIp != null) { WledDdpClient(InetAddress.getByName(wledIp), 4048)