diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt index b2971311..a6d526c8 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt @@ -1,8 +1,14 @@ package com.hiddify.hiddify +import android.annotation.SuppressLint import android.content.Intent +import android.Manifest +import android.content.pm.PackageManager import android.net.VpnService +import android.os.Build import android.util.Log +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.lifecycle.MutableLiveData import androidx.lifecycle.lifecycleScope @@ -18,6 +24,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.LinkedList + class MainActivity : FlutterFragmentActivity(), ServiceConnection.Callback { companion object { private const val TAG = "ANDROID/MyActivity" @@ -52,7 +59,8 @@ class MainActivity : FlutterFragmentActivity(), ServiceConnection.Callback { fun startService() { if (!ServiceNotification.checkPermission()) { - Log.d(TAG, "missing notification permission") +// Log.d(TAG, "missing notification permission") + grantNotificationPermission() return } lifecycleScope.launch(Dispatchers.IO) { @@ -123,6 +131,29 @@ class MainActivity : FlutterFragmentActivity(), ServiceConnection.Callback { super.onDestroy() } + @SuppressLint("NewApi") + private fun grantNotificationPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.POST_NOTIFICATIONS), + NOTIFICATION_PERMISSION_REQUEST_CODE + ) + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + if (requestCode == NOTIFICATION_PERMISSION_REQUEST_CODE) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startService() + } else onServiceAlert(Alert.RequestNotificationPermission, null) + } + } + private suspend fun prepare() = withContext(Dispatchers.Main) { try { val intent = VpnService.prepare(this@MainActivity)