ServerItem.kt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. package com.vpn.fastestvpnservice.customItems
  2. import android.content.res.Configuration
  3. import android.os.Looper
  4. import android.widget.Toast
  5. import androidx.compose.foundation.Image
  6. import androidx.compose.foundation.background
  7. import androidx.compose.foundation.clickable
  8. import androidx.compose.foundation.interaction.MutableInteractionSource
  9. import androidx.compose.foundation.layout.Arrangement
  10. import androidx.compose.foundation.layout.Box
  11. import androidx.compose.foundation.layout.Row
  12. import androidx.compose.foundation.layout.Spacer
  13. import androidx.compose.foundation.layout.fillMaxWidth
  14. import androidx.compose.foundation.layout.height
  15. import androidx.compose.foundation.layout.padding
  16. import androidx.compose.foundation.layout.size
  17. import androidx.compose.foundation.shape.CircleShape
  18. import androidx.compose.foundation.shape.RoundedCornerShape
  19. import androidx.compose.material3.Icon
  20. import androidx.compose.material3.MaterialTheme
  21. import androidx.compose.material3.Surface
  22. import androidx.compose.material3.Text
  23. import androidx.compose.runtime.Composable
  24. import androidx.compose.runtime.getValue
  25. import androidx.compose.runtime.mutableIntStateOf
  26. import androidx.compose.runtime.mutableStateOf
  27. import androidx.compose.runtime.remember
  28. import androidx.compose.runtime.saveable.rememberSaveable
  29. import androidx.compose.runtime.setValue
  30. import androidx.compose.ui.Alignment
  31. import androidx.compose.ui.Modifier
  32. import androidx.compose.ui.draw.alpha
  33. import androidx.compose.ui.draw.clip
  34. import androidx.compose.ui.graphics.Brush
  35. import androidx.compose.ui.graphics.Color
  36. import androidx.compose.ui.graphics.Shape
  37. import androidx.compose.ui.platform.LocalContext
  38. import androidx.compose.ui.res.colorResource
  39. import androidx.compose.ui.res.painterResource
  40. import androidx.compose.ui.text.TextStyle
  41. import androidx.compose.ui.tooling.preview.Preview
  42. import androidx.compose.ui.unit.dp
  43. import androidx.compose.ui.unit.sp
  44. import com.stealthcopter.networktools.Ping
  45. import com.stealthcopter.networktools.ping.PingResult
  46. import com.stealthcopter.networktools.ping.PingStats
  47. import com.vpn.fastestvpnservice.R
  48. import com.vpn.fastestvpnservice.beans.Server
  49. import com.vpn.fastestvpnservice.beans.ServerList
  50. import com.vpn.fastestvpnservice.beans.favList
  51. import com.vpn.fastestvpnservice.beans.favListServer
  52. import com.vpn.fastestvpnservice.utils.Utils
  53. import java.lang.Exception
  54. @Composable
  55. fun ServerItem(server: Server) {
  56. Box(
  57. modifier = Modifier
  58. .fillMaxWidth()
  59. .background(color = MaterialTheme.colorScheme.background)
  60. .padding(bottom = 1.dp)
  61. ) {
  62. val context = LocalContext.current
  63. Row(
  64. verticalAlignment = Alignment.Top,
  65. horizontalArrangement = Arrangement.Start,
  66. modifier = Modifier
  67. .fillMaxWidth()
  68. .padding(start = 12.dp, end = 7.dp, top = 12.dp)
  69. .clickable(
  70. indication = null,
  71. interactionSource = remember { MutableInteractionSource() }
  72. ) {
  73. Toast
  74. .makeText(
  75. context,
  76. server.server_name,
  77. Toast.LENGTH_SHORT
  78. )
  79. .show()
  80. }
  81. ) {
  82. var ping by remember { mutableIntStateOf(0) }
  83. Ping.onAddress(server.ip as String).setTimeOutMillis(1000).doPing(
  84. object : Ping.PingListener{
  85. override fun onResult(pingResult: PingResult?) {
  86. android.os.Handler(Looper.getMainLooper()).post {
  87. ping = pingResult?.timeTaken?.toInt()!!
  88. }
  89. }
  90. override fun onError(e: Exception?) {}
  91. override fun onFinished(pingStats: PingStats?) {}
  92. }
  93. )
  94. val icon = Utils.getDrawable(context, server.iso)
  95. Icon(
  96. painter = painterResource(id = icon),
  97. contentDescription = "Server Logo",
  98. tint = Color.Unspecified,
  99. modifier = Modifier
  100. .padding(bottom = 16.dp)
  101. .size(24.dp)
  102. )
  103. Text(text = server.server_name!!,
  104. style = TextStyle(
  105. fontSize = 16.sp,
  106. color = MaterialTheme.colorScheme.primary
  107. ),
  108. modifier = Modifier
  109. .padding(start = 16.dp, bottom = 18.dp)
  110. .align(Alignment.CenterVertically)
  111. )
  112. Spacer(modifier = Modifier.weight(1F))
  113. Text(text = "$ping ms",
  114. style = TextStyle(
  115. fontSize = 16.sp,
  116. color = colorResource(id = R.color.blue_text)
  117. ),
  118. modifier = Modifier
  119. .padding(end = 30.dp, bottom = 18.dp)
  120. .align(Alignment.CenterVertically)
  121. )
  122. // Spacer(modifier = Modifier.weight(1F))
  123. var isFavorite by rememberSaveable { mutableStateOf(false) }
  124. Icon(
  125. modifier = Modifier
  126. .padding(bottom = 18.dp, end = 8.dp)
  127. .size(22.dp, 21.dp)
  128. .clickable(
  129. indication = null,
  130. interactionSource = remember { MutableInteractionSource() }
  131. ) { isFavorite = !isFavorite },
  132. painter = if (isFavorite) painterResource(
  133. id = R.drawable.fav_server3x) else painterResource(
  134. id = R.drawable.unfav_server3x),
  135. contentDescription = "Server Logo",
  136. tint = Color.Unspecified,
  137. )
  138. // IconButton(
  139. // onClick = { isFavorite = !isFavorite },
  140. // modifier = Modifier
  141. // .clickable(
  142. // indication = null,
  143. // interactionSource = remember { MutableInteractionSource() },
  144. // ) {
  145. // isFavorite = !isFavorite
  146. // }
  147. // ) {
  148. //
  149. //
  150. // }
  151. }
  152. Surface(
  153. modifier = Modifier
  154. .padding(start = 0.dp, end = 0.dp)
  155. .height(1.dp)
  156. .fillMaxWidth()
  157. .alpha(0.6F)
  158. .align(Alignment.BottomCenter)
  159. ,
  160. color = colorResource(id = R.color.gray_icon)
  161. ) {}
  162. }
  163. }
  164. @Composable
  165. fun FavoriteServerItem(server: Server) {
  166. Box(
  167. modifier = Modifier
  168. .fillMaxWidth()
  169. .background(MaterialTheme.colorScheme.background)
  170. .padding(bottom = 1.dp)
  171. ) {
  172. val context = LocalContext.current
  173. Row(
  174. verticalAlignment = Alignment.Top,
  175. horizontalArrangement = Arrangement.Start,
  176. modifier = Modifier
  177. .fillMaxWidth()
  178. .padding(start = 12.dp, end = 7.dp, top = 12.dp)
  179. .clickable(
  180. indication = null,
  181. interactionSource = remember { MutableInteractionSource() }
  182. ) {
  183. Toast
  184. .makeText(
  185. context,
  186. server.server_name,
  187. Toast.LENGTH_SHORT
  188. )
  189. .show()
  190. }
  191. ) {
  192. var ping by remember { mutableIntStateOf(0) }
  193. Ping.onAddress(server.ip as String).setTimeOutMillis(1000).doPing(
  194. object : Ping.PingListener{
  195. override fun onResult(pingResult: PingResult?) {
  196. android.os.Handler(Looper.getMainLooper()).post {
  197. ping = pingResult?.timeTaken?.toInt()!!
  198. }
  199. }
  200. override fun onError(e: Exception?) {}
  201. override fun onFinished(pingStats: PingStats?) {}
  202. }
  203. )
  204. val icon = Utils.getDrawable(context, server.iso)
  205. Icon(
  206. painter = painterResource(id = icon),
  207. contentDescription = "Server Logo",
  208. tint = Color.Unspecified,
  209. modifier = Modifier
  210. .padding(bottom = 16.dp)
  211. .size(24.dp)
  212. )
  213. Text(text = server.server_name!!,
  214. style = TextStyle(
  215. fontSize = 16.sp,
  216. color = MaterialTheme.colorScheme.primary
  217. ),
  218. modifier = Modifier
  219. .padding(start = 16.dp, bottom = 18.dp)
  220. .align(Alignment.CenterVertically)
  221. )
  222. Spacer(modifier = Modifier.weight(1F))
  223. Text(text = "$ping ms",
  224. style = TextStyle(
  225. fontSize = 16.sp,
  226. color = colorResource(id = R.color.blue_text)
  227. ),
  228. modifier = Modifier
  229. .padding(end = 30.dp, bottom = 18.dp)
  230. .align(Alignment.CenterVertically)
  231. )
  232. // Spacer(modifier = Modifier.weight(1F))
  233. var isFavorite by rememberSaveable {
  234. mutableStateOf(true) }
  235. Icon(
  236. modifier = Modifier
  237. .padding(bottom = 18.dp, end = 0.dp)
  238. .size(22.dp, 21.dp)
  239. .clickable(
  240. indication = null,
  241. interactionSource = remember { MutableInteractionSource() }
  242. ) { isFavorite = !isFavorite },
  243. painter = if (isFavorite) painterResource(
  244. id = R.drawable.fav_server3x) else painterResource(
  245. id = R.drawable.unfav_server3x),
  246. contentDescription = "Server Logo",
  247. tint = Color.Unspecified,
  248. )
  249. // IconButton(
  250. // onClick = { isFavorite = !isFavorite },
  251. // modifier = Modifier
  252. // .clickable(
  253. // indication = null,
  254. // interactionSource = remember { MutableInteractionSource() },
  255. // ) {
  256. // isFavorite = !isFavorite
  257. // }
  258. // ) {
  259. //
  260. //
  261. // }
  262. }
  263. Surface(
  264. modifier = Modifier
  265. .padding(start = 0.dp, end = 0.dp)
  266. .height(1.dp)
  267. .fillMaxWidth()
  268. .alpha(0.6F)
  269. .align(Alignment.BottomCenter)
  270. ,
  271. color = colorResource(id = R.color.gray_icon)
  272. ) {}
  273. }
  274. }
  275. @Composable
  276. fun ServerSearchItem(server: Server) {
  277. Box(
  278. modifier = Modifier
  279. .fillMaxWidth()
  280. .background(color = MaterialTheme.colorScheme.background)
  281. .padding(bottom = 1.dp)
  282. ) {
  283. val context = LocalContext.current
  284. Row(
  285. verticalAlignment = Alignment.Top,
  286. horizontalArrangement = Arrangement.Start,
  287. modifier = Modifier
  288. .fillMaxWidth()
  289. .padding(start = 12.dp, end = 7.dp, top = 12.dp)
  290. .clickable(
  291. indication = null,
  292. interactionSource = remember { MutableInteractionSource() }
  293. ) {
  294. Toast
  295. .makeText(
  296. context,
  297. server.server_name,
  298. Toast.LENGTH_SHORT
  299. )
  300. .show()
  301. }
  302. ) {
  303. var ping by remember { mutableIntStateOf(0) }
  304. Ping.onAddress(server.ip as String).setTimeOutMillis(1000).doPing(
  305. object : Ping.PingListener{
  306. override fun onResult(pingResult: PingResult?) {
  307. android.os.Handler(Looper.getMainLooper()).post {
  308. ping = pingResult?.timeTaken?.toInt()!!
  309. }
  310. }
  311. override fun onError(e: Exception?) {}
  312. override fun onFinished(pingStats: PingStats?) {}
  313. }
  314. )
  315. val icon = Utils.getDrawable(context, server.iso)
  316. Icon(
  317. painter = painterResource(id = icon),
  318. contentDescription = "Server Logo",
  319. tint = Color.Unspecified,
  320. modifier = Modifier
  321. .padding(bottom = 16.dp)
  322. .size(24.dp)
  323. )
  324. Text(text = server.server_name!!,
  325. style = TextStyle(
  326. fontSize = 16.sp,
  327. color = MaterialTheme.colorScheme.primary
  328. ),
  329. modifier = Modifier
  330. .padding(start = 16.dp, bottom = 18.dp)
  331. .align(Alignment.CenterVertically)
  332. )
  333. Spacer(modifier = Modifier.weight(1F))
  334. Text(text = "$ping ms",
  335. style = TextStyle(
  336. fontSize = 16.sp,
  337. color = colorResource(id = R.color.blue_text)
  338. ),
  339. modifier = Modifier
  340. .padding(end = 30.dp, bottom = 18.dp)
  341. .align(Alignment.CenterVertically)
  342. )
  343. // Spacer(modifier = Modifier.weight(1F))
  344. var isFavorite by rememberSaveable { mutableStateOf(false) }
  345. Icon(
  346. modifier = Modifier
  347. .padding(bottom = 18.dp, end = 8.dp)
  348. .size(22.dp, 21.dp)
  349. .clickable(
  350. indication = null,
  351. interactionSource = remember { MutableInteractionSource() }
  352. ) { isFavorite = !isFavorite },
  353. painter = if (isFavorite) painterResource(
  354. id = R.drawable.fav_server3x) else painterResource(
  355. id = R.drawable.unfav_server3x),
  356. contentDescription = "Server Logo",
  357. tint = Color.Unspecified,
  358. )
  359. // IconButton(
  360. // onClick = { isFavorite = !isFavorite },
  361. // modifier = Modifier
  362. // .clickable(
  363. // indication = null,
  364. // interactionSource = remember { MutableInteractionSource() },
  365. // ) {
  366. // isFavorite = !isFavorite
  367. // }
  368. // ) {
  369. //
  370. //
  371. // }
  372. }
  373. Surface(
  374. modifier = Modifier
  375. .padding(start = 0.dp, end = 0.dp)
  376. .height(1.dp)
  377. .fillMaxWidth()
  378. .alpha(0.6F)
  379. .align(Alignment.BottomCenter)
  380. ,
  381. color = colorResource(id = R.color.gray_icon)
  382. ) {}
  383. }
  384. }
  385. @Preview
  386. @Composable
  387. fun ServerItemPreview() {
  388. ServerItem(server = favListServer[0])
  389. }
  390. @Preview
  391. @Composable
  392. fun FavoriteServerItemPreview() {
  393. FavoriteServerItem(server = favListServer[0])
  394. }
  395. @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
  396. @Composable
  397. fun FavoriteServerItemPreviewDark() {
  398. FavoriteServerItem(server = favListServer[0])
  399. }
  400. @Preview
  401. @Composable
  402. fun ServerSearchItemPreview() {
  403. ServerSearchItem(server = favListServer[0])
  404. }