Browse Source

working on Split Tunnel list..

Khubaib 1 year ago
parent
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.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
 
 
     <application
     <application
         android:name=".application.App"
         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.ApplicationInfo
 import android.content.pm.PackageManager
 import android.content.pm.PackageManager
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.Drawable
+import android.util.Log
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.mutableStateOf
 import java.text.Collator
 import java.text.Collator
@@ -20,6 +21,8 @@ class SelectApplicationEntry : Comparable<SelectApplicationEntry> {
         mName = name.toString()
         mName = name.toString()
         mIcon = info.loadIcon(packageManager)
         mIcon = info.loadIcon(packageManager)
         mSelected.value = state
         mSelected.value = state
+
+        Log.d("test_splittunnel_data", "$name $state")
     }
     }
 
 
     fun setSelected(selected: MutableState<Boolean>) {
     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(
 data class SplitTunnelData(
     val icon: Int,
     val icon: Int,
     val appName: String,
     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" +
         "\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."
         "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.Bitmap
 import android.graphics.drawable.BitmapDrawable
 import android.graphics.drawable.BitmapDrawable
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.Drawable
+import android.util.Log
 import android.widget.Toast
 import android.widget.Toast
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.background
@@ -53,7 +54,7 @@ import androidx.compose.ui.graphics.painter.BitmapPainter
 import com.google.accompanist.drawablepainter.rememberDrawablePainter
 import com.google.accompanist.drawablepainter.rememberDrawablePainter
 
 
 @Composable
 @Composable
-fun SplitTunnelingItem(app: SelectApplicationEntry) {
+fun SplitTunnelingItem(app: SelectApplicationEntry, list: List<SelectApplicationEntry>) {
     var isSelected by rememberSaveable { mutableStateOf(false) }
     var isSelected by rememberSaveable { mutableStateOf(false) }
 
 
     Surface(
     Surface(
@@ -82,6 +83,7 @@ fun SplitTunnelingItem(app: SelectApplicationEntry) {
                     },
                     },
                 ) {
                 ) {
                     isSelected = !isSelected
                     isSelected = !isSelected
+                    Log.d("test_splittunnel_data", list.size.toString())
                 }
                 }
         ) {
         ) {
             Image(
             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.R
 import com.vpn.fastestvpnservice.beans.*
 import com.vpn.fastestvpnservice.beans.*
 import com.vpn.fastestvpnservice.constants.AppEnum
 import com.vpn.fastestvpnservice.constants.AppEnum
+import com.vpn.fastestvpnservice.constants.splitList
 
 
 class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
 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, KEY_ISLOGGEDIN)
         removePreference(context, KEY_FILENAME, THEME)
         removePreference(context, KEY_FILENAME, THEME)
         removePreference(context, KEY_FILENAME, KEY_ISCONNECT)
         removePreference(context, KEY_FILENAME, KEY_ISCONNECT)
+        removePreference(context, KEY_FILENAME, KEY_SPLIT_POS)
     }
     }
 
 
     fun saveUser(user: UserResponse) {
     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) {
     fun saveAdBlockState(status: Boolean) {
         putBooleanPreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH, status)
         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)
         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 {
     companion object {
         private const val KEY_FILENAME = "file_fastestvpn"
         private const val KEY_FILENAME = "file_fastestvpn"
         private const val KEY_USER = "keydata_user"
         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")
                         Log.d("Refreshed token: ", "Login: $it")
                     }
                     }
 
 
-                    prefHelper.saveRadioBtnSplitPos(0)
-
-
-
-
-
-
 
 
                     navHostController.popBackStack()
                     navHostController.popBackStack()
                     navHostController.navigate(Screen.BottomBarMainScreen.route)
                     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")
                         Log.d("Refreshed token: ","SignUp: $it")
                     }
                     }
 
 
-                    prefHelper.saveRadioBtnSplitPos(0)
                 }
                 }
 
 
                 navHostController.popBackStack()
                 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.R
 import com.vpn.fastestvpnservice.beans.SelectApplicationEntry
 import com.vpn.fastestvpnservice.beans.SelectApplicationEntry
 import com.vpn.fastestvpnservice.beans.SplitTunnelData
 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.customItems.SplitTunnelingItem
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import java.util.ArrayList
 import java.util.ArrayList
 import java.util.SortedSet
 import java.util.SortedSet
 import java.util.TreeSet
 import java.util.TreeSet
@@ -130,9 +131,11 @@ fun SplitTunneling(navHostController: NavHostController) {
 
 
 @Composable
 @Composable
 fun ColumnScope.ShowRadioButtons() {
 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))
     Spacer(modifier = Modifier.height(15.dp))
 
 
@@ -142,12 +145,13 @@ fun ColumnScope.ShowRadioButtons() {
                     .fillMaxWidth()
                     .fillMaxWidth()
                     .background(Color.Transparent)
                     .background(Color.Transparent)
                     .padding(top = 0.dp)
                     .padding(top = 0.dp)
-                                    .selectable(
-                                        selected = selectedList == list,
-                                        onClick = {
-                                            selectedList = list
-                                        },
-                                    )
+                    .selectable(
+                        selected = selectedList == list,
+                        onClick = {
+                            selectedList = list
+                            prefHelper.saveSplitPosition(list)
+                        },
+                    )
 //                                    .indication(
 //                                    .indication(
 //                                        indication = null,
 //                                        indication = null,
 //                                        interactionSource = remember {
 //                                        interactionSource = remember {
@@ -160,6 +164,7 @@ fun ColumnScope.ShowRadioButtons() {
                 RadioButton(selected = list == selectedList,
                 RadioButton(selected = list == selectedList,
                     onClick = {
                     onClick = {
                         selectedList = list
                         selectedList = list
+                        prefHelper.saveSplitPosition(list)
                     },
                     },
                     colors = RadioButtonDefaults.colors(
                     colors = RadioButtonDefaults.colors(
                         selectedColor = colorResource(
                         selectedColor = colorResource(
@@ -188,13 +193,22 @@ fun ColumnScope.ShowRadioButtons() {
         color = colorResource(id = R.color.gray_icon)
         color = colorResource(id = R.color.gray_icon)
     ) {}
     ) {}
 
 
-    val context = LocalContext.current
     val apps: ArrayList<SelectApplicationEntry> = ArrayList()
     val apps: ArrayList<SelectApplicationEntry> = ArrayList()
     val apps2: ArrayList<SelectApplicationEntry> = ArrayList()
     val apps2: ArrayList<SelectApplicationEntry> = ArrayList()
     val seen: SortedSet<String> = TreeSet()
     val seen: SortedSet<String> = TreeSet()
     var selectedAppsList = ArrayList<String>()
     var selectedAppsList = ArrayList<String>()
     var selectedAppsListNoVpn = 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
     val mPackageManager: PackageManager = context.packageManager
 
 
     for (info in mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA)) { /* skip apps that can't access the network anyway */
     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
                 if (info.packageName == context.packageName) continue
                 val entry = SelectApplicationEntry(mPackageManager, info, false)
                 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())
                 Log.d("entry split", entry.toString())
 
 
                 apps.add(entry)
                 apps.add(entry)
@@ -225,6 +256,21 @@ fun ColumnScope.ShowRadioButtons() {
                 if (info.packageName == context.packageName) continue
                 if (info.packageName == context.packageName) continue
                 val entry = SelectApplicationEntry(mPackageManager, info, false)
                 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)
                 apps.add(entry)
                 apps2.add(entry)
                 apps2.add(entry)
                 seen.add(info.packageName)
                 seen.add(info.packageName)
@@ -255,8 +301,6 @@ fun ColumnScope.ShowRadioButtons() {
 @Composable
 @Composable
 fun ColumnScope.ShowSplitTunnelList(list: List<SelectApplicationEntry>) {
 fun ColumnScope.ShowSplitTunnelList(list: List<SelectApplicationEntry>) {
 
 
-
-
     Box(modifier = Modifier
     Box(modifier = Modifier
         .padding(top = 5.dp)
         .padding(top = 5.dp)
         .fillMaxSize()
         .fillMaxSize()
@@ -264,7 +308,7 @@ fun ColumnScope.ShowSplitTunnelList(list: List<SelectApplicationEntry>) {
     ) {
     ) {
         LazyColumn() {
         LazyColumn() {
             items(items = list) { app ->
             items(items = list) { app ->
-                SplitTunnelingItem(app)
+                SplitTunnelingItem(app, list)
             }
             }
         }
         }
     }
     }