|
@@ -20,11 +20,14 @@ import androidx.compose.foundation.layout.size
|
|
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
|
import androidx.compose.foundation.lazy.items
|
|
|
import androidx.compose.material3.Icon
|
|
|
+import androidx.compose.material3.IconButton
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
import androidx.compose.material3.Surface
|
|
|
import androidx.compose.material3.Text
|
|
|
import androidx.compose.runtime.Composable
|
|
|
+import androidx.compose.runtime.LaunchedEffect
|
|
|
import androidx.compose.runtime.getValue
|
|
|
+import androidx.compose.runtime.livedata.observeAsState
|
|
|
import androidx.compose.runtime.mutableIntStateOf
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
import androidx.compose.runtime.remember
|
|
@@ -41,6 +44,7 @@ import androidx.compose.ui.text.TextStyle
|
|
|
import androidx.compose.ui.tooling.preview.Preview
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
import androidx.compose.ui.unit.sp
|
|
|
+import androidx.lifecycle.viewmodel.compose.viewModel
|
|
|
import com.vpn.fastestvpnservice.R
|
|
|
import com.vpn.fastestvpnservice.beans.CountryServerList
|
|
|
import com.vpn.fastestvpnservice.beans.Server
|
|
@@ -51,11 +55,14 @@ import com.vpn.fastestvpnservice.utils.Utils
|
|
|
import com.stealthcopter.networktools.Ping
|
|
|
import com.stealthcopter.networktools.ping.PingResult
|
|
|
import com.stealthcopter.networktools.ping.PingStats
|
|
|
+import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
|
|
|
+import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
|
|
|
import java.lang.Exception
|
|
|
import java.util.logging.Handler
|
|
|
|
|
|
@Composable
|
|
|
fun CountryItem(server: Server, category: String) {
|
|
|
+ Log.d("test_countrySize", "CountryItem Called")
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
.fillMaxWidth()
|
|
@@ -63,24 +70,135 @@ fun CountryItem(server: Server, category: String) {
|
|
|
color = MaterialTheme.colorScheme.background
|
|
|
)
|
|
|
.padding(bottom = 1.dp)
|
|
|
-
|
|
|
) {
|
|
|
val context = LocalContext.current
|
|
|
- val countrySize by rememberSaveable { mutableStateOf(server.totalServers) }
|
|
|
+ var countrySize by rememberSaveable { mutableStateOf(server.countryServers) }
|
|
|
var isServerExpanded by rememberSaveable { mutableStateOf(false) }
|
|
|
+ val serverListViewModel: ServerListViewModel = viewModel{
|
|
|
+ ServerListViewModel(context)
|
|
|
+ }
|
|
|
+ val splashViewModel: SplashViewModel = viewModel{
|
|
|
+ SplashViewModel(context)
|
|
|
+ }
|
|
|
+// var countrySize: Int = 0
|
|
|
+
|
|
|
+ Log.d("test_countrySize", "countrySize $countrySize")
|
|
|
+
|
|
|
+// LaunchedEffect(key1 = Unit) {
|
|
|
+// Log.d("test_countrySize", "countrySize LE() $countrySize")
|
|
|
+// if (countrySize == 0) {
|
|
|
+// Log.d("test_countrySize", "countrySize==0 $countrySize")
|
|
|
+// countrySize = server.totalServers
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+ if (countrySize != null){
|
|
|
+ countrySize.let { size ->
|
|
|
+ if (size?.size!! > 1) {
|
|
|
+ Column {
|
|
|
+ /* Country Location's Row */
|
|
|
+ Row(
|
|
|
+ verticalAlignment = Alignment.Top,
|
|
|
+ horizontalArrangement = Arrangement.Start,
|
|
|
+ modifier = Modifier
|
|
|
+ .fillMaxWidth()
|
|
|
+ .padding(
|
|
|
+ start = 16.dp, end = 12.dp, top = 12.dp
|
|
|
+ )
|
|
|
+ .clickable(
|
|
|
+ indication = null,
|
|
|
+ interactionSource = remember { MutableInteractionSource() }
|
|
|
+ ) {
|
|
|
+ Toast
|
|
|
+ .makeText(
|
|
|
+ context,
|
|
|
+ server.country,
|
|
|
+ Toast.LENGTH_SHORT
|
|
|
+ )
|
|
|
+ .show()
|
|
|
+ }
|
|
|
+ ) {
|
|
|
+ val icon = Utils.getDrawable(context, server.iso)
|
|
|
+ Icon(
|
|
|
+ painter = painterResource(id = icon),
|
|
|
+ contentDescription = "Server Logo",
|
|
|
+ tint = Color.Unspecified,
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(bottom = 16.dp)
|
|
|
+ .size(24.dp)
|
|
|
+ )
|
|
|
+ Text(text = server.country!!,
|
|
|
+ style = TextStyle(
|
|
|
+ fontSize = 16.sp,
|
|
|
+ color = MaterialTheme.colorScheme.primary
|
|
|
+ ),
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(start = 16.dp, bottom = 18.dp)
|
|
|
+ .align(Alignment.CenterVertically)
|
|
|
+ )
|
|
|
+ Spacer(modifier = Modifier.weight(1F))
|
|
|
+ Text(text = "${countrySize?.size} locations",
|
|
|
+ style = TextStyle(
|
|
|
+ fontSize = 16.sp,
|
|
|
+ color = colorResource(id = R.color.blue_text)
|
|
|
+ ),
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(end = 30.dp, bottom = 18.dp)
|
|
|
+ .align(Alignment.CenterVertically)
|
|
|
+ )
|
|
|
+// Spacer(modifier = Modifier.weight(1F))
|
|
|
+
|
|
|
+ Icon(
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(bottom = 18.dp, end = 0.dp)
|
|
|
+ .size(12.dp, 7.dp)
|
|
|
+ .align(Alignment.CenterVertically)
|
|
|
+ .clickable(
|
|
|
+ indication = null,
|
|
|
+ interactionSource = remember { MutableInteractionSource() }
|
|
|
+ ) { isServerExpanded = !isServerExpanded },
|
|
|
+
|
|
|
+ painter = if (isServerExpanded) painterResource(
|
|
|
+ id = R.drawable.dragarrow3x) else painterResource(
|
|
|
+ id = R.drawable.downarrow3x),
|
|
|
+
|
|
|
+ contentDescription = "Server Logo",
|
|
|
+ tint = MaterialTheme.colorScheme.primary,
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Country Expandable's Row */
|
|
|
+ if (isServerExpanded) {
|
|
|
+ ExpandableRow(server = server)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+
|
|
|
+// Log.d("test_servers_count", "${server.server_name} ${server.countryServers?.size}")
|
|
|
+ /* Country Location's Row -> 1 Location() */
|
|
|
+
|
|
|
+ var ping by remember { mutableIntStateOf(0) }
|
|
|
+ Ping.onAddress(server.ip as String).setTimeOutMillis(1000).doPing(
|
|
|
+ object : Ping.PingListener{
|
|
|
+ override fun onResult(pingResult: PingResult?) {
|
|
|
+ android.os.Handler(Looper.getMainLooper()).post {
|
|
|
+ ping = pingResult?.timeTaken?.toInt()!!
|
|
|
+ Log.d("test_ping", "ping = $ping")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onError(e: Exception?) {}
|
|
|
+ override fun onFinished(pingStats: PingStats?) {}
|
|
|
+ }
|
|
|
+ )
|
|
|
|
|
|
- countrySize.let { size ->
|
|
|
- if (size > 1) {
|
|
|
- Column {
|
|
|
- /* Country Location's Row */
|
|
|
Row(
|
|
|
verticalAlignment = Alignment.Top,
|
|
|
horizontalArrangement = Arrangement.Start,
|
|
|
modifier = Modifier
|
|
|
.fillMaxWidth()
|
|
|
- .padding(
|
|
|
- start = 16.dp, end = 12.dp, top = 12.dp
|
|
|
- )
|
|
|
+ .padding(start = 16.dp, end = 7.dp, top = 12.dp)
|
|
|
.clickable(
|
|
|
indication = null,
|
|
|
interactionSource = remember { MutableInteractionSource() }
|
|
@@ -103,7 +221,8 @@ fun CountryItem(server: Server, category: String) {
|
|
|
.padding(bottom = 16.dp)
|
|
|
.size(24.dp)
|
|
|
)
|
|
|
- Text(text = server.country!!,
|
|
|
+ val serverTitle = if (category.lowercase().toString() == "servers") server.country else server.server_name
|
|
|
+ Text(text = serverTitle!!,
|
|
|
style = TextStyle(
|
|
|
fontSize = 16.sp,
|
|
|
color = MaterialTheme.colorScheme.primary
|
|
@@ -113,7 +232,8 @@ fun CountryItem(server: Server, category: String) {
|
|
|
.align(Alignment.CenterVertically)
|
|
|
)
|
|
|
Spacer(modifier = Modifier.weight(1F))
|
|
|
- Text(text = "$countrySize locations",
|
|
|
+ Text(
|
|
|
+ text = "$ping ms",
|
|
|
style = TextStyle(
|
|
|
fontSize = 16.sp,
|
|
|
color = colorResource(id = R.color.blue_text)
|
|
@@ -122,121 +242,41 @@ fun CountryItem(server: Server, category: String) {
|
|
|
.padding(end = 30.dp, bottom = 18.dp)
|
|
|
.align(Alignment.CenterVertically)
|
|
|
)
|
|
|
-// Spacer(modifier = Modifier.weight(1F))
|
|
|
+ var isFavorite by rememberSaveable { mutableStateOf(server.isFavourited) }
|
|
|
|
|
|
- Icon(
|
|
|
+ IconButton(
|
|
|
modifier = Modifier
|
|
|
- .padding(bottom = 18.dp, end = 0.dp)
|
|
|
- .size(12.dp, 7.dp)
|
|
|
- .align(Alignment.CenterVertically)
|
|
|
- .clickable(
|
|
|
- indication = null,
|
|
|
- interactionSource = remember { MutableInteractionSource() }
|
|
|
- ) { isServerExpanded = !isServerExpanded },
|
|
|
-
|
|
|
- painter = if (isServerExpanded) painterResource(
|
|
|
- id = R.drawable.dragarrow3x) else painterResource(
|
|
|
- id = R.drawable.downarrow3x),
|
|
|
-
|
|
|
- contentDescription = "Server Logo",
|
|
|
- tint = MaterialTheme.colorScheme.primary,
|
|
|
+ .padding(bottom = 18.dp, end = 8.dp)
|
|
|
+ .size(21.dp, 20.dp)
|
|
|
+ .align(Alignment.CenterVertically),
|
|
|
+ onClick = {
|
|
|
+ isFavorite = !isFavorite!!
|
|
|
+ serverListViewModel.favAndUnFav(server)
|
|
|
+ }
|
|
|
)
|
|
|
- }
|
|
|
-
|
|
|
- /* Country Expandable's Row */
|
|
|
- if (isServerExpanded) {
|
|
|
- ExpandableRow(server = server)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
-
|
|
|
-// Log.d("test_servers_count", "${server.server_name} ${server.countryServers?.size}")
|
|
|
- /* Country Location's Row -> 1 Location() */
|
|
|
-
|
|
|
- var ping by remember { mutableIntStateOf(0) }
|
|
|
- Ping.onAddress(server.ip as String).setTimeOutMillis(1000).doPing(
|
|
|
- object : Ping.PingListener{
|
|
|
- override fun onResult(pingResult: PingResult?) {
|
|
|
- android.os.Handler(Looper.getMainLooper()).post {
|
|
|
- ping = pingResult?.timeTaken?.toInt()!!
|
|
|
- Log.d("test_ping", "ping = $ping")
|
|
|
+ {
|
|
|
+ val favResponse = serverListViewModel.mutableLiveDataFavUnFav.observeAsState().value
|
|
|
+ favResponse?.let {
|
|
|
+ Log.d("test_fav_response", it.message.toString())
|
|
|
+ splashViewModel.serverDataApi()
|
|
|
+ serverListViewModel.mutableLiveDataFavUnFav.value = null
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- override fun onError(e: Exception?) {}
|
|
|
- override fun onFinished(pingStats: PingStats?) {}
|
|
|
- }
|
|
|
- )
|
|
|
+ Icon(
|
|
|
+// .clickable(
|
|
|
+// indication = null,
|
|
|
+// interactionSource = remember { MutableInteractionSource() }
|
|
|
+// ) { },
|
|
|
|
|
|
- Row(
|
|
|
- verticalAlignment = Alignment.Top,
|
|
|
- horizontalArrangement = Arrangement.Start,
|
|
|
- modifier = Modifier
|
|
|
- .fillMaxWidth()
|
|
|
- .padding(start = 16.dp, end = 7.dp, top = 12.dp)
|
|
|
- .clickable(
|
|
|
- indication = null,
|
|
|
- interactionSource = remember { MutableInteractionSource() }
|
|
|
- ) {
|
|
|
- Toast
|
|
|
- .makeText(
|
|
|
- context,
|
|
|
- server.country,
|
|
|
- Toast.LENGTH_SHORT
|
|
|
- )
|
|
|
- .show()
|
|
|
- }
|
|
|
- ) {
|
|
|
- val icon = Utils.getDrawable(context, server.iso)
|
|
|
- Icon(
|
|
|
- painter = painterResource(id = icon),
|
|
|
- contentDescription = "Server Logo",
|
|
|
- tint = Color.Unspecified,
|
|
|
- modifier = Modifier
|
|
|
- .padding(bottom = 16.dp)
|
|
|
- .size(24.dp)
|
|
|
- )
|
|
|
- val serverTitle = if (category.lowercase().toString() == "servers") server.country else server.server_name
|
|
|
- Text(text = serverTitle!!,
|
|
|
- style = TextStyle(
|
|
|
- fontSize = 16.sp,
|
|
|
- color = MaterialTheme.colorScheme.primary
|
|
|
- ),
|
|
|
- modifier = Modifier
|
|
|
- .padding(start = 16.dp, bottom = 18.dp)
|
|
|
- .align(Alignment.CenterVertically)
|
|
|
- )
|
|
|
- Spacer(modifier = Modifier.weight(1F))
|
|
|
- Text(
|
|
|
- text = "$ping 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(
|
|
|
- modifier = Modifier
|
|
|
- .padding(bottom = 18.dp, end = 8.dp)
|
|
|
- .size(21.dp, 20.dp)
|
|
|
- .align(Alignment.CenterVertically)
|
|
|
- .clickable(
|
|
|
- indication = null,
|
|
|
- interactionSource = remember { MutableInteractionSource() }
|
|
|
- ) { isFavorite = !isFavorite },
|
|
|
-
|
|
|
- painter = if (isFavorite) painterResource(
|
|
|
- id = R.drawable.fav_server3x) else painterResource(
|
|
|
- id = R.drawable.unfav_server3x),
|
|
|
+ painter = if (isFavorite == true) painterResource(
|
|
|
+ id = R.drawable.fav_server3x) else painterResource(
|
|
|
+ id = R.drawable.unfav_server3x),
|
|
|
|
|
|
- contentDescription = "Server Logo",
|
|
|
- tint = Color.Unspecified,
|
|
|
- )
|
|
|
+ contentDescription = "Server Logo",
|
|
|
+ tint = Color.Unspecified,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -258,6 +298,12 @@ fun CountryItem(server: Server, category: String) {
|
|
|
@Composable
|
|
|
fun ColumnScope.ExpandableRow(server: Server) {
|
|
|
val context = LocalContext.current
|
|
|
+ val serverListViewModel: ServerListViewModel = viewModel{
|
|
|
+ ServerListViewModel(context)
|
|
|
+ }
|
|
|
+ val splashViewModel: SplashViewModel = viewModel{
|
|
|
+ SplashViewModel(context)
|
|
|
+ }
|
|
|
|
|
|
Column(
|
|
|
modifier = Modifier
|
|
@@ -282,6 +328,8 @@ fun ColumnScope.ExpandableRow(server: Server) {
|
|
|
}
|
|
|
)
|
|
|
|
|
|
+ // Expandable Row
|
|
|
+
|
|
|
server.countryServers?.let { serverData ->
|
|
|
serverData.forEachIndexed { index, serverInfo ->
|
|
|
Row(
|
|
@@ -326,25 +374,42 @@ fun ColumnScope.ExpandableRow(server: Server) {
|
|
|
.padding(start = 0.dp, end = 30.dp)
|
|
|
.align(Alignment.CenterVertically)
|
|
|
)
|
|
|
- var isFavorite by rememberSaveable { mutableStateOf(false) }
|
|
|
+ var isFavorite by rememberSaveable {
|
|
|
+ mutableStateOf(serverInfo.isFavourited)
|
|
|
+ }
|
|
|
|
|
|
- Icon(
|
|
|
+ IconButton(
|
|
|
modifier = Modifier
|
|
|
.padding(bottom = 0.dp, end = 16.dp)
|
|
|
.size(21.dp, 20.dp)
|
|
|
- .align(Alignment.CenterVertically)
|
|
|
- .clickable(
|
|
|
- indication = null,
|
|
|
- interactionSource = remember { MutableInteractionSource() }
|
|
|
- ) { isFavorite = !isFavorite },
|
|
|
+ .align(Alignment.CenterVertically),
|
|
|
+ onClick = {
|
|
|
+ isFavorite = !isFavorite!!
|
|
|
+ serverListViewModel.favAndUnFav(serverInfo)
|
|
|
+ }
|
|
|
+ )
|
|
|
+ {
|
|
|
+
|
|
|
+ val favResponse = serverListViewModel.mutableLiveDataFavUnFav.observeAsState().value
|
|
|
+ favResponse?.let {
|
|
|
+ Log.d("test_fav_response", it.message.toString())
|
|
|
+ splashViewModel.serverDataApi()
|
|
|
+ serverListViewModel.mutableLiveDataFavUnFav.value = null
|
|
|
+ }
|
|
|
+ Icon(
|
|
|
+// .clickable(
|
|
|
+// indication = null,
|
|
|
+// interactionSource = remember { MutableInteractionSource() }
|
|
|
+// ) { },
|
|
|
|
|
|
- painter = if (isFavorite) painterResource(
|
|
|
- id = R.drawable.fav_server3x) else painterResource(
|
|
|
- id = R.drawable.unfav_server3x),
|
|
|
+ painter = if (isFavorite == true) painterResource(
|
|
|
+ id = R.drawable.fav_server3x) else painterResource(
|
|
|
+ id = R.drawable.unfav_server3x),
|
|
|
|
|
|
- contentDescription = "Server Logo",
|
|
|
- tint = Color.Unspecified,
|
|
|
- )
|
|
|
+ contentDescription = "Server Logo",
|
|
|
+ tint = Color.Unspecified,
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Surface(
|