Cast: fix device connection lifecycle and implement joinApplication#3351
Open
FloodExLLC wants to merge 4 commits intomicrog:masterfrom
Open
Cast: fix device connection lifecycle and implement joinApplication#3351FloodExLLC wants to merge 4 commits intomicrog:masterfrom
FloodExLLC wants to merge 4 commits intomicrog:masterfrom
Conversation
The ChromeCast object was created but connect() was never called before launchApp(), sendRawRequest() etc., causing all outgoing operations to fail with IOException because no socket existed. - Add ensureConnected() helper; call it at the top of every outgoing operation (launchApplication, joinApplication, sendMessage, stopApplication) - Fix launchApplication() to guard against a null Application response instead of NPE-ing on app.sessionId - Implement joinApplication() properly: query device status, join an already-running matching session (wasLaunched=false), and only fall back to launching when the app is absent
onSelect() and onUnselect() were stubs. The Cast device connection lifecycle must mirror the route selection lifecycle so the socket is open before the Cast session begins and closed when the user switches away. - onSelect(): open TCP/TLS connection to the Cast device - onUnselect() / onUnselect(int): close the connection - onRelease(): close the connection when the controller is destroyed
|
Does not even build which makes it clear you didn't test this |
|
Hey! Thank you for this PR. Seems on the surface you have done some great work. |
added 2 commits
March 22, 2026 09:04
chromecast.connect() throws both IOException and GeneralSecurityException (a checked exception). The ensureConnected() helper only declared throws IOException, causing a compile error. Wrap the connect() call to catch GeneralSecurityException and rethrow as IOException so all callers remain unchanged. Fixes: microg#3351
….onSelect() Same fix as CastDeviceControllerImpl: chromecast.connect() throws both IOException and GeneralSecurityException. Update the catch clause to handle both using a multi-catch.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the two root causes that prevent Cast from working in practice.
Problem
The
ChromeCastobject (from the chromecast-java-api-v2 library) requiresan explicit
connect()call to open a TLS socket before any operation cansucceed. The existing code created the
ChromeCastinstance but never calledconnect(), solaunchApp(),sendRawRequest(),stopSession()etc. allthrew
IOExceptionimmediately, making Cast non-functional for all apps.A second issue was that
joinApplication()always launched a new instanceinstead of joining an existing session, breaking multi-sender scenarios
and session resume.
Changes
CastDeviceControllerImplensureConnected()helper that callschromecast.connect()if notalready connected; invoke it at the start of every outgoing operation
launchApplication()to handle anullapp response gracefullyrather than NPE-ing on
app.sessionIdjoinApplication()correctly: query device status, jointhe already-running matching session (
wasLaunched = false), fall backto launching only when the app is not present
CastMediaRouteControlleronSelect(): open TLS connection when user selects routeonUnselect()/onUnselect(int): close connection on deselectonRelease(): close connection when controller is destroyedCloses #580