Browse Source

delay on searching is resolved on searchBar

Khubaib 11 months ago
parent
commit
5b95e95548

+ 1 - 1
.idea/deploymentTargetSelector.xml

@@ -4,7 +4,7 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2024-05-15T10:04:40.982940791Z">
+        <DropdownSelection timestamp="2024-06-03T12:05:37.031573834Z">
           <Target type="DEFAULT_BOOT">
             <handle>
               <DeviceId pluginId="LocalEmulator" identifier="path=/home/ubuntu/.android/avd/Small_Phone_API_27.avd" />

+ 6 - 0
.idea/other.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ScreenshotViewer">
+    <option name="frameScreenshot" value="true" />
+  </component>
+</project>

+ 14 - 0
app/src/main/java/com/vpn/fastestvpnservice/helpers/BasePreferenceHelper.kt

@@ -369,6 +369,19 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         putStringPreference(context, KEY_FILENAME, KEY_RECOMMENDED, Gson().toJson(recommended))
     }
 
+    fun getRecommendedList(): ArrayList<Server>? {
+        val type = object : TypeToken<ArrayList<Server?>?>() {}.type
+        return Gson().fromJson<ArrayList<Server>>(
+            getStringPreference(
+                context, KEY_FILENAME, KEY_RECOMMENDED_LIST
+            ), type
+        )
+    }
+
+    fun setRecommendedList(recommended: ArrayList<Server>?) {
+        putStringPreference(context, KEY_FILENAME, KEY_RECOMMENDED_LIST, Gson().toJson(recommended))
+    }
+
     fun getSubscriptionServerObject(): Server? {
         var serverObj: Server? = null
         val serverObjStr: String = getStringPreference(context, KEY_FILENAME, KEY_SUBSCRIPTION)
@@ -600,6 +613,7 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         private const val KEY_SMART_SERVER = "keydata_smart_server"
         private const val KEY_AUTO_OPENVPN = "keydata_auto_openvpn"
         private const val KEY_RECOMMENDED = "keydata_recommended"
+        private const val KEY_RECOMMENDED_LIST = "keydata_recommended_list"
         private const val KEY_CONNECTED_SERVER = "keydata_connected_server"
         private const val KEY_SUBSCRIPTION = "keydata_subscription"
         private const val KEY_RECENTLY_SERVERS = "keydata_recently_servers"

+ 37 - 23
app/src/main/java/com/vpn/fastestvpnservice/screens/ServerListScreen.kt

@@ -54,6 +54,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.derivedStateOf
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
@@ -99,6 +100,7 @@ import com.vpn.fastestvpnservice.utils.isTablet
 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
 
 var isAlphabetList: MutableState<Boolean> = mutableStateOf(false)
@@ -452,10 +454,22 @@ fun ColumnScope.ShowRecommendedList(
                     recommendedFilterList.sortBy {
                         it.server_name
                     }
+                    recommendedFilterList.forEachIndexed { index, server ->
+                        Log.d("test_filter_list", "if => ${server.server_name}")
+                    }
                 } else {
-                    val recommended2 = serverListViewModelSplash.liveDataGetRecommendedServers.value
+//                    val recommended2 = serverListViewModelSplash.liveDataGetRecommendedServers.value
+                    val recommended2 = prefHelper.getRecommendedList()
+                    recommended2?.forEachIndexed { index, server ->
+                        Log.d("test_filter_list", "recommended2 => ${server.server_name}")
+                    }
+
                     if (recommended2 != null) {
                         recommendedFilterList = recommended2
+
+                        recommendedFilterList.forEachIndexed { index, server ->
+                            Log.d("test_filter_list", "else => ${server.server_name}")
+                        }
                     }
                 }
             }
@@ -737,35 +751,32 @@ fun ColumnScope.ShowSearchBar(
     serverListViewModel: ServerListViewModel,
     basePreferenceHelper: BasePreferenceHelper,
     navHostController: NavHostController) {
-
-    val context = LocalContext.current
-//    val splashViewModel: SplashViewModel = viewModel{
-//        SplashViewModel(context)
-//    }
-//    val splashViewModel = splashViewModelGlobal
-//    val searchListViewModel: SearchListViewModel = viewModel{
-//        SearchListViewModel(context, serverListViewModel, splashViewModel)
-//    }
+//    var isActive by remember { mutableStateOf(false) }
+//    val searchText = searchListViewModel.searchText.collectAsState().value
 
     val searchListViewModel = searchListViewModelSplash
     val scope = rememberCoroutineScope()
-
-//    var searchText by remember { mutableStateOf("") }
-//    var isActive by remember { mutableStateOf(false) }
-
-    val searchText = searchListViewModel.searchText.observeAsState().value
+    var searchText1 by remember { mutableStateOf("") }
     val isActive = searchListViewModel.isActive.observeAsState().value
-
     var isFilter by remember { mutableStateOf(false) }
     val sheetState = rememberModalBottomSheetState()
     var selectedFilterList by remember { mutableStateOf(basePreferenceHelper.getFilterList()) }
 
+    LaunchedEffect(key1 = searchText1) {
+        Log.d("test_search_logic", "LaunchedEffect $searchText1")
+        delay(300L)
+        searchListViewModel.getCountries(searchText1, true)
+    }
+    if (isActive == false) {
+        searchText1 = ""
+    }
     SearchBar(
-        query = searchText!!,
+        query = searchText1,
         onQueryChange = {
-            scope.launch {
-                searchListViewModel.searchTextChange(it)
-            }
+            searchText1 = it
+//            scope.launch {
+//                searchListViewModel.searchTextChange(it)
+//            }
         },
         onSearch = {
             scope.launch {
@@ -823,14 +834,17 @@ fun ColumnScope.ShowSearchBar(
         CompositionLocalProvider(
             LocalOverscrollConfiguration provides null
         ) {
-            val searchServersList = searchListViewModel.countriesList.value
+            val searchServersList = searchListViewModel.countriesList.observeAsState().value
+            Log.d("test_search", "SLS_${searchServersList?.size.toString()}")
             if (searchServersList != null) {
                 LazyColumn(
                     modifier = Modifier
                         .padding(top = 0.dp, bottom = 0.dp),
                 ) {
-                    items(items = searchServersList) { server ->
-                        ServerSearchItem(server, navHostController = navHostController) {}
+                    searchServersList.let {
+                        items(items = it) { server ->
+                            ServerSearchItem(server, navHostController = navHostController) {}
+                        }
                     }
                 }
             }

+ 16 - 15
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt

@@ -48,6 +48,8 @@ import androidx.compose.material3.TextFieldDefaults
 import androidx.compose.material3.rememberModalBottomSheetState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
@@ -95,6 +97,7 @@ 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
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -956,17 +959,9 @@ fun ColumnScope.AddRowSettingsSmart(
 
     if (isAnySpecificSheetOpen) {
         val sheetStateAny = rememberModalBottomSheetState()
-//        val splashViewModel: SplashViewModel = viewModel{
-//            SplashViewModel(context)
-//        }
-//        val serverListViewModel: ServerListViewModel = viewModel {
-//            ServerListViewModel(context = context)
-//        }
-//        val searchListViewModel: SearchListViewModel = viewModel{
-//            SearchListViewModel(context, serverListViewModel, splashViewModel)
-//        }
         val searchListViewModel = searchListViewModelSplash
-        val searchText = searchListViewModel.searchText.observeAsState().value
+//        val searchText = searchListViewModel.searchText.observeAsState().value
+        var searchText1 by remember { mutableStateOf("") }
         val isActive = searchListViewModel.isActive.observeAsState().value
         val scope = rememberCoroutineScope()
 
@@ -991,13 +986,19 @@ fun ColumnScope.AddRowSettingsSmart(
                     CompositionLocalProvider(
                         LocalOverscrollConfiguration provides null
                     ) {
+                        LaunchedEffect(key1 = searchText1) {
+                            Log.d("test_search_logic", "LaunchedEffect $searchText1")
+                            delay(300L)
+                            searchListViewModel.getCountries(searchText1, true)
+                        }
 
                         DockedSearchBar(
-                            query = searchText!!,
+                            query = searchText1,
                             onQueryChange = {
-                                scope.launch {
-                                    searchListViewModel.searchTextChange(it)
-                                }
+                                searchText1 = it
+//                                scope.launch {
+//                                    searchListViewModel.searchTextChange(it)
+//                                }
                             },
                             onSearch = {
                                 scope.launch {
@@ -1045,11 +1046,11 @@ fun ColumnScope.AddRowSettingsSmart(
                                 .background(Color.Transparent)
                         ) {}
 
+                        val searchServersList = searchListViewModel.countriesList.observeAsState().value
                         LazyColumn(
                             modifier = Modifier
                                 .padding(top = 20.dp, bottom = 40.dp),
                         ) {
-                            val searchServersList = searchListViewModel.countriesList.value
                             items(items = searchServersList!!) { server ->
                                 ServerSpecificItem(
                                     server, navHostController = navHostController,

+ 31 - 36
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SearchListViewModel.kt

@@ -8,6 +8,7 @@ import androidx.compose.ui.platform.LocalContext
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
 import androidx.lifecycle.viewmodel.compose.viewModel
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
@@ -19,8 +20,14 @@ import com.vpn.fastestvpnservice.retrofit.RetrofitNetworkHandling
 import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers.IO
+import kotlinx.coroutines.FlowPreview
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.debounce
 import kotlinx.coroutines.launch
 import retrofit2.Call
 
@@ -39,66 +46,51 @@ class SearchListViewModel constructor(
         this.serverListViewModel = serverListViewModel
         this.splashViewModel = splashViewModel
     }
+//    private var _searchText  = MutableStateFlow("")
+//    val searchText: StateFlow<String> = _searchText.asStateFlow()
 
     private var _searchText = MutableLiveData<String>("")
     var searchText: LiveData<String> = _searchText
-
     private var _isActive = MutableLiveData<Boolean>(false)
     var isActive: LiveData<Boolean> = _isActive
-
-
     val basePreferenceHelper = BasePreferenceHelper(context)
-
-//    private var _countriesList = MutableLiveData<ArrayList<Server>>(getCountries())
-
-    private var _countriesList = MutableLiveData<ArrayList<Server>>(getCountries())
+    private var _countriesList = MutableLiveData<ArrayList<Server>>(getCountries(""))
     var countriesList: LiveData<ArrayList<Server>> = _countriesList
 
-     suspend fun searchTextChange(text: String) {
-//        Log.d("test_search_logic", "B:=> ${_searchText.value} & $text")
-
-//        Log.d("test_search_logic", "A:=> ${_searchText.value} & $text")
-
-//         delay(100)
-
-         _searchText.value = text
-
-         if (_searchText.value == text) {
-            Log.d("test_search_logic", "Same:: => ${_searchText.value} & $text")
-            _countriesList.value = getCountries()
-        }
+    fun searchTextChange(text: String) {
+//         _searchText.value = text
+         getCountries(text, true)
+        Log.d("test_search","STC_"  + countriesList.value?.size.toString())
     }
 
+
     suspend fun isActiveChange(state: Boolean) {
         _isActive.value = state
-
         if (_isActive.value == false) {
             searchTextChange("")
-//            _searchText.value = ""
-//            _countriesList.value = getCountries()
         }
     }
 
     private var debounceJob: Job? = null
-
     fun debounceSearch(text: String, scope: CoroutineScope = CoroutineScope(IO)) {
         debounceJob?.cancel() // Cancel any previous debounce job
         debounceJob = scope.launch {
             delay(500) // Adjust delay as needed
             if (_searchText.value == text) {
                 Log.d("test_search_logic", "Same:: => ${_searchText.value} & $text")
-                getCountries()
+                getCountries("")
             }
         }
     }
 
-    fun getCountries(): ArrayList<Server> {
+    fun getCountries(text: String, isReturn: Boolean = false): ArrayList<Server> {
         val serversData = basePreferenceHelper.getServerData()
         val allServers: ArrayList<Server> = ArrayList<Server>()
         val serversArray: ArrayList<Server> = ArrayList<Server>()
         var filtersArray: ArrayList<Server> = ArrayList<Server>()
-        var emptyArray: ArrayList<Server> = ArrayList<Server>()
+        val emptyArray: ArrayList<Server> = ArrayList<Server>()
 
+        Log.d("test_search_logic", "getCountries() $text")
 
         serversData.forEachIndexed { index, serverData ->
             serverData.servers?.forEachIndexed { indexes, server ->
@@ -109,16 +101,17 @@ class SearchListViewModel constructor(
         val searchServersList = serverListViewModel.filterServersAllCategory(allServers)
 
         searchServersList.forEachIndexed { index, server ->
-            if (server.country?.lowercase()?.contains(_searchText.value?.lowercase().toString()) == true
-                || server.server_name?.lowercase()?.contains(_searchText.value?.lowercase().toString()) == true
-                || server.name?.lowercase()?.contains(_searchText.value?.lowercase().toString()) == true
-                || server.iso?.lowercase()?.contains(_searchText.value?.lowercase().toString()) == true) {
+            if (server.country?.lowercase()?.contains(text.lowercase().toString()) == true
+                || server.server_name?.lowercase()?.contains(text.lowercase().toString()) == true
+                || server.name?.lowercase()?.contains(text.lowercase().toString()) == true
+                || server.iso?.lowercase()?.contains(text.lowercase().toString()) == true) {
                 serversArray.add(server)
             }
         }
 
-        filtersArray = if (_searchText.value == ""){
-            searchServersList
+        filtersArray = if (text == ""){
+//            if (isFromSettings) searchServersList else emptyArray
+            emptyArray
         } else {
             if (serversArray.size > 0) {
                 serversArray
@@ -127,10 +120,12 @@ class SearchListViewModel constructor(
             }
         }
 
+           if (isReturn) {
+               _countriesList.value = filtersArray
+           }
 
-
-        Log.d("test_search", searchServersList.size.toString())
-            return filtersArray
+            Log.d("test_search","GC_" +  filtersArray.size.toString())
+        return filtersArray
     }
 
     fun updateFavUnFavServerState(server: Server) {

+ 2 - 0
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/ServerListViewModel.kt

@@ -125,7 +125,9 @@ class ServerListViewModel(context: Context): ViewModel() {
                 }
             }
 
+            Log.d("test_filter_list", "setRecommendedSmartServers")
             _mutableLiveDataGetRecommendedServers.value = recommendedListGlobal
+            preferencesHelper.setRecommendedList(recommendedListGlobal)
 
             if (sortedDistance.isNotEmpty()) {
                 for (i in 0..0) {