浏览代码

Worked on launch app on startup android, for below android 10 it is working normally and after android 10 version user had toenable permission of Screen Overlay Permission

Khubaib 11 月之前
父节点
当前提交
39499ea864

+ 2 - 2
.idea/deploymentTargetSelector.xml

@@ -4,10 +4,10 @@
     <selectionStates>
     <selectionStates>
       <SelectionState runConfigName="app">
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2024-08-09T10:30:45.536311501Z">
+        <DropdownSelection timestamp="2024-08-14T11:35:20.287161627Z">
           <Target type="DEFAULT_BOOT">
           <Target type="DEFAULT_BOOT">
             <handle>
             <handle>
-              <DeviceId pluginId="LocalEmulator" identifier="path=/home/ubuntu/.android/avd/Television_1080p_API_31.avd" />
+              <DeviceId pluginId="LocalEmulator" identifier="path=/home/ubuntu/.android/avd/Small_Phone_API_27.avd" />
             </handle>
             </handle>
           </Target>
           </Target>
         </DropdownSelection>
         </DropdownSelection>

+ 22 - 2
app/src/main/AndroidManifest.xml

@@ -1,6 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools">
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.vpn.fastestvpnservice"
+    >
 
 
     <uses-feature
     <uses-feature
         android:name="android.software.leanback"
         android:name="android.software.leanback"
@@ -27,6 +30,10 @@
     <uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
     <uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
     <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
     <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove"/>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION" />
+
     <application
     <application
         android:name="de.blinkt.openvpn.core.App"
         android:name="de.blinkt.openvpn.core.App"
         android:allowBackup="false"
         android:allowBackup="false"
@@ -165,6 +172,19 @@
                 android:resource="@xml/simple_app_widget_info" />
                 android:resource="@xml/simple_app_widget_info" />
         </receiver>
         </receiver>
 
 
+        <receiver
+            android:name=".broadcasts.Device_Boot_Receiver"
+            android:exported="true"
+            android:enabled="true"
+            >
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+                <action android:name="android.intent.action.REBOOT" />
+                <action android:name="android.intent.action..QUICKBOOT_POWERON" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </receiver>
+
         <service
         <service
             android:name=".utils.WireGuardService"
             android:name=".utils.WireGuardService"
             android:enabled="true"
             android:enabled="true"

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

@@ -10,6 +10,7 @@ import android.net.Uri
 import android.os.Build
 import android.os.Build
 import android.os.Bundle
 import android.os.Bundle
 import android.os.LocaleList
 import android.os.LocaleList
+import android.provider.Settings
 import android.util.Log
 import android.util.Log
 import android.view.WindowInsets
 import android.view.WindowInsets
 import android.view.WindowInsetsController
 import android.view.WindowInsetsController
@@ -87,6 +88,12 @@ 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 {

+ 33 - 0
app/src/main/java/com/vpn/fastestvpnservice/broadcasts/Device_Boot_Receiver.java

@@ -0,0 +1,33 @@
+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 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");
+        }
+    }
+}

+ 71 - 56
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/SettingsScreen.kt

@@ -2,6 +2,7 @@ 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.os.Build
 import android.os.Build
@@ -9,7 +10,6 @@ import android.os.Bundle
 import android.os.Handler
 import android.os.Handler
 import android.os.LocaleList
 import android.os.LocaleList
 import android.util.Log
 import android.util.Log
-import android.widget.Toast
 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
@@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.ColumnScope
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.height
@@ -53,7 +52,6 @@ import androidx.compose.material3.rememberModalBottomSheetState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.mutableStateOf
@@ -99,9 +97,7 @@ import com.vpn.fastestvpnservice.screens.serverListViewModelSplash
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
 import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
 import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
-import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
-import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import de.blinkt.openvpn.core.App
 import de.blinkt.openvpn.core.App
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
@@ -114,10 +110,11 @@ fun Settings(navHostController: NavHostController) {
     CompositionLocalProvider(
     CompositionLocalProvider(
         LocalOverscrollConfiguration provides null
         LocalOverscrollConfiguration provides null
     ) {
     ) {
-        Box(modifier = Modifier
-            .background(MaterialTheme.colorScheme.background)
-            .fillMaxSize()
-            .padding(vertical = 10.dp),
+        Box(
+            modifier = Modifier
+                .background(MaterialTheme.colorScheme.background)
+                .fillMaxSize()
+                .padding(vertical = 10.dp),
         ) {
         ) {
             val view = LocalView.current
             val view = LocalView.current
             val window = (view.context as Activity).window
             val window = (view.context as Activity).window
@@ -289,7 +286,8 @@ fun ColumnScope.AddRowSwitch(icon: Int, text: String) {
                         Handler().postDelayed(Runnable {
                         Handler().postDelayed(Runnable {
                             vpnConnectionsUtil.startVpn()
                             vpnConnectionsUtil.startVpn()
                         }, 500)
                         }, 500)
-                    }                },
+                    }
+                },
                 modifier = Modifier.scale(0.8F),
                 modifier = Modifier.scale(0.8F),
                 colors = SwitchDefaults.colors(
                 colors = SwitchDefaults.colors(
                     checkedThumbColor = Color.White,
                     checkedThumbColor = Color.White,
@@ -448,7 +446,8 @@ fun ColumnScope.AddRowSettingsColumn(
                         .weight(1f)
                         .weight(1f)
                 )
                 )
                 Spacer(modifier = Modifier.height(2.dp))
                 Spacer(modifier = Modifier.height(2.dp))
-                Text(text = selectedProtocol,
+                Text(
+                    text = selectedProtocol,
                     style = MaterialTheme.typography.headlineSmall.copy(
                     style = MaterialTheme.typography.headlineSmall.copy(
                         fontSize = if (isTablet) 14.sp else 12.sp
                         fontSize = if (isTablet) 14.sp else 12.sp
                     ),
                     ),
@@ -489,12 +488,13 @@ fun ColumnScope.AddRowSettingsColumn(
                 sheetState = sheetState,
                 sheetState = sheetState,
                 containerColor = MaterialTheme.colorScheme.onBackground
                 containerColor = MaterialTheme.colorScheme.onBackground
             ) {
             ) {
-                Box(modifier = Modifier
-                    .background(Color.Transparent)
-                    .fillMaxWidth()
-                    .height(340.dp)
-                    .padding(start = 0.dp, top = 5.dp),
-                    ) {
+                Box(
+                    modifier = Modifier
+                        .background(Color.Transparent)
+                        .fillMaxWidth()
+                        .height(340.dp)
+                        .padding(start = 0.dp, top = 5.dp),
+                ) {
                     Column(
                     Column(
                         verticalArrangement = Arrangement.Top,
                         verticalArrangement = Arrangement.Top,
                         horizontalAlignment = Alignment.Start
                         horizontalAlignment = Alignment.Start
@@ -542,7 +542,8 @@ fun ColumnScope.AddRowSettingsColumn(
                                     },
                                     },
                                     colors = RadioButtonDefaults.colors(
                                     colors = RadioButtonDefaults.colors(
                                         selectedColor = colorResource(id = R.color.radio_button_blue),
                                         selectedColor = colorResource(id = R.color.radio_button_blue),
-                                        unselectedColor = colorResource(id = R.color.gray_icon),)
+                                        unselectedColor = colorResource(id = R.color.gray_icon),
+                                    )
                                     )
                                     )
                                 Text(text = protocol,
                                 Text(text = protocol,
                                     modifier = Modifier.padding(start = 12.dp),
                                     modifier = Modifier.padding(start = 12.dp),
@@ -692,11 +693,12 @@ fun AddRowDarkLightTheme(
             sheetState = sheetState,
             sheetState = sheetState,
             containerColor = MaterialTheme.colorScheme.onBackground
             containerColor = MaterialTheme.colorScheme.onBackground
         ) {
         ) {
-            Box(modifier = Modifier
-                .background(Color.Transparent)
-                .fillMaxWidth()
-                .height(250.dp)
-                .padding(start = 0.dp, top = 10.dp),
+            Box(
+                modifier = Modifier
+                    .background(Color.Transparent)
+                    .fillMaxWidth()
+                    .height(250.dp)
+                    .padding(start = 0.dp, top = 10.dp),
             ) {
             ) {
 
 
                 Log.d("test_theme", "systemTheme -> $systemTheme")
                 Log.d("test_theme", "systemTheme -> $systemTheme")
@@ -765,7 +767,8 @@ fun AddRowDarkLightTheme(
                                 },
                                 },
                                 colors = RadioButtonDefaults.colors(
                                 colors = RadioButtonDefaults.colors(
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
-                                    unselectedColor = colorResource(id = R.color.gray_icon),)
+                                    unselectedColor = colorResource(id = R.color.gray_icon),
+                                )
                             )
                             )
                             Text(text = theme,
                             Text(text = theme,
                                 modifier = Modifier.padding(start = 12.dp),
                                 modifier = Modifier.padding(start = 12.dp),
@@ -866,11 +869,12 @@ fun SelectLanguage(
             sheetState = sheetState,
             sheetState = sheetState,
             containerColor = MaterialTheme.colorScheme.onBackground
             containerColor = MaterialTheme.colorScheme.onBackground
         ) {
         ) {
-            Box(modifier = Modifier
-                .background(Color.Transparent)
-                .fillMaxWidth()
-                .height(300.dp)
-                .padding(start = 0.dp, top = 10.dp),
+            Box(
+                modifier = Modifier
+                    .background(Color.Transparent)
+                    .fillMaxWidth()
+                    .height(300.dp)
+                    .padding(start = 0.dp, top = 10.dp),
             ) {
             ) {
                 Column(
                 Column(
                     verticalArrangement = Arrangement.Top,
                     verticalArrangement = Arrangement.Top,
@@ -894,22 +898,29 @@ fun SelectLanguage(
                                 .selectable(
                                 .selectable(
                                     selected = language == languages[0],
                                     selected = language == languages[0],
                                     onClick = {
                                     onClick = {
-                                      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
-                                          when (language.name) {
-                                              languages[0].name -> {
-                                                  context.getSystemService(LocaleManager::class.java).applicationLocales = LocaleList.forLanguageTags(language.code)
-                                              }
-                                              languages[1].name -> {
-                                                  context.getSystemService(LocaleManager::class.java).applicationLocales = LocaleList.forLanguageTags(language.code)
-                                              }
-                                              languages[2].name -> {
-                                                  context.getSystemService(LocaleManager::class.java).applicationLocales = LocaleList.forLanguageTags(language.code)
-                                              }
-                                              languages[3].name -> {
-                                                  context.getSystemService(LocaleManager::class.java).applicationLocales = LocaleList.forLanguageTags(language.code)
-                                              }
-                                          }
-                                      }
+                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+                                            when (language.name) {
+                                                languages[0].name -> {
+                                                    context.getSystemService(LocaleManager::class.java).applicationLocales =
+                                                        LocaleList.forLanguageTags(language.code)
+                                                }
+
+                                                languages[1].name -> {
+                                                    context.getSystemService(LocaleManager::class.java).applicationLocales =
+                                                        LocaleList.forLanguageTags(language.code)
+                                                }
+
+                                                languages[2].name -> {
+                                                    context.getSystemService(LocaleManager::class.java).applicationLocales =
+                                                        LocaleList.forLanguageTags(language.code)
+                                                }
+
+                                                languages[3].name -> {
+                                                    context.getSystemService(LocaleManager::class.java).applicationLocales =
+                                                        LocaleList.forLanguageTags(language.code)
+                                                }
+                                            }
+                                        }
                                         isLanguageSheetOpen = false
                                         isLanguageSheetOpen = false
                                     },
                                     },
                                 )
                                 )
@@ -942,7 +953,8 @@ fun SelectLanguage(
                                 },
                                 },
                                 colors = RadioButtonDefaults.colors(
                                 colors = RadioButtonDefaults.colors(
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
-                                    unselectedColor = colorResource(id = R.color.gray_icon),)
+                                    unselectedColor = colorResource(id = R.color.gray_icon),
+                                )
                             )
                             )
                             Text(text = language.name,
                             Text(text = language.name,
                                 modifier = Modifier.padding(start = 12.dp),
                                 modifier = Modifier.padding(start = 12.dp),
@@ -1050,11 +1062,12 @@ fun ColumnScope.AddRowSettingsSmart(
             sheetState = sheetState,
             sheetState = sheetState,
             containerColor = MaterialTheme.colorScheme.onBackground
             containerColor = MaterialTheme.colorScheme.onBackground
         ) {
         ) {
-            Box(modifier = Modifier
-                .background(Color.Transparent)
-                .fillMaxWidth()
-                .height(250.dp)
-                .padding(start = 0.dp, top = 10.dp),
+            Box(
+                modifier = Modifier
+                    .background(Color.Transparent)
+                    .fillMaxWidth()
+                    .height(250.dp)
+                    .padding(start = 0.dp, top = 10.dp),
             ) {
             ) {
                 val selectedSmartList = basePreferenceHelper.getSmartList()
                 val selectedSmartList = basePreferenceHelper.getSmartList()
                 val smartServer = basePreferenceHelper.getSmartServerObject() ?: basePreferenceHelper.getRecommendedServerObject()
                 val smartServer = basePreferenceHelper.getSmartServerObject() ?: basePreferenceHelper.getRecommendedServerObject()
@@ -1112,7 +1125,8 @@ fun ColumnScope.AddRowSettingsSmart(
                                 },
                                 },
                                 colors = RadioButtonDefaults.colors(
                                 colors = RadioButtonDefaults.colors(
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
-                                    unselectedColor = colorResource(id = R.color.gray_icon),)
+                                    unselectedColor = colorResource(id = R.color.gray_icon),
+                                )
                             )
                             )
                             Column {
                             Column {
                                 Text(text = smart,
                                 Text(text = smart,
@@ -1161,12 +1175,13 @@ fun ColumnScope.AddRowSettingsSmart(
                 .padding(top = 15.dp)
                 .padding(top = 15.dp)
                 .fillMaxSize()
                 .fillMaxSize()
         ) {
         ) {
-            Box(modifier = Modifier
-                .background(Color.Transparent)
+            Box(
+                modifier = Modifier
+                    .background(Color.Transparent)
 //                .fillMaxWidth()
 //                .fillMaxWidth()
 //                .fillMaxHeight()
 //                .fillMaxHeight()
-                .padding(start = 0.dp, top = 10.dp)
-                .fillMaxSize(),
+                    .padding(start = 0.dp, top = 10.dp)
+                    .fillMaxSize(),
             ) {
             ) {
                 Column(
                 Column(
                     verticalArrangement = Arrangement.Top,
                     verticalArrangement = Arrangement.Top,