Browse Source

Resolved uninitialized issues of viewmodel objects on TV

Khubaib 8 months ago
parent
commit
55c418779e

+ 22 - 10
app/src/main/java/com/vpn/fastestvpnservice/screensTV/HomeScreenTV.kt

@@ -116,6 +116,7 @@ import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.isServerDialog
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.navHostController1
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.protocolObj
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.serverObj
+import com.vpn.fastestvpnservice.screens.isServerModelInitialized
 import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
 import com.vpn.fastestvpnservice.sealedClass.ScreenTV
 import com.vpn.fastestvpnservice.ui.theme.customTypography
@@ -273,6 +274,12 @@ fun HomeTV(
     var isButtonFocused by remember { mutableStateOf(false) }
     val vpnConnectionsUtil = VPNConnectionsUtil(context, activity, homeViewModel)
 
+    if (!isServerModelInitialized) {
+        serverListViewModelSplash = viewModel {
+            ServerListViewModel(context = context)
+        }
+    }
+
     OnLifecycleEvent { owner, event ->
         when (event) {
             Lifecycle.Event.ON_RESUME -> {
@@ -601,6 +608,7 @@ fun HomeTV(
                                     }
                                     true
                                 }
+
                                 else -> {
                                     true
                                 }
@@ -759,8 +767,14 @@ fun HomeTV(
                                 }
                                 .onKeyEvent {
                                     when (it.key) {
-                                        Key.DirectionLeft -> { true }
-                                        Key.DirectionRight -> { true }
+                                        Key.DirectionLeft -> {
+                                            true
+                                        }
+
+                                        Key.DirectionRight -> {
+                                            true
+                                        }
+
                                         else -> false
                                     }
                                 }
@@ -1083,11 +1097,9 @@ fun HomeTV(
                                             if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
                                                 isFirstItemPressed.value = true
                                                 true
-                                            }
-                                            else if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionLeft) {
+                                            } else if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionLeft) {
                                                 true
-                                            }
-                                            else {
+                                            } else {
                                                 false
                                             }
                                         }
@@ -1142,11 +1154,9 @@ fun HomeTV(
                                             if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
                                                 isFirstItemPressed.value = true
                                                 true
-                                            }
-                                            else if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionRight) {
+                                            } else if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionRight) {
                                                 true
-                                            }
-                                            else {
+                                            } else {
                                                 false
                                             }
                                         }
@@ -1612,9 +1622,11 @@ fun BoxScope.AddRowSmartTV(
                             Key.DirectionLeft -> {
                                 true
                             }
+
                             Key.DirectionRight -> {
                                 true
                             }
+
                             else -> {
                                 false
                             }

+ 20 - 6
app/src/main/java/com/vpn/fastestvpnservice/screensTV/SettingsScreenTV.kt

@@ -103,6 +103,7 @@ import com.vpn.fastestvpnservice.navigation.isSettingsScreenPressed
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.AddTextSettings
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.getAvailableProtocols
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.navHostController1
+import com.vpn.fastestvpnservice.screens.isSearchModelInitialized
 import com.vpn.fastestvpnservice.screens.searchListViewModelSplash
 import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
@@ -110,7 +111,9 @@ import com.vpn.fastestvpnservice.sealedClass.ScreenTV
 import com.vpn.fastestvpnservice.utils.VPNConnectionsUtil
 import com.vpn.fastestvpnservice.utils.isTablet
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
+import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
+import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import de.blinkt.openvpn.core.App
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
@@ -1019,10 +1022,21 @@ fun ColumnScope.AddRowSettingsSmartTV(
 
     if (isAnySpecificSheetOpen) {
         val sheetStateAny = rememberModalBottomSheetState(skipPartiallyExpanded = true)
-        val searchListViewModel = searchListViewModelSplash
+//        val searchListViewModel = searchListViewModelSplash
 //        val searchText = searchListViewModel.searchText.observeAsState().value
         var searchText1 by remember { mutableStateOf("") }
-        val isActive = searchListViewModel.isActive.observeAsState().value
+        if (!isSearchModelInitialized) {
+            splashViewModelSplash = viewModel {
+                SplashViewModel(context)
+            }
+            serverListViewModelSplash = viewModel {
+                ServerListViewModel(context = context)
+            }
+            searchListViewModelSplash = viewModel {
+                SearchListViewModel(context, serverListViewModelSplash, com.vpn.fastestvpnservice.screens.splashViewModelSplash)
+            }
+        }
+        val isActive = searchListViewModelSplash.isActive.observeAsState().value
         val scope = rememberCoroutineScope()
 
         ModalBottomSheet(
@@ -1054,7 +1068,7 @@ fun ColumnScope.AddRowSettingsSmartTV(
                             val delay = if (searchText1.isEmpty()) 0L else 300L
                             delay(delay)
                             val query = searchText1.ifEmpty { "settings_screen" }
-                            searchListViewModel.getCountries(query, true)
+                            searchListViewModelSplash.getCountries(query, true)
                         }
 //                        if (isActive == false) {
 //                            searchText1 = ""
@@ -1069,14 +1083,14 @@ fun ColumnScope.AddRowSettingsSmartTV(
                             },
                             onSearch = {
                                 scope.launch {
-                                    searchListViewModel.isActiveChange(state = false, true)
+                                    searchListViewModelSplash.isActiveChange(state = false, true)
                                 }
 //                                keyboardController?.hide()
                             },
                             active = isActive!!,
                             onActiveChange = {
                                 scope.launch {
-                                    searchListViewModel.isActiveChange(it, isFromSettings = true)
+                                    searchListViewModelSplash.isActiveChange(it, isFromSettings = true)
                                 }
                             },
                             placeholder = {
@@ -1114,7 +1128,7 @@ fun ColumnScope.AddRowSettingsSmartTV(
                                 .background(Color.Transparent)
                         ) {}
 
-                        val searchServersList = searchListViewModel.countriesListSettings.observeAsState().value
+                        val searchServersList = searchListViewModelSplash.countriesListSettings.observeAsState().value
                         LazyColumn(
                             modifier = Modifier
                                 .padding(top = 20.dp, bottom = 40.dp)

+ 21 - 18
app/src/main/java/com/vpn/fastestvpnservice/screensTV/settingsScreenAll/AnySpecificScreenTV.kt

@@ -1,11 +1,8 @@
 package com.vpn.fastestvpnservice.screensTV.settingsScreenAll
 
 import android.util.Log
-import android.widget.Toast
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.focusable
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.fillMaxHeight
@@ -15,19 +12,14 @@ import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.items
 import androidx.compose.foundation.lazy.itemsIndexed
-import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.text.KeyboardActions
 import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.SearchBarDefaults
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextField
 import androidx.compose.material3.TextFieldDefaults
@@ -41,8 +33,6 @@ import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusRequester
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalFocusManager
@@ -53,26 +43,39 @@ import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.customItems.SearchServerItemTV
-import com.vpn.fastestvpnservice.customItems.ServerItemTV
-import com.vpn.fastestvpnservice.customItems.ServerSearchItem
+import com.vpn.fastestvpnservice.screens.isSearchModelInitialized
 import com.vpn.fastestvpnservice.screens.searchListViewModelSplash
 import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
 import com.vpn.fastestvpnservice.screensTV.HeaderRowSL
-import com.vpn.fastestvpnservice.screensTV.locations
+import com.vpn.fastestvpnservice.screensTV.splashViewModelSplash
 import com.vpn.fastestvpnservice.ui.theme.customTypography
+import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
+import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
+import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
 
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun AnySpecificScreenTV(navHostController: NavHostController) {
     val context = LocalContext.current
-    val searchListViewModel = searchListViewModelSplash
+//    val searchListViewModel = searchListViewModelSplash
     var searchText1 by remember { mutableStateOf("Test") }
-    val isActive = searchListViewModel.isActive.observeAsState().value
+    if (!isSearchModelInitialized) {
+        splashViewModelSplash = viewModel {
+            SplashViewModel(context)
+        }
+        serverListViewModelSplash = viewModel {
+            ServerListViewModel(context = context)
+        }
+        searchListViewModelSplash = viewModel {
+            SearchListViewModel(context, serverListViewModelSplash, splashViewModelSplash)
+        }
+    }
+    val isActive = searchListViewModelSplash.isActive.observeAsState().value
     val scope = rememberCoroutineScope()
     var textChanged by remember { mutableStateOf("") }
     val keyboardController = LocalSoftwareKeyboardController.current
@@ -247,10 +250,10 @@ fun AnySpecificScreenTV(navHostController: NavHostController) {
                 Log.d("test_search_logic", "LaunchedEffect $textChanged")
                 val delay = if (textChanged.isEmpty()) 0L else 300L
                 delay(delay)
-                searchListViewModel.getCountries(textChanged, true)
+                searchListViewModelSplash.getCountries(textChanged, true)
             }
 
-            val searchServersList = searchListViewModel.countriesList.observeAsState().value
+            val searchServersList = searchListViewModelSplash.countriesList.observeAsState().value
             searchServersList?.forEachIndexed { index, server ->
                 Log.d("test_search", "SLS_ ${server.server_name} ${server.ping}")
             }