feat: connect to server on app launch
This commit is contained in:
parent
645f8e2f04
commit
7471168a21
@ -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 {
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user