diff --git a/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/SettingsWearViewModel.kt b/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/SettingsWearViewModel.kt index 6f996f4d31f..181b856d1fd 100644 --- a/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/SettingsWearViewModel.kt +++ b/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/SettingsWearViewModel.kt @@ -276,8 +276,8 @@ class SettingsWearViewModel @Inject constructor(private val serverManager: Serve } } - private fun readUriData(uri: String): ByteArray { - if (uri.isEmpty()) return ByteArray(0) + private fun readUriData(uri: String?): ByteArray { + if (uri.isNullOrEmpty()) return ByteArray(0) return getApplication().contentResolver.openInputStream( uri.toUri(), )!!.buffered().use { @@ -291,8 +291,8 @@ class SettingsWearViewModel @Inject constructor(private val serverManager: Serve deviceName: String, deviceTrackingEnabled: Boolean, notificationsEnabled: Boolean, - tlsClientCertificateUri: String, - tlsClientCertificatePassword: String, + tlsClientCertificateUri: String?, + tlsClientCertificatePassword: String?, ) { _hasData.value = false // Show loading indicator val putDataRequest = PutDataMapRequest.create("/authenticate").run { @@ -304,7 +304,7 @@ class SettingsWearViewModel @Inject constructor(private val serverManager: Serve dataMap.putBoolean("LocationTracking", deviceTrackingEnabled) dataMap.putBoolean("Notifications", notificationsEnabled) dataMap.putByteArray("TLSClientCertificateData", readUriData(tlsClientCertificateUri)) - dataMap.putString("TLSClientCertificatePassword", tlsClientCertificatePassword) + dataMap.putString("TLSClientCertificatePassword", tlsClientCertificatePassword.orEmpty()) setUrgent() asPutDataRequest() } diff --git a/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearMainView.kt b/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearMainView.kt index 9632fb9edc9..c2e9c14ba92 100644 --- a/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearMainView.kt +++ b/app/src/full/kotlin/io/homeassistant/companion/android/settings/wear/views/SettingsWearMainView.kt @@ -9,8 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.google.android.gms.wearable.Node import dagger.hilt.android.AndroidEntryPoint -import io.homeassistant.companion.android.HomeAssistantApplication -import io.homeassistant.companion.android.onboarding.OnboardApp +import io.homeassistant.companion.android.onboarding.WearOnboardApp import io.homeassistant.companion.android.settings.wear.SettingsWearViewModel import io.homeassistant.companion.android.util.enableEdgeToEdgeCompat import kotlinx.coroutines.cancel @@ -23,7 +22,7 @@ class SettingsWearMainView : AppCompatActivity() { private val settingsWearViewModel by viewModels() private val registerActivityResult = registerForActivityResult( - OnboardApp(), + WearOnboardApp(), this::onOnboardingComplete, ) @@ -69,28 +68,21 @@ class SettingsWearMainView : AppCompatActivity() { private fun loginWearOs() { registerActivityResult.launch( - OnboardApp.Input( + WearOnboardApp.Input( url = registerUrl, defaultDeviceName = currentNodes.firstOrNull()?.displayName ?: "unknown", - locationTrackingPossible = false, - // While notifications are technically possible, the app can't handle this for the Wear device - notificationsPossible = false, - isWatch = true, - discoveryOptions = OnboardApp.DiscoveryOptions.ADD_EXISTING_EXTERNAL, - mayRequireTlsClientCertificate = - (application as HomeAssistantApplication).keyChainRepository.getPrivateKey() != null, ), ) } - private fun onOnboardingComplete(result: OnboardApp.Output?) { + private fun onOnboardingComplete(result: WearOnboardApp.Output?) { result?.apply { settingsWearViewModel.sendAuthToWear( url, authCode, deviceName, - deviceTrackingEnabled, - true, + deviceTrackingEnabled = false, + notificationsEnabled = true, tlsClientCertificateUri, tlsClientCertificatePassword, ) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d721ca4cdd4..89bc3cad16f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -112,7 +112,6 @@ - diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/OnboardApp.kt b/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/OnboardApp.kt deleted file mode 100644 index ee117f73d05..00000000000 --- a/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/OnboardApp.kt +++ /dev/null @@ -1,106 +0,0 @@ -package io.homeassistant.companion.android.onboarding - -import android.content.Context -import android.content.Intent -import android.os.Build -import androidx.activity.result.contract.ActivityResultContract -import io.homeassistant.companion.android.BuildConfig -import io.homeassistant.companion.android.launcher.intentLauncherOnboarding -import io.homeassistant.companion.android.launcher.intentLauncherWearOnboarding - -class OnboardApp : ActivityResultContract() { - - companion object { - private const val EXTRA_URL = "extra_url" - private const val EXTRA_DEFAULT_DEVICE_NAME = "extra_default_device_name" - private const val EXTRA_LOCATION_TRACKING_POSSIBLE = "location_tracking_possible" - private const val EXTRA_NOTIFICATIONS_POSSIBLE = "notifications_possible" - private const val EXTRA_IS_WATCH = "extra_is_watch" - private const val EXTRA_DISCOVERY_OPTIONS = "extra_discovery_options" - private const val EXTRA_MAY_REQUIRE_TLS_CLIENT_CERTIFICATE = "may_require_tls_client_certificate" - - fun parseInput(intent: Intent): Input = Input( - url = intent.getStringExtra(EXTRA_URL), - defaultDeviceName = intent.getStringExtra(EXTRA_DEFAULT_DEVICE_NAME) ?: Build.MODEL, - locationTrackingPossible = intent.getBooleanExtra(EXTRA_LOCATION_TRACKING_POSSIBLE, false), - notificationsPossible = intent.getBooleanExtra(EXTRA_NOTIFICATIONS_POSSIBLE, true), - isWatch = intent.getBooleanExtra(EXTRA_IS_WATCH, false), - discoveryOptions = intent.getStringExtra(EXTRA_DISCOVERY_OPTIONS)?.let { DiscoveryOptions.valueOf(it) }, - mayRequireTlsClientCertificate = intent.getBooleanExtra(EXTRA_MAY_REQUIRE_TLS_CLIENT_CERTIFICATE, false), - ) - } - - enum class DiscoveryOptions { - /** Add existing servers in the app to discovery results using their external URL */ - ADD_EXISTING_EXTERNAL, - - /** Hide existing servers in the app from discovery results if discovered */ - HIDE_EXISTING, - } - - data class Input( - val url: String? = null, - val defaultDeviceName: String = Build.MODEL, - val locationTrackingPossible: Boolean = BuildConfig.FLAVOR == "full", - val notificationsPossible: Boolean = true, - val isWatch: Boolean = false, - val discoveryOptions: DiscoveryOptions? = null, - val mayRequireTlsClientCertificate: Boolean = false, - ) - - data class Output( - val url: String, - val authCode: String, - val deviceName: String, - val deviceTrackingEnabled: Boolean, - val notificationsEnabled: Boolean, - val tlsClientCertificateUri: String, - val tlsClientCertificatePassword: String, - ) { - fun toIntent(): Intent { - return Intent().apply { - putExtra("URL", url) - putExtra("AuthCode", authCode) - putExtra("DeviceName", deviceName) - putExtra("LocationTracking", deviceTrackingEnabled) - putExtra("Notifications", notificationsEnabled) - putExtra("TLSClientCertificateUri", tlsClientCertificateUri) - putExtra("TLSClientCertificatePassword", tlsClientCertificatePassword) - } - } - - companion object { - fun fromIntent(intent: Intent): Output { - return Output( - url = intent.getStringExtra("URL").toString(), - authCode = intent.getStringExtra("AuthCode").toString(), - deviceName = intent.getStringExtra("DeviceName").toString(), - deviceTrackingEnabled = intent.getBooleanExtra("LocationTracking", false), - notificationsEnabled = intent.getBooleanExtra("Notifications", true), - tlsClientCertificateUri = intent.getStringExtra("TLSClientCertificateUri").toString(), - tlsClientCertificatePassword = intent.getStringExtra("TLSClientCertificatePassword").toString(), - ) - } - } - } - - override fun createIntent(context: Context, input: Input): Intent { - return if (input.isWatch) { - context.intentLauncherWearOnboarding(input.defaultDeviceName, input.url) - } else { - context.intentLauncherOnboarding( - input.url, - hideExistingServers = input.discoveryOptions == DiscoveryOptions.HIDE_EXISTING, - skipWelcome = true, - ) - } - } - - override fun parseResult(resultCode: Int, intent: Intent?): Output? { - if (intent == null) { - return null - } - - return Output.fromIntent(intent) - } -} diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/WearOnboardApp.kt b/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/WearOnboardApp.kt new file mode 100644 index 00000000000..5963ccd375d --- /dev/null +++ b/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/WearOnboardApp.kt @@ -0,0 +1,59 @@ +package io.homeassistant.companion.android.onboarding + +import android.content.Context +import android.content.Intent +import android.os.Build +import androidx.activity.result.contract.ActivityResultContract +import io.homeassistant.companion.android.launcher.intentLauncherWearOnboarding + +class WearOnboardApp : ActivityResultContract() { + data class Input(val url: String? = null, val defaultDeviceName: String = Build.MODEL) + + data class Output( + val url: String, + val authCode: String, + val deviceName: String, + val tlsClientCertificateUri: String?, + val tlsClientCertificatePassword: String?, + ) { + fun toIntent(): Intent { + return Intent().apply { + putExtra(EXTRA_OUTPUT_URL, url) + putExtra(EXTRA_OUTPUT_AUTH_CODE, authCode) + putExtra(EXTRA_OUTPUT_DEVICE_NAME, deviceName) + putExtra(EXTRA_OUTPUT_TLS_CLIENT_CERTIFICATE_URI, tlsClientCertificateUri) + putExtra(EXTRA_OUTPUT_TLS_CLIENT_CERTIFICATE_PASSWORD, tlsClientCertificatePassword) + } + } + + companion object { + private const val EXTRA_OUTPUT_URL = "URL" + private const val EXTRA_OUTPUT_AUTH_CODE = "AuthCode" + private const val EXTRA_OUTPUT_DEVICE_NAME = "DeviceName" + private const val EXTRA_OUTPUT_TLS_CLIENT_CERTIFICATE_URI = "TLSClientCertificateUri" + private const val EXTRA_OUTPUT_TLS_CLIENT_CERTIFICATE_PASSWORD = "TLSClientCertificatePassword" + + fun fromIntent(intent: Intent): Output { + return Output( + url = intent.getStringExtra(EXTRA_OUTPUT_URL).toString(), + authCode = intent.getStringExtra(EXTRA_OUTPUT_AUTH_CODE).toString(), + deviceName = intent.getStringExtra(EXTRA_OUTPUT_DEVICE_NAME).toString(), + tlsClientCertificateUri = intent.getStringExtra(EXTRA_OUTPUT_TLS_CLIENT_CERTIFICATE_URI), + tlsClientCertificatePassword = intent.getStringExtra(EXTRA_OUTPUT_TLS_CLIENT_CERTIFICATE_PASSWORD), + ) + } + } + } + + override fun createIntent(context: Context, input: Input): Intent { + return context.intentLauncherWearOnboarding(input.defaultDeviceName, input.url) + } + + override fun parseResult(resultCode: Int, intent: Intent?): Output? { + if (intent == null) { + return null + } + + return Output.fromIntent(intent) + } +} diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModel.kt b/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModel.kt index 2651e8db30e..01df74de004 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModel.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModel.kt @@ -172,8 +172,13 @@ internal class NameYourDeviceViewModel @VisibleForTesting constructor( messagingTokenProvider(), ), ) - return serverManager.convertTemporaryServer(tempServerId) + val serverId = serverManager.convertTemporaryServer(tempServerId) ?: throw IllegalStateException("Server still temporary") + + // Active the newly added server + serverManager.activateServer(serverId) + + return serverId } catch (e: Exception) { // Fatal errors: if one of these calls fail, the app cannot proceed. // Show an error, clean up the session and require new registration. diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt index e9c127d2c93..9004f5ae0cd 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsFragment.kt @@ -34,8 +34,8 @@ import io.homeassistant.companion.android.common.util.isAutomotive import io.homeassistant.companion.android.common.util.isIgnoringBatteryOptimizations import io.homeassistant.companion.android.common.util.maybeAskForIgnoringBatteryOptimizations import io.homeassistant.companion.android.database.server.Server +import io.homeassistant.companion.android.launcher.intentLauncherOnboarding import io.homeassistant.companion.android.nfc.NfcSetupActivity -import io.homeassistant.companion.android.onboarding.OnboardApp import io.homeassistant.companion.android.settings.controls.ManageControlsSettingsFragment import io.homeassistant.companion.android.settings.developer.DeveloperSettingsFragment import io.homeassistant.companion.android.settings.gestures.GesturesFragment @@ -77,9 +77,6 @@ class SettingsFragment(private val presenter: SettingsPresenter, private val lan registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { updateNotificationChannelPrefs() } - - private val requestOnboardingResult = registerForActivityResult(OnboardApp(), this::onOnboardingComplete) - private var serverAuth: Int? = null private val serverMutex = Mutex() @@ -140,13 +137,15 @@ class SettingsFragment(private val presenter: SettingsPresenter, private val lan findPreference("server_add")?.let { it.setOnPreferenceClickListener { - requestOnboardingResult.launch( - OnboardApp.Input( - // Empty url skips the 'Welcome' screen - url = "", - discoveryOptions = OnboardApp.DiscoveryOptions.HIDE_EXISTING, - ), - ) + requireContext().apply { + startActivity( + intentLauncherOnboarding( + urlToOnboard = null, + hideExistingServers = true, + skipWelcome = true, + ), + ) + } return@setOnPreferenceClickListener true } } @@ -560,12 +559,6 @@ class SettingsFragment(private val presenter: SettingsPresenter, private val lan return true } - private fun onOnboardingComplete(result: OnboardApp.Output?) { - lifecycleScope.launch { - presenter.addServer(result) - } - } - private fun openNotificationSettings() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { requestNotificationPermissionResult.launch( diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenter.kt b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenter.kt index 96f354a017e..58cf168a88d 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenter.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenter.kt @@ -4,7 +4,6 @@ import android.content.Context import androidx.preference.PreferenceDataStore import io.homeassistant.companion.android.common.data.integration.impl.entities.RateLimitResponse import io.homeassistant.companion.android.database.server.Server -import io.homeassistant.companion.android.onboarding.OnboardApp import kotlinx.coroutines.flow.StateFlow interface SettingsPresenter { @@ -18,7 +17,6 @@ interface SettingsPresenter { fun onFinish() fun updateSuggestions(context: Context) fun cancelSuggestion(context: Context, id: String) - suspend fun addServer(result: OnboardApp.Output?) fun getSuggestionFlow(): StateFlow fun getServersFlow(): StateFlow> fun getServerCount(): Int diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt index 7d66b7523f8..e10bf71ff9a 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/settings/SettingsPresenterImpl.kt @@ -12,30 +12,16 @@ import androidx.preference.PreferenceDataStore import io.homeassistant.companion.android.BuildConfig import io.homeassistant.companion.android.R import io.homeassistant.companion.android.common.R as commonR -import io.homeassistant.companion.android.common.data.integration.DeviceRegistration import io.homeassistant.companion.android.common.data.integration.impl.entities.RateLimitResponse import io.homeassistant.companion.android.common.data.prefs.NightModeTheme import io.homeassistant.companion.android.common.data.prefs.PrefsRepository import io.homeassistant.companion.android.common.data.servers.ServerManager -import io.homeassistant.companion.android.common.util.AppVersion -import io.homeassistant.companion.android.common.util.MessagingTokenProvider import io.homeassistant.companion.android.common.util.isAutomotive -import io.homeassistant.companion.android.database.sensor.SensorDao import io.homeassistant.companion.android.database.server.Server -import io.homeassistant.companion.android.database.server.ServerConnectionInfo -import io.homeassistant.companion.android.database.server.ServerSessionInfo -import io.homeassistant.companion.android.database.server.ServerType -import io.homeassistant.companion.android.database.server.ServerUserInfo -import io.homeassistant.companion.android.database.settings.SensorUpdateFrequencySetting -import io.homeassistant.companion.android.database.settings.Setting import io.homeassistant.companion.android.database.settings.SettingsDao -import io.homeassistant.companion.android.database.settings.WebsocketSetting -import io.homeassistant.companion.android.onboarding.OnboardApp -import io.homeassistant.companion.android.sensors.LocationSensorManager import io.homeassistant.companion.android.settings.language.LanguagesManager import io.homeassistant.companion.android.themes.NightModeManager import io.homeassistant.companion.android.util.ChangeLog -import io.homeassistant.companion.android.util.UrlUtil import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -55,8 +41,6 @@ class SettingsPresenterImpl @Inject constructor( private val langsManager: LanguagesManager, private val changeLog: ChangeLog, private val settingsDao: SettingsDao, - private val sensorDao: SensorDao, - private val messagingTokenProvider: MessagingTokenProvider, ) : PreferenceDataStore(), SettingsPresenter { @@ -172,7 +156,7 @@ class SettingsPresenterImpl @Inject constructor( null } } catch (e: Exception) { - Timber.d("Unable to get rate limits") + Timber.d(e, "Unable to get rate limits") return@withContext null } } @@ -189,81 +173,6 @@ class SettingsPresenterImpl @Inject constructor( prefsRepository.setChangeLogPopupEnabled(enabled) } - override suspend fun addServer(result: OnboardApp.Output?) { - if (result != null) { - val (url, authCode, deviceName, deviceTrackingEnabled, notificationsEnabled) = result - val messagingToken = messagingTokenProvider() - var serverId: Int? = null - try { - val formattedUrl = UrlUtil.formattedUrlString(url) - val server = Server( - _name = "", - type = ServerType.TEMPORARY, - connection = ServerConnectionInfo( - externalUrl = formattedUrl, - ), - session = ServerSessionInfo(), - user = ServerUserInfo(), - ) - serverId = serverManager.addServer(server) - serverManager.authenticationRepository(serverId).registerAuthorizationCode(authCode) - serverManager.integrationRepository(serverId).registerDevice( - DeviceRegistration( - AppVersion.from(BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE), - deviceName, - messagingToken, - ), - ) - serverManager.getServer()?.id?.let { - serverManager.activateServer(it) // Prevent unexpected active server changes - } - serverId = serverManager.convertTemporaryServer(serverId) - serverId?.let { - setLocationTracking(it, deviceTrackingEnabled) - setNotifications(it, notificationsEnabled) - } - view.onAddServerResult(true, serverId) - } catch (e: Exception) { - Timber.e(e, "Exception while registering") - try { - if (serverId != null) { - serverManager.authenticationRepository(serverId).revokeSession() - serverManager.removeServer(serverId) - } - } catch (e: Exception) { - Timber.e(e, "Can't revoke session") - } - view.onAddServerResult(false, null) - } - } - } - - private suspend fun setLocationTracking(serverId: Int, enabled: Boolean) { - sensorDao.setSensorsEnabled( - sensorIds = listOf( - LocationSensorManager.backgroundLocation.id, - LocationSensorManager.zoneLocation.id, - LocationSensorManager.singleAccurateLocation.id, - ), - serverId = serverId, - enabled = enabled, - ) - } - - private suspend fun setNotifications(serverId: Int, enabled: Boolean) { - // Full: this only refers to the system permission on Android 13+ so no changes are necessary. - // Minimal: change persistent connection setting to reflect preference. - if (BuildConfig.FLAVOR != "full") { - settingsDao.insert( - Setting( - serverId, - if (enabled) WebsocketSetting.ALWAYS else WebsocketSetting.NEVER, - SensorUpdateFrequencySetting.NORMAL, - ), - ) - } - } - override fun updateSuggestions(context: Context) { mainScope.launch { getSuggestions(context, false) } } diff --git a/app/src/main/kotlin/io/homeassistant/companion/android/util/compose/HANavHost.kt b/app/src/main/kotlin/io/homeassistant/companion/android/util/compose/HANavHost.kt index 8f169ad7670..9898f285670 100644 --- a/app/src/main/kotlin/io/homeassistant/companion/android/util/compose/HANavHost.kt +++ b/app/src/main/kotlin/io/homeassistant/companion/android/util/compose/HANavHost.kt @@ -1,7 +1,6 @@ package io.homeassistant.companion.android.util.compose import android.app.Activity -import android.content.Intent import android.net.Uri import androidx.activity.compose.LocalActivity import androidx.compose.runtime.Composable @@ -17,6 +16,7 @@ import io.homeassistant.companion.android.loading.LoadingScreen import io.homeassistant.companion.android.loading.navigation.LoadingRoute import io.homeassistant.companion.android.loading.navigation.loadingScreen import io.homeassistant.companion.android.onboarding.OnboardingRoute +import io.homeassistant.companion.android.onboarding.WearOnboardApp import io.homeassistant.companion.android.onboarding.WearOnboardingRoute import io.homeassistant.companion.android.onboarding.onboarding import io.homeassistant.companion.android.onboarding.wearOnboarding @@ -76,17 +76,15 @@ internal fun HANavHost( certUri: Uri?, certPassword: String?, -> - // TODO Use OnboardApp contract or similar to avoid using const - // OnboardApp should accept null for TLSCients activity?.setResult( Activity.RESULT_OK, - Intent().apply { - putExtra("URL", serverUrl) - putExtra("AuthCode", authCode) - putExtra("DeviceName", deviceName) - putExtra("TLSClientCertificateUri", certUri?.toString() ?: "") - putExtra("TLSClientCertificatePassword", certPassword ?: "") - }, + WearOnboardApp.Output( + url = serverUrl, + authCode = authCode, + deviceName = deviceName, + tlsClientCertificateUri = certUri?.toString(), + tlsClientCertificatePassword = certPassword, + ).toIntent(), ) activity?.finish() }, diff --git a/app/src/test/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModelTest.kt b/app/src/test/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModelTest.kt index bc727863426..31a9721b1ee 100644 --- a/app/src/test/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModelTest.kt +++ b/app/src/test/kotlin/io/homeassistant/companion/android/onboarding/nameyourdevice/NameYourDeviceViewModelTest.kt @@ -57,6 +57,7 @@ class NameYourDeviceViewModelTest { coEvery { serverManager.authenticationRepository(any()) } returns authRepository coEvery { serverManager.integrationRepository(any()) } returns integrationRepository coEvery { integrationRepository.setAllowInsecureConnection(any()) } just Runs + coEvery { serverManager.activateServer(any()) } just Runs viewModel = NameYourDeviceViewModel( route, @@ -144,6 +145,7 @@ class NameYourDeviceViewModelTest { authRepository.registerAuthorizationCode(route.authCode) integrationRepository.registerDevice(any()) serverManager.convertTemporaryServer(tempServerId) + serverManager.activateServer(testServerId) } coVerify(exactly = 0) { integrationRepository.setAllowInsecureConnection(any()) @@ -152,7 +154,7 @@ class NameYourDeviceViewModelTest { } @Test - fun `Given custom deviceName and successful add server when onSaveClick then emits DeviceNameSaved event and registered with custom name`() = runTest { + fun `Given custom deviceName and successful add server when onSaveClick then emits DeviceNameSaved event and registered with custom name and server activated`() = runTest { val customDeviceName = "Pixel" viewModel.onDeviceNameChange(customDeviceName) advanceUntilIdle() @@ -193,6 +195,7 @@ class NameYourDeviceViewModelTest { messagingTokenProvider(), ), ) + serverManager.activateServer(testServerId) } } } @@ -236,6 +239,7 @@ class NameYourDeviceViewModelTest { coVerify(exactly = 1) { integrationRepository.setAllowInsecureConnection(false) + serverManager.activateServer(testServerId) } } } @@ -280,6 +284,7 @@ class NameYourDeviceViewModelTest { coVerify(exactly = 1) { integrationRepository.setAllowInsecureConnection(false) serverManager.convertTemporaryServer(tempServerId) + serverManager.activateServer(testServerId) } } } @@ -300,6 +305,7 @@ class NameYourDeviceViewModelTest { authRepository.registerAuthorizationCode(any()) integrationRepository.registerDevice(any()) serverManager.convertTemporaryServer(any()) + serverManager.activateServer(any()) authRepository.revokeSession() serverManager.removeServer(any()) } @@ -331,6 +337,7 @@ class NameYourDeviceViewModelTest { coVerify(exactly = 0) { integrationRepository.registerDevice(any()) serverManager.convertTemporaryServer(any()) + serverManager.activateServer(any()) } } } @@ -358,7 +365,10 @@ class NameYourDeviceViewModelTest { authRepository.revokeSession() serverManager.removeServer(tempServerId) } - coVerify(exactly = 0) { serverManager.convertTemporaryServer(any()) } + coVerify(exactly = 0) { + serverManager.convertTemporaryServer(any()) + serverManager.activateServer(any()) + } } } @@ -387,6 +397,7 @@ class NameYourDeviceViewModelTest { authRepository.revokeSession() serverManager.removeServer(tempServerId) } + coVerify(exactly = 0) { serverManager.activateServer(any()) } } }