Skip to content

Commit 8934b25

Browse files
committed
fix(discovery): Improve local network permission handling
Enhances server discovery by explicitly checking for local network permission, preventing discovery attempts when permission is not granted, and updating the UI accordingly. This ensures a smoother user experience and proper permission adherence. Key changes: * Permission Check for Discovery: Local and broadcast server discovery now explicitly checks if local network permission is satisfied before initiating. * UI State Update: The login UI state is updated to reflect when local network permission is required, guiding the user. * Resume Permission Recheck: Added a mechanism to recheck local network permission when the login screen resumes, automatically triggering discovery if permission is granted. * Broadcast Discovery Timeout: Introduced a timeout for broadcast server discovery to prevent indefinite waits.
1 parent b24d579 commit 8934b25

4 files changed

Lines changed: 49 additions & 17 deletions

File tree

‎app/src/main/java/com/makd/afinity/data/discovery/LocalServiceDiscovery.kt‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ constructor(
7373
serviceType: String,
7474
timeoutMs: Long = DEFAULT_TIMEOUT_MS,
7575
): Flow<DiscoveryResult> {
76+
if (!localNetworkPermission.isSatisfied()) {
77+
Timber.d("mDNS: local network permission not granted, skipping $serviceType")
78+
return flowOf(DiscoveryResult.PermissionRequired)
79+
}
80+
7681
val manager =
7782
nsdManager
7883
?: run {

‎app/src/main/java/com/makd/afinity/data/repository/server/JellyfinServerRepository.kt‎

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -268,24 +268,29 @@ constructor(
268268
}
269269
}
270270

271-
launch {
272-
try {
273-
jellyfin.discovery.discoverLocalServers(timeout = 5000, maxServers = 10).collect {
274-
serverInfo ->
275-
addServer(
276-
Server(
277-
id = serverInfo.id,
278-
name = serverInfo.name,
279-
version = null,
280-
address = serverInfo.address,
281-
),
282-
"broadcast",
283-
)
271+
if (localNetworkPermission.isSatisfied()) {
272+
launch {
273+
try {
274+
withTimeoutOrNull(BROADCAST_DISCOVERY_TIMEOUT_MS.milliseconds) {
275+
jellyfin.discovery
276+
.discoverLocalServers(timeout = 5000, maxServers = 10)
277+
.collect { serverInfo ->
278+
addServer(
279+
Server(
280+
id = serverInfo.id,
281+
name = serverInfo.name,
282+
version = null,
283+
address = serverInfo.address,
284+
),
285+
"broadcast",
286+
)
287+
}
288+
}
289+
} catch (e: CancellationException) {
290+
throw e
291+
} catch (e: Exception) {
292+
Timber.e(e, "Broadcast server discovery failed")
284293
}
285-
} catch (e: CancellationException) {
286-
throw e
287-
} catch (e: Exception) {
288-
Timber.e(e, "Broadcast server discovery failed")
289294
}
290295
}
291296

@@ -511,5 +516,6 @@ constructor(
511516
const val RECONNECT_INITIAL_DELAY_MS = 2_000L
512517
const val RECONNECT_MAX_DELAY_MS = 120_000L
513518
const val UNREACHABLE_CONFIRM_DELAY_MS = 4_000L
519+
const val BROADCAST_DISCOVERY_TIMEOUT_MS = 5_000L
514520
}
515521
}

‎app/src/main/java/com/makd/afinity/ui/login/LoginScreen.kt‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ import androidx.compose.ui.text.style.TextOverflow
8585
import androidx.compose.ui.unit.dp
8686
import androidx.compose.ui.unit.sp
8787
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
88+
import androidx.lifecycle.compose.LifecycleResumeEffect
8889
import androidx.lifecycle.compose.collectAsStateWithLifecycle
8990
import coil3.compose.AsyncImage
9091
import coil3.request.ImageRequest
@@ -139,6 +140,11 @@ fun LoginScreen(
139140

140141
LaunchedEffect(Unit) { viewModel.discoverServers() }
141142

143+
LifecycleResumeEffect(Unit) {
144+
viewModel.recheckLocalNetworkPermission()
145+
onPauseOrDispose {}
146+
}
147+
142148
LaunchedEffect(loginState.uiState.isLoggedIn) {
143149
if (loginState.uiState.isLoggedIn) {
144150
onLoginSuccess()

‎app/src/main/java/com/makd/afinity/ui/login/LoginViewModel.kt‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,8 +686,23 @@ constructor(
686686
discoverServers()
687687
}
688688

689+
fun recheckLocalNetworkPermission() {
690+
if (_uiState.value.needsLocalNetworkPermission && localNetworkPermission.isSatisfied()) {
691+
onLocalNetworkPermissionGranted()
692+
}
693+
}
694+
689695
fun discoverServers() {
690696
discoveryJob?.cancel()
697+
if (!localNetworkPermission.isSatisfied()) {
698+
_uiState.value =
699+
_uiState.value.copy(
700+
isDiscovering = false,
701+
discoveredServers = emptyList(),
702+
needsLocalNetworkPermission = true,
703+
)
704+
return
705+
}
691706
discoveryJob = viewModelScope.launch {
692707
_uiState.value =
693708
_uiState.value.copy(

0 commit comments

Comments
 (0)