Files
amnezia-client/client/android/src/org/amnezia/vpn/VpnRequestActivity.kt
T

111 lines
3.9 KiB
Kotlin
Raw Normal View History

2023-11-24 21:51:09 +03:00
package org.amnezia.vpn
import android.app.AlertDialog
2023-11-24 21:51:09 +03:00
import android.app.KeyguardManager
import android.content.BroadcastReceiver
import android.content.Intent
import android.content.res.Configuration.UI_MODE_NIGHT_MASK
import android.content.res.Configuration.UI_MODE_NIGHT_YES
2023-11-24 21:51:09 +03:00
import android.net.VpnService
2024-06-18 20:46:21 +03:00
import android.os.Build
2023-11-24 21:51:09 +03:00
import android.os.Bundle
import android.provider.Settings
2023-11-24 21:51:09 +03:00
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import org.amnezia.vpn.util.Log
2023-11-24 21:51:09 +03:00
private const val TAG = "VpnRequestActivity"
2024-06-18 20:46:21 +03:00
const val EXTRA_PROTOCOL = "PROTOCOL"
2023-11-24 21:51:09 +03:00
class VpnRequestActivity : ComponentActivity() {
2024-06-18 20:46:21 +03:00
private var vpnProto: VpnProto? = null
2023-11-24 21:51:09 +03:00
private var userPresentReceiver: BroadcastReceiver? = null
private val requestLauncher =
registerForActivityResult(StartActivityForResult(), ::checkRequestResult)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
2024-01-20 16:40:12 +03:00
Log.d(TAG, "Start request activity")
2024-06-18 20:46:21 +03:00
vpnProto = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
intent.extras?.getSerializable(EXTRA_PROTOCOL, VpnProto::class.java)
} else {
@Suppress("DEPRECATION")
intent.extras?.getSerializable(EXTRA_PROTOCOL) as VpnProto
}
2023-11-24 21:51:09 +03:00
val requestIntent = VpnService.prepare(applicationContext)
if (requestIntent != null) {
if (getSystemService<KeyguardManager>()!!.isKeyguardLocked) {
2024-05-12 18:04:14 +03:00
userPresentReceiver = registerBroadcastReceiver(Intent.ACTION_USER_PRESENT) {
requestLauncher.launch(requestIntent)
2023-11-24 21:51:09 +03:00
}
} else {
requestLauncher.launch(requestIntent)
}
return
} else {
onPermissionGranted()
finish()
}
}
override fun onDestroy() {
2024-05-12 18:04:14 +03:00
unregisterBroadcastReceiver(userPresentReceiver)
userPresentReceiver = null
2023-11-24 21:51:09 +03:00
super.onDestroy()
}
private fun checkRequestResult(result: ActivityResult) {
when (val resultCode = result.resultCode) {
RESULT_OK -> {
onPermissionGranted()
finish()
}
else -> {
Log.w(TAG, "Vpn permission denied, resultCode: $resultCode")
showOnVpnPermissionRejectDialog()
}
2023-11-24 21:51:09 +03:00
}
}
private fun onPermissionGranted() {
Toast.makeText(this, resources.getString(R.string.vpnGranted), Toast.LENGTH_LONG).show()
2024-06-18 20:46:21 +03:00
vpnProto?.let { proto ->
Intent(applicationContext, proto.serviceClass).apply {
putExtra(AFTER_PERMISSION_CHECK, true)
}.also {
ContextCompat.startForegroundService(this, it)
}
} ?: run {
Intent(this, AmneziaActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}.also {
startActivity(it)
}
2023-11-24 21:51:09 +03:00
}
}
private fun showOnVpnPermissionRejectDialog() {
AlertDialog.Builder(this, getDialogTheme())
.setTitle(R.string.vpnSetupFailed)
.setMessage(R.string.vpnSetupFailedMessage)
.setNegativeButton(R.string.ok) { _, _ -> }
.setPositiveButton(R.string.openVpnSettings) { _, _ ->
startActivity(Intent(Settings.ACTION_VPN_SETTINGS))
}
.setOnDismissListener { finish() }
.show()
}
private fun getDialogTheme(): Int =
if (resources.configuration.uiMode and UI_MODE_NIGHT_MASK == UI_MODE_NIGHT_YES)
android.R.style.Theme_DeviceDefault_Dialog_Alert
else
android.R.style.Theme_DeviceDefault_Light_Dialog_Alert
2023-11-24 21:51:09 +03:00
}