From fa05bbc1da9abb9898054d4c55c49e0db092884f Mon Sep 17 00:00:00 2001 From: Himanth Reddy Date: Mon, 17 Aug 2026 09:55:23 +0530 Subject: [PATCH] feat(settings): wire IPTV sort order controls and trigger cloud sync --- .../arflix/tv/ui/screens/settings/SettingsScreen.kt | 4 +++- .../tv/ui/screens/settings/SettingsViewModel.kt | 8 ++++++-- .../tv/data/repository/IptvProviderOrderTest.kt | 13 +++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsScreen.kt b/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsScreen.kt index 880ad9d6f..f2a0095c0 100644 --- a/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsScreen.kt +++ b/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsScreen.kt @@ -1646,7 +1646,9 @@ fun SettingsScreen( }, onRefresh = { viewModel.refreshIptv() }, onDelete = { viewModel.clearIptvConfig() }, - onManageCategories = openIptvCategories + onManageCategories = openIptvCategories, + sortOrder = uiState.iptvSortOrder, + onSortOrderChange = { viewModel.setIptvSortOrder(it) } ) "home_server" -> HomeServerSettings( connections = uiState.homeServerConnections, diff --git a/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsViewModel.kt b/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsViewModel.kt index caf84e441..bb6c093b8 100644 --- a/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/arflix/tv/ui/screens/settings/SettingsViewModel.kt @@ -34,6 +34,7 @@ import com.arflix.tv.data.repository.HomeServerRepository import com.arflix.tv.data.repository.PlexPinAuthSession import com.arflix.tv.data.repository.IptvConfig import com.arflix.tv.data.repository.IptvRepository +import com.arflix.tv.data.repository.normalizeIptvSortOrder import com.arflix.tv.data.repository.IptvPlaylistEntry import com.arflix.tv.data.repository.LauncherContinueWatchingRepository import com.arflix.tv.data.repository.MediaRepository @@ -1939,7 +1940,7 @@ class SettingsViewModel @Inject constructor( viewModelScope.launch { iptvRepository.observeConfig().collect { config -> val current = _uiState.value - if (current.iptvM3uUrl != config.m3uUrl || current.iptvEpgUrl != config.epgUrl || current.iptvStalkerUrl != config.stalkerPortalUrl || current.iptvStalkerMac != config.stalkerMacAddress || current.iptvPlaylists != config.playlists) { + if (current.iptvM3uUrl != config.m3uUrl || current.iptvEpgUrl != config.epgUrl || current.iptvStalkerUrl != config.stalkerPortalUrl || current.iptvStalkerMac != config.stalkerMacAddress || current.iptvPlaylists != config.playlists || current.iptvSortOrder != config.sortOrder) { _uiState.value = current.copy( iptvM3uUrl = config.m3uUrl, iptvEpgUrl = config.epgUrl, @@ -2449,8 +2450,11 @@ class SettingsViewModel @Inject constructor( } fun setIptvSortOrder(mode: String) { + val normalized = normalizeIptvSortOrder(mode) + _uiState.value = _uiState.value.copy(iptvSortOrder = normalized) viewModelScope.launch { - iptvRepository.saveSortOrder(mode) + iptvRepository.saveSortOrder(normalized) + syncLocalStateToCloud(silent = true) } } diff --git a/app/src/test/kotlin/com/arflix/tv/data/repository/IptvProviderOrderTest.kt b/app/src/test/kotlin/com/arflix/tv/data/repository/IptvProviderOrderTest.kt index f747fd29f..60397ad9c 100644 --- a/app/src/test/kotlin/com/arflix/tv/data/repository/IptvProviderOrderTest.kt +++ b/app/src/test/kotlin/com/arflix/tv/data/repository/IptvProviderOrderTest.kt @@ -14,6 +14,19 @@ class IptvProviderOrderTest { assertThat(normalizeIptvSortOrder(null)).isEqualTo("provider") } + @Test + fun iptvSortOrderCyclesThroughExpectedSequence() { + fun nextSortOrder(current: String): String = when (normalizeIptvSortOrder(current)) { + "provider" -> "number" + "number" -> "name" + else -> "provider" + } + + assertThat(nextSortOrder("provider")).isEqualTo("number") + assertThat(nextSortOrder("number")).isEqualTo("name") + assertThat(nextSortOrder("name")).isEqualTo("provider") + } + @Test fun xtreamCategoryEndpointDefinesGroupOrder() { val categorizedChannels = listOf(