ソースを参照

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 8 ヶ月 前
コミット
39499ea864

+ 2 - 2
.idea/deploymentTargetSelector.xml

@@ -4,10 +4,10 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <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">
             <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>
           </Target>
         </DropdownSelection>

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

@@ -1,6 +1,9 @@
 <?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
         android:name="android.software.leanback"
@@ -27,6 +30,10 @@
     <uses-permission android:name="android.permission.UNINSTALL_SHORTCUT" />
     <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="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
         android:name="de.blinkt.openvpn.core.App"
         android:allowBackup="false"
@@ -165,6 +172,19 @@
                 android:resource="@xml/simple_app_widget_info" />
         </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
             android:name=".utils.WireGuardService"
             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.Bundle
 import android.os.LocaleList
+import android.provider.Settings
 import android.util.Log
 import android.view.WindowInsets
 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)
 
         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.LocaleManager
+import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
 import android.os.Build
@@ -9,7 +10,6 @@ import android.os.Bundle
 import android.os.Handler
 import android.os.LocaleList
 import android.util.Log
-import android.widget.Toast
 import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.Image
 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.Row
 import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
@@ -53,7 +52,6 @@ import androidx.compose.material3.rememberModalBottomSheetState
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.CompositionLocalProvider
 import androidx.compose.runtime.LaunchedEffect
-import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
 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.Screen
 import com.vpn.fastestvpnservice.viewmodels.HomeViewModel
-import com.vpn.fastestvpnservice.viewmodels.SearchListViewModel
 import com.vpn.fastestvpnservice.viewmodels.ServerListViewModel
-import com.vpn.fastestvpnservice.viewmodels.SplashViewModel
 import de.blinkt.openvpn.core.App
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
@@ -114,10 +110,11 @@ fun Settings(navHostController: NavHostController) {
     CompositionLocalProvider(
         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 window = (view.context as Activity).window
@@ -289,7 +286,8 @@ fun ColumnScope.AddRowSwitch(icon: Int, text: String) {
                         Handler().postDelayed(Runnable {
                             vpnConnectionsUtil.startVpn()
                         }, 500)
-                    }                },
+                    }
+                },
                 modifier = Modifier.scale(0.8F),
                 colors = SwitchDefaults.colors(
                     checkedThumbColor = Color.White,
@@ -448,7 +446,8 @@ fun ColumnScope.AddRowSettingsColumn(
                         .weight(1f)
                 )
                 Spacer(modifier = Modifier.height(2.dp))
-                Text(text = selectedProtocol,
+                Text(
+                    text = selectedProtocol,
                     style = MaterialTheme.typography.headlineSmall.copy(
                         fontSize = if (isTablet) 14.sp else 12.sp
                     ),
@@ -489,12 +488,13 @@ fun ColumnScope.AddRowSettingsColumn(
                 sheetState = sheetState,
                 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(
                         verticalArrangement = Arrangement.Top,
                         horizontalAlignment = Alignment.Start
@@ -542,7 +542,8 @@ fun ColumnScope.AddRowSettingsColumn(
                                     },
                                     colors = RadioButtonDefaults.colors(
                                         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,
                                     modifier = Modifier.padding(start = 12.dp),
@@ -692,11 +693,12 @@ fun AddRowDarkLightTheme(
             sheetState = sheetState,
             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")
@@ -765,7 +767,8 @@ fun AddRowDarkLightTheme(
                                 },
                                 colors = RadioButtonDefaults.colors(
                                     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,
                                 modifier = Modifier.padding(start = 12.dp),
@@ -866,11 +869,12 @@ fun SelectLanguage(
             sheetState = sheetState,
             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(
                     verticalArrangement = Arrangement.Top,
@@ -894,22 +898,29 @@ fun SelectLanguage(
                                 .selectable(
                                     selected = language == languages[0],
                                     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
                                     },
                                 )
@@ -942,7 +953,8 @@ fun SelectLanguage(
                                 },
                                 colors = RadioButtonDefaults.colors(
                                     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,
                                 modifier = Modifier.padding(start = 12.dp),
@@ -1050,11 +1062,12 @@ fun ColumnScope.AddRowSettingsSmart(
             sheetState = sheetState,
             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 smartServer = basePreferenceHelper.getSmartServerObject() ?: basePreferenceHelper.getRecommendedServerObject()
@@ -1112,7 +1125,8 @@ fun ColumnScope.AddRowSettingsSmart(
                                 },
                                 colors = RadioButtonDefaults.colors(
                                     selectedColor = colorResource(id = R.color.radio_button_blue),
-                                    unselectedColor = colorResource(id = R.color.gray_icon),)
+                                    unselectedColor = colorResource(id = R.color.gray_icon),
+                                )
                             )
                             Column {
                                 Text(text = smart,
@@ -1161,12 +1175,13 @@ fun ColumnScope.AddRowSettingsSmart(
                 .padding(top = 15.dp)
                 .fillMaxSize()
         ) {
-            Box(modifier = Modifier
-                .background(Color.Transparent)
+            Box(
+                modifier = Modifier
+                    .background(Color.Transparent)
 //                .fillMaxWidth()
 //                .fillMaxHeight()
-                .padding(start = 0.dp, top = 10.dp)
-                .fillMaxSize(),
+                    .padding(start = 0.dp, top = 10.dp)
+                    .fillMaxSize(),
             ) {
                 Column(
                     verticalArrangement = Arrangement.Top,