123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- package com.vpn.fastestvpnservice.customItems
- import android.content.Context
- import android.content.pm.PackageManager
- import android.graphics.Bitmap
- import android.graphics.drawable.BitmapDrawable
- import android.graphics.drawable.Drawable
- import android.util.Log
- import android.widget.Toast
- import androidx.compose.foundation.Image
- import androidx.compose.foundation.background
- import androidx.compose.foundation.clickable
- import androidx.compose.foundation.interaction.MutableInteractionSource
- import androidx.compose.foundation.layout.Arrangement
- import androidx.compose.foundation.layout.Box
- import androidx.compose.foundation.layout.Row
- import androidx.compose.foundation.layout.Spacer
- import androidx.compose.foundation.layout.fillMaxWidth
- import androidx.compose.foundation.layout.height
- import androidx.compose.foundation.layout.padding
- import androidx.compose.foundation.layout.size
- import androidx.compose.foundation.layout.width
- import androidx.compose.foundation.layout.wrapContentHeight
- import androidx.compose.foundation.layout.wrapContentWidth
- import androidx.compose.foundation.shape.RoundedCornerShape
- import androidx.compose.material.Checkbox
- import androidx.compose.material.CheckboxDefaults
- import androidx.compose.material.Surface
- import androidx.compose.material.Text
- import androidx.compose.material3.Icon
- import androidx.compose.material3.MaterialTheme
- import androidx.compose.material3.rememberDrawerState
- import androidx.compose.runtime.Composable
- import androidx.compose.runtime.getValue
- import androidx.compose.runtime.mutableStateOf
- import androidx.compose.runtime.remember
- import androidx.compose.runtime.saveable.rememberSaveable
- import androidx.compose.runtime.setValue
- import androidx.compose.ui.Alignment
- import androidx.compose.ui.Modifier
- import androidx.compose.ui.draw.alpha
- import androidx.compose.ui.focus.onFocusChanged
- import androidx.compose.ui.graphics.Color
- import androidx.compose.ui.graphics.ImageBitmap
- import androidx.compose.ui.graphics.asImageBitmap
- import androidx.compose.ui.platform.LocalContext
- import androidx.compose.ui.res.colorResource
- import androidx.compose.ui.res.painterResource
- 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.core.graphics.drawable.DrawableCompat
- import androidx.core.graphics.drawable.toBitmap
- import com.vpn.fastestvpnservice.R
- import com.vpn.fastestvpnservice.beans.SelectApplicationEntry
- import com.vpn.fastestvpnservice.beans.SplitTunnelData
- import androidx.compose.ui.graphics.painter.BitmapPainter
- import androidx.compose.ui.text.style.TextOverflow
- import com.google.accompanist.drawablepainter.rememberDrawablePainter
- import com.vpn.fastestvpnservice.constants.splitList
- import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
- @Composable
- fun SplitTunnelingItem(
- app: SelectApplicationEntry,
- list: List<SelectApplicationEntry>,
- position: Int
- ) {
- var isSelected by rememberSaveable { mutableStateOf(app.isSelected().value) }
- var isItemFocused by remember { mutableStateOf(false) }
- val color = if (isSelected) colorResource(id = R.color.split_background)
- else if (isItemFocused) colorResource(id = R.color.grayDark)
- else colorResource(id = R.color.background_color_gray)
- Surface(
- modifier = Modifier
- .fillMaxWidth()
- .background(
- color = colorResource(id = R.color.background_color_gray)
- )
- .padding(bottom = 1.dp)
- .onFocusChanged {
- isItemFocused = it.isFocused
- },
- color = color
- ) {
- val context = LocalContext.current
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.Start,
- modifier = Modifier
- .fillMaxWidth()
- .padding(start = 12.dp, end = 7.dp, top = 15.dp, bottom = 15.dp)
- .clickable(
- indication = null,
- interactionSource = remember {
- MutableInteractionSource()
- },
- ) {
- isSelected = !isSelected
- // Log.d("test_splittunnel_data", "$app ${list.get(position).isSelected().value}")
- list.get(position).setSelected(mutableStateOf(!list.get(position).isSelected().value))
- countSelectedApp(list, context)
- }
- .background(Color.Transparent)
- ) {
- Image(
- painter = rememberDrawablePainter(drawable = app.getIcon()),
- contentDescription = "Server Logo",
- // tint = Color.Unspecified,
- modifier = Modifier
- .padding(bottom = 0.dp)
- .align(Alignment.CenterVertically)
- .size(40.dp)
- )
- Text(text = "$app",
- style = MaterialTheme.typography.bodySmall,
- color = colorResource(id = R.color.dark_blue_gray_text),
- maxLines = 2,
- overflow = TextOverflow.Ellipsis,
- modifier = Modifier
- .padding(start = 12.dp, bottom = 0.dp, end = 20.dp)
- .align(Alignment.CenterVertically)
- .background(Color.Transparent)
- .weight(1f)
- )
- // Spacer(modifier = Modifier.weight(1F))
- // Image(
- // painter = rememberDrawablePainter(drawable = app.getIcon()),
- // contentDescription = "Server Logo",
- //// tint = Color.Unspecified,
- // modifier = Modifier
- // .padding(bottom = 18.dp, end = 8.dp)
- // .align(Alignment.CenterVertically)
- // .size(40.dp)
- // )
- Checkbox(
- checked = isSelected,
- onCheckedChange = {
- isSelected = !isSelected
- list.get(position).setSelected(mutableStateOf(!list.get(position).isSelected().value))
- countSelectedApp(list, context)
- },
- colors = CheckboxDefaults.colors(
- uncheckedColor = colorResource(id = R.color.switch_gray),
- checkedColor = colorResource(id = R.color.blue_text),
- ),
- modifier = Modifier
- .padding(start = 0.dp, bottom = 0.dp, end = 8.dp)
- .align(Alignment.CenterVertically)
- .background(
- color = if (isSelected) colorResource(id = R.color.blue_text)
- else colorResource(id = R.color.switch_gray),
- shape = RoundedCornerShape(5.dp)
- )
- .size(24.dp)
- )
- }
- }
- }
- fun countSelectedApp(list: List<SelectApplicationEntry>, context: Context) {
- val prefHelper: BasePreferenceHelper = BasePreferenceHelper(context = context)
- list.let { it ->
- Log.d("test_split_data", it.size.toString())
- prefHelper.getSplitPosition().let { pos ->
- when (pos) {
- splitList[1] -> {
- val temp = it.filter {
- it.isSelected().value
- }
- if (temp.size == 0) {
- prefHelper.setSplitTunneledApps(null)
- } else {
- val stringList = ArrayList<String>()
- temp.forEach {
- Log.d("test_split_data","apps allow " + it.getInfo()?.packageName.toString())
- stringList.add(it.getInfo()?.packageName!!)
- }
- prefHelper.setSplitTunneledApps(stringList.toString())
- }
- }
- splitList[2] -> {
- val tempNoVpn = it.filter {
- it.isSelected().value
- }
- val tempNotAllow = it.filter {
- !it.isSelected().value
- }
- if (tempNoVpn.size == 0) {
- prefHelper.setSplitTunneledAppsNoVpn(null)
- } else {
- val stringListNoVpn = ArrayList<String>()
- Log.d("test_split_data", "apps no vpn $tempNoVpn")
- tempNoVpn.forEach {
- stringListNoVpn.add(it.getInfo()?.packageName!!)
- }
- prefHelper.setSplitTunneledAppsNoVpn(stringListNoVpn.toString())
- }
- if (tempNotAllow.size == 0) {
- prefHelper.setSplitTunneledAppsNotAllow(null)
- } else {
- val stringListNotAllow = ArrayList<String>()
- Log.d("test_split_data", "apps not allow $tempNotAllow")
- tempNotAllow.forEach {
- stringListNotAllow.add(it.getInfo()?.packageName!!)
- }
- prefHelper.setSplitTunneledAppsNotAllow(stringListNotAllow.toString())
- }
- }
- }
- }
- }
- }
- @Preview
- @Composable
- fun SplitTunnelingItemPreview() {
- }
|