Parcourir la source

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 il y a 8 mois
Parent
commit
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)
 
         setContent {

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

@@ -1,33 +1,27 @@
 package com.vpn.fastestvpnservice.broadcasts;
 
-import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.util.Log;
-import android.widget.Toast;
 
 import com.vpn.fastestvpnservice.MainActivity;
+import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper;
 
 import java.util.Objects;
 
-import de.blinkt.openvpn.core.App;
-
 public class Device_Boot_Receiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
-        Log.d("Device_Boot_Receiver", intent.getAction());
         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_RECENTLY_SERVERS)
         removePreference(context, KEY_FILENAME, KEY_FEEDBACK)
+        removePreference(context, KEY_FILENAME, KEY_LAUNCH)
     }
 
     fun clearServerObject() {
@@ -526,6 +527,14 @@ class BasePreferenceHelper(private val context: Context) : PreferencesHelper() {
         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) {
         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_RECENTLY_SERVERS = "keydata_recently_servers"
         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)
             }
             composable(route = BottomBarScreen.Settings.route) {
-                Settings(navHostController = navHostController)
+                Settings(navHostController = navHostController, activity)
             }
             composable(route = BottomBarScreen.Help.route) { entry ->
                 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.LocaleManager
-import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
+import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.os.Handler
 import android.os.LocaleList
+import android.provider.Settings
 import android.util.Log
+import android.widget.Toast
+import androidx.activity.ComponentActivity
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.Image
 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.filled.DarkMode
 import androidx.compose.material.icons.filled.Language
+import androidx.compose.material.icons.filled.RocketLaunch
 import androidx.compose.material3.DockedSearchBar
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Icon
@@ -104,7 +108,7 @@ import kotlinx.coroutines.launch
 
 @OptIn(ExperimentalFoundationApi::class)
 @Composable
-fun Settings(navHostController: NavHostController) {
+fun Settings(navHostController: NavHostController, activity: ComponentActivity) {
     val context = LocalContext.current
 
     CompositionLocalProvider(
@@ -201,6 +205,8 @@ fun Settings(navHostController: NavHostController) {
                     text = "Theme")
 
                 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
+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(
     icon: Int,
     text: String,
@@ -1294,5 +1379,5 @@ fun ColumnScope.AddTextSettings(
 @Preview
 @Composable
 fun SettingsPreview() {
-    Settings(rememberNavController())
+//    Settings(rememberNavController(), ComponentActivity())
 }