Skip to content

Commit

Permalink
Reconnect automatically if disconnected while in background
Browse files Browse the repository at this point in the history
  • Loading branch information
gujjwal00 committed Feb 23, 2024
1 parent 19f22bd commit df7279b
Showing 1 changed file with 24 additions and 2 deletions.
26 changes: 24 additions & 2 deletions app/src/main/java/com/gaurav/avnc/ui/vnc/VncActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import android.os.SystemClock
import android.util.Log
import android.util.Rational
import android.view.InputDevice
Expand All @@ -40,6 +41,7 @@ import com.gaurav.avnc.util.DeviceAuthPrompt
import com.gaurav.avnc.util.SamsungDex
import com.gaurav.avnc.viewmodel.VncViewModel
import com.gaurav.avnc.viewmodel.VncViewModel.State.Companion.isConnected
import com.gaurav.avnc.viewmodel.VncViewModel.State.Companion.isDisconnected
import com.gaurav.avnc.vnc.VncUri
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -81,10 +83,11 @@ class VncActivity : AppCompatActivity() {
private val layoutManager by lazy { LayoutManager(this) }
private val toolbar by lazy { Toolbar(this, dispatcher) }
private var restoredFromBundle = false
private var wasConnectedWhenStopped = false
private var onStartTime = 0L

override fun onCreate(savedInstanceState: Bundle?) {
DeviceAuthPrompt.applyFingerprintDialogFix(supportFragmentManager)
restoredFromBundle = savedInstanceState != null

super.onCreate(savedInstanceState)
if (!loadViewModel(savedInstanceState)) {
Expand All @@ -110,24 +113,32 @@ class VncActivity : AppCompatActivity() {
viewModel.loginInfoRequest.observe(this) { showLoginDialog() }
viewModel.sshHostKeyVerifyRequest.observe(this) { showHostKeyDialog() }
viewModel.state.observe(this) { onClientStateChanged(it) }

savedInstanceState?.let {
restoredFromBundle = true
wasConnectedWhenStopped = it.getBoolean("wasConnectedWhenStopped")
}
}

override fun onStart() {
super.onStart()
binding.frameView.onResume()
viewModel.resumeFrameBufferUpdates()
onStartTime = SystemClock.uptimeMillis()
}

override fun onStop() {
super.onStop()
virtualKeys.releaseMetaKeys()
binding.frameView.onPause()
viewModel.pauseFrameBufferUpdates()
wasConnectedWhenStopped = viewModel.state.value.isConnected
}

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putParcelable(PROFILE_KEY, viewModel.profile)
outState.putBoolean("wasConnectedWhenStopped", wasConnectedWhenStopped || viewModel.state.value.isConnected)
}

private fun loadViewModel(savedState: Bundle?): Boolean {
Expand Down Expand Up @@ -214,7 +225,18 @@ class VncActivity : AppCompatActivity() {

private var autoReconnecting = false
private fun autoReconnect(state: VncViewModel.State) {
if (autoReconnecting || state != VncViewModel.State.Disconnected || !viewModel.pref.server.autoReconnect)
if (!state.isDisconnected)
return

// If disconnected when coming back from background, try to reconnect immediately
if (wasConnectedWhenStopped && (SystemClock.uptimeMillis() - onStartTime) in 0..2000) {
Log.d(javaClass.simpleName, "Disconnected while in background, reconnecting ...")
retryConnection()
@Suppress("DEPRECATION")
overridePendingTransition(0, 0)
}

if (autoReconnecting || !viewModel.pref.server.autoReconnect)
return

autoReconnecting = true
Expand Down

0 comments on commit df7279b

Please sign in to comment.