Browse Source

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 months ago
parent
commit
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,