diff --git a/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsScreen.kt b/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsScreen.kt index 56e0501..6c79845 100644 --- a/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsScreen.kt +++ b/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsScreen.kt @@ -239,6 +239,7 @@ fun GlobalSettingsScreen(vm: GlobalSettingsViewModel = viewModel()) { availableQuery = "" selectedQuery = "" activeTab = "AVAILABLE" + vm.loadInstalledAppsIfNeeded() showAppPicker = true }, modifier = Modifier.fillMaxWidth() diff --git a/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsViewModel.kt b/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsViewModel.kt index 44b2200..d53b604 100644 --- a/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsViewModel.kt +++ b/android/app/src/main/java/com/masterdns/vpn/ui/settings/GlobalSettingsViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.viewModelScope import com.masterdns.vpn.util.GlobalSettings import com.masterdns.vpn.util.GlobalSettingsStore import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -28,10 +29,8 @@ class GlobalSettingsViewModel(app: Application) : AndroidViewModel(app) { private val _installedApps = MutableStateFlow>(emptyList()) val installedApps: StateFlow> = _installedApps - - init { - loadInstalledApps() - } + private var installedAppsJob: Job? = null + private var installedAppsLoaded = false fun save(settings: GlobalSettings) { viewModelScope.launch { @@ -39,8 +38,9 @@ class GlobalSettingsViewModel(app: Application) : AndroidViewModel(app) { } } - private fun loadInstalledApps() { - viewModelScope.launch { + fun loadInstalledAppsIfNeeded() { + if (installedAppsLoaded || installedAppsJob?.isActive == true) return + installedAppsJob = viewModelScope.launch { val appList = withContext(Dispatchers.IO) { val packageManager = getApplication().packageManager val launcherIntent = Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER) @@ -69,6 +69,7 @@ class GlobalSettingsViewModel(app: Application) : AndroidViewModel(app) { .toList() } _installedApps.value = appList + installedAppsLoaded = true } } }