Browse Source

added filter list functionality on countries servers(All Locations) and saving filterlist state and also servers are sorting also..

Khubaib 11 months ago
parent
commit
9b783368ec

+ 14 - 1
.idea/deploymentTargetDropDown.xml

@@ -6,7 +6,20 @@
         <State />
       </entry>
       <entry key="app">
-        <State />
+        <State>
+          <runningDeviceTargetSelectedWithDropDown>
+            <Target>
+              <type value="RUNNING_DEVICE_TARGET" />
+              <deviceKey>
+                <Key>
+                  <type value="SERIAL_NUMBER" />
+                  <value value="1C051FDF60048Z" />
+                </Key>
+              </deviceKey>
+            </Target>
+          </runningDeviceTargetSelectedWithDropDown>
+          <timeTargetWasSelectedWithDropDown value="2024-03-20T09:52:00.878888415Z" />
+        </State>
       </entry>
     </value>
   </component>

+ 3 - 1
app/src/main/java/com/vpn/fastestvpnservice/beans/Dark_Light_Theme.kt

@@ -9,4 +9,6 @@ val themesList = listOf<String>(
 
 var isDarkTheme: MutableState<Boolean> = mutableStateOf(false)
 
-var selectedtheme: MutableState<String> = mutableStateOf(themesList[0])
+var selectedtheme: MutableState<String> = mutableStateOf(themesList[0])
+
+val filterList = listOf<String>("Popularity", "Alphabetically")

+ 1 - 1
app/src/main/java/com/vpn/fastestvpnservice/customItems/CountryItem.kt

@@ -151,7 +151,7 @@ fun CountryItem(server: Server, category: String, navHostController: NavHostCont
                         val countriesServersData = basePreferenceHelper.getServerData().get(0).servers
                         countriesServersData?.let {
                             val serversGroup = serverListViewModel.getServerGroupList(server, it)
-                            Log.d("test_compose_servers", "${server.server_name} = ${serversGroup.size}")
+//                            Log.d("test_compose_servers", "${server.server_name} = ${serversGroup.size}")
                             locationsSize = serversGroup.size
                         }
 

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

@@ -41,6 +41,7 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         removePreference(context, KEY_FILENAME, THEME)
         removePreference(context, KEY_FILENAME, KEY_ISCONNECT)
         removePreference(context, KEY_FILENAME, KEY_SPLIT_POS)
+        removePreference(context, KEY_FILENAME, FILTER)
     }
 
     fun saveUser(user: UserResponse) {
@@ -365,6 +366,13 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         }
     }
 
+    fun saveFilterList(filter: String) {
+        putStringPreference(context, KEY_FILENAME, FILTER, filter)
+    }
+
+    fun getFilterList(): String {
+        return getStringPreference(context, KEY_FILENAME, FILTER)
+    }
 
     fun saveTvSplitTunnel(tvSplitTunneling: ArrayList<TvSplitTunneling>) {
         putStringPreference(context, KEY_FILENAME, TV_SPLIT_CLASS, Gson().toJson(tvSplitTunneling))
@@ -487,5 +495,6 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         private const val KEY_ISLOGGEDIN = "key_isloggedin"
         private const val THEME = "key_theme"
         private const val KEY_ISCONNECT = "keydata_isconnect"
+        private const val FILTER = "keydata_filter"
     }
 }

+ 2 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/LoginScreen.kt

@@ -110,6 +110,7 @@ import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.DataResponse
 import com.vpn.fastestvpnservice.beans.UserResponse
+import com.vpn.fastestvpnservice.beans.filterList
 import com.vpn.fastestvpnservice.beans.themesList
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.AddText
@@ -637,6 +638,7 @@ fun BoxScope.SignInButton(
                     prefHelper.saveXPlatformToken(it.userinfo?.email + "_" + System.currentTimeMillis())
                     prefHelper.saveAdBlockState(false)
                     prefHelper.saveTheme(themesList[0])
+                    prefHelper.saveFilterList(filterList[0])
 
                     it.servers?.let {
                         prefHelper.saveServerData(it)

+ 32 - 68
app/src/main/java/com/vpn/fastestvpnservice/screens/ServerListScreen.kt

@@ -28,6 +28,7 @@ import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
 import androidx.compose.foundation.pager.HorizontalPager
 import androidx.compose.foundation.pager.rememberPagerState
+import androidx.compose.foundation.selection.selectable
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.automirrored.filled.ArrowBack
@@ -38,6 +39,7 @@ import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.ModalBottomSheet
 import androidx.compose.material3.RadioButton
 import androidx.compose.material3.RadioButtonDefaults
+import androidx.compose.material3.ScrollableTabRow
 import androidx.compose.material3.SearchBar
 import androidx.compose.material3.SearchBarDefaults
 import androidx.compose.material3.Surface
@@ -77,6 +79,7 @@ import androidx.compose.ui.res.painterResource
 import androidx.lifecycle.viewmodel.compose.viewModel
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.Server
+import com.vpn.fastestvpnservice.beans.filterList
 import com.vpn.fastestvpnservice.customItems.CountryItem
 import com.vpn.fastestvpnservice.customItems.ServerItem
 import com.vpn.fastestvpnservice.customItems.ServerSearchItem
@@ -91,6 +94,7 @@ import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import kotlinx.coroutines.launch
 
+var isAlphabetList: MutableState<Boolean> = mutableStateOf(false)
 @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
 @Composable
 fun ServerList(
@@ -104,7 +108,7 @@ fun ServerList(
         ServerListViewModel(context = context)
     }
     val basePreferenceHelper = BasePreferenceHelper(context)
-
+    isAlphabetList.value = basePreferenceHelper.getFilterList() != filterList[0]
     Box(
         modifier = Modifier
             .fillMaxSize()
@@ -319,21 +323,9 @@ fun ColumnScope.ShowRecommendedList(
 
         }
 
-//        recommendedList.forEachIndexed { index, server ->
-//            Log.d("test_server recm", "$index ${server.server_name}")
-//        }
-//
-//        smartLocationList.forEachIndexed { index, server ->
-//            Log.d("test_server smart", "$index ${server.server_name}")
-//        }
-
         val liveServerData = serverListViewModel.liveDataGetServerData.observeAsState().value
-        val favList = serverListViewModel.liveDataGetFavList.observeAsState().value
+        var favList = serverListViewModel.liveDataGetFavList.observeAsState().value
 
-
-//        favList?.forEachIndexed { index, server ->
-//            Log.d("test_server favList", "$index ${server.server_name}")
-//        }
         LazyColumn(
             modifier = Modifier
                 .padding(top = 14.dp),
@@ -365,26 +357,21 @@ fun ColumnScope.ShowRecommendedList(
                     )
                 }
             }
-                val fav = prefHelper.getServerData()
-//                fav.forEachIndexed { index, serverData ->
-//                    Log.d("getServerData", serverData.name.toString())
-//                }
-//                val filterData1 = fav.get(2).servers?.let {
-//                    serverListViewModel.filterServersByStreamingServers(
-//                        it
-//                    )
-//                }
-
-//            val favList = serverListViewModel.getFavList()
-
 
             favList?.let {
+//                var favFilterList = favList
+//                if (isAlphabetList.value) {
+//                    favFilterList.sortBy {
+//                        it.server_name
+//                    }
+//                } else {
+//                    favFilterList = it
+//                }
                 items(items = favList) { server ->
                     ServerItem(server, navHostController)
                 }
             }
 
-
             /* Smart List */
             item {
                 Row(
@@ -413,13 +400,6 @@ fun ColumnScope.ShowRecommendedList(
                 }
             }
 
-//            val smart = prefHelper.getServerData()
-//            val filterData2 = smart.get(1).servers?.let {
-//                serverListViewModel.filterServersByStreamingServers(
-//                    it
-//                )
-//            }
-
             items(items = smartLocationList) { server ->
                 ServerItem(server, navHostController)
             }
@@ -508,7 +488,6 @@ fun ColumnScope.ShowRecommendedList(
             }
         }
     }
-
 }
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -519,12 +498,6 @@ fun ColumnScope.ShowAllLocationsList(
     navHostController: NavHostController
 ) {
     val serverData = basePreferenceHelper.getServerData()
-//    val filterData = serverData.get(0).servers?.let {
-//        serverListViewModel.filterServersByISO(
-//            it
-//        )
-//    }
-
     val pagerState = rememberPagerState(pageCount = { serverData.size })
     val selectedIndex by remember { derivedStateOf { pagerState.currentPage } }
     var indexTab = serverListViewModel.liveDataPagerIndex.observeAsState().value
@@ -533,11 +506,7 @@ fun ColumnScope.ShowAllLocationsList(
     val context = LocalContext.current
     var filterServersList: ArrayList<Server> = ArrayList<Server>()
 
-//    serverData.forEachIndexed { index, server ->
-//        Log.d("test_data", "${server.name} ${server.servers?.size} -> ${serverData.size}")
-//    }
-
-    androidx.compose.material3.ScrollableTabRow(
+    ScrollableTabRow(
         selectedTabIndex = selectedIndex,
         containerColor = Color.Transparent,
         modifier = Modifier
@@ -560,8 +529,7 @@ fun ColumnScope.ShowAllLocationsList(
             var color by remember { mutableStateOf(Color.Transparent) }
             var alpha by remember { mutableFloatStateOf(1F) }
 
-                color =
-                    if (selectedIndex == index1)
+                color = if (selectedIndex == index1)
                         colorResource(id = R.color.light_blue_2)
                     else MaterialTheme.colorScheme.primary
                 alpha = if (selectedIndex == index1)
@@ -570,12 +538,10 @@ fun ColumnScope.ShowAllLocationsList(
             Tab(
                 selected = selectedIndex == index1,
                 onClick = {
+                    Log.d("serverTabPager_index", "$index1")
 //                    serverListViewModel.setPagerIndex(index1)
                     scope.launch {
                         pagerState.animateScrollToPage(index1)
-//                        Toast.makeText(
-//                            context, "indexTab = $indexTab , index1 = $index1", Toast.LENGTH_SHORT
-//                        ).show()
 //                        val filterServersData =
 //                            if (data[index1].name?.lowercase().toString() == "servers") {
 //                                data.get(index1).servers?.let {
@@ -680,13 +646,13 @@ fun ColumnScope.ShowAllLocationsList(
                         filterServersList = if (data[serverTabPager].name?.lowercase().toString() == "servers") {
                             data.get(serverTabPager).servers?.let {
                                 serverListViewModel.filterServersByISO(
-                                    it
+                                    it, isAlphabetList.value
                                 )
                             }!!
                         } else {
                             data.get(serverTabPager).servers?.let {
                                 serverListViewModel.filterServersByStreamingServers(
-                                    it
+                                    it, isAlphabetList.value
                                 )
                             }!!
                         }
@@ -806,8 +772,7 @@ fun ColumnScope.ShowSearchBar(
 
     var isFilter by remember { mutableStateOf(false) }
     val sheetState = rememberModalBottomSheetState()
-    val filterList = listOf("Popularity", "Alphabetically")
-    var selectedFilterList by remember { mutableStateOf(filterList[0]) }
+    var selectedFilterList by remember { mutableStateOf(basePreferenceHelper.getFilterList()) }
     val scope = rememberCoroutineScope()
 
     SearchBar(
@@ -915,18 +880,15 @@ fun ColumnScope.ShowSearchBar(
                                 .fillMaxWidth()
                                 .background(Color.Transparent)
                                 .padding(start = 2.dp)
-//                                    .selectable(
-//                                        selected = selectedProtocol == protocol,
-//                                        onClick = {
-//                                            selectedProtocol = protocol
-//                                        },
-//                                    )
-//                                    .indication(
-//                                        indication = null,
-//                                        interactionSource = remember {
-//                                            MutableInteractionSource()
-//                                        }
-//                                    )
+                                .selectable(
+                                    selected = filter == selectedFilterList,
+                                    onClick = {
+                                        selectedFilterList = filter
+                                        basePreferenceHelper.saveFilterList(filter)
+                                        isAlphabetList.value = filter != filterList[0]
+                                        isFilter = false
+                                    },
+                                )
                             ,
                             verticalAlignment = Alignment.CenterVertically
                         ) {
@@ -934,7 +896,9 @@ fun ColumnScope.ShowSearchBar(
                                 selected = filter == selectedFilterList,
                                 onClick = {
                                     selectedFilterList = filter
-
+                                    basePreferenceHelper.saveFilterList(filter)
+                                    isAlphabetList.value = filter != filterList[0]
+                                    isFilter = false
                                 },
                                 colors = RadioButtonDefaults.colors(
                                     selectedColor = colorResource(id = R.color.radio_button_blue),

+ 2 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/SignUpScreen.kt

@@ -88,6 +88,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
+import com.vpn.fastestvpnservice.beans.filterList
 import com.vpn.fastestvpnservice.beans.themesList
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.sealedClass.Screen
@@ -709,6 +710,7 @@ fun BoxScope.SignUpButton(
                     prefHelper.saveXPlatformToken(it.userinfo?.email + "_" + System.currentTimeMillis())
                     prefHelper.saveAdBlockState(false)
                     prefHelper.saveTheme(themesList[0])
+                    prefHelper.saveFilterList(filterList[0])
 
                     it.servers?.let {
                         prefHelper.saveServerData(it)

+ 30 - 19
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/ServerListViewModel.kt

@@ -21,6 +21,7 @@ import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.helpers.UIHelper
 import com.vpn.fastestvpnservice.retrofit.RetrofitNetworkHandling
 import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
+import com.vpn.fastestvpnservice.screens.isAlphabetList
 import retrofit2.Call
 
 class ServerListViewModel(context: Context): ViewModel() {
@@ -39,7 +40,7 @@ class ServerListViewModel(context: Context): ViewModel() {
     var _mutableLiveDataPagerIndex = MutableLiveData<Int>(0)
     var liveDataPagerIndex: LiveData<Int> = _mutableLiveDataPagerIndex
 
-    var _mutableLiveDataGetFavList = MutableLiveData<ArrayList<Server>>(getFavList())
+    var _mutableLiveDataGetFavList = MutableLiveData<ArrayList<Server>>(getFavList(isAlphabetList.value))
     var liveDataGetFavList: LiveData<ArrayList<Server>> = _mutableLiveDataGetFavList
 
     var _mutableLiveDataGetServers = MutableLiveData<ArrayList<Server>>()
@@ -73,8 +74,8 @@ class ServerListViewModel(context: Context): ViewModel() {
         )
     }
 
-    fun filterServersByISO(serverlist: ArrayList<Server>): ArrayList<Server> {
-        Log.d("test_compose_servers", "serverTabPager = ${serverlist.size}")
+    fun filterServersByISO(serverlist: ArrayList<Server>, isAlphabetList: Boolean = false): ArrayList<Server> {
+//        Log.d("test_compose_servers", "size = ${serverlist.size}")
 
         serverlist.forEachIndexed { index, server ->
             Log.d("serverlist_test", server.server_name + " , " + server.country)
@@ -141,11 +142,19 @@ class ServerListViewModel(context: Context): ViewModel() {
             }
         }
 
+        val filterListCountries = distinctBy as ArrayList<Server>
+
+        if (isAlphabetList) {
+            filterListCountries.sortBy {
+                it.country
+            }
+        }
+
         distinctBy.forEachIndexed { index, server ->
-            Log.d("serverlist_test d 2", server.server_name + " , " + server.country + " , " + server.totalServers)
+            Log.d("serverlist_test_d2", server.server_name + " , " + server.country + " , " + server.totalServers)
         }
 
-        return (distinctBy as ArrayList<Server>)
+        return (filterListCountries)
     }
 
     fun filterServersByISOTV(serverlist: ArrayList<Server>): ArrayList<Server> {
@@ -277,7 +286,7 @@ class ServerListViewModel(context: Context): ViewModel() {
         return (enabledServer as ArrayList<Server>)
     }
 
-    fun filterServersByStreamingServers(serverlist: ArrayList<Server>): ArrayList<Server> {
+    fun filterServersByStreamingServers(serverlist: ArrayList<Server>, isAlphabet: Boolean): ArrayList<Server> {
 
         serverlist.sortWith(Comparator { s1, s2 ->
             return@Comparator s1.country_sort.compareTo(s2.country_sort)
@@ -300,23 +309,19 @@ class ServerListViewModel(context: Context): ViewModel() {
 
 //                    distinctBy.get(index).countryServers = entry.value
 
-//                    calculatePing(value) {
-//                        distinctBy.get(index).ping = it
-//                        Log.d("test_return_ping", "value => ${value.server_name} ${value.ping}")
-//                    }
-
-//                    value.countryServers?.forEachIndexed { indexs1, serverInfo ->
-//                        calculatePing(serverInfo) {
-//                            serverInfo.ping = it
-//                            Log.d("test_return_ping", "SS=> " +serverInfo.server_name + serverInfo.ping)
-//                        }
-//                    }
                 }
             }
         }
 
+        val filterList = distinctBy as ArrayList<Server>
+
+        if (isAlphabet) {
+            filterList.sortBy {
+                it.server_name
+            }
+        }
 //        Log.d("streaming_servers t", distinctBy.size.toString())
-        return (distinctBy as ArrayList<Server>)
+        return (filterList)
     }
 
     fun filterServersByStreamingServersTV(serverlist: ArrayList<Server>): ArrayList<Server> {
@@ -454,7 +459,7 @@ class ServerListViewModel(context: Context): ViewModel() {
 
     }
 
-    fun getFavList(): ArrayList<Server> {
+    fun getFavList(isAlphabet: Boolean = false): ArrayList<Server> {
         val tempList = ArrayList<Server>()
 
         preferencesHelper.getServerData().let {
@@ -471,6 +476,12 @@ class ServerListViewModel(context: Context): ViewModel() {
             }
         }
 
+//        if (isAlphabetList.value) {
+//            tempList.sortBy {
+//                it.server_name
+//            }
+//        }
+
         Log.d("test_server favList", "size of favlist = ${tempList.size}")
         return tempList
     }