|
@@ -29,6 +29,7 @@ import androidx.compose.foundation.layout.height
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.layout.size
|
|
import androidx.compose.foundation.layout.size
|
|
import androidx.compose.foundation.layout.width
|
|
import androidx.compose.foundation.layout.width
|
|
|
|
+import androidx.compose.foundation.layout.wrapContentHeight
|
|
import androidx.compose.foundation.rememberScrollState
|
|
import androidx.compose.foundation.rememberScrollState
|
|
import androidx.compose.foundation.shape.CircleShape
|
|
import androidx.compose.foundation.shape.CircleShape
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
@@ -37,11 +38,13 @@ import androidx.compose.foundation.verticalScroll
|
|
import androidx.compose.material.icons.Icons
|
|
import androidx.compose.material.icons.Icons
|
|
import androidx.compose.material.icons.filled.Home
|
|
import androidx.compose.material.icons.filled.Home
|
|
import androidx.compose.material.ripple.LocalRippleTheme
|
|
import androidx.compose.material.ripple.LocalRippleTheme
|
|
|
|
+import androidx.compose.material3.AlertDialog
|
|
import androidx.compose.material3.Button
|
|
import androidx.compose.material3.Button
|
|
import androidx.compose.material3.ButtonDefaults
|
|
import androidx.compose.material3.ButtonDefaults
|
|
import androidx.compose.material3.Card
|
|
import androidx.compose.material3.Card
|
|
import androidx.compose.material3.CardColors
|
|
import androidx.compose.material3.CardColors
|
|
import androidx.compose.material3.CardDefaults
|
|
import androidx.compose.material3.CardDefaults
|
|
|
|
+import androidx.compose.material3.ExperimentalMaterial3Api
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.IconButton
|
|
import androidx.compose.material3.IconButton
|
|
import androidx.compose.material3.MaterialTheme
|
|
import androidx.compose.material3.MaterialTheme
|
|
@@ -51,6 +54,7 @@ import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.CompositionLocalProvider
|
|
import androidx.compose.runtime.CompositionLocalProvider
|
|
import androidx.compose.runtime.DisposableEffect
|
|
import androidx.compose.runtime.DisposableEffect
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
import androidx.compose.runtime.LaunchedEffect
|
|
|
|
+import androidx.compose.runtime.MutableState
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.Modifier
|
|
@@ -83,6 +87,7 @@ import androidx.compose.ui.graphics.painter.Painter
|
|
import androidx.compose.ui.input.pointer.pointerInput
|
|
import androidx.compose.ui.input.pointer.pointerInput
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.platform.LocalContext
|
|
import androidx.compose.ui.platform.LocalLifecycleOwner
|
|
import androidx.compose.ui.platform.LocalLifecycleOwner
|
|
|
|
+import androidx.compose.ui.window.DialogProperties
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.Lifecycle
|
|
import androidx.lifecycle.LifecycleEventObserver
|
|
import androidx.lifecycle.LifecycleEventObserver
|
|
import androidx.lifecycle.LifecycleOwner
|
|
import androidx.lifecycle.LifecycleOwner
|
|
@@ -107,29 +112,48 @@ import com.wireguard.android.backend.GoBackend
|
|
import kotlinx.coroutines.CoroutineScope
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
|
|
|
lateinit var act: ComponentActivity
|
|
lateinit var act: ComponentActivity
|
|
|
|
+var isServerDialog: MutableState<Boolean> = mutableStateOf(false)
|
|
|
|
+var serverObj: MutableState<Server> = mutableStateOf(Server())
|
|
|
|
|
|
|
|
+ @OptIn(ExperimentalMaterial3Api::class)
|
|
val onServer = object : ServerCallbacks {
|
|
val onServer = object : ServerCallbacks {
|
|
@Composable
|
|
@Composable
|
|
override fun onServerSelected(
|
|
override fun onServerSelected(
|
|
context: Context, homeViewModel: HomeViewModel,
|
|
context: Context, homeViewModel: HomeViewModel,
|
|
- onClick: () -> Unit) {
|
|
|
|
|
|
+ onClick: () -> Unit, isServerDialogShown: Boolean, server: Server) {
|
|
|
|
+ val basePreferenceHelper = BasePreferenceHelper(context)
|
|
|
|
+ val wg = WireGuardConnection(context, act ,homeViewModel)
|
|
|
|
|
|
- Text(text = "Hi")
|
|
|
|
Log.d("ServerCallbacks", "onServerSelected called!")
|
|
Log.d("ServerCallbacks", "onServerSelected called!")
|
|
- Log.d("onServerSelected", "onServerSelected called")
|
|
|
|
-// homeViewModel._isConnect.value = true
|
|
|
|
- val basePreferenceHelper = BasePreferenceHelper(context)
|
|
|
|
-// basePreferenceHelper.setConnectState(true)
|
|
|
|
-// homeViewModel.setConnectState(true)
|
|
|
|
|
|
+ Log.d("ServerCallbacks", "onServerSelected server = ${server.server_name}")
|
|
|
|
+
|
|
|
|
+ val lastServer = basePreferenceHelper.getServerObject()
|
|
|
|
+ if (isServerDialogShown) {
|
|
|
|
+ if (wg.isVPNConnected()) {
|
|
|
|
+ if (lastServer?.id != server.id) {
|
|
|
|
+ isServerDialog.value = true
|
|
|
|
+ serverObj.value = server
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ basePreferenceHelper.setServerObject(server)
|
|
|
|
+ Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ basePreferenceHelper.setServerObject(server)
|
|
|
|
+ wg.startVpn()
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ wg.startVpn()
|
|
|
|
+ Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
|
|
|
|
+ }
|
|
|
|
|
|
- val wg = WireGuardConnection(context, act ,homeViewModel)
|
|
|
|
- wg.startVpn()
|
|
|
|
- Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
|
|
|
|
onClick()
|
|
onClick()
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-@OptIn(ExperimentalFoundationApi::class)
|
|
|
|
|
|
+@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
@Composable
|
|
fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
|
|
|
|
@@ -152,13 +176,14 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
}
|
|
}
|
|
var server: Server = Server()
|
|
var server: Server = Server()
|
|
val wireGuardConnection = WireGuardConnection(context, activity, homeViewModel)
|
|
val wireGuardConnection = WireGuardConnection(context, activity, homeViewModel)
|
|
|
|
+ val wg = WireGuardConnection(context, activity, homeViewModel)
|
|
|
|
|
|
var isConnect: Boolean = homeViewModel.isConnect.observeAsState().value == true
|
|
var isConnect: Boolean = homeViewModel.isConnect.observeAsState().value == true
|
|
Log.d("isConnect_State", "live: $isConnect")
|
|
Log.d("isConnect_State", "live: $isConnect")
|
|
isConnect = basePreferenceHelper.getConnectState()
|
|
isConnect = basePreferenceHelper.getConnectState()
|
|
Log.d("isConnect_State", "$isConnect prefs => ${basePreferenceHelper.getConnectState()}")
|
|
Log.d("isConnect_State", "$isConnect prefs => ${basePreferenceHelper.getConnectState()}")
|
|
|
|
|
|
- OnLifecycleEvent{owner, event ->
|
|
|
|
|
|
+ OnLifecycleEvent{owner, event ->
|
|
when(event) {
|
|
when(event) {
|
|
Lifecycle.Event.ON_RESUME -> {
|
|
Lifecycle.Event.ON_RESUME -> {
|
|
Log.d("test_home_resume", "ON_RESUME: Home Screen!")
|
|
Log.d("test_home_resume", "ON_RESUME: Home Screen!")
|
|
@@ -241,15 +266,7 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
Box(
|
|
Box(
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
.background(MaterialTheme.colorScheme.background)
|
|
.background(MaterialTheme.colorScheme.background)
|
|
-// .paint(
|
|
|
|
-// if (isConnect) blueBackground() else pinkBackground(),
|
|
|
|
-// alignment = Alignment.TopStart,
|
|
|
|
-// contentScale = ContentScale.FillWidth,
|
|
|
|
-//// colorFilter = ColorFilter.tint(
|
|
|
|
-//// color = colorResource(id = R.color.pink_color)),
|
|
|
|
-// )
|
|
|
|
.fillMaxSize(),
|
|
.fillMaxSize(),
|
|
-// contentAlignment = Alignment.TopCenter
|
|
|
|
) {
|
|
) {
|
|
|
|
|
|
Image(
|
|
Image(
|
|
@@ -275,6 +292,13 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
)
|
|
)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (isServerDialog.value) {
|
|
|
|
+ ShowServerDialog(
|
|
|
|
+ basePreferenceHelper,
|
|
|
|
+ wg
|
|
|
|
+ )
|
|
|
|
+ }
|
|
|
|
+
|
|
IconButton(
|
|
IconButton(
|
|
onClick = {
|
|
onClick = {
|
|
Log.d("isConnect_State", "onClick{} -> $isConnect")
|
|
Log.d("isConnect_State", "onClick{} -> $isConnect")
|
|
@@ -325,7 +349,8 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
val serverObj = basePreferenceHelper.getServerObject()
|
|
val serverObj = basePreferenceHelper.getServerObject()
|
|
val serverDis = basePreferenceHelper.getIpinfo()
|
|
val serverDis = basePreferenceHelper.getIpinfo()
|
|
|
|
|
|
- val ipInfo = if (isConnect) serverObj?.ip else serverDis?.query
|
|
|
|
|
|
+ var ipInfo = homeViewModel.mutableLiveDataIpInfo.observeAsState().value?.query
|
|
|
|
+ ipInfo = if (isConnect) serverObj?.ip.toString() else serverDis?.query
|
|
AddText(
|
|
AddText(
|
|
text = "$ipInfo",
|
|
text = "$ipInfo",
|
|
size = 18.sp,
|
|
size = 18.sp,
|
|
@@ -591,18 +616,129 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
-fun onServerSelected(context: Context, homeViewModel: HomeViewModel) {
|
|
|
|
- Log.d("onServerSelected", "onServerSelected called")
|
|
|
|
-// homeViewModel._isConnect.value = true
|
|
|
|
- val basePreferenceHelper = BasePreferenceHelper(context)
|
|
|
|
-// basePreferenceHelper.setConnectState(true)
|
|
|
|
-// homeViewModel.setConnectState(true)
|
|
|
|
|
|
|
|
- val wg = WireGuardConnection(context, act ,homeViewModel)
|
|
|
|
- wg.startVpn()
|
|
|
|
- Log.d("isConnect_State", "onServerSelected ${homeViewModel.isConnect.value}")
|
|
|
|
|
|
+@OptIn(ExperimentalMaterial3Api::class)
|
|
|
|
+@Composable
|
|
|
|
+fun BoxScope.ShowServerDialog(
|
|
|
|
+ prefHelper: BasePreferenceHelper,
|
|
|
|
+ wg: WireGuardConnection
|
|
|
|
+) {
|
|
|
|
+ AlertDialog(
|
|
|
|
+ onDismissRequest = { isServerDialog.value = false },
|
|
|
|
+ properties = DialogProperties(),
|
|
|
|
+ modifier = Modifier
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
+ .wrapContentHeight()
|
|
|
|
+ ) {
|
|
|
|
+ val lastServer = prefHelper.getServerObject()
|
|
|
|
+ Surface(
|
|
|
|
+ color = colorResource(id = R.color.white),
|
|
|
|
+ modifier = Modifier
|
|
|
|
+ .background(Color.Transparent)
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
+ ,
|
|
|
|
+ shape = RoundedCornerShape(18.dp)
|
|
|
|
+ ) {
|
|
|
|
+ Column(
|
|
|
|
+ verticalArrangement = Arrangement.Top,
|
|
|
|
+ horizontalAlignment = Alignment.CenterHorizontally,
|
|
|
|
+ modifier = Modifier
|
|
|
|
+ .background(MaterialTheme.colorScheme.onPrimary)
|
|
|
|
+ ) {
|
|
|
|
+ Log.d("islogoutClicked", "AlertDialog")
|
|
|
|
+
|
|
|
|
+ Text(text = "Confirm",
|
|
|
|
+ color = MaterialTheme.colorScheme.primary,
|
|
|
|
+ style = MaterialTheme.typography.bodyMedium,
|
|
|
|
+ modifier = Modifier.padding(top = 45.dp)
|
|
|
|
+ )
|
|
|
|
+ Text(text = "Are you sure to switch from ${lastServer?.server_name} to ${serverObj.value.server_name}?",
|
|
|
|
+ color = MaterialTheme.colorScheme.primary,
|
|
|
|
+ style = MaterialTheme.typography.labelSmall,
|
|
|
|
+ maxLines = 2,
|
|
|
|
+ modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 26.dp)
|
|
|
|
+ )
|
|
|
|
+ Row (
|
|
|
|
+ modifier = Modifier
|
|
|
|
+ .padding(top = 34.dp, bottom = 20.dp),
|
|
|
|
+ horizontalArrangement = Arrangement.SpaceBetween,
|
|
|
|
+ verticalAlignment = Alignment.Bottom
|
|
|
|
+ ) {
|
|
|
|
+ Button(
|
|
|
|
+ onClick = {
|
|
|
|
+ Log.d("test_button", "No")
|
|
|
|
+ isServerDialog.value = false
|
|
|
|
+ },
|
|
|
|
+ modifier = Modifier
|
|
|
|
+ .padding(
|
|
|
|
+ start = 15.dp, end = 5.dp,
|
|
|
|
+ bottom = 0.dp, top = 0.dp
|
|
|
|
+ )
|
|
|
|
+ .background(colorResource(id = R.color.transparent))
|
|
|
|
+ .weight(1F)
|
|
|
|
+ .height(52.dp),
|
|
|
|
+
|
|
|
|
+ shape = RoundedCornerShape(15.dp),
|
|
|
|
+ colors = ButtonDefaults.buttonColors(
|
|
|
|
+ contentColor = colorResource(id = R.color.white),
|
|
|
|
+ containerColor = colorResource(id = R.color.light_blue),
|
|
|
|
+ ),
|
|
|
|
+ )
|
|
|
|
+ {
|
|
|
|
+ Text(text = "No",
|
|
|
|
+ style = MaterialTheme.typography.labelLarge)
|
|
|
|
+ Log.d("test_button", "RowScope")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Button(
|
|
|
|
+ onClick = {
|
|
|
|
+ Log.d("test_button", "Yes")
|
|
|
|
+ isServerDialog.value = false
|
|
|
|
+ prefHelper.setServerObject(serverObj.value)
|
|
|
|
+ wg.startVpn()
|
|
|
|
+ Log.d("ServerCallbacks", "Yes click => ${isServerDialog.value}")
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ modifier = Modifier
|
|
|
|
+ .padding(
|
|
|
|
+ start = 5.dp, end = 15.dp,
|
|
|
|
+ bottom = 0.dp, top = 0.dp
|
|
|
|
+ )
|
|
|
|
+ .background(colorResource(id = R.color.transparent))
|
|
|
|
+ .weight(1F)
|
|
|
|
+ .height(52.dp),
|
|
|
|
+ shape = RoundedCornerShape(15.dp),
|
|
|
|
+ colors = ButtonDefaults.buttonColors(
|
|
|
|
+ contentColor = colorResource(id = R.color.white),
|
|
|
|
+ containerColor = colorResource(id = R.color.red),
|
|
|
|
+ ),
|
|
|
|
+// border = BorderStroke(2.dp,
|
|
|
|
+// colorResource(id = R.color.gray_icon))
|
|
|
|
+ )
|
|
|
|
+ {
|
|
|
|
+ Text(text = "Yes",
|
|
|
|
+ style = MaterialTheme.typography.labelLarge)
|
|
|
|
+ Log.d("test_button", "RowScope")
|
|
|
|
+
|
|
|
|
+// val logoutResponse = accountViewModel.liveDataLogout.observeAsState().value
|
|
|
|
+// if (logoutResponse == true) {
|
|
|
|
+// accountViewModel.setLogoutStatus(false)
|
|
|
|
+// Log.d("test_api_response","Logout live: $logoutResponse")
|
|
|
|
+// basePreferenceHelper.setLoggedInState(false)
|
|
|
|
+// settingsNavHostController.popBackStack()
|
|
|
|
+// settingsNavHostController.navigate(Screen.Started.route)
|
|
|
|
+// }
|
|
|
|
+// else {
|
|
|
|
+//// accountViewModel.setLogoutStatus(false)
|
|
|
|
+//// onCancel()
|
|
|
|
+// }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
@Composable
|
|
@Composable
|