AccountScreenTV.kt 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  1. package com.vpn.fastestvpnservice.screensTV
  2. import android.app.Activity
  3. import android.content.Intent
  4. import android.os.Handler
  5. import android.os.Looper
  6. import android.util.Log
  7. import android.widget.Toast
  8. import androidx.activity.compose.BackHandler
  9. import androidx.compose.foundation.BorderStroke
  10. import androidx.compose.foundation.ExperimentalFoundationApi
  11. import androidx.compose.foundation.Image
  12. import androidx.compose.foundation.LocalOverscrollConfiguration
  13. import androidx.compose.foundation.background
  14. import androidx.compose.foundation.clickable
  15. import androidx.compose.foundation.focusable
  16. import androidx.compose.foundation.gestures.detectTapGestures
  17. import androidx.compose.foundation.layout.Arrangement
  18. import androidx.compose.foundation.layout.Box
  19. import androidx.compose.foundation.layout.BoxScope
  20. import androidx.compose.foundation.layout.Column
  21. import androidx.compose.foundation.layout.ColumnScope
  22. import androidx.compose.foundation.layout.Row
  23. import androidx.compose.foundation.layout.Spacer
  24. import androidx.compose.foundation.layout.fillMaxSize
  25. import androidx.compose.foundation.layout.fillMaxWidth
  26. import androidx.compose.foundation.layout.height
  27. import androidx.compose.foundation.layout.padding
  28. import androidx.compose.foundation.layout.size
  29. import androidx.compose.foundation.rememberScrollState
  30. import androidx.compose.foundation.shape.RoundedCornerShape
  31. import androidx.compose.foundation.verticalScroll
  32. import androidx.compose.material3.AlertDialog
  33. import androidx.compose.material3.Button
  34. import androidx.compose.material3.ButtonDefaults
  35. import androidx.compose.material3.CircularProgressIndicator
  36. import androidx.compose.material3.ExperimentalMaterial3Api
  37. import androidx.compose.material3.MaterialTheme
  38. import androidx.compose.material3.Surface
  39. import androidx.compose.material3.Text
  40. import androidx.compose.runtime.Composable
  41. import androidx.compose.runtime.CompositionLocalProvider
  42. import androidx.compose.runtime.LaunchedEffect
  43. import androidx.compose.runtime.getValue
  44. import androidx.compose.runtime.livedata.observeAsState
  45. import androidx.compose.runtime.mutableFloatStateOf
  46. import androidx.compose.runtime.mutableStateOf
  47. import androidx.compose.runtime.remember
  48. import androidx.compose.runtime.rememberCoroutineScope
  49. import androidx.compose.runtime.setValue
  50. import androidx.compose.ui.Alignment
  51. import androidx.compose.ui.Modifier
  52. import androidx.compose.ui.draw.alpha
  53. import androidx.compose.ui.draw.clip
  54. import androidx.compose.ui.focus.FocusRequester
  55. import androidx.compose.ui.focus.focusRequester
  56. import androidx.compose.ui.focus.onFocusChanged
  57. import androidx.compose.ui.graphics.Color
  58. import androidx.compose.ui.graphics.ColorFilter
  59. import androidx.compose.ui.graphics.painter.Painter
  60. import androidx.compose.ui.graphics.toArgb
  61. import androidx.compose.ui.input.key.Key
  62. import androidx.compose.ui.input.key.KeyEventType
  63. import androidx.compose.ui.input.key.key
  64. import androidx.compose.ui.input.key.onKeyEvent
  65. import androidx.compose.ui.input.key.type
  66. import androidx.compose.ui.input.pointer.pointerInput
  67. import androidx.compose.ui.platform.LocalContext
  68. import androidx.compose.ui.platform.LocalView
  69. import androidx.compose.ui.res.colorResource
  70. import androidx.compose.ui.res.painterResource
  71. import androidx.compose.ui.unit.TextUnit
  72. import androidx.compose.ui.unit.dp
  73. import androidx.compose.ui.unit.sp
  74. import androidx.compose.ui.window.DialogProperties
  75. import androidx.lifecycle.viewmodel.compose.viewModel
  76. import androidx.navigation.NavHostController
  77. import com.vpn.fastestvpnservice.R
  78. import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
  79. import com.vpn.fastestvpnservice.navigation.isAccountScreenPressed
  80. import com.vpn.fastestvpnservice.navigation.isFirstItemPressed
  81. import com.vpn.fastestvpnservice.navigation.isFourthItemFocused
  82. import com.vpn.fastestvpnservice.navigation.isFourthItemPressed
  83. import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.LogoutDialog
  84. import com.vpn.fastestvpnservice.screens.bottomNavBarScreens.act
  85. import com.vpn.fastestvpnservice.sealedClass.Screen
  86. import com.vpn.fastestvpnservice.sealedClass.ScreenTV
  87. import com.vpn.fastestvpnservice.utils.VPNConnectionsUtil
  88. import com.vpn.fastestvpnservice.utils.isTablet
  89. import com.vpn.fastestvpnservice.viewmodels.AccountViewModel
  90. import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
  91. import com.vpn.fastestvpnservice.widgets.SimpleAppWidget
  92. import de.blinkt.openvpn.core.App
  93. import kotlinx.coroutines.delay
  94. @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
  95. @Composable
  96. fun AccountTV(navHostController: NavHostController,
  97. settingsNavHostController: NavHostController)
  98. {
  99. var isLoggedOut by remember { mutableStateOf(false) }
  100. var isDelete by remember { mutableStateOf(false) }
  101. val context = LocalContext.current
  102. val basePreferenceHelper = BasePreferenceHelper(context)
  103. val accountViewModel: AccountViewModel = viewModel()
  104. val focusRequester1 = remember { FocusRequester() }
  105. BackHandler {
  106. // Toast.makeText(
  107. // context, "BackHandler Account TV - ${isFourthItemFocused.value}", Toast.LENGTH_SHORT
  108. // ).show()
  109. if (isFourthItemFocused.value) {
  110. navHostController.popBackStack()
  111. isFirstItemPressed.value = true
  112. // customNavigation(navHostController, BottomBarScreen.Home)
  113. } else {
  114. isFourthItemPressed.value = true
  115. }
  116. }
  117. CompositionLocalProvider(
  118. LocalOverscrollConfiguration provides null
  119. ) {
  120. Box(modifier = Modifier
  121. .background(colorResource(id = R.color.background_color_gray))
  122. .fillMaxSize()
  123. .padding(top = 0.dp)
  124. .verticalScroll(rememberScrollState())
  125. // contentAlignment = Alignment.Center
  126. ) {
  127. val view = LocalView.current
  128. val window = (view.context as Activity).window
  129. window.statusBarColor = Color.Transparent.toArgb()
  130. window.navigationBarColor = Color.Transparent.toArgb()
  131. if (isAccountScreenPressed.value) {
  132. LaunchedEffect(key1 = Unit) {
  133. focusRequester1.requestFocus()
  134. }
  135. isAccountScreenPressed.value = false
  136. }
  137. Column(
  138. verticalArrangement = Arrangement.Top,
  139. horizontalAlignment = Alignment.Start,
  140. modifier = Modifier
  141. .padding(start = 16.dp, end = 24.dp, top = 10.dp)
  142. .fillMaxSize()
  143. ) {
  144. // Spacer(modifier = Modifier.height(50.dp))
  145. AddTextAccountTV(
  146. text = "Account",
  147. size = 28.sp,
  148. color = MaterialTheme.colorScheme.inversePrimary
  149. )
  150. // Spacer(modifier = Modifier.height(15.dp))
  151. // AddRowAccountTV("Email: ", basePreferenceHelper.getUser()?.userinfo?.email ?: "")
  152. // AddRowAccountTV("Product: ", basePreferenceHelper.getProduct()?.productName ?: "")
  153. // AddRowAccountTV("Account Status: ", basePreferenceHelper.getProduct()?.status ?: "")
  154. // Surface(
  155. // modifier = Modifier
  156. // .padding(top = 23.5.dp, bottom = 0.dp)
  157. // .height(1.dp)
  158. // .fillMaxWidth(),
  159. // color = colorResource(id = R.color.gray_icon)
  160. // ) {}
  161. Spacer(modifier = Modifier.height(22.dp))
  162. AddRowAccountIconTV(
  163. icon = painterResource(id = R.drawable.subscription3x),
  164. text = "Upgrade Subscription",
  165. onClick = {
  166. navHostController.navigate(
  167. Screen.Subscription.route
  168. )
  169. },
  170. focusRequester1
  171. )
  172. AddRowAccountIconTV(
  173. icon = painterResource(id = R.drawable.fav3x),
  174. text = "Favorite Servers",
  175. onClick = {
  176. navHostController.navigate(
  177. Screen.FavoriteServers.route
  178. )
  179. }
  180. )
  181. AddRowAccountIconTV(
  182. icon = painterResource(id = R.drawable.lock3x),
  183. text = "Change Password",
  184. onClick = {
  185. navHostController.navigate(
  186. Screen.ChangePassword.route
  187. )
  188. }
  189. )
  190. AddRowAccountIconTV(
  191. icon = painterResource(id = R.drawable.delete3x),
  192. text = "Delete Account",
  193. onClick = {
  194. isDelete = true
  195. Log.d("islogoutClicked?", "isDelete Yes")
  196. }
  197. )
  198. AddRowAccountIconTV(
  199. icon = painterResource(id = R.drawable.logout3x),
  200. text = "Logout",
  201. onClick = {
  202. isLoggedOut = true
  203. Log.d("islogoutClicked?", "Yes")
  204. },
  205. isLastRow = true
  206. )
  207. }
  208. if (isLoggedOut) {
  209. Log.d("islogoutClicked", "isLoggedOut$isLoggedOut")
  210. AlertDialog(
  211. onDismissRequest = { isLoggedOut = false },
  212. properties = DialogProperties(),
  213. modifier = Modifier
  214. .fillMaxWidth()
  215. .height(228.dp)
  216. ) {
  217. LogoutDialogTV("Logout Account",
  218. "Are you sure to logout the account?",
  219. onCancel = {
  220. isLoggedOut = false
  221. },
  222. settingsNavHostController,
  223. isLoggedOut,
  224. isDelete,
  225. basePreferenceHelper,
  226. accountViewModel
  227. )
  228. }
  229. }
  230. if (isDelete) {
  231. Log.d("islogoutClicked", "isDelete$isDelete")
  232. AlertDialog(
  233. onDismissRequest = { isDelete = false },
  234. properties = DialogProperties(),
  235. modifier = Modifier
  236. .fillMaxWidth()
  237. .height(228.dp)
  238. ) {
  239. LogoutDialogTV("Delete Account",
  240. "Are you sure to delete the account?",
  241. onCancel = { isDelete = false },
  242. settingsNavHostController,
  243. isLoggedOut,
  244. isDelete,
  245. basePreferenceHelper,
  246. accountViewModel
  247. )
  248. }
  249. }
  250. if (accountViewModel.liveDataLogoutStatus.value == true) {
  251. var progress by remember { mutableFloatStateOf(0.1F) }
  252. LaunchedEffect(key1 = Unit) {
  253. for (i in 1..100) {
  254. progress = i.toFloat()/100F
  255. delay(100)
  256. }
  257. }
  258. CircularProgressIndicator(
  259. progress = { progress },
  260. modifier = Modifier
  261. .align(Alignment.Center)
  262. .size(50.dp),
  263. color = colorResource(id = R.color.yellow_text),
  264. strokeWidth = 5.dp,
  265. )
  266. }
  267. val logoutResponse = accountViewModel.liveDataLogout.observeAsState().value
  268. logoutResponse?.let {
  269. Log.d("test_button_log", "logout api response")
  270. accountViewModel.setLogoutStatus(false)
  271. if (it) {
  272. Log.d("test_api_response","Logout live: $logoutResponse")
  273. basePreferenceHelper.setLoggedInState(false)
  274. basePreferenceHelper.clearAllData()
  275. settingsNavHostController.popBackStack()
  276. settingsNavHostController.navigate(ScreenTV.LoginTV.route)
  277. val widgetIntent = Intent(context, SimpleAppWidget::class.java)
  278. widgetIntent.action = SimpleAppWidget.ACTION_LOGOUT
  279. context.sendBroadcast(widgetIntent)
  280. }
  281. else {
  282. Log.d("test_api_response","Logout false: $logoutResponse")
  283. accountViewModel.mutableLiveDataLogoutStatus.value = false
  284. Toast.makeText(context, logoutResponse.toString(), Toast.LENGTH_SHORT).show()
  285. }
  286. accountViewModel.mutableLiveDataLogout.value = null
  287. }
  288. val deleteResponse = accountViewModel.liveDataDelete.observeAsState().value
  289. deleteResponse?.let {
  290. Log.d("test_api_response","Delete Response")
  291. // Toast.makeText(
  292. // context, "API Response IN", Toast.LENGTH_SHORT
  293. // ).show()
  294. accountViewModel.setLogoutStatus(false)
  295. if (it.status) {
  296. Log.d("test_api_response","Delete live: ${deleteResponse.status}")
  297. basePreferenceHelper.setLoggedInState(false)
  298. basePreferenceHelper.clearAllData()
  299. settingsNavHostController.popBackStack()
  300. settingsNavHostController.navigate(ScreenTV.LoginTV.route)
  301. }
  302. else {
  303. Log.d("test_api_response","Delete false: ${deleteResponse.status}")
  304. accountViewModel.mutableLiveDataDeleteStatus.value = false
  305. Toast.makeText(context, deleteResponse.status.toString(), Toast.LENGTH_SHORT).show()
  306. }
  307. accountViewModel.mutableLiveDataDelete.value = null
  308. }
  309. }
  310. }
  311. }
  312. @Composable
  313. fun ColumnScope.AddTextAccountTV(text: String, size: TextUnit, color: Color) {
  314. Text(
  315. text = text,
  316. color = color,
  317. style = MaterialTheme.typography.headlineLarge
  318. )
  319. }
  320. @Composable
  321. fun ColumnScope.AddRowAccountTV(title: String, subTitle: String) {
  322. // val configuration = LocalConfiguration.current
  323. // val isTablet = configuration.screenWidthDp > 840
  324. Row(
  325. modifier = Modifier
  326. .fillMaxWidth()
  327. .padding(top = 16.dp)
  328. .background(Color.Transparent)
  329. .height(if (isTablet()) 20.dp else 18.dp),
  330. horizontalArrangement = Arrangement.SpaceBetween,
  331. verticalAlignment = Alignment.CenterVertically
  332. ) {
  333. Surface(
  334. modifier = Modifier
  335. .padding(start = 0.dp)
  336. .align(Alignment.CenterVertically),
  337. color = Color.Transparent
  338. ) {
  339. Text(text = title,
  340. color = MaterialTheme.colorScheme.inversePrimary,
  341. style = MaterialTheme.typography.bodyLarge.copy(
  342. fontSize = if (isTablet()) 15.sp else 14.sp
  343. ),
  344. maxLines = 1,
  345. modifier = Modifier
  346. .padding(start = 10.dp, end = 0.dp)
  347. .weight(1f)
  348. )
  349. }
  350. // Spacer(modifier = Modifier.weight(1f))
  351. Surface(
  352. modifier = Modifier
  353. .padding(start = 0.dp)
  354. .align(Alignment.CenterVertically),
  355. color = Color.Transparent
  356. ) {
  357. Text(text = subTitle,
  358. color = MaterialTheme.colorScheme.inversePrimary,
  359. style = MaterialTheme.typography.bodySmall.copy(
  360. fontSize = if (isTablet()) 16.sp else 14.sp
  361. ),
  362. maxLines = 1,
  363. modifier = Modifier
  364. .padding(start = 0.dp, end = 0.dp)
  365. .weight(1f)
  366. .alpha(0.6F)
  367. )
  368. }
  369. }
  370. }
  371. @Composable
  372. fun ColumnScope.AddRowAccountIconFirstTV(
  373. icon: Painter,
  374. text: String,
  375. onClick : () -> Unit
  376. ) {
  377. Row(
  378. modifier = Modifier
  379. .fillMaxWidth()
  380. .padding(top = 0.dp)
  381. .clip(RoundedCornerShape(4.dp))
  382. .background(Color.White)
  383. .height(61.dp)
  384. .pointerInput(Unit) {
  385. detectTapGestures {
  386. onClick()
  387. }
  388. },
  389. horizontalArrangement = Arrangement.Start,
  390. verticalAlignment = Alignment.CenterVertically
  391. ) {
  392. Surface(
  393. modifier = Modifier.padding(start = 20.dp),
  394. color = Color.Transparent
  395. ) {
  396. Image(
  397. painter = icon,
  398. contentDescription = "World",
  399. modifier = Modifier
  400. .padding(start = 0.dp)
  401. .size(24.dp)
  402. .weight(1f),
  403. colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.inversePrimary)
  404. )
  405. }
  406. Surface(
  407. modifier = Modifier.padding(start = 0.dp),
  408. color = Color.Transparent
  409. ) {
  410. Text(text = text,
  411. color = MaterialTheme.colorScheme.inversePrimary,
  412. style = MaterialTheme.typography.titleSmall,
  413. maxLines = 2,
  414. modifier = Modifier
  415. .padding(start = 18.dp, end = 0.dp)
  416. .weight(1f)
  417. )
  418. }
  419. Spacer(modifier = Modifier.weight(1f))
  420. Surface(
  421. modifier = Modifier
  422. .padding(end = 20.dp)
  423. .align(Alignment.CenterVertically),
  424. color = Color.Transparent
  425. ) {
  426. Image(
  427. painter = painterResource(id = R.drawable.frontarrow3x),
  428. contentDescription = "Front_Arrow",
  429. modifier = Modifier
  430. .padding(start = 0.dp, end = 3.dp)
  431. .size(10.dp, 18.dp)
  432. .weight(1f),
  433. colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.inversePrimary)
  434. )
  435. }
  436. }
  437. }
  438. @Composable
  439. fun ColumnScope.AddRowAccountIconTV(
  440. icon: Painter,
  441. text: String,
  442. onClick : () -> Unit,
  443. focusRequester1: FocusRequester = FocusRequester(),
  444. isLastRow: Boolean = false
  445. ) {
  446. var isRowFocused by remember { mutableStateOf(false) }
  447. val context = LocalContext.current
  448. Row(
  449. modifier = Modifier
  450. .fillMaxWidth()
  451. .padding(top = 5.dp)
  452. .background(if (isRowFocused) Color.LightGray else Color.White,
  453. shape = RoundedCornerShape(4.dp))
  454. .height(61.dp)
  455. .onKeyEvent {
  456. if (isLastRow) {
  457. if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
  458. // Toast
  459. // .makeText(
  460. // context, "KeyDown & DirectionDown Email", Toast.LENGTH_SHORT
  461. // )
  462. // .show()
  463. // customNavigation(navHostController, BottomBarScreen.Help)
  464. isFourthItemPressed.value = true
  465. true
  466. }
  467. else if (it.type == KeyEventType.KeyUp && it.key == Key.DirectionUp) {
  468. // Toast
  469. // .makeText(
  470. // context, "KeyUp & DirectionUp Email", Toast.LENGTH_SHORT
  471. // )
  472. // .show()
  473. false
  474. }
  475. else {
  476. false
  477. }
  478. } else { false }
  479. }
  480. .focusRequester(focusRequester1)
  481. .onFocusChanged {
  482. isRowFocused = it.isFocused
  483. }
  484. .focusable()
  485. .clickable {
  486. // Toast.makeText(
  487. // context, text, Toast.LENGTH_SHORT
  488. // ).show()
  489. onClick()
  490. }
  491. ,
  492. horizontalArrangement = Arrangement.Start,
  493. verticalAlignment = Alignment.CenterVertically
  494. ) {
  495. Surface(
  496. modifier = Modifier.padding(start = 20.dp),
  497. color = Color.Transparent
  498. ) {
  499. Image(
  500. painter = icon,
  501. contentDescription = "World",
  502. modifier = Modifier
  503. .padding(start = 0.dp)
  504. .size(24.dp)
  505. .weight(1f),
  506. colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.inversePrimary)
  507. )
  508. }
  509. Surface(
  510. modifier = Modifier.padding(start = 0.dp),
  511. color = Color.Transparent
  512. ) {
  513. Text(text = text,
  514. color = MaterialTheme.colorScheme.inversePrimary,
  515. style = MaterialTheme.typography.titleSmall,
  516. maxLines = 2,
  517. modifier = Modifier
  518. .padding(start = 18.dp, end = 0.dp)
  519. .weight(1f)
  520. )
  521. }
  522. Spacer(modifier = Modifier.weight(1f))
  523. Surface(
  524. modifier = Modifier
  525. .padding(end = 20.dp)
  526. .align(Alignment.CenterVertically),
  527. color = Color.Transparent
  528. ) {
  529. Image(
  530. painter = painterResource(id = R.drawable.frontarrow3x),
  531. contentDescription = "Front_Arrow",
  532. modifier = Modifier
  533. .padding(start = 0.dp, end = 3.dp)
  534. .size(10.dp, 18.dp)
  535. .weight(1f),
  536. colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.inversePrimary)
  537. )
  538. }
  539. }
  540. }
  541. @Composable
  542. fun BoxScope.LogoutDialogTV(
  543. title: String,
  544. desc: String,
  545. onCancel : () -> Unit,
  546. settingsNavHostController: NavHostController,
  547. isLogout: Boolean,
  548. isDelete: Boolean,
  549. basePreferenceHelper: BasePreferenceHelper,
  550. accountViewModel: AccountViewModel
  551. ) {
  552. val context = LocalContext.current
  553. val scope = rememberCoroutineScope()
  554. val homeViewModel: HomeViewModel = viewModel {
  555. HomeViewModel(context, scope)
  556. }
  557. var isButtonFocused1 by remember { mutableStateOf(false) }
  558. var isButtonFocused2 by remember { mutableStateOf(false) }
  559. Surface(
  560. color = colorResource(id = R.color.white),
  561. modifier = Modifier
  562. .background(Color.Transparent)
  563. .fillMaxWidth()
  564. ,
  565. shape = RoundedCornerShape(18.dp)
  566. ) {
  567. Column(
  568. verticalArrangement = Arrangement.Top,
  569. horizontalAlignment = Alignment.CenterHorizontally,
  570. modifier = Modifier
  571. .background(Color.White)
  572. ) {
  573. Log.d("islogoutClicked", "AlertDialog")
  574. Text(text = title,
  575. color = colorResource(id = R.color.dark_blue_gray_text),
  576. style = MaterialTheme.typography.bodyMedium,
  577. modifier = Modifier.padding(top = 45.dp)
  578. )
  579. Text(text = desc,
  580. color = colorResource(id = R.color.dark_blue_gray_text),
  581. style = MaterialTheme.typography.labelSmall,
  582. maxLines = 2,
  583. modifier = Modifier.padding(top = 26.dp)
  584. )
  585. Row (
  586. modifier = Modifier
  587. .padding(top = 34.dp),
  588. horizontalArrangement = Arrangement.SpaceBetween,
  589. verticalAlignment = Alignment.Bottom
  590. ) {
  591. Button(
  592. onClick = {
  593. Log.d("test_button", "No")
  594. onCancel()
  595. // navHostController.popBackStack()
  596. // navHostController.navigate(Screen.Login.route)
  597. },
  598. modifier = Modifier
  599. .padding(
  600. start = 15.dp, end = 5.dp,
  601. bottom = 0.dp, top = 0.dp
  602. )
  603. .onFocusChanged {
  604. isButtonFocused1 = it.isFocused
  605. }
  606. .background(colorResource(id = R.color.transparent))
  607. .weight(1F)
  608. .height(52.dp),
  609. shape = RoundedCornerShape(15.dp),
  610. colors = ButtonDefaults.buttonColors(
  611. contentColor = if (isButtonFocused1) colorResource(id = R.color.dark_blue_gray_text) else colorResource(id = R.color.white),
  612. containerColor = colorResource(id = R.color.light_blue),
  613. ),
  614. border = BorderStroke(2.dp, if (isButtonFocused1) colorResource(id = R.color.dark_blue_gray_text) else colorResource(id = R.color.light_blue))
  615. )
  616. {
  617. Text(text = "No",
  618. style = MaterialTheme.typography.labelLarge)
  619. Log.d("test_button", "RowScope")
  620. }
  621. Button(
  622. onClick = {
  623. Log.d("test_button", "Logout Yes")
  624. if (isLogout) {
  625. Log.d("test_api_response","Logout click = $isLogout")
  626. val connectState = homeViewModel.isConnect.value
  627. if (connectState == App.CONNECTED || connectState == App.CONNECTING) {
  628. Log.d("test_button_log", "connectState = $connectState, act = $act")
  629. Handler(Looper.getMainLooper()).postDelayed({
  630. val wg = VPNConnectionsUtil(context, act ,homeViewModel)
  631. wg.stopVpn()
  632. }, 400)
  633. }
  634. Log.d("test_button_log", "logout api")
  635. accountViewModel.setLogoutStatus(true)
  636. accountViewModel.logout()
  637. onCancel()
  638. }
  639. if (isDelete) {
  640. Log.d("test_api_response","Delete click = $isDelete")
  641. accountViewModel.setLogoutStatus(true)
  642. accountViewModel.deleteAccount()
  643. onCancel()
  644. }
  645. },
  646. modifier = Modifier
  647. .padding(
  648. start = 5.dp, end = 15.dp,
  649. bottom = 0.dp, top = 0.dp
  650. )
  651. .onFocusChanged {
  652. isButtonFocused2 = it.isFocused
  653. }
  654. .background(colorResource(id = R.color.transparent))
  655. .weight(1F)
  656. .height(52.dp),
  657. shape = RoundedCornerShape(15.dp),
  658. colors = ButtonDefaults.buttonColors(
  659. contentColor = if (isButtonFocused2) colorResource(id = R.color.dark_blue_gray_text) else colorResource(id = R.color.white),
  660. containerColor = colorResource(id = R.color.red),
  661. ),
  662. border = BorderStroke(2.dp, if (isButtonFocused2) colorResource(id = R.color.dark_blue_gray_text) else colorResource(id = R.color.red))
  663. // border = BorderStroke(2.dp,
  664. // colorResource(id = R.color.gray_icon))
  665. )
  666. {
  667. Text(text = "Yes",
  668. style = MaterialTheme.typography.labelLarge)
  669. Log.d("test_button", "RowScope")
  670. // val logoutResponse = accountViewModel.liveDataLogout.observeAsState().value
  671. // if (logoutResponse == true) {
  672. // accountViewModel.setLogoutStatus(false)
  673. // Log.d("test_api_response","Logout live: $logoutResponse")
  674. // basePreferenceHelper.setLoggedInState(false)
  675. // settingsNavHostController.popBackStack()
  676. // settingsNavHostController.navigate(Screen.Started.route)
  677. // }
  678. // else {
  679. //// accountViewModel.setLogoutStatus(false)
  680. //// onCancel()
  681. // }
  682. }
  683. }
  684. }
  685. }
  686. }