diff --git a/app/src/main/java/com/example/tvcontroller/MainActivity.kt b/app/src/main/java/com/example/tvcontroller/MainActivity.kt index 57c1a29..66f754c 100644 --- a/app/src/main/java/com/example/tvcontroller/MainActivity.kt +++ b/app/src/main/java/com/example/tvcontroller/MainActivity.kt @@ -23,6 +23,7 @@ import com.example.tvcontroller.ui.theme.TVControllerTheme import androidx.compose.runtime.getValue import androidx.compose.ui.res.painterResource import androidx.core.app.ActivityCompat +import androidx.lifecycle.lifecycleScope import com.example.tvcontroller.services.BluetoothService import com.example.tvcontroller.services.CameraService import com.example.tvcontroller.services.ControllerService @@ -30,6 +31,8 @@ import com.example.tvcontroller.services.DeviceService import com.example.tvcontroller.ui.views.CameraView import com.example.tvcontroller.ui.views.RemoteView import com.example.tvcontroller.ui.views.SettingsView +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch const val TAG = "MainActivity" @@ -47,6 +50,10 @@ class MainActivity : ComponentActivity() { cameraService = CameraService(this.applicationContext) controllerService = ControllerService(this.applicationContext, bluetoothService) checkPermissions() + + lifecycleScope.launch(Dispatchers.IO) { + deviceService.initialize() + } enableEdgeToEdge() setContent { TVControllerTheme { diff --git a/app/src/main/java/com/example/tvcontroller/services/DeviceService.kt b/app/src/main/java/com/example/tvcontroller/services/DeviceService.kt index 6563183..9399bc5 100644 --- a/app/src/main/java/com/example/tvcontroller/services/DeviceService.kt +++ b/app/src/main/java/com/example/tvcontroller/services/DeviceService.kt @@ -10,10 +10,13 @@ import io.ktor.client.call.body import io.ktor.client.plugins.cookies.HttpCookies import io.ktor.client.plugins.websocket.WebSockets import io.ktor.client.plugins.websocket.webSocket +import io.ktor.client.request.HttpRequestBuilder +import io.ktor.client.request.cookie import io.ktor.client.request.headers import io.ktor.client.request.request import io.ktor.client.request.setBody import io.ktor.client.statement.HttpResponse +import io.ktor.http.Cookie import io.ktor.http.HttpMethod import io.ktor.websocket.Frame import io.ktor.websocket.readText @@ -25,15 +28,18 @@ private const val TAG = "DeviceService" class DeviceService(private val context: Context) { private var client = HttpClient(CIO) { - install(HttpCookies) install(WebSockets) } private var serverAddress: String = "" private var token: String = "" private var deviceId: String = "" - init { + suspend fun initialize() { loadPreferences() + if (token.isEmpty()) return + getIntegration()?.let { + connect() + } } suspend fun registerIntegration(name: String, code: String) { @@ -44,13 +50,15 @@ class DeviceService(private val context: Context) { token = "" deviceId = "" try { - val response: HttpResponse = client.request("http://$serverAddress/api/integrations/register") { - method = HttpMethod.Post - setBody(requestJson.toString()) - headers { - append("Content-Type", "application/json") + val response: HttpResponse = + client.request("http://$serverAddress/api/integrations/register") { + method = HttpMethod.Post + setBody(requestJson.toString()) + headers { + append("Content-Type", "application/json") + } + cookie(name = "token", value = token) } - } val body: String = response.body() val responseJson = JSONObject(body) @@ -78,6 +86,7 @@ class DeviceService(private val context: Context) { headers { append("Authorization", "Bearer $token") } + cookie(name = "token", value = token) } val body: String = response.body() @@ -120,11 +129,17 @@ class DeviceService(private val context: Context) { fun connect() { Log.i(TAG, "Connecting to websocket at $serverAddress") runBlocking { - // split server address into host and port val (host, port) = serverAddress.split(":") - // if no port is specified, assume 80 val portInt = if (port.isEmpty()) 80 else port.toInt() - client.webSocket(method = HttpMethod.Get, host = host, port = portInt, path = "/ws") { + client.webSocket( + method = HttpMethod.Get, + host = host, + port = portInt, + path = "/ws", + request = { + cookie(name = "token", value = token) + } + ) { Log.i(TAG, "Listening for incoming websocket messages") while (true) { val frame = incoming.receive()