Skip to content

Commit 43c0366

Browse files
committed
fix: address Wi-Fi review comments
1 parent 9458a02 commit 43c0366

7 files changed

Lines changed: 95 additions & 8 deletions

File tree

app/src/main/kotlin/io/homeassistant/companion/android/settings/ssid/views/SsidView.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
5151
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
5252
import androidx.compose.ui.res.colorResource
5353
import androidx.compose.ui.res.stringResource
54+
import androidx.compose.ui.semantics.Role
5455
import androidx.compose.ui.text.font.FontFamily
5556
import androidx.compose.ui.text.input.ImeAction
5657
import androidx.compose.ui.tooling.preview.Preview
@@ -270,7 +271,7 @@ fun SsidSubheader(
270271
val subheaderModifier = if (onClicked != null) {
271272
modifier.then(
272273
Modifier
273-
.clickable { checked?.let { onClicked(!it) } ?: onClicked(true) }
274+
.clickable(role = Role.Checkbox) { checked?.let { onClicked(!it) } ?: onClicked(true) }
274275
.heightIn(min = 56.dp)
275276
.padding(horizontal = 16.dp),
276277
)

app/src/main/res/xml/changelog_master.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<change>Android 17: added assistant volume level sensor + notification command for control</change>
66
<change>Health Connect sleep duration sensor now ignores awake and out of bed time</change>
77
<change>Modernized settings for entity widgets and tiles</change>
8+
<change>Added an option to treat any Wi-Fi connection as internal</change>
89
<change>Bug fixes and dependency updates</change>
910
</release>
1011
<release version="2026.8.4 - Wear" versioncode="2">
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.homeassistant.companion.android.settings.ssid.views
2+
3+
import androidx.compose.material.icons.Icons
4+
import androidx.compose.material.icons.filled.Wifi
5+
import androidx.compose.ui.semantics.Role
6+
import androidx.compose.ui.semantics.SemanticsProperties
7+
import androidx.compose.ui.test.SemanticsMatcher
8+
import androidx.compose.ui.test.assert
9+
import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule
10+
import androidx.compose.ui.test.onNodeWithText
11+
import androidx.compose.ui.test.performClick
12+
import dagger.hilt.android.testing.HiltAndroidRule
13+
import dagger.hilt.android.testing.HiltAndroidTest
14+
import dagger.hilt.android.testing.HiltTestApplication
15+
import io.homeassistant.companion.android.HiltComponentActivity
16+
import org.junit.Rule
17+
import org.junit.Test
18+
import org.junit.jupiter.api.Assertions.assertEquals
19+
import org.junit.runner.RunWith
20+
import org.robolectric.RobolectricTestRunner
21+
import org.robolectric.annotation.Config
22+
23+
@RunWith(RobolectricTestRunner::class)
24+
@Config(application = HiltTestApplication::class)
25+
@HiltAndroidTest
26+
class SsidViewTest {
27+
28+
@get:Rule(order = 0)
29+
val hiltRule = HiltAndroidRule(this)
30+
31+
@get:Rule(order = 1)
32+
val composeTestRule = createAndroidComposeRule<HiltComponentActivity>()
33+
34+
@Test
35+
fun `Given an enabled SSID setting when clicked then toggle it with checkbox semantics`() {
36+
var checked: Boolean? = true
37+
38+
composeTestRule.setContent {
39+
SsidSubheader(
40+
title = "Any Wi-Fi",
41+
icon = Icons.Default.Wifi,
42+
checked = checked,
43+
onClicked = { checked = it },
44+
)
45+
}
46+
47+
composeTestRule.onNodeWithText("Any Wi-Fi")
48+
.assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
49+
.performClick()
50+
51+
assertEquals(false, checked)
52+
}
53+
}

common/src/main/kotlin/io/homeassistant/companion/android/common/data/servers/ServerConnectionStateProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ interface ServerConnectionStateProvider {
107107
* When on the home network, the internal URL should be used.
108108
*
109109
* Home network detection is based on the server's configuration:
110+
* - Connected to any Wi-Fi network (if enabled in settings)
110111
* - Connected to a configured Wi-Fi SSID (requires location permission)
111112
* - Connected via Ethernet (if enabled in settings)
112113
* - Connected via VPN (if enabled in settings)

common/src/main/kotlin/io/homeassistant/companion/android/common/data/servers/ServerConnectionStateProviderImpl.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,17 @@ internal class ServerConnectionStateProviderImpl @AssistedInject constructor(
122122

123123
override suspend fun getSecurityState(): SecurityState {
124124
val connection = connection()
125-
126-
val hasLocationPermission = ContextCompat.checkSelfPermission(
127-
context,
128-
Manifest.permission.ACCESS_FINE_LOCATION,
129-
) == PackageManager.PERMISSION_GRANTED
130-
val isLocationEnabled = DisabledLocationHandler.isLocationEnabled(context)
125+
val locationEnabled = connection.internalSsids.isEmpty() ||
126+
ContextCompat.checkSelfPermission(
127+
context,
128+
Manifest.permission.ACCESS_FINE_LOCATION,
129+
) == PackageManager.PERMISSION_GRANTED &&
130+
DisabledLocationHandler.isLocationEnabled(context)
131131

132132
return SecurityState(
133133
isOnHomeNetwork = isInternal(requiresUrl = false),
134134
hasHomeSetup = connection.hasHomeNetworkSetup,
135-
locationEnabled = hasLocationPermission && isLocationEnabled,
135+
locationEnabled = locationEnabled,
136136
)
137137
}
138138

common/src/test/kotlin/io/homeassistant/companion/android/common/data/servers/ServerConnectionStateProviderImplTest.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,17 +372,34 @@ class ServerConnectionStateProviderImplTest {
372372
assertTrue(result.hasHomeSetup)
373373
}
374374

375+
@Test
376+
fun `Given any WiFi detection only and location unavailable then locationEnabled is true`() = runTest {
377+
val repository = createServerConnectionStateProvider(
378+
externalUrl = "http://external.example.com",
379+
internalUrl = "http://192.168.1.1:8123",
380+
useAnyWifiForInternal = true,
381+
)
382+
every { wifiHelper.isUsingWifi() } returns false
383+
384+
val result = repository.getSecurityState()
385+
386+
assertTrue(result.hasHomeSetup)
387+
assertTrue(result.locationEnabled)
388+
}
389+
375390
@Test
376391
fun `Given location permission denied then locationEnabled is false`() = runTest {
377392
val repository = createServerConnectionStateProvider(
378393
externalUrl = "http://external.example.com",
379394
internalUrl = "http://192.168.1.1:8123",
380395
internalVpn = false,
381396
internalEthernet = false,
397+
internalSsids = listOf("HomeWiFi"),
382398
)
383399
every { networkHelper.isUsingEthernet() } returns false
384400
every { networkHelper.isUsingVpn() } returns false
385401
every { wifiHelper.isUsingSpecificWifi(any()) } returns false
402+
every { wifiHelper.isUsingWifi() } returns false
386403
every {
387404
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
388405
} returns PackageManager.PERMISSION_DENIED
@@ -401,10 +418,12 @@ class ServerConnectionStateProviderImplTest {
401418
internalUrl = "http://192.168.1.1:8123",
402419
internalVpn = false,
403420
internalEthernet = false,
421+
internalSsids = listOf("HomeWiFi"),
404422
)
405423
every { networkHelper.isUsingEthernet() } returns false
406424
every { networkHelper.isUsingVpn() } returns false
407425
every { wifiHelper.isUsingSpecificWifi(any()) } returns false
426+
every { wifiHelper.isUsingWifi() } returns false
408427
every {
409428
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
410429
} returns PackageManager.PERMISSION_GRANTED
@@ -423,10 +442,12 @@ class ServerConnectionStateProviderImplTest {
423442
internalUrl = "http://192.168.1.1:8123",
424443
internalVpn = false,
425444
internalEthernet = false,
445+
internalSsids = listOf("HomeWiFi"),
426446
)
427447
every { networkHelper.isUsingEthernet() } returns false
428448
every { networkHelper.isUsingVpn() } returns false
429449
every { wifiHelper.isUsingSpecificWifi(any()) } returns false
450+
every { wifiHelper.isUsingWifi() } returns false
430451
every {
431452
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
432453
} returns PackageManager.PERMISSION_DENIED

common/src/test/kotlin/io/homeassistant/companion/android/database/server/ServerConnectionInfoTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@ class ServerConnectionInfoTest {
3636
assertTrue(connection.hasHomeNetworkSetup)
3737
}
3838

39+
@Test
40+
fun `Given any WiFi detection enabled then hasHomeNetworkSetup is true`() {
41+
val connection = ServerConnectionInfo(
42+
externalUrl = "https://example.com",
43+
useAnyWifiForInternal = true,
44+
)
45+
46+
assertTrue(connection.hasHomeNetworkSetup)
47+
}
48+
3949
@Test
4050
fun `Given internalVpn enabled then hasHomeNetworkSetup is true`() {
4151
val connection = ServerConnectionInfo(

0 commit comments

Comments
 (0)