소스 검색

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 1 년 전
부모
커밋
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())
 }