Explorar el Código

working on Split Tunnel list..

Khubaib hace 1 año
padre
commit
5c7ade417a

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -4,6 +4,7 @@
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
 
     <application
         android:name=".application.App"

+ 3 - 0
app/src/main/java/com/vpn/fastestvpnservice/beans/SelectApplicationEntry.kt

@@ -3,6 +3,7 @@ package com.vpn.fastestvpnservice.beans
 import android.content.pm.ApplicationInfo
 import android.content.pm.PackageManager
 import android.graphics.drawable.Drawable
+import android.util.Log
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import java.text.Collator
@@ -20,6 +21,8 @@ class SelectApplicationEntry : Comparable<SelectApplicationEntry> {
         mName = name.toString()
         mIcon = info.loadIcon(packageManager)
         mSelected.value = state
+
+        Log.d("test_splittunnel_data", "$name $state")
     }
 
     fun setSelected(selected: MutableState<Boolean>) {

+ 11 - 11
app/src/main/java/com/vpn/fastestvpnservice/beans/SplitTunnelList.kt

@@ -7,19 +7,19 @@ import com.vpn.fastestvpnservice.R
 data class SplitTunnelData(
     val icon: Int,
     val appName: String,
-    var isSelected: MutableState<Boolean>
+    var isSelected: Boolean
 )
 
 
-val splitTunnelList1 = listOf(
-    SplitTunnelData(R.drawable.adaptive3x, "Adaptive Connectivity Services", mutableStateOf(false)),
-    SplitTunnelData(R.drawable.accessibility3x, "Android Accessibility Suite", mutableStateOf(false)),
-    SplitTunnelData(R.drawable.calculator3x, "Calculator", mutableStateOf(false))
-)
+//val splitTunnelList1 = listOf(
+//    SplitTunnelData(R.drawable.adaptive3x, "Adaptive Connectivity Services", mutableStateOf(false)),
+//    SplitTunnelData(R.drawable.accessibility3x, "Android Accessibility Suite", mutableStateOf(false)),
+//    SplitTunnelData(R.drawable.calculator3x, "Calculator", mutableStateOf(false))
+//)
 
-val splitTunnelList2 = listOf(
-    SplitTunnelData(R.drawable.adaptive3x, "Adaptive Connectivity Services", mutableStateOf(false)),
-    SplitTunnelData(R.drawable.accessibility3x, "Android Accessibility Suite", mutableStateOf(false)),
-    SplitTunnelData(R.drawable.calculator3x, "Calculator", mutableStateOf(false))
-)
+//val splitTunnelList2 = listOf(
+//    SplitTunnelData(R.drawable.adaptive3x, "Adaptive Connectivity Services", mutableStateOf(false)),
+//    SplitTunnelData(R.drawable.accessibility3x, "Android Accessibility Suite", mutableStateOf(false)),
+//    SplitTunnelData(R.drawable.calculator3x, "Calculator", mutableStateOf(false))
+//)
 

+ 4 - 1
app/src/main/java/com/vpn/fastestvpnservice/constants/CustomText.kt

@@ -22,4 +22,7 @@ const val TermsAndConditionsDesc: String = "Duis vestibulum elit vel neque phare
         "\n" +
         "Duis vestibulum elit vel neque pharetra vulputate. Quisque scelerisque nisi urna. Duis rutrum non risus in imperdiet. Proin molestie accumsan nulla sit amet mattis. Ut vel tristique neque. Praesent purus eros, aliquet sit amet venenatis in, sodales in odio. Curabitur ac ligula et purus cursus vulputate accumsan sit amet erat. Vestibulum ac mauris ut nisl maximus porta eu a libero. In hac habitasse platea dictumst. Proin augue urna, pretium vel mauris sed, lobortis rutrum libero."
 
-const val HelpDesc: String = "The VPN on your phone is a Virtual Private Network. It's an app that allows you to connect to another server and replace your IP address with the IP address."
+const val HelpDesc: String = "The VPN on your phone is a Virtual Private Network. It's an app that allows you to connect to another server and replace your IP address with the IP address."
+
+val splitList = listOf("All apps use the VPN", "Only allow selected apps to use the vpn",
+    "Do not allow selected apps to use the vpn")

+ 3 - 1
app/src/main/java/com/vpn/fastestvpnservice/customItems/SplitTunnelingItem.kt

@@ -4,6 +4,7 @@ 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
@@ -53,7 +54,7 @@ import androidx.compose.ui.graphics.painter.BitmapPainter
 import com.google.accompanist.drawablepainter.rememberDrawablePainter
 
 @Composable
-fun SplitTunnelingItem(app: SelectApplicationEntry) {
+fun SplitTunnelingItem(app: SelectApplicationEntry, list: List<SelectApplicationEntry>) {
     var isSelected by rememberSaveable { mutableStateOf(false) }
 
     Surface(
@@ -82,6 +83,7 @@ fun SplitTunnelingItem(app: SelectApplicationEntry) {
                     },
                 ) {
                     isSelected = !isSelected
+                    Log.d("test_splittunnel_data", list.size.toString())
                 }
         ) {
             Image(

+ 21 - 7
app/src/main/java/com/vpn/fastestvpnservice/helpers/BasePreferenceHelper.kt

@@ -11,6 +11,7 @@ import com.google.gson.reflect.TypeToken
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.*
 import com.vpn.fastestvpnservice.constants.AppEnum
+import com.vpn.fastestvpnservice.constants.splitList
 
 class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
 
@@ -39,6 +40,7 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         removePreference(context, KEY_FILENAME, KEY_ISLOGGEDIN)
         removePreference(context, KEY_FILENAME, THEME)
         removePreference(context, KEY_FILENAME, KEY_ISCONNECT)
+        removePreference(context, KEY_FILENAME, KEY_SPLIT_POS)
     }
 
     fun saveUser(user: UserResponse) {
@@ -389,13 +391,13 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         }
     }
 
-    fun saveRadioBtnSplitPos(position: Int) {
-        putIntegerPreference(context, KEY_FILENAME, KEY_SPLIT_POS, position)
-    }
-
-    fun getRadioBtnSplitPos(): Int {
-        return getIntegerPreference(context, KEY_FILENAME, KEY_SPLIT_POS)
-    }
+//    fun saveRadioBtnSplitPos(position: Int) {
+//        putIntegerPreference(context, KEY_FILENAME, KEY_SPLIT_POS, position)
+//    }
+//
+//    fun getRadioBtnSplitPos(): Int {
+//        return getIntegerPreference(context, KEY_FILENAME, KEY_SPLIT_POS)
+//    }
 
     fun saveAdBlockState(status: Boolean) {
         putBooleanPreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH, status)
@@ -437,6 +439,18 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         return getStringPreference(context, KEY_FILENAME, X_PLATFORM_TOKEN)
     }
 
+    fun saveSplitPosition(token: String) {
+        putStringPreference(context, KEY_FILENAME, KEY_SPLIT_POS, token)
+    }
+
+    fun getSplitPosition(): String {
+        try {
+            return getStringPreference(context, KEY_FILENAME, KEY_SPLIT_POS)
+        } catch (ex: Exception) {
+            return splitList[0]
+        }
+    }
+
     companion object {
         private const val KEY_FILENAME = "file_fastestvpn"
         private const val KEY_USER = "keydata_user"

+ 0 - 7
app/src/main/java/com/vpn/fastestvpnservice/screens/LoginScreen.kt

@@ -555,13 +555,6 @@ fun BoxScope.SignInButton(
                         Log.d("Refreshed token: ", "Login: $it")
                     }
 
-                    prefHelper.saveRadioBtnSplitPos(0)
-
-
-
-
-
-
 
                     navHostController.popBackStack()
                     navHostController.navigate(Screen.BottomBarMainScreen.route)

+ 0 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/SignUpScreen.kt

@@ -589,7 +589,6 @@ fun BoxScope.SignUpButton(
                         Log.d("Refreshed token: ","SignUp: $it")
                     }
 
-                    prefHelper.saveRadioBtnSplitPos(0)
                 }
 
                 navHostController.popBackStack()

+ 58 - 14
app/src/main/java/com/vpn/fastestvpnservice/screens/settingsScreenAll/SplitTunneling.kt

@@ -57,8 +57,9 @@ import com.google.gson.reflect.TypeToken
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.SelectApplicationEntry
 import com.vpn.fastestvpnservice.beans.SplitTunnelData
-import com.vpn.fastestvpnservice.beans.splitTunnelList2
+import com.vpn.fastestvpnservice.constants.splitList
 import com.vpn.fastestvpnservice.customItems.SplitTunnelingItem
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import java.util.ArrayList
 import java.util.SortedSet
 import java.util.TreeSet
@@ -130,9 +131,11 @@ fun SplitTunneling(navHostController: NavHostController) {
 
 @Composable
 fun ColumnScope.ShowRadioButtons() {
-    val splitList = listOf("All apps use the VPN", "Only allow selected apps to use the vpn",
-        "Do not allow selected apps to use the vpn")
-    var selectedList by remember { mutableStateOf(splitList[0]) }
+    val context = LocalContext.current
+    val prefHelper = BasePreferenceHelper(context = context)
+
+
+    var selectedList by remember { mutableStateOf(prefHelper.getSplitPosition()) }
 
     Spacer(modifier = Modifier.height(15.dp))
 
@@ -142,12 +145,13 @@ fun ColumnScope.ShowRadioButtons() {
                     .fillMaxWidth()
                     .background(Color.Transparent)
                     .padding(top = 0.dp)
-                                    .selectable(
-                                        selected = selectedList == list,
-                                        onClick = {
-                                            selectedList = list
-                                        },
-                                    )
+                    .selectable(
+                        selected = selectedList == list,
+                        onClick = {
+                            selectedList = list
+                            prefHelper.saveSplitPosition(list)
+                        },
+                    )
 //                                    .indication(
 //                                        indication = null,
 //                                        interactionSource = remember {
@@ -160,6 +164,7 @@ fun ColumnScope.ShowRadioButtons() {
                 RadioButton(selected = list == selectedList,
                     onClick = {
                         selectedList = list
+                        prefHelper.saveSplitPosition(list)
                     },
                     colors = RadioButtonDefaults.colors(
                         selectedColor = colorResource(
@@ -188,13 +193,22 @@ fun ColumnScope.ShowRadioButtons() {
         color = colorResource(id = R.color.gray_icon)
     ) {}
 
-    val context = LocalContext.current
     val apps: ArrayList<SelectApplicationEntry> = ArrayList()
     val apps2: ArrayList<SelectApplicationEntry> = ArrayList()
     val seen: SortedSet<String> = TreeSet()
     var selectedAppsList = ArrayList<String>()
     var selectedAppsListNoVpn = ArrayList<String>()
 
+    if (!prefHelper.getSplitTunneledApps().equals("")) {
+        val type = object : TypeToken<ArrayList<String>>() {}.type
+        selectedAppsList = Gson().fromJson(prefHelper.getSplitTunneledApps(), type)
+    }
+
+    if (!prefHelper.getSplitTunneledAppsNoVpn().equals("")) {
+        val type = object : TypeToken<ArrayList<String>>() {}.type
+        selectedAppsListNoVpn = Gson().fromJson(prefHelper.getSplitTunneledAppsNoVpn(), type)
+    }
+
     val mPackageManager: PackageManager = context.packageManager
 
     for (info in mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA)) { /* skip apps that can't access the network anyway */
@@ -208,6 +222,23 @@ fun ColumnScope.ShowRadioButtons() {
                 if (info.packageName == context.packageName) continue
                 val entry = SelectApplicationEntry(mPackageManager, info, false)
 
+                prefHelper.getSplitPosition().let {
+                    when (it){
+                        splitList[1] -> {
+                            if (!prefHelper.getSplitTunneledApps().equals("")) {
+                                entry.setSelected(mutableStateOf(selectedAppsList.contains(info.packageName))) //= selectedAppsList!!.contains(info.packageName)
+                            }
+                        }
+                        splitList[2] -> {
+                            if (!prefHelper.getSplitTunneledAppsNoVpn().equals("")) {
+                                entry.setSelected(mutableStateOf(selectedAppsListNoVpn.contains(info.packageName))) //= selectedAppsList!!.contains(info.packageName)
+                            }
+                        }
+                    }
+                }
+
+                Log.d("test_splittunnel_data", "${entry.getInfo()?.name}")
+
                 Log.d("entry split", entry.toString())
 
                 apps.add(entry)
@@ -225,6 +256,21 @@ fun ColumnScope.ShowRadioButtons() {
                 if (info.packageName == context.packageName) continue
                 val entry = SelectApplicationEntry(mPackageManager, info, false)
 
+                prefHelper.getSplitPosition().let {
+                    when (it){
+                        splitList[1] -> {
+                            if (!prefHelper.getSplitTunneledApps().equals("")) {
+                                entry.setSelected(mutableStateOf(selectedAppsList.contains(info.packageName))) //= selectedAppsList!!.contains(info.packageName)
+                            }
+                        }
+                        splitList[2] -> {
+                            if (!prefHelper.getSplitTunneledAppsNoVpn().equals("")) {
+                                entry.setSelected(mutableStateOf(selectedAppsListNoVpn.contains(info.packageName))) //= selectedAppsList!!.contains(info.packageName)
+                            }
+                        }
+                    }
+                }
+
                 apps.add(entry)
                 apps2.add(entry)
                 seen.add(info.packageName)
@@ -255,8 +301,6 @@ fun ColumnScope.ShowRadioButtons() {
 @Composable
 fun ColumnScope.ShowSplitTunnelList(list: List<SelectApplicationEntry>) {
 
-
-
     Box(modifier = Modifier
         .padding(top = 5.dp)
         .fillMaxSize()
@@ -264,7 +308,7 @@ fun ColumnScope.ShowSplitTunnelList(list: List<SelectApplicationEntry>) {
     ) {
         LazyColumn() {
             items(items = list) { app ->
-                SplitTunnelingItem(app)
+                SplitTunnelingItem(app, list)
             }
         }
     }