From 52099b2e09ac0a5cfeb85f0c837c6244f72c05b3 Mon Sep 17 00:00:00 2001 From: Fritz Heiden Date: Wed, 19 Mar 2025 17:43:02 +0100 Subject: [PATCH] feat: persist token and show connection state --- .../java/com/example/tvcontroller/Settings.kt | 8 +++++++ .../example/tvcontroller/SettingsScreen.kt | 12 ++++++++++- .../example/tvcontroller/SettingsViewModel.kt | 16 ++++++++++++++ .../tvcontroller/services/DeviceService.kt | 21 ++++++++++++++----- app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/example/tvcontroller/Settings.kt diff --git a/app/src/main/java/com/example/tvcontroller/Settings.kt b/app/src/main/java/com/example/tvcontroller/Settings.kt new file mode 100644 index 0000000..f7bfb19 --- /dev/null +++ b/app/src/main/java/com/example/tvcontroller/Settings.kt @@ -0,0 +1,8 @@ +package com.example.tvcontroller + +object Settings { + enum class ConnectionState { + Unregistered, + Registered, + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tvcontroller/SettingsScreen.kt b/app/src/main/java/com/example/tvcontroller/SettingsScreen.kt index 11b031e..6a956ad 100644 --- a/app/src/main/java/com/example/tvcontroller/SettingsScreen.kt +++ b/app/src/main/java/com/example/tvcontroller/SettingsScreen.kt @@ -40,7 +40,9 @@ fun SettingsScreen(deviceService: DeviceService, appViewModel: AppViewModel) { style = MaterialTheme.typography.headlineSmall ) Text( - text = stringResource(id = R.string.server_connection_label) + ": " + stringResource(id = R.string.connection_state_disconnected), + text = stringResource(id = R.string.server_connection_label) + ": " + getConnectionStateString( + viewModel.connectionState + ), style = MaterialTheme.typography.bodyMedium ) OutlinedTextField( @@ -84,3 +86,11 @@ fun SettingsScreen(deviceService: DeviceService, appViewModel: AppViewModel) { } } } + +@Composable +fun getConnectionStateString(state: Settings.ConnectionState): String { + return when (state) { + Settings.ConnectionState.Unregistered -> stringResource(id = R.string.connection_state_unregistered) + Settings.ConnectionState.Registered -> stringResource(id = R.string.connection_state_registered) + } +} diff --git a/app/src/main/java/com/example/tvcontroller/SettingsViewModel.kt b/app/src/main/java/com/example/tvcontroller/SettingsViewModel.kt index 1135dd0..069f923 100644 --- a/app/src/main/java/com/example/tvcontroller/SettingsViewModel.kt +++ b/app/src/main/java/com/example/tvcontroller/SettingsViewModel.kt @@ -16,12 +16,28 @@ class SettingsViewModel(private val deviceService: DeviceService) : ViewModel() private set var registrationCode by mutableStateOf("") private set + var connectionState by mutableStateOf(Settings.ConnectionState.Unregistered) + private set + + init { + checkConnectionState() + } fun connect() { //Log.i("SettingsScreen", "Save settings: $serverUrl, $deviceName, $registrationCode") viewModelScope.launch { deviceService.setServerAddress(serverAddress) deviceService.createIntegration(deviceName, registrationCode) + checkConnectionState() + } + } + + private fun checkConnectionState() { + connectionState = if (deviceService.getToken().isEmpty()) { + Settings.ConnectionState.Unregistered + return + } else { + Settings.ConnectionState.Registered } } 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 dfeebd6..74ddc1f 100644 --- a/app/src/main/java/com/example/tvcontroller/services/DeviceService.kt +++ b/app/src/main/java/com/example/tvcontroller/services/DeviceService.kt @@ -18,6 +18,7 @@ private const val SHARED_PREFERENCES_NAME = "devices"; class DeviceService(private val context: Context) { private var client = HttpClient(CIO) private var serverAddress: String = "" + private var token: String = "" init { loadPreferences() @@ -25,20 +26,23 @@ class DeviceService(private val context: Context) { suspend fun createIntegration(name: String, code: String) { Log.i("DeviceService", "Creating integration for $name with code $code at $serverAddress") - val json = JSONObject() - json.put("name", name) - json.put("code", code) + val requestJson = JSONObject() + requestJson.put("name", name) + requestJson.put("code", code) try { val response: HttpResponse = client.request("http://$serverAddress/api/integrations") { method = HttpMethod.Post - setBody(json.toString()) + setBody(requestJson.toString()) headers { append("Content-Type", "application/json") } } - savePreferences() val body: String = response.body() + val responseJson = JSONObject(body) + token = responseJson.getString("token") + savePreferences() + Log.i("DeviceService", "Response: ${response.status.value} $body") } catch (e: Exception) { Log.e("DeviceService", "Error creating integration", e) @@ -48,6 +52,8 @@ class DeviceService(private val context: Context) { private fun loadPreferences() { val sharedPreferences = context.getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE) serverAddress = sharedPreferences.getString("server_address", "")!! + token = sharedPreferences.getString("token", "")!! + Log.i("DeviceService", "Loaded preferences: $serverAddress $token") } private fun savePreferences() { @@ -55,6 +61,7 @@ class DeviceService(private val context: Context) { val editor = sharedPreferences.edit() editor.apply { putString("server_address", serverAddress) + putString("token", token) apply() } } @@ -66,4 +73,8 @@ class DeviceService(private val context: Context) { fun getServerAddress(): String { return serverAddress } + + fun getToken(): String { + return token + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 942f1aa..8c4600f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,4 +11,6 @@ Save Connect Server address + unregistered + registered \ No newline at end of file