Browse Source

Searching implemented on Search List SCreen ...

Khubaib 1 year ago
parent
commit
155e0aa771

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

@@ -17,11 +17,10 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.items
-import androidx.compose.material.IconButton
-import androidx.compose.material.Surface
-import androidx.compose.material.Text
 import androidx.compose.material3.Icon
 import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
@@ -44,9 +43,11 @@ import com.vpn.fastestvpnservice.beans.CountryServerList
 import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.allLocationsList
 import com.vpn.fastestvpnservice.beans.favList
+import com.vpn.fastestvpnservice.beans.favListServer
+import com.vpn.fastestvpnservice.utils.Utils
 
 @Composable
-fun CountryItem(server: CountryServerList) {
+fun CountryItem(server: Server) {
     Box(
         modifier = Modifier
             .fillMaxWidth()
@@ -58,8 +59,8 @@ fun CountryItem(server: CountryServerList) {
     ) {
         val context = LocalContext.current
 
-        var countrySize by rememberSaveable { mutableStateOf(server.server?.size) }
-        var isServerExpanded by rememberSaveable { mutableStateOf(true) }
+        var countrySize by rememberSaveable { mutableStateOf(server.countryServers?.size) }
+        var isServerExpanded by rememberSaveable { mutableStateOf(false) }
 
         if (countrySize != null) {
             countrySize?.let { size ->
@@ -87,15 +88,16 @@ fun CountryItem(server: CountryServerList) {
                                         .show()
                                 }
                         ) {
+                            val icon = Utils.getDrawable(context, server.iso)
                             Icon(
-                                painter = painterResource(id = server.icon),
+                                painter = painterResource(id = icon),
                                 contentDescription = "Server Logo",
                                 tint = Color.Unspecified,
                                 modifier = Modifier
                                     .padding(bottom = 16.dp)
                                     .size(24.dp)
                             )
-                            Text(text = server.country,
+                            Text(text = server.country!!,
                                 style = TextStyle(
                                     fontSize = 16.sp,
                                     color = MaterialTheme.colorScheme.primary
@@ -162,15 +164,16 @@ fun CountryItem(server: CountryServerList) {
                                     .show()
                             }
                     ) {
+                        val icon = Utils.getDrawable(context, server.iso)
                         Icon(
-                            painter = painterResource(id = server.icon),
+                            painter = painterResource(id = icon),
                             contentDescription = "Server Logo",
                             tint = Color.Unspecified,
                             modifier = Modifier
                                 .padding(bottom = 16.dp)
                                 .size(24.dp)
                         )
-                        Text(text = server.country,
+                        Text(text = server.country!!,
                             style = TextStyle(
                                 fontSize = 16.sp,
                                 color = MaterialTheme.colorScheme.primary
@@ -180,7 +183,16 @@ fun CountryItem(server: CountryServerList) {
                                 .align(Alignment.CenterVertically)
                         )
                         Spacer(modifier = Modifier.weight(1F))
-
+                        Text(
+                            text = "130 ms",
+                            style = TextStyle(
+                                fontSize = 16.sp,
+                                color = colorResource(id = R.color.blue_text)
+                            ),
+                            modifier = Modifier
+                                .padding(end = 30.dp, bottom = 18.dp)
+                                .align(Alignment.CenterVertically)
+                        )
                         var isFavorite by rememberSaveable { mutableStateOf(false) }
 
                         Icon(
@@ -220,7 +232,7 @@ fun CountryItem(server: CountryServerList) {
 }
 
 @Composable
-fun ColumnScope.ExpandableRow(server: CountryServerList) {
+fun ColumnScope.ExpandableRow(server: Server) {
     val context = LocalContext.current
 
     Column(
@@ -231,7 +243,7 @@ fun ColumnScope.ExpandableRow(server: CountryServerList) {
             )
             .background(Color.Transparent)
     ) {
-            server.server?.let { serverData ->
+            server.countryServers?.let { serverData ->
                 serverData.forEachIndexed { index, serverInfo ->
                     Row(
                         verticalAlignment = Alignment.CenterVertically,
@@ -249,13 +261,13 @@ fun ColumnScope.ExpandableRow(server: CountryServerList) {
                                 Toast
                                     .makeText(
                                         context,
-                                        serverInfo.ServerListName,
+                                        serverInfo.server_name,
                                         Toast.LENGTH_SHORT
                                     )
                                     .show()
                             }
                     ) {
-                        Text(text = serverInfo.ServerListName,
+                        Text(text = serverInfo.server_name!!,
                             style = TextStyle(
                                 fontSize = 16.sp,
                                 color = MaterialTheme.colorScheme.primary
@@ -266,7 +278,7 @@ fun ColumnScope.ExpandableRow(server: CountryServerList) {
                         )
                         Spacer(modifier = Modifier.weight(1F))
 
-                        Text(text = serverInfo.ping,
+                        Text(text = "45 ms",
                             style = TextStyle(
                                 fontSize = 16.sp,
                                 color = colorResource(id = R.color.blue_text)
@@ -313,5 +325,5 @@ fun ColumnScope.ExpandableRow(server: CountryServerList) {
 @Preview
 @Composable
 fun CountryItemPreview() {
-    CountryItem(server = allLocationsList[0])
+    CountryItem(server = favListServer[0])
 }

+ 16 - 14
app/src/main/java/com/vpn/fastestvpnservice/customItems/ServerItem.kt

@@ -48,7 +48,7 @@ import com.vpn.fastestvpnservice.beans.favListServer
 import com.vpn.fastestvpnservice.utils.Utils
 
 @Composable
-fun ServerItem(server: ServerList) {
+fun ServerItem(server: Server) {
     Box(
         modifier = Modifier
             .fillMaxWidth()
@@ -70,21 +70,22 @@ fun ServerItem(server: ServerList) {
                     Toast
                         .makeText(
                             context,
-                            server.ServerListName,
+                            server.server_name,
                             Toast.LENGTH_SHORT
                         )
                         .show()
                 }
         ) {
+            val icon = Utils.getDrawable(context, server.iso)
             Icon(
-                painter = painterResource(id = server.icon),
+                painter = painterResource(id = icon),
                 contentDescription = "Server Logo",
                 tint = Color.Unspecified,
                 modifier = Modifier
                     .padding(bottom = 16.dp)
                     .size(24.dp)
             )
-            Text(text = server.country,
+            Text(text = server.server_name!!,
                 style = TextStyle(
                     fontSize = 16.sp,
                     color = MaterialTheme.colorScheme.primary
@@ -94,7 +95,7 @@ fun ServerItem(server: ServerList) {
                     .align(Alignment.CenterVertically)
                 )
             Spacer(modifier = Modifier.weight(1F))
-            Text(text = server.ping,
+            Text(text = "75 ms",
                 style = TextStyle(
                     fontSize = 16.sp,
                     color = colorResource(id = R.color.blue_text)
@@ -192,7 +193,7 @@ fun FavoriteServerItem(server: Server) {
                     .size(24.dp)
             )
 
-            Text(text = server.country!!,
+            Text(text = "65 ms",
                 style = TextStyle(
                     fontSize = 16.sp,
                     color = MaterialTheme.colorScheme.primary
@@ -202,7 +203,7 @@ fun FavoriteServerItem(server: Server) {
                     .align(Alignment.CenterVertically)
             )
             Spacer(modifier = Modifier.weight(1F))
-            Text(text = server.name!!,
+            Text(text = "125 ms",
                 style = TextStyle(
                     fontSize = 16.sp,
                     color = colorResource(id = R.color.blue_text)
@@ -262,7 +263,7 @@ fun FavoriteServerItem(server: Server) {
 }
 
 @Composable
-fun ServerSearchItem(server: ServerList) {
+fun ServerSearchItem(server: Server) {
     Box(
         modifier = Modifier
             .fillMaxWidth()
@@ -285,21 +286,22 @@ fun ServerSearchItem(server: ServerList) {
                     Toast
                         .makeText(
                             context,
-                            server.ServerListName,
+                            server.server_name,
                             Toast.LENGTH_SHORT
                         )
                         .show()
                 }
         ) {
+            val icon = Utils.getDrawable(context, server.iso)
             Icon(
-                painter = painterResource(id = server.icon),
+                painter = painterResource(id = icon),
                 contentDescription = "Server Logo",
                 tint = Color.Unspecified,
                 modifier = Modifier
                     .padding(bottom = 16.dp)
                     .size(24.dp)
             )
-            Text(text = server.country,
+            Text(text = server.server_name!!,
                 style = TextStyle(
                     fontSize = 16.sp,
                     color = MaterialTheme.colorScheme.primary
@@ -309,7 +311,7 @@ fun ServerSearchItem(server: ServerList) {
                     .align(Alignment.CenterVertically)
             )
             Spacer(modifier = Modifier.weight(1F))
-            Text(text = server.ping,
+            Text(text = "145 ms",
                 style = TextStyle(
                     fontSize = 16.sp,
                     color = colorResource(id = R.color.blue_text)
@@ -370,7 +372,7 @@ fun ServerSearchItem(server: ServerList) {
 @Preview
 @Composable
 fun ServerItemPreview() {
-    ServerItem(server = favList[0])
+    ServerItem(server = favListServer[0])
 }
 
 @Preview
@@ -388,5 +390,5 @@ fun FavoriteServerItemPreviewDark() {
 @Preview
 @Composable
 fun ServerSearchItemPreview() {
-    ServerSearchItem(server = favList[0])
+    ServerSearchItem(server = favListServer[0])
 }

+ 173 - 127
app/src/main/java/com/vpn/fastestvpnservice/screens/ServerListScreen.kt

@@ -2,16 +2,11 @@ package com.vpn.fastestvpnservice.screens
 
 import android.content.res.Configuration
 import android.util.Log
-import android.widget.Toast
 import androidx.compose.animation.Animatable
-import androidx.compose.animation.core.animateFloatAsState
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.LocalOverscrollConfiguration
 import androidx.compose.foundation.background
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.gestures.Orientation
 import androidx.compose.foundation.gestures.detectTapGestures
-import androidx.compose.foundation.gestures.scrollable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
@@ -24,39 +19,28 @@ import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.wrapContentHeight
-import androidx.compose.foundation.layout.wrapContentWidth
 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.rememberScrollState
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.foundation.verticalScroll
-import androidx.compose.material.Icon
-import androidx.compose.material.IconButton
-import androidx.compose.material.Surface
-import androidx.compose.material.Tab
-import androidx.compose.material.TabRowDefaults
-import androidx.compose.material.TabRowDefaults.tabIndicatorOffset
-import androidx.compose.material.Text
-import androidx.compose.material.TopAppBar
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.automirrored.filled.ArrowBack
-import androidx.compose.material.icons.filled.FileDownload
-import androidx.compose.material.icons.filled.FilterList
-import androidx.compose.material.icons.outlined.FilterList
-import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.ModalBottomSheet
 import androidx.compose.material3.RadioButton
 import androidx.compose.material3.RadioButtonDefaults
 import androidx.compose.material3.SearchBar
 import androidx.compose.material3.SearchBarDefaults
-import androidx.compose.material3.ShapeDefaults
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Tab
 import androidx.compose.material3.TabRow
+import androidx.compose.material3.TabRowDefaults
 import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset
+import androidx.compose.material3.Text
 import androidx.compose.material3.TextFieldDefaults
 import androidx.compose.material3.rememberModalBottomSheetState
 import androidx.compose.runtime.Composable
@@ -76,36 +60,24 @@ import androidx.compose.ui.unit.sp
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
 import androidx.compose.runtime.*
+import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.draw.clip
-import androidx.compose.ui.draw.rotate
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.nestedscroll.nestedScroll
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalFocusManager
-import androidx.compose.ui.platform.rememberNestedScrollInteropConnection
 import androidx.compose.ui.res.painterResource
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewmodel.ViewModelFactoryDsl
 import androidx.lifecycle.viewmodel.compose.viewModel
 import com.vpn.fastestvpnservice.R
-import com.vpn.fastestvpnservice.beans.Server
-import com.vpn.fastestvpnservice.beans.allLocationsList
-import com.vpn.fastestvpnservice.beans.dvpnList
-import com.vpn.fastestvpnservice.beans.favList
-import com.vpn.fastestvpnservice.beans.p2pList
-import com.vpn.fastestvpnservice.beans.recentList
-import com.vpn.fastestvpnservice.beans.recommendedList
-import com.vpn.fastestvpnservice.beans.smartList
-import com.vpn.fastestvpnservice.beans.streamingList
 import com.vpn.fastestvpnservice.customItems.CountryItem
 import com.vpn.fastestvpnservice.customItems.ServerItem
 import com.vpn.fastestvpnservice.customItems.ServerSearchItem
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.AddTextSettings
 import com.vpn.fastestvpnservice.sealedClass.Screen
+import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import kotlinx.coroutines.launch
 
@@ -137,7 +109,7 @@ fun ServerList(
                 .padding(horizontal = 16.dp)
                 .padding(top = 100.dp)
         ) {
-            ShowSearchBar()
+            ShowSearchBar(serverListViewModel, basePreferenceHelper)
 
             val serverTabItems = listOf("Recommended", "All Locations")
             val pagerState = rememberPagerState(pageCount = {serverTabItems.size})
@@ -152,6 +124,7 @@ fun ServerList(
                 }
             }
 
+            // Tab Row [Recommended, All Locations]
             TabRow(
                 selectedTabIndex = selectedIndex,
                 containerColor = Color.White,
@@ -213,20 +186,26 @@ fun ServerList(
                     modifier = Modifier
                         .padding(top = 14.dp)
                         .fillMaxWidth()
-                        .background(Color.Transparent)
+                        .background(Color.Transparent),
+                    userScrollEnabled = false
                 ) { page ->
-                    Column(
-                        modifier = Modifier
-                            .fillMaxSize()
-                            .padding(top = 0.dp, bottom = 10.dp)
+                    CompositionLocalProvider(
+                        LocalOverscrollConfiguration provides null
                     ) {
-                        if (page == 0) {
-                            ShowRecommendedList()
-                        }
-                        else if (page == 1) {
-                            ShowAllLocationsList(serverListViewModel, basePreferenceHelper)
+                        Column(
+                            modifier = Modifier
+                                .fillMaxSize()
+                                .padding(top = 0.dp, bottom = 10.dp)
+                        ) {
+                            if (page == 0) {
+                                ShowRecommendedList(serverListViewModel, basePreferenceHelper)
+                            }
+                            else if (page == 1) {
+                                ShowAllLocationsList(serverListViewModel, basePreferenceHelper)
+                            }
                         }
                     }
+
                 }
         }
     }
@@ -276,7 +255,10 @@ fun BoxScope.HeaderRowSL(
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
-fun ColumnScope.ShowRecommendedList() {
+fun ColumnScope.ShowRecommendedList(
+    serverListViewModel: ServerListViewModel,
+    basePreferenceHelper: BasePreferenceHelper
+) {
     CompositionLocalProvider(
         LocalOverscrollConfiguration provides null
     ) {
@@ -313,10 +295,15 @@ fun ColumnScope.ShowRecommendedList() {
                     )
                 }
             }
-            for (i in 1..1) {
-                items(items = favList) { server ->
-                    ServerItem(server)
+                val fav = basePreferenceHelper.getServerData()
+                val filterData1 = fav.get(1).servers?.let {
+                    serverListViewModel.filterServersByStreamingServers(
+                        it
+                    )
                 }
+
+            items(items = filterData1!!) { server ->
+                ServerItem(server)
             }
 
             /* Smart List */
@@ -348,7 +335,15 @@ fun ColumnScope.ShowRecommendedList() {
                     )
                 }
             }
-            items(items = smartList) { server ->
+
+            val smart = basePreferenceHelper.getServerData()
+            val filterData2 = smart.get(1).servers?.let {
+                serverListViewModel.filterServersByStreamingServers(
+                    it
+                )
+            }
+
+            items(items = filterData2!!) { server ->
                 ServerItem(server)
             }
 
@@ -382,7 +377,14 @@ fun ColumnScope.ShowRecommendedList() {
                     )
                 }
             }
-            items(items = recentList) { server ->
+            val recent = basePreferenceHelper.getServerData()
+            val filterData3 = recent.get(1).servers?.let {
+                serverListViewModel.filterServersByStreamingServers(
+                    it
+                )
+            }
+
+            items(items = filterData3!!) { server ->
                 ServerItem(server)
             }
 
@@ -416,7 +418,15 @@ fun ColumnScope.ShowRecommendedList() {
                     )
                 }
             }
-            items(items = recommendedList) { server ->
+
+            val recommend = basePreferenceHelper.getServerData()
+            val filterData4 = recommend.get(1).servers?.let {
+                serverListViewModel.filterServersByStreamingServers(
+                    it
+                )
+            }
+
+            items(items = filterData4!!) { server ->
                 ServerItem(server)
             }
         }
@@ -437,7 +447,18 @@ fun ColumnScope.ShowAllLocationsList(
     val selectedIndex by remember { derivedStateOf { pagerState.currentPage } }
     val scope = rememberCoroutineScope()
 
-    TabRow(
+    val country = basePreferenceHelper.getServerData()
+    val filterData = country.get(0).servers?.let {
+        serverListViewModel.filterServersByISO(
+            it
+        )
+    }
+
+    country.forEachIndexed { index, server ->
+        Log.d("test_data", server.name.toString())
+    }
+
+    androidx.compose.material3.ScrollableTabRow(
         selectedTabIndex = selectedIndex,
         containerColor = Color.Transparent,
         modifier = Modifier
@@ -446,6 +467,7 @@ fun ColumnScope.ShowAllLocationsList(
             .background(Color.Transparent)
             .clip(RoundedCornerShape(0.dp))
             .height(68.dp),
+        edgePadding = 0.dp,
         indicator = { selectedTab ->
             TabRowDefaults.Indicator(
                 modifier = Modifier.tabIndicatorOffset(selectedTab[selectedIndex]),
@@ -504,77 +526,69 @@ fun ColumnScope.ShowAllLocationsList(
     var isDvpnExpanded by rememberSaveable { mutableStateOf(true) }
     var isP2PExpanded by rememberSaveable { mutableStateOf(true) }
 
-    val rotationState by animateFloatAsState(
-        targetValue = if (isCountriesExpanded) 180f else 0f,
-        label = if (isCountriesExpanded) "Show Less" else "Show More"
-    )
-    val rotationState2 by animateFloatAsState(
-        targetValue = if (isStreamingExpanded) 180f else 0f,
-        label = if (isStreamingExpanded) "Show Less" else "Show More"
-    )
-    val rotationState3 by animateFloatAsState(
-        targetValue = if (isDvpnExpanded) 180f else 0f,
-        label = if (isDvpnExpanded) "Show Less" else "Show More"
-    )
-    val rotationState4 by animateFloatAsState(
-        targetValue = if (isP2PExpanded) 180f else 0f,
-        label = if (isP2PExpanded) "Show Less" else "Show More"
-    )
+//    val rotationState by animateFloatAsState(
+//        targetValue = if (isCountriesExpanded) 180f else 0f,
+//        label = if (isCountriesExpanded) "Show Less" else "Show More"
+//    )
 
     HorizontalPager(
         state = pagerState,
         modifier = Modifier
             .padding(top = 16.dp)
             .fillMaxWidth()
-            .background(Color.Transparent)
+            .background(Color.Transparent),
+        userScrollEnabled = false
     ) { serverTabPager ->
-        Column(
-            modifier = Modifier.fillMaxSize()
+        CompositionLocalProvider(
+            LocalOverscrollConfiguration provides null
         ) {
-            var serverTitle by rememberSaveable { mutableStateOf("") }
-            var icon by rememberSaveable { mutableStateOf(0) }
-
-            when (serverTabPager) {
-                0 -> {
-                    serverTitle = allLocationsTabItems[0]
-                    icon = if (isCountriesExpanded) R.drawable.dragarrow3x
-                            else R.drawable.downarrow3x
-                }
-                1 -> {
-                    serverTitle = allLocationsTabItems[1]
-                    icon = if (isStreamingExpanded) R.drawable.dragarrow3x
-                    else R.drawable.downarrow3x
-                }
-                2 -> {
-                    serverTitle = allLocationsTabItems[2]
-                    icon = if (isDvpnExpanded) R.drawable.dragarrow3x
-                    else R.drawable.downarrow3x
-                }
-                3 -> {
-                    serverTitle = allLocationsTabItems[3]
-                    icon = if (isP2PExpanded) R.drawable.dragarrow3x
-                    else R.drawable.downarrow3x
-                }
-            }
+            Column(
+                modifier = Modifier.fillMaxSize()
+            ) {
+                var serverTitle by rememberSaveable { mutableStateOf("") }
+                var icon by rememberSaveable { mutableStateOf(0) }
 
-            ShowHeaderItem(serverTitle, icon, serverTabPager) {
                 when (serverTabPager) {
                     0 -> {
-                        isCountriesExpanded = !isCountriesExpanded
+                        serverTitle = allLocationsTabItems[0]
+                        icon = if (isCountriesExpanded) R.drawable.dragarrow3x
+                        else R.drawable.downarrow3x
                     }
                     1 -> {
-                        isStreamingExpanded = !isStreamingExpanded
+                        serverTitle = allLocationsTabItems[1]
+                        icon = if (isStreamingExpanded) R.drawable.dragarrow3x
+                        else R.drawable.downarrow3x
                     }
                     2 -> {
-                        isDvpnExpanded = !isDvpnExpanded
+                        serverTitle = allLocationsTabItems[2]
+                        icon = if (isDvpnExpanded) R.drawable.dragarrow3x
+                        else R.drawable.downarrow3x
                     }
                     3 -> {
-                        isP2PExpanded = !isP2PExpanded
+                        serverTitle = allLocationsTabItems[3]
+                        icon = if (isP2PExpanded) R.drawable.dragarrow3x
+                        else R.drawable.downarrow3x
+                    }
+                }
+
+                ShowHeaderItem(serverTitle, icon, serverTabPager) {
+                    when (serverTabPager) {
+                        0 -> {
+                            isCountriesExpanded = !isCountriesExpanded
+                        }
+                        1 -> {
+                            isStreamingExpanded = !isStreamingExpanded
+                        }
+                        2 -> {
+                            isDvpnExpanded = !isDvpnExpanded
+                        }
+                        3 -> {
+                            isP2PExpanded = !isP2PExpanded
+                        }
                     }
                 }
-            }
 
-            when (serverTabPager) {
+                when (serverTabPager) {
                     0 -> {
                         if (isCountriesExpanded) {
                             CompositionLocalProvider(
@@ -586,10 +600,9 @@ fun ColumnScope.ShowAllLocationsList(
                                         it
                                     )
                                 }
-                                Log.d("test_country_list", filterData?.get(0)?.country.toString() + " " + filterData?.size)
 
                                 LazyColumn() {
-                                    items(items = allLocationsList) { country ->
+                                    items(items = filterData!!) { country ->
                                         CountryItem(server = country)
                                     }
                                 }
@@ -602,9 +615,14 @@ fun ColumnScope.ShowAllLocationsList(
                             CompositionLocalProvider(
                                 LocalOverscrollConfiguration provides null
                             ) {
-
+                                val streaming = basePreferenceHelper.getServerData()
+                                val filterData = streaming.get(1).servers?.let {
+                                    serverListViewModel.filterServersByStreamingServers(
+                                        it
+                                    )
+                                }
                                 LazyColumn() {
-                                    items(items = streamingList) { streaming ->
+                                    items(items = filterData!!) { streaming ->
                                         ServerItem(server = streaming)
                                     }
                                 }
@@ -616,8 +634,15 @@ fun ColumnScope.ShowAllLocationsList(
                             CompositionLocalProvider(
                                 LocalOverscrollConfiguration provides null
                             ) {
+                                val dvpn = basePreferenceHelper.getServerData()
+                                val filterData = dvpn.get(2).servers?.let {
+                                    serverListViewModel.filterServersByISO(
+                                        it
+                                    )
+                                }
+
                                 LazyColumn() {
-                                    items(items = dvpnList) { dvpn ->
+                                    items(items = filterData!!) { dvpn ->
                                         ServerItem(server = dvpn)
                                     }
                                 }
@@ -630,8 +655,15 @@ fun ColumnScope.ShowAllLocationsList(
                             CompositionLocalProvider(
                                 LocalOverscrollConfiguration provides null
                             ) {
+                                val p2p = basePreferenceHelper.getServerData()
+                                val filterData = p2p.get(3).servers?.let {
+                                    serverListViewModel.filterServersByISO(
+                                        it
+                                    )
+                                }
+
                                 LazyColumn() {
-                                    items(items = p2pList) { p2p ->
+                                    items(items = filterData!!) { p2p ->
                                         ServerItem(server = p2p)
                                     }
                                 }
@@ -639,7 +671,9 @@ fun ColumnScope.ShowAllLocationsList(
                         }
                     }
                 }
+            }
         }
+
     }
 }
 
@@ -717,27 +751,37 @@ fun ColumnScope.ShowHeaderItem(
 
 @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
 @Composable
-fun ColumnScope.ShowSearchBar() {
-    var searchText by remember { mutableStateOf("") }
-    var isActive by remember { mutableStateOf(false) }
+fun ColumnScope.ShowSearchBar(
+    serverListViewModel: ServerListViewModel,
+    basePreferenceHelper: BasePreferenceHelper) {
+
+    val context = LocalContext.current
+    val searchListViewModel: SearchListViewModel = viewModel{
+        SearchListViewModel(context, serverListViewModel)
+    }
+
+//    var searchText by remember { mutableStateOf("") }
+//    var isActive by remember { mutableStateOf(false) }
+
+    val searchText = searchListViewModel.searchText.observeAsState().value
+    val isActive = searchListViewModel.isActive.observeAsState().value
 
     var isFilter by remember { mutableStateOf(false) }
     val sheetState = rememberModalBottomSheetState()
     val filterList = listOf("Popularity", "Alphabetically")
     var selectedFilterList by remember { mutableStateOf(filterList[0]) }
-    val context = LocalContext.current
 
     SearchBar(
-        query = searchText,
+        query = searchText!!,
         onQueryChange = {
-            searchText = it
+            searchListViewModel.searchTextChange(it)
         },
         onSearch = {
-            isActive = false
+            searchListViewModel.isActiveChange(false)
         },
-        active = isActive,
+        active = isActive!!,
         onActiveChange = {
-            isActive = it
+            searchListViewModel.isActiveChange(it)
         },
         placeholder = {
             Text(
@@ -775,7 +819,11 @@ fun ColumnScope.ShowSearchBar() {
             dividerColor = Color.Transparent,
             inputFieldColors = TextFieldDefaults.colors(
                 focusedTextColor = colorResource(id = R.color.dark_blue_gray_text),
-                unfocusedTextColor = colorResource(id = R.color.dark_blue_gray_text)
+                unfocusedTextColor = colorResource(id = R.color.dark_blue_gray_text),
+                unfocusedIndicatorColor = colorResource(id = R.color.dark_blue_gray_text),
+                focusedIndicatorColor = colorResource(id = R.color.dark_blue_gray_text),
+                disabledIndicatorColor = colorResource(id = R.color.dark_blue_gray_text),
+                cursorColor = colorResource(id = R.color.dark_blue_gray_text),
             )
         ),
         modifier = Modifier
@@ -788,10 +836,9 @@ fun ColumnScope.ShowSearchBar() {
                 modifier = Modifier
                     .padding(top = 0.dp, bottom = 0.dp),
             ) {
-                for (i in 1..20) {
-                    items(items = favList) { server ->
-                        ServerSearchItem(server)
-                    }
+                val searchServersList = searchListViewModel.countriesList.value
+                items(items = searchServersList!!) { server ->
+                    ServerSearchItem(server)
                 }
             }
         }
@@ -866,7 +913,6 @@ fun ColumnScope.ShowSearchBar() {
     }
 }
 
-
 @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
 @Composable
 fun ServerListPreview() {

+ 81 - 0
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SearchListViewModel.kt

@@ -0,0 +1,81 @@
+package com.vpn.fastestvpnservice.viewmodels
+
+import android.content.Context
+import android.util.Log
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vpn.fastestvpnservice.beans.Server
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
+
+class SearchListViewModel constructor(context: Context, serverListViewModel: ServerListViewModel): ViewModel() {
+
+    private var serverListViewModel: ServerListViewModel
+
+    init {
+        this.serverListViewModel = serverListViewModel
+    }
+
+    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())
+    var countriesList: LiveData<ArrayList<Server>> = _countriesList
+
+    fun searchTextChange(text: String) {
+        _searchText.value = text
+
+        _countriesList.value = getCountries()
+    }
+
+    fun isActiveChange(state: Boolean) {
+        _isActive.value = state
+
+        if (_isActive.value == false) {
+            searchTextChange("")
+        }
+    }
+
+    fun getCountries(): ArrayList<Server> {
+        val serversData = basePreferenceHelper.getServerData()
+        val allServers: ArrayList<Server> = ArrayList<Server>()
+        val serversArray: ArrayList<Server> = ArrayList<Server>()
+        var filtersArray: ArrayList<Server> = ArrayList<Server>()
+
+        serversData.forEachIndexed { index, serverData ->
+            serverData.servers?.forEachIndexed { indexes, server ->
+                allServers.add(indexes, server)
+            }
+        }
+
+        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) {
+                serversArray.add(server)
+            }
+        }
+
+        filtersArray = if (serversArray.size > 0) {
+            serversArray
+        } else {
+            searchServersList
+        }
+        Log.d("test_search", searchServersList.size.toString())
+        return filtersArray
+
+    }
+
+}