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