mirror of
https://github.com/twinksoftware/Gearslip.git
synced 2026-11-11 00:12:24 +01:00
Wireless connects again when the car asks again before it has spoken
A Bolt opened the TCP connection but never sent its first message, then sent a new StartRequest over Bluetooth. Gearslip kept waiting on the dead connection for 88 seconds. Now a repeat StartRequest while the session still waits for the car opens a fresh connection. A session already under way is left alone.
This commit is contained in:
1 parent
e9aa6debb6
commit
a186b0c7d0
3 files changed
+24
No files matched your search
@@ -151,6 +151,7 @@ class GearslipActivity : ComponentActivity(), Projection {
|
|||||||
app.seb3thehacker.gearslip.wireless.WirelessLink.onConnected = { socket ->
|
app.seb3thehacker.gearslip.wireless.WirelessLink.onConnected = { socket ->
|
||||||
runOnUiThread { startWireless(socket) }
|
runOnUiThread { startWireless(socket) }
|
||||||
}
|
}
|
||||||
|
app.seb3thehacker.gearslip.wireless.WirelessLink.sessionWaiting = { runner?.waitingForVersion == true }
|
||||||
app.seb3thehacker.gearslip.wireless.WirelessAuto.showApproval = { chooser, address ->
|
app.seb3thehacker.gearslip.wireless.WirelessAuto.showApproval = { chooser, address ->
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
approvingCar = address
|
approvingCar = address
|
||||||
@@ -245,6 +246,7 @@ class GearslipActivity : ComponentActivity(), Projection {
|
|||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
app.seb3thehacker.gearslip.wireless.WirelessLink.onConnected = null
|
app.seb3thehacker.gearslip.wireless.WirelessLink.onConnected = null
|
||||||
|
app.seb3thehacker.gearslip.wireless.WirelessLink.sessionWaiting = null
|
||||||
app.seb3thehacker.gearslip.wireless.WirelessAuto.showApproval = null
|
app.seb3thehacker.gearslip.wireless.WirelessAuto.showApproval = null
|
||||||
runCatching { unregisterReceiver(detachReceiver) }
|
runCatching { unregisterReceiver(detachReceiver) }
|
||||||
PhoneMirror.onStartRequested = null
|
PhoneMirror.onStartRequested = null
|
||||||
|
|||||||
@@ -74,6 +74,9 @@ class GearslipRunner(
|
|||||||
@Volatile private var stopped = false
|
@Volatile private var stopped = false
|
||||||
|
|
||||||
@Volatile private var state = State.WAIT_VERSION
|
@Volatile private var state = State.WAIT_VERSION
|
||||||
|
|
||||||
|
/** Connected, but the car hasn't sent its first message yet. */
|
||||||
|
val waitingForVersion: Boolean get() = running && state == State.WAIT_VERSION
|
||||||
@Volatile private var lastProgress = System.currentTimeMillis()
|
@Volatile private var lastProgress = System.currentTimeMillis()
|
||||||
@Volatile private var running = true
|
@Volatile private var running = true
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ object WirelessLink {
|
|||||||
/** Set by the activity: starts a session on the car's socket. */
|
/** Set by the activity: starts a session on the car's socket. */
|
||||||
@Volatile var onConnected: ((Socket) -> Unit)? = null
|
@Volatile var onConnected: ((Socket) -> Unit)? = null
|
||||||
|
|
||||||
|
/** Set by the activity: whether the session on the socket still waits for the car's first message. */
|
||||||
|
@Volatile var sessionWaiting: (() -> Boolean)? = null
|
||||||
|
|
||||||
@Volatile private var rfcomm: BluetoothSocket? = null
|
@Volatile private var rfcomm: BluetoothSocket? = null
|
||||||
@Volatile private var listener: BluetoothServerSocket? = null
|
@Volatile private var listener: BluetoothServerSocket? = null
|
||||||
@Volatile private var tcp: Socket? = null
|
@Volatile private var tcp: Socket? = null
|
||||||
@@ -92,6 +95,8 @@ object WirelessLink {
|
|||||||
@Volatile private var lostNetwork: Network? = null
|
@Volatile private var lostNetwork: Network? = null
|
||||||
/** The car network asked for or joined, until Android says it's gone or never came. */
|
/** The car network asked for or joined, until Android says it's gone or never came. */
|
||||||
@Volatile private var activeSsid: String? = null
|
@Volatile private var activeSsid: String? = null
|
||||||
|
/** The car's network once joined, for connecting again on it. */
|
||||||
|
@Volatile private var joinedNet: Network? = null
|
||||||
/** Bumped on each Wi-Fi join and on stop, so an older run of TCP tries ends instead of racing the new one. */
|
/** Bumped on each Wi-Fi join and on stop, so an older run of TCP tries ends instead of racing the new one. */
|
||||||
@Volatile private var tcpRun = 0
|
@Volatile private var tcpRun = 0
|
||||||
/** The socket reached the car's projection: whatever ends the start-up now, it isn't retried. */
|
/** The socket reached the car's projection: whatever ends the start-up now, it isn't retried. */
|
||||||
@@ -195,6 +200,7 @@ object WirelessLink {
|
|||||||
}
|
}
|
||||||
network = null
|
network = null
|
||||||
activeSsid = null
|
activeSsid = null
|
||||||
|
joinedNet = null
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A stable id for this phone as this app sees it, standing in for the serial a real phone sends. */
|
/** A stable id for this phone as this app sees it, standing in for the serial a real phone sends. */
|
||||||
@@ -272,6 +278,17 @@ object WirelessLink {
|
|||||||
val port = Wire.varint(f, 2)?.toInt() ?: 0
|
val port = Wire.varint(f, 2)?.toInt() ?: 0
|
||||||
log.i("<- StartRequest: projection at $ip:$port")
|
log.i("<- StartRequest: projection at $ip:$port")
|
||||||
target = ip to port
|
target = ip to port
|
||||||
|
// The car asks again while the connection it got still hasn't heard from
|
||||||
|
// it: it started its side over, and waits on a fresh connection. Issue #18:
|
||||||
|
// a Bolt left Gearslip waiting 88 seconds on the old one, then hung up.
|
||||||
|
// A session already under way is left alone.
|
||||||
|
val net = joinedNet
|
||||||
|
if (net != null && activeSsid != null && handedOver && sessionWaiting?.invoke() == true) {
|
||||||
|
log.w("the car asked again while the connection still waits for it - connecting again")
|
||||||
|
val run = ++tcpRun
|
||||||
|
Thread({ connectTcp(context, output, name, net, ip, port, run) }, "gearslip-wireless-tcp").start()
|
||||||
|
continue
|
||||||
|
}
|
||||||
val join = waitingJoin
|
val join = waitingJoin
|
||||||
if (join != null) {
|
if (join != null) {
|
||||||
waitingJoin = null
|
waitingJoin = null
|
||||||
@@ -423,6 +440,7 @@ object WirelessLink {
|
|||||||
val callback = object : ConnectivityManager.NetworkCallback() {
|
val callback = object : ConnectivityManager.NetworkCallback() {
|
||||||
override fun onAvailable(net: Network) {
|
override fun onAvailable(net: Network) {
|
||||||
log.i("Wi-Fi: joined \"$ssid\"")
|
log.i("Wi-Fi: joined \"$ssid\"")
|
||||||
|
joinedNet = net
|
||||||
// Real phones report the join over Bluetooth before opening TCP, and some cars
|
// Real phones report the join over Bluetooth before opening TCP, and some cars
|
||||||
// only start listening once they hear it.
|
// only start listening once they hear it.
|
||||||
val phoneIp = manager.getLinkProperties(net)?.linkAddresses
|
val phoneIp = manager.getLinkProperties(net)?.linkAddresses
|
||||||
@@ -463,6 +481,7 @@ object WirelessLink {
|
|||||||
|
|
||||||
override fun onLost(net: Network) {
|
override fun onLost(net: Network) {
|
||||||
lostNetwork = net
|
lostNetwork = net
|
||||||
|
if (joinedNet == net) joinedNet = null
|
||||||
if (activeSsid == ssid) activeSsid = null
|
if (activeSsid == ssid) activeSsid = null
|
||||||
log.w(
|
log.w(
|
||||||
"Wi-Fi: lost \"$ssid\" - Android dropped the car's network. Picking it by hand " +
|
"Wi-Fi: lost \"$ssid\" - Android dropped the car's network. Picking it by hand " +
|
||||||
|
|||||||
Reference in new issue
Block a user