浏览代码

working on smart list..

Khubaib 1 年之前
父节点
当前提交
c4ac98b934

+ 13 - 0
app/src/main/java/com/vpn/fastestvpnservice/MainActivity.kt

@@ -1,5 +1,7 @@
 package com.vpn.fastestvpnservice
 
+import android.content.pm.PackageManager
+import android.os.Build
 import android.os.Bundle
 import android.util.Log
 import androidx.activity.ComponentActivity
@@ -22,6 +24,7 @@ import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.tooling.preview.Preview
+import androidx.core.app.ActivityCompat
 import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.get
@@ -46,6 +49,16 @@ class MainActivity : ComponentActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+            if (ActivityCompat.checkSelfPermission(
+                    this,
+                    android.Manifest.permission.POST_NOTIFICATIONS
+                ) != PackageManager.PERMISSION_GRANTED
+            ) {
+                requestPermissions(arrayOf(android.Manifest.permission.POST_NOTIFICATIONS), 1);
+            }
+        }
+
         setContent {
             val context = LocalContext.current
 

+ 19 - 0
app/src/main/java/com/vpn/fastestvpnservice/helpers/BasePreferenceHelper.kt

@@ -43,6 +43,7 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         removePreference(context, KEY_FILENAME, KEY_SPLIT_POS)
         removePreference(context, KEY_FILENAME, FILTER)
         removePreference(context, KEY_FILENAME, SMART)
+        removePreference(context, KEY_FILENAME, KEY_SMART_SERVER)
     }
 
     fun saveUser(user: UserResponse) {
@@ -302,6 +303,21 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         putStringPreference(context, KEY_FILENAME, KEY_SERVERS, Gson().toJson(serverObj))
     }
 
+    fun getSmartServerObject(): Server? {
+        var serverObj: Server? = null
+        val serverObjStr: String = getStringPreference(context, KEY_FILENAME, KEY_SMART_SERVER)
+        if (serverObjStr != null) {
+            val gson = GsonBuilder().create()
+            serverObj = gson.fromJson(serverObjStr, Server::class.java)
+        }
+        return serverObj
+    }
+
+    fun setSmartServerObject(smartObj: Server?) {
+        putStringPreference(context, KEY_FILENAME, KEY_SMART_SERVER, Gson().toJson(smartObj))
+    }
+
+
     fun getSplitTunneledApps(): String? {
         return getStringPreference(context, KEY_FILENAME, KEY_SELECTED_APPS)
     }
@@ -383,6 +399,8 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         return getStringPreference(context, KEY_FILENAME, SMART)
     }
 
+
+
     fun saveTvSplitTunnel(tvSplitTunneling: ArrayList<TvSplitTunneling>) {
         putStringPreference(context, KEY_FILENAME, TV_SPLIT_CLASS, Gson().toJson(tvSplitTunneling))
     }
@@ -506,5 +524,6 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         private const val KEY_ISCONNECT = "keydata_isconnect"
         private const val FILTER = "keydata_filter"
         private const val SMART = "keydata_smart"
+        private const val KEY_SMART_SERVER = "keydata_smart_server"
     }
 }

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

@@ -3,6 +3,7 @@ package com.vpn.fastestvpnservice.screens
 
 import android.content.res.Configuration
 import android.gesture.Gesture
+import android.location.Location
 import android.util.Log
 import android.widget.TextView
 import android.widget.Toast
@@ -109,6 +110,7 @@ import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.DataResponse
+import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.UserResponse
 import com.vpn.fastestvpnservice.beans.filterList
 import com.vpn.fastestvpnservice.beans.themesList
@@ -655,6 +657,54 @@ fun BoxScope.SignInButton(
 //                        Log.d("Refreshed token: ", "Login: $it")
                     }
 
+                    val smartLocationList: MutableList<Server> = ArrayList<Server>()
+                    prefHelper.getServerData().get(0).servers?.let {
+                        val serverDataLocation = it
+
+                        val distinctdatanotnull =
+                            serverDataLocation.filter {   // servers's lt and lt not be null
+                                it.lt != null && it.lg != null
+                            }
+
+                        val distinctdata =
+                            distinctdatanotnull.distinctBy { // servers's lt filter, no same lt of a server
+                                it.lt
+                            }
+
+                        val result = FloatArray(1)
+                        val ipinfo = prefHelper.getIpinfo()
+
+                        distinctdata.forEachIndexed { index, server ->
+                            val lat1 = ipinfo?.latitute
+                            val lon1 = ipinfo?.longitude
+                            val lat2 = server.lt
+                            val lon2 = server.lg
+
+                            if (lat1 != null && lat2 != null && lon1 != null && lon2 != null) {
+                                Location.distanceBetween(lat1, lon1, lat2, lon2, result)
+                            }
+
+                            val distance: Float = result[0]
+                            distinctdata.get(index).distance = distance
+
+                        }
+
+                        val sortedDistance = distinctdata.sortedBy {
+                            it.distance
+                        }
+
+                        if (sortedDistance.isNotEmpty()) {
+                            for (i in 0..0) {
+                                smartLocationList.add(sortedDistance.get(i))
+                            }
+                        }
+
+                        smartLocationList.forEach {
+                            prefHelper.setSmartServerObject(it)
+                            Log.d("smartLocationList", "L:: server = ${it.server_name}")
+                        }
+
+                    }
 
                     navHostController.popBackStack()
                     navHostController.navigate(Screen.BottomBarMainScreen.route)

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

@@ -1,6 +1,7 @@
 package com.vpn.fastestvpnservice.screens
 
 import android.content.res.Configuration
+import android.location.Location
 import android.util.Log
 import android.widget.Toast
 import androidx.compose.foundation.Image
@@ -88,6 +89,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
+import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.filterList
 import com.vpn.fastestvpnservice.beans.themesList
 import com.vpn.fastestvpnservice.constants.smartConnect
@@ -730,6 +732,55 @@ fun BoxScope.SignUpButton(
 
                 }
 
+                val smartLocationList: MutableList<Server> = ArrayList<Server>()
+                prefHelper.getServerData().get(0).servers?.let {
+                    val serverDataLocation = it
+
+                    val distinctdatanotnull =
+                        serverDataLocation.filter {   // servers's lt and lt not be null
+                            it.lt != null && it.lg != null
+                        }
+
+                    val distinctdata =
+                        distinctdatanotnull.distinctBy { // servers's lt filter, no same lt of a server
+                            it.lt
+                        }
+
+                    val result = FloatArray(1)
+                    val ipinfo = prefHelper.getIpinfo()
+
+                    distinctdata.forEachIndexed { index, server ->
+                        val lat1 = ipinfo?.latitute
+                        val lon1 = ipinfo?.longitude
+                        val lat2 = server.lt
+                        val lon2 = server.lg
+
+                        if (lat1 != null && lat2 != null && lon1 != null && lon2 != null) {
+                            Location.distanceBetween(lat1, lon1, lat2, lon2, result)
+                        }
+
+                        val distance: Float = result[0]
+                        distinctdata.get(index).distance = distance
+
+                    }
+
+                    val sortedDistance = distinctdata.sortedBy {
+                        it.distance
+                    }
+
+                    if (sortedDistance.isNotEmpty()) {
+                        for (i in 0..0) {
+                            smartLocationList.add(sortedDistance.get(i))
+                        }
+                    }
+
+                    smartLocationList.forEach {
+                        prefHelper.setSmartServerObject(it)
+                        Log.d("smartLocationList", "S:: server = ${it.server_name}")
+                    }
+
+                }
+
                 navHostController.popBackStack()
                 navHostController.navigate(Screen.BottomBarMainScreen.route)
             }

+ 60 - 8
app/src/main/java/com/vpn/fastestvpnservice/screens/SplashScreen.kt

@@ -3,8 +3,10 @@ package com.vpn.fastestvpnservice.screens
 import android.content.res.Configuration
 import android.graphics.fonts.Font
 import android.graphics.fonts.FontStyle
+import android.location.Location
 import android.provider.CalendarContract.Colors
 import android.text.Layout
+import android.util.Log
 import android.widget.Toast
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
@@ -109,14 +111,64 @@ fun Splash(navHostController: NavHostController) {
             ServerListViewModel(context = context)
         }
 
-//        val allServers: ArrayList<Server> = ArrayList<Server>()
-//        basePreferenceHelper.getServerData().let {
-//            it.forEachIndexed { index, serverData ->
-//                serverData.servers?.forEachIndexed { indexes, server ->
-//                    allServers.add(indexes, server)
-//                }
-//            }
-//        }
+        val smartLocationList: MutableList<Server> = ArrayList<Server>()
+
+        basePreferenceHelper.getServerData().get(0).servers?.let {
+            val serverDataLocation = it
+
+            val distinctdatanotnull =
+                serverDataLocation.filter {   // servers's lt and lt not be null
+                    it.lt != null && it.lg != null
+                }
+
+            val distinctdata =
+                distinctdatanotnull.distinctBy { // servers's lt filter, no same lt of a server
+                    it.lt
+                }
+
+            val result = FloatArray(1)
+            val ipinfo = basePreferenceHelper.getIpinfo()
+
+            distinctdata.forEachIndexed { index, server ->
+                val lat1 = ipinfo?.latitute
+                val lon1 = ipinfo?.longitude
+                val lat2 = server.lt
+                val lon2 = server.lg
+
+                if (lat1 != null && lat2 != null && lon1 != null && lon2 != null) {
+                    Location.distanceBetween(lat1, lon1, lat2, lon2, result)
+                }
+
+                val distance: Float = result[0]
+                distinctdata.get(index).distance = distance
+
+            }
+
+            val sortedDistance = distinctdata.sortedBy {
+                it.distance
+            }
+
+            if (sortedDistance.isNotEmpty()) {
+                for (i in 0..0) {
+                    smartLocationList.add(sortedDistance.get(i))
+                }
+            }
+
+            smartLocationList.forEach {
+                basePreferenceHelper.setSmartServerObject(it)
+                Log.d("smartLocationList", "SS:: server = ${it.server_name}")
+            }
+
+        }
+
+        val allServers: ArrayList<Server> = ArrayList<Server>()
+        basePreferenceHelper.getServerData().let {
+            it.forEachIndexed { index, serverData ->
+                serverData.servers?.forEachIndexed { indexes, server ->
+                    allServers.add(indexes, server)
+                }
+            }
+        }
 
         val serverData = basePreferenceHelper.getServerData()
 

+ 70 - 12
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HomeScreen.kt

@@ -2,6 +2,7 @@ package com.vpn.fastestvpnservice.screens.bottomNavBarScreens
 
 import android.content.Context
 import android.content.res.Configuration
+import android.location.Location
 import android.os.Handler
 import android.util.Log
 import android.widget.Toast
@@ -100,6 +101,7 @@ import com.vpn.fastestvpnservice.beans.Protocol
 import com.vpn.fastestvpnservice.beans.Server
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.constants.AppEnum
+import com.vpn.fastestvpnservice.constants.smartConnect
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.interfaces.ServerCallbacks
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
@@ -230,7 +232,7 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
     Log.d("isConnect_State", "live: $isConnect")
     isConnect = basePreferenceHelper.getConnectState()
     Log.d("isConnect_State", "$isConnect prefs => ${basePreferenceHelper.getConnectState()}")
-
+    
     OnLifecycleEvent{owner, event ->
         when(event) {
             Lifecycle.Event.ON_RESUME -> {
@@ -323,6 +325,8 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
             "android",
             android.os.Build.VERSION.RELEASE
         )
+
+
     }
 
     Box(
@@ -641,14 +645,36 @@ fun Home(navHostController: NavHostController, activity: ComponentActivity) {
                             ),
 //            contentAlignment = Alignment.TopCenter,
                     ) {
-                        AddRowSmart(navHostController)
+                        AddRowSmart(navHostController, basePreferenceHelper, context)
+                        var smartServer = basePreferenceHelper.getSmartServerObject()
+                        val selectedSmartList = basePreferenceHelper.getSmartList()
+                        when(selectedSmartList) {
+                            smartConnect[0] -> {
+                                smartServer = basePreferenceHelper.getSmartServerObject()
+                            }
+                            smartConnect[1] -> {
+                                smartServer = basePreferenceHelper.getServerObject()
+                            }
+                            smartConnect[2] -> {}
+                            else -> {}
+                        }
                         Button(
                             onClick = {
-                                Log.d("test_button", "onClick Smart Connect")
-                                navHostController.navigate(
-                                    BottomBarScreen.Settings.route
-                                )
-                                BottomBarScreen.Settings.isTrue = true
+                                Log.d("test_button", "onClick Smart Connect ${smartServer?.server_name}")
+                                basePreferenceHelper.setServerObject(smartServer)
+                                if (isConnect == App.CONNECTED || isConnect == App.CONNECTING) {
+                                    Log.d("isConnect_State_vpn", "stopVPN")
+                                    vpnConnectionsUtil.stopVpn()
+                                    homeViewModel.getIp()
+                                } else {
+                                    Log.d("isConnect_State_vpn", "startVPN")
+                                    vpnConnectionsUtil.startVpn()
+                                }
+
+//                                navHostController.navigate(
+//                                    BottomBarScreen.Settings.route
+//                                )
+//                                BottomBarScreen.Settings.isTrue = true
 
                             },
                             modifier = Modifier
@@ -1001,7 +1027,33 @@ fun ColumnScope.ColumnText(
 }
 
 @Composable
-fun BoxScope.AddRowSmart(navHostController: NavHostController) {
+fun BoxScope.AddRowSmart(
+    navHostController: NavHostController,
+    basePreferenceHelper: BasePreferenceHelper,
+    context: Context
+) {
+    val smart = basePreferenceHelper.getSmartServerObject()
+    val recently = basePreferenceHelper.getServerObject()
+    val ipInfo = basePreferenceHelper.getIpinfo()
+    val selectedSmartList = basePreferenceHelper.getSmartList()
+    var selectedServer = basePreferenceHelper.getServerObject()
+    
+    Log.d("smartLocationList", "Home:: server = ${smart?.server_name}")
+    var icon = Utils.getDrawable(context, selectedServer?.iso)
+
+    when(selectedSmartList) {
+        smartConnect[0] -> {
+            icon = Utils.getDrawable(context, smart?.iso)
+            selectedServer = smart
+        }
+        smartConnect[1] -> {
+            icon = Utils.getDrawable(context, recently?.iso)
+            selectedServer = recently
+        }
+        smartConnect[2] -> {}
+        else -> {}
+    }
+    
     Row(
         modifier = Modifier
             .fillMaxWidth()
@@ -1015,13 +1067,19 @@ fun BoxScope.AddRowSmart(navHostController: NavHostController) {
             modifier = Modifier.padding(start = 0.dp),
             color = Color.Transparent
         ) {
-            Image(
-                painter = painterResource(id = R.drawable.dubai3x),
+            Icon(
+                painter = painterResource(id = icon),
                 contentDescription = "Country Logo",
+                tint = Color.Unspecified,
                 modifier = Modifier
                     .padding(start = 0.dp)
                     .size(40.dp)
                     .weight(1f)
+                    .clip(CircleShape)
+                    .paint(
+                        painter = painterResource(id = icon),
+                        contentScale = ContentScale.FillHeight
+                    )
             )
         }
         Column(
@@ -1029,13 +1087,13 @@ fun BoxScope.AddRowSmart(navHostController: NavHostController) {
                 .padding(start = 12.dp)
         ) {
             ColumnText(
-                text = "Fastest Location",
+                text = selectedSmartList,
                 color = colorResource(id = R.color.blue_text),
                 size = 12.sp,
                 style = MaterialTheme.typography.customTypography.headlineSmall
             )
             ColumnText(
-                text = "United Arab Emirates",
+                text = "${selectedServer?.server_name}",
                 color = colorResource(id = R.color.dark_blue_gray_text),
                 size = 16.sp,
                 style = MaterialTheme.typography.labelMedium

+ 5 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt

@@ -861,6 +861,11 @@ fun ColumnScope.AddRowSettingsSmart(
                                     onClick = {
                                         selectedSmartConnect = smart
                                         basePreferenceHelper.saveSmartList(smart)
+
+                                        if (smart == smartConnect[0]) {
+                                            Log.d("smartLocationList", "$smart")
+                                        }
+
                                         isSmartSheetOpen = false
                                     },
                                 )

+ 4 - 4
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/SplashViewModel.kt

@@ -59,10 +59,10 @@ class SplashViewModel constructor(context: Context): ViewModel() {
                             mutableLiveDataServerData.value = data
                             data.data?.let { preferenceHelper.saveServerData(it)
                             }
-//                            data.wireguard?.let {wg ->
-//                                preferenceHelper.saveWireGuard(wg)
-//                                Log.d("test_wg_data", "Splash:: ${wg.ip} ${wg.key}")
-//                            }
+                            data.wireguard?.let {wg ->
+                                preferenceHelper.saveWireGuard(wg)
+                                Log.d("test_wg_data", "Splash:: ${wg.ip} ${wg.key}")
+                            }
                             data.product?.let {
 //                            Log.d("test_api_response", it.productName.toString())
                                 preferenceHelper.saveProduct(it)