HelpScreenTV.kt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. package com.vpn.fastestvpnservice.screensTV
  2. import android.app.Activity
  3. import android.util.Log
  4. import android.widget.Toast
  5. import androidx.compose.foundation.ExperimentalFoundationApi
  6. import androidx.compose.foundation.Image
  7. import androidx.compose.foundation.LocalOverscrollConfiguration
  8. import androidx.compose.foundation.background
  9. import androidx.compose.foundation.clickable
  10. import androidx.compose.foundation.focusable
  11. import androidx.compose.foundation.layout.Arrangement
  12. import androidx.compose.foundation.layout.Box
  13. import androidx.compose.foundation.layout.Column
  14. import androidx.compose.foundation.layout.ColumnScope
  15. import androidx.compose.foundation.layout.Row
  16. import androidx.compose.foundation.layout.Spacer
  17. import androidx.compose.foundation.layout.fillMaxSize
  18. import androidx.compose.foundation.layout.fillMaxWidth
  19. import androidx.compose.foundation.layout.height
  20. import androidx.compose.foundation.layout.padding
  21. import androidx.compose.foundation.layout.size
  22. import androidx.compose.foundation.rememberScrollState
  23. import androidx.compose.foundation.shape.RoundedCornerShape
  24. import androidx.compose.foundation.verticalScroll
  25. import androidx.compose.material.icons.Icons
  26. import androidx.compose.material.icons.automirrored.filled.Message
  27. import androidx.compose.material3.MaterialTheme
  28. import androidx.compose.material3.Surface
  29. import androidx.compose.material3.Text
  30. import androidx.compose.runtime.Composable
  31. import androidx.compose.runtime.CompositionLocalProvider
  32. import androidx.compose.runtime.LaunchedEffect
  33. import androidx.compose.runtime.getValue
  34. import androidx.compose.runtime.mutableStateOf
  35. import androidx.compose.runtime.remember
  36. import androidx.compose.runtime.setValue
  37. import androidx.compose.ui.Alignment
  38. import androidx.compose.ui.Modifier
  39. import androidx.compose.ui.draw.alpha
  40. import androidx.compose.ui.draw.clip
  41. import androidx.compose.ui.focus.FocusRequester
  42. import androidx.compose.ui.focus.focusRequester
  43. import androidx.compose.ui.focus.onFocusChanged
  44. import androidx.compose.ui.graphics.Color
  45. import androidx.compose.ui.graphics.ColorFilter
  46. import androidx.compose.ui.graphics.toArgb
  47. import androidx.compose.ui.graphics.vector.ImageVector
  48. import androidx.compose.ui.input.key.Key
  49. import androidx.compose.ui.input.key.KeyEventType
  50. import androidx.compose.ui.input.key.key
  51. import androidx.compose.ui.input.key.onKeyEvent
  52. import androidx.compose.ui.input.key.type
  53. import androidx.compose.ui.platform.LocalContext
  54. import androidx.compose.ui.platform.LocalView
  55. import androidx.compose.ui.res.colorResource
  56. import androidx.compose.ui.res.painterResource
  57. import androidx.compose.ui.unit.Dp
  58. import androidx.compose.ui.unit.TextUnit
  59. import androidx.compose.ui.unit.dp
  60. import androidx.compose.ui.unit.sp
  61. import androidx.core.view.WindowCompat
  62. import androidx.navigation.NavHostController
  63. import com.vpn.fastestvpnservice.R
  64. import com.vpn.fastestvpnservice.beans.isDarkTheme
  65. import com.vpn.fastestvpnservice.navigation.customNavigation
  66. import com.vpn.fastestvpnservice.navigation.isHelpScreenPressed
  67. import com.vpn.fastestvpnservice.navigation.isSecondItemPressed
  68. import com.vpn.fastestvpnservice.navigation.isThirdItemPressed
  69. import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
  70. import com.vpn.fastestvpnservice.sealedClass.Screen
  71. @OptIn(ExperimentalFoundationApi::class)
  72. @Composable
  73. fun HelpTV(navHostController: NavHostController) {
  74. val focusRequester1 = remember { FocusRequester() }
  75. val focusRequester2 = remember { FocusRequester() }
  76. val context = LocalContext.current
  77. CompositionLocalProvider(
  78. LocalOverscrollConfiguration provides null
  79. ) {
  80. Box(
  81. modifier = Modifier
  82. .background(colorResource(id = R.color.background_color_gray))
  83. .fillMaxSize()
  84. .padding(vertical = 10.dp)
  85. .verticalScroll(rememberScrollState()),
  86. // contentAlignment = Alignment.Center
  87. ) {
  88. val view = LocalView.current
  89. val window = (view.context as Activity).window
  90. window.statusBarColor = Color.Transparent.toArgb()
  91. window.navigationBarColor = Color.Transparent.toArgb()
  92. WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !isDarkTheme.value
  93. if (isHelpScreenPressed.value) {
  94. LaunchedEffect(Unit) {
  95. focusRequester1.requestFocus()
  96. }
  97. isHelpScreenPressed.value = false
  98. }
  99. Column(
  100. verticalArrangement = Arrangement.Top,
  101. horizontalAlignment = Alignment.Start,
  102. modifier = Modifier
  103. .padding(start = 16.dp, end = 24.dp)
  104. .fillMaxSize()
  105. ) {
  106. Spacer(modifier = Modifier.height(50.dp))
  107. AddTextHelpTV(
  108. text = "Help",
  109. size = 28.sp,
  110. color = MaterialTheme.colorScheme.inversePrimary
  111. )
  112. Spacer(modifier = Modifier.height(22.dp))
  113. AddRowTV(
  114. icon = R.drawable.faq3x,
  115. text = "FAQ", navHostController = navHostController,
  116. topPadding = 22.dp,
  117. focusRequester1 = focusRequester1,
  118. onClick = {navHostController.navigate(
  119. Screen.FAQ.route
  120. )},
  121. )
  122. AddRowTV(
  123. icon = R.drawable.privacy3x,
  124. text = "Privacy Policy",
  125. navHostController = navHostController,
  126. onClick = {
  127. navHostController.navigate(
  128. Screen.PrivacyPolicy.route
  129. )
  130. },
  131. )
  132. AddRowTV(
  133. icon = R.drawable.terms3x,
  134. text = "Terms and Conditions",
  135. navHostController = navHostController,
  136. onClick = {
  137. navHostController.navigate(
  138. Screen.TermsAndConditions.route
  139. )
  140. },
  141. )
  142. AddRowTV(
  143. icon = R.drawable.about3x,
  144. text = "About Fastest VPN",
  145. navHostController = navHostController,
  146. onClick = {
  147. navHostController.navigate(
  148. Screen.About.route
  149. )
  150. },
  151. )
  152. AddRowTV(
  153. icon = R.drawable.faq3x,
  154. text = "Customer Support",
  155. navHostController = navHostController,
  156. onClick = {
  157. navHostController.navigate(
  158. Screen.CustomerSupport.route
  159. )
  160. },
  161. isIconTV = false
  162. )
  163. AddRowTV(
  164. icon = R.drawable.customer_support3x,
  165. text = "Email Us",
  166. navHostController = navHostController,
  167. onClick = {
  168. navHostController.navigate(
  169. Screen.EmailUs.route
  170. )
  171. },
  172. isLastRow = true
  173. )
  174. }
  175. }
  176. }
  177. }
  178. @Composable
  179. fun ColumnScope.AddRowTV(
  180. icon: Int,
  181. text: String,
  182. navHostController: NavHostController,
  183. topPadding: Dp = 40.dp,
  184. focusRequester1: FocusRequester = FocusRequester(),
  185. onClick: () -> Unit,
  186. isIconTV: Boolean = true,
  187. isLastRow: Boolean = false
  188. ) {
  189. var isRowFocused by remember { mutableStateOf(false) }
  190. val context = LocalContext.current
  191. val icon1 = painterResource(id = icon)
  192. val icon2 = Icons.AutoMirrored.Filled.Message
  193. Row(
  194. modifier = Modifier
  195. .fillMaxWidth()
  196. .padding(top = 5.dp)
  197. .clip(RoundedCornerShape(4.dp))
  198. .background(if (isRowFocused) Color.LightGray else Color.White)
  199. .height(61.dp)
  200. .onKeyEvent {
  201. if (isLastRow) {
  202. if (it.type == KeyEventType.KeyDown && it.key == Key.DirectionDown) {
  203. Toast
  204. .makeText(
  205. context, "KeyDown & DirectionDown Email", Toast.LENGTH_SHORT
  206. )
  207. .show()
  208. // customNavigation(navHostController, BottomBarScreen.Help)
  209. isThirdItemPressed.value = true
  210. true
  211. }
  212. else if (it.type == KeyEventType.KeyUp && it.key == Key.DirectionUp) {
  213. Toast
  214. .makeText(
  215. context, "KeyUp & DirectionUp Email", Toast.LENGTH_SHORT
  216. )
  217. .show()
  218. false
  219. }
  220. else {
  221. false
  222. }
  223. } else { false }
  224. }
  225. .focusRequester(focusRequester1)
  226. .onFocusChanged {
  227. isRowFocused = it.isFocused
  228. }
  229. .focusable()
  230. // .clickable {
  231. // Log.d("test_row", "Clicked Row ${onClick.toString()}")
  232. // Toast.makeText(
  233. // context, text, Toast.LENGTH_SHORT
  234. // ).show()
  235. //// onClick()
  236. // }
  237. ,
  238. horizontalArrangement = Arrangement.Start,
  239. verticalAlignment = Alignment.CenterVertically
  240. ) {
  241. Surface(
  242. modifier = Modifier.padding(start = 20.dp),
  243. color = Color.Transparent
  244. ) {
  245. if (isIconTV) {
  246. Image(
  247. icon1,
  248. contentDescription = "World",
  249. modifier = Modifier
  250. .padding(start = 0.dp)
  251. .size(24.dp)
  252. .weight(1f),
  253. colorFilter = ColorFilter.tint(
  254. MaterialTheme.colorScheme.inversePrimary)
  255. )
  256. } else {
  257. Image(
  258. icon2,
  259. contentDescription = "World",
  260. modifier = Modifier
  261. .padding(start = 0.dp)
  262. .size(24.dp)
  263. .weight(1f),
  264. colorFilter = ColorFilter.tint(
  265. MaterialTheme.colorScheme.inversePrimary)
  266. )
  267. }
  268. }
  269. Surface(
  270. modifier = Modifier.padding(start = 0.dp),
  271. color = Color.Transparent
  272. ) {
  273. Text(text = text,
  274. color = MaterialTheme.colorScheme.inversePrimary,
  275. style = MaterialTheme.typography.titleSmall,
  276. maxLines = 2,
  277. modifier = Modifier
  278. .padding(start = 18.dp, end = 0.dp)
  279. .weight(1f)
  280. )
  281. }
  282. Spacer(modifier = Modifier.weight(1f))
  283. Surface(
  284. modifier = Modifier
  285. .padding(end = 20.dp)
  286. .align(Alignment.CenterVertically),
  287. color = Color.Transparent
  288. ) {
  289. Image(
  290. painter = painterResource(
  291. id = R.drawable.frontarrow3x),
  292. contentDescription = "Front_Arrow",
  293. modifier = Modifier
  294. .padding(start = 0.dp, end = 3.dp)
  295. .size(10.dp, 18.dp)
  296. .weight(1f)
  297. .alpha(1F),
  298. colorFilter = ColorFilter.tint(
  299. MaterialTheme.colorScheme.inversePrimary)
  300. )
  301. }
  302. }
  303. }
  304. @Composable
  305. fun ColumnScope.AddRowIconTV(
  306. icon: ImageVector,
  307. text: String,
  308. navHostController: NavHostController,
  309. topPadding: Dp = 40.dp,
  310. onClick: () -> Unit
  311. ) {
  312. var isRowFocused by remember { mutableStateOf(false) }
  313. Row(
  314. modifier = Modifier
  315. .fillMaxWidth()
  316. .padding(top = 5.dp)
  317. .background(if (isRowFocused) Color.LightGray else Color.White)
  318. .height(61.dp)
  319. .onFocusChanged {
  320. isRowFocused = it.isFocused
  321. }
  322. // .pointerInput(Unit) {
  323. // detectTapGestures {
  324. // Log.d("test_row", "Clicked Row ${onClick().toString()}")
  325. // onClick()
  326. // }
  327. // }
  328. // .clickable {
  329. // Log.d("test_row", "Clicked Row ${onClick.toString()}")
  330. // onClick()
  331. // }
  332. ,
  333. horizontalArrangement = Arrangement.Start,
  334. verticalAlignment = Alignment.CenterVertically
  335. ) {
  336. Surface(
  337. modifier = Modifier.padding(start = 20.dp),
  338. color = Color.Transparent
  339. ) {
  340. Image(
  341. imageVector = icon,
  342. contentDescription = "World",
  343. modifier = Modifier
  344. .padding(start = 0.dp)
  345. .size(24.dp)
  346. .weight(1f),
  347. colorFilter = ColorFilter.tint(
  348. MaterialTheme.colorScheme.inversePrimary)
  349. )
  350. }
  351. Surface(
  352. modifier = Modifier.padding(start = 0.dp),
  353. color = Color.Transparent
  354. ) {
  355. Text(text = text,
  356. color = MaterialTheme.colorScheme.inversePrimary,
  357. style = MaterialTheme.typography.titleSmall,
  358. maxLines = 2,
  359. modifier = Modifier
  360. .padding(start = 18.dp, end = 0.dp)
  361. .weight(1f)
  362. )
  363. }
  364. Spacer(modifier = Modifier.weight(1f))
  365. Surface(
  366. modifier = Modifier
  367. .padding(end = 20.dp)
  368. .align(Alignment.CenterVertically),
  369. color = Color.Transparent
  370. ) {
  371. Image(
  372. painter = painterResource(
  373. id = R.drawable.frontarrow3x),
  374. contentDescription = "Front_Arrow",
  375. modifier = Modifier
  376. .padding(start = 0.dp, end = 3.dp)
  377. .size(10.dp, 18.dp)
  378. .weight(1f)
  379. .alpha(1F),
  380. colorFilter = ColorFilter.tint(
  381. MaterialTheme.colorScheme.inversePrimary)
  382. )
  383. }
  384. }
  385. }
  386. @Composable
  387. fun ColumnScope.AddTextHelpTV(text: String, size: TextUnit, color: Color) {
  388. Text(
  389. text = text,
  390. color = color,
  391. style = MaterialTheme.typography.headlineLarge,
  392. )
  393. }