浏览代码

Created UI for launch on startup app android on settings screen and handle state of switch for launch, set condition on broadcast receiver if enabled then it should launch

Khubaib 10 月之前
父节点
当前提交
60532ee523

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

@@ -88,12 +88,6 @@ open class MainActivity : DockActivity(), ConnectivityReceiver.ConnectivityRecei
             }
             }
         }
         }
 
 
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !Settings.canDrawOverlays(this)) {
-            val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
-            intent.setData(Uri.parse("package:com.vpn.fastestvpnservice"))
-            startActivityForResult(intent, 12345)
-        }
-
         WindowCompat.setDecorFitsSystemWindows(window, false)
         WindowCompat.setDecorFitsSystemWindows(window, false)
 
 
         setContent {
         setContent {

+ 9 - 15
app/src/main/java/com/vpn/fastestvpnservice/broadcasts/Device_Boot_Receiver.java

@@ -1,33 +1,27 @@
 package com.vpn.fastestvpnservice.broadcasts;
 package com.vpn.fastestvpnservice.broadcasts;
 
 
-import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Context;
 import android.content.Intent;
 import android.content.Intent;
 import android.util.Log;
 import android.util.Log;
-import android.widget.Toast;
 
 
 import com.vpn.fastestvpnservice.MainActivity;
 import com.vpn.fastestvpnservice.MainActivity;
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper;
 
 
 import java.util.Objects;
 import java.util.Objects;
 
 
-import de.blinkt.openvpn.core.App;
-
 public class Device_Boot_Receiver extends BroadcastReceiver {
 public class Device_Boot_Receiver extends BroadcastReceiver {
     @Override
     @Override
     public void onReceive(Context context, Intent intent) {
     public void onReceive(Context context, Intent intent) {
-        Log.d("Device_Boot_Receiver", intent.getAction());
         if (Objects.equals(intent.getAction(), Intent.ACTION_BOOT_COMPLETED)) {
         if (Objects.equals(intent.getAction(), Intent.ACTION_BOOT_COMPLETED)) {
-            Log.d("Device_Boot_Receiver", "ACTION_BOOT_COMPLETED");
-            Intent intent1 = new Intent(context, MainActivity.class);
-//            Intent intent1 = App.getApplication().getApplicationContext().getPackageManager().getLaunchIntentForPackage("com.vpn.fastestvpnservice");
-
-            intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-//            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent1, PendingIntent.FLAG_IMMUTABLE);
-            context.startActivity(intent1);
-        }
-        else if (Objects.equals(intent.getAction(), Intent.ACTION_CAMERA_BUTTON)) {
-            Log.d("Device_Boot_Receiver", "ACTION_CAMERA_BUTTON");
+            BasePreferenceHelper basePreferenceHelper = new BasePreferenceHelper(context);
+            boolean isLaunchEnabled = basePreferenceHelper.getLaunchState();
+            Log.d("Device_Boot_Receiver", "ACTION_BOOT_COMPLETED: " + isLaunchEnabled);
+            if (isLaunchEnabled) {
+                Intent intent1 = new Intent(context, MainActivity.class);
+                intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                context.startActivity(intent1);
+            }
         }
         }
     }
     }
 }
 }

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

@@ -50,6 +50,7 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         removePreference(context, KEY_FILENAME, KEY_CONNECTED_SERVER)
         removePreference(context, KEY_FILENAME, KEY_CONNECTED_SERVER)
         removePreference(context, KEY_FILENAME, KEY_RECENTLY_SERVERS)
         removePreference(context, KEY_FILENAME, KEY_RECENTLY_SERVERS)
         removePreference(context, KEY_FILENAME, KEY_FEEDBACK)
         removePreference(context, KEY_FILENAME, KEY_FEEDBACK)
+        removePreference(context, KEY_FILENAME, KEY_LAUNCH)
     }
     }
 
 
     fun clearServerObject() {
     fun clearServerObject() {
@@ -526,6 +527,14 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         return getBooleanPreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH)
         return getBooleanPreference(context, KEY_FILENAME, KEY_ADBLOCK_SWITCH)
     }
     }
 
 
+    fun saveLaunchState(status: Boolean) {
+        putBooleanPreference(context, KEY_FILENAME, KEY_LAUNCH, status)
+    }
+
+    fun getLaunchState(): Boolean {
+        return getBooleanPreference(context, KEY_FILENAME, KEY_LAUNCH)
+    }
+
     fun saveFcmToken(token: String) {
     fun saveFcmToken(token: String) {
         putStringPreference(context, KEY_FILENAME, KEY_FCM, token)
         putStringPreference(context, KEY_FILENAME, KEY_FCM, token)
     }
     }
@@ -627,5 +636,6 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         private const val KEY_SUBSCRIPTION = "keydata_subscription"
         private const val KEY_SUBSCRIPTION = "keydata_subscription"
         private const val KEY_RECENTLY_SERVERS = "keydata_recently_servers"
         private const val KEY_RECENTLY_SERVERS = "keydata_recently_servers"
         private const val KEY_FEEDBACK = "key_feedback"
         private const val KEY_FEEDBACK = "key_feedback"
+        private const val KEY_LAUNCH = "key_launch"
     }
     }
 }
 }

+ 1 - 1
app/src/main/java/com/vpn/fastestvpnservice/navigation/BottomBarNavGraph.kt

@@ -63,7 +63,7 @@ fun BottomBarNavGraph(navHostController: NavHostController,
                 Home(navHostController = navHostController, activity, settingsNavHostController)
                 Home(navHostController = navHostController, activity, settingsNavHostController)
             }
             }
             composable(route = BottomBarScreen.Settings.route) {
             composable(route = BottomBarScreen.Settings.route) {
-                Settings(navHostController = navHostController)
+                Settings(navHostController = navHostController, activity)
             }
             }
             composable(route = BottomBarScreen.Help.route) { entry ->
             composable(route = BottomBarScreen.Help.route) { entry ->
                 Help(navHostController = navHostController)
                 Help(navHostController = navHostController)

+ 88 - 3
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt

@@ -2,14 +2,17 @@ package com.vpn.fastestvpnservice.screens.bottomNavBarScreens
 
 
 import android.app.Activity
 import android.app.Activity
 import android.app.LocaleManager
 import android.app.LocaleManager
-import android.app.PendingIntent
 import android.content.Context
 import android.content.Context
 import android.content.Intent
 import android.content.Intent
+import android.net.Uri
 import android.os.Build
 import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
 import android.os.Handler
 import android.os.Handler
 import android.os.LocaleList
 import android.os.LocaleList
+import android.provider.Settings
 import android.util.Log
 import android.util.Log
+import android.widget.Toast
+import androidx.activity.ComponentActivity
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.LocalOverscrollConfiguration
 import androidx.compose.foundation.LocalOverscrollConfiguration
@@ -35,6 +38,7 @@ import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.DarkMode
 import androidx.compose.material.icons.filled.DarkMode
 import androidx.compose.material.icons.filled.Language
 import androidx.compose.material.icons.filled.Language
+import androidx.compose.material.icons.filled.RocketLaunch
 import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
 import androidx.compose.material3.Icon
@@ -104,7 +108,7 @@ import kotlinx.coroutines.launch
 
 
 @OptIn(ExperimentalFoundationApi::class)
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
 @Composable
-fun Settings(navHostController: NavHostController) {
+fun Settings(navHostController: NavHostController, activity: ComponentActivity) {
     val context = LocalContext.current
     val context = LocalContext.current
 
 
     CompositionLocalProvider(
     CompositionLocalProvider(
@@ -201,6 +205,8 @@ fun Settings(navHostController: NavHostController) {
                     text = "Theme")
                     text = "Theme")
 
 
                 SelectLanguage(icon = Icons.Default.Language, text = "Language")
                 SelectLanguage(icon = Icons.Default.Language, text = "Language")
+                
+                AddRowLaunchSwitch(icon = Icons.Filled.RocketLaunch, text = "Launch On Startup", activity)
             }
             }
         }
         }
     }
     }
@@ -303,6 +309,85 @@ fun ColumnScope.AddRowSwitch(icon: Int, text: String) {
 }
 }
 
 
 @Composable
 @Composable
+fun ColumnScope.AddRowLaunchSwitch(icon: ImageVector, text: String, activity: ComponentActivity) {
+    val context = LocalContext.current
+    val basePreferenceHelper = BasePreferenceHelper(context)
+    Row(
+        modifier = Modifier
+            .fillMaxWidth()
+            .padding(top = 40.dp, end = 13.dp)
+            .background(Color.Transparent)
+            .height(30.dp),
+        horizontalArrangement = Arrangement.Start,
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+
+        Surface(
+            modifier = Modifier.padding(start = 0.dp),
+            color = Color.Transparent
+        ) {
+            Image(
+                imageVector = icon,
+                contentDescription = "Launch on startup",
+                modifier = Modifier
+                    .padding(start = 0.dp)
+                    .size(24.dp)
+                    .weight(1f),
+                colorFilter = ColorFilter.tint(
+                    MaterialTheme.colorScheme.primary)
+            )
+        }
+
+        Surface(
+            modifier = Modifier.padding(start = 0.dp),
+            color = Color.Transparent
+        ) {
+            Text(text = text,
+                style = MaterialTheme.typography.titleSmall,
+                color = MaterialTheme.colorScheme.primary,
+                maxLines = 1,
+                modifier = Modifier
+                    .padding(start = 18.dp, end = 0.dp)
+                    .weight(1f)
+            )
+        }
+        Spacer(modifier = Modifier.weight(1f))
+
+        Surface(
+            modifier = Modifier
+                .padding(start = 0.dp, end = 0.dp)
+                .align(Alignment.CenterVertically),
+            color = Color.Transparent
+        ) {
+            var isSwitch by remember { mutableStateOf(basePreferenceHelper.getLaunchState()) }
+            Switch(
+                checked = isSwitch,
+                onCheckedChange = {
+                    isSwitch = it
+                    basePreferenceHelper.saveLaunchState(isSwitch)
+                    if (isSwitch) {
+                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && !Settings.canDrawOverlays(context)) {
+                            val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
+                            intent.data = Uri.parse("package:${activity.packageName}")
+                            activity.startActivityForResult(intent, 12345)
+                        }
+                    }
+                },
+                modifier = Modifier.scale(0.8F),
+                colors = SwitchDefaults.colors(
+                    checkedThumbColor = Color.White,
+                    checkedTrackColor = MaterialTheme.colorScheme.surfaceContainerLowest,
+                    uncheckedThumbColor = MaterialTheme.colorScheme.onSecondaryContainer,
+                    uncheckedTrackColor = MaterialTheme.colorScheme.surfaceContainerHighest,
+                    uncheckedBorderColor = MaterialTheme.colorScheme.surfaceContainerHighest
+                ),
+                thumbContent = {}
+            )
+        }
+    }
+}
+
+@Composable
 fun ColumnScope.AddRowSettings(
 fun ColumnScope.AddRowSettings(
     icon: Int,
     icon: Int,
     text: String,
     text: String,
@@ -1294,5 +1379,5 @@ fun ColumnScope.AddTextSettings(
 @Preview
 @Preview
 @Composable
 @Composable
 fun SettingsPreview() {
 fun SettingsPreview() {
-    Settings(rememberNavController())
+//    Settings(rememberNavController(), ComponentActivity())
 }
 }