diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d16ef51..76e241c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ + diff --git a/app/src/main/java/ru/officialdakari/fmd/LockActivity.kt b/app/src/main/java/ru/officialdakari/fmd/LockActivity.kt index 14aef5f..d33afc1 100644 --- a/app/src/main/java/ru/officialdakari/fmd/LockActivity.kt +++ b/app/src/main/java/ru/officialdakari/fmd/LockActivity.kt @@ -1,5 +1,10 @@ package ru.officialdakari.fmd +import android.Manifest +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri import android.os.Bundle import android.view.WindowManager import androidx.activity.ComponentActivity @@ -9,6 +14,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -16,8 +22,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em +import androidx.core.app.ActivityCompat +import androidx.core.net.toUri import ru.officialdakari.fmd.ui.theme.FindMyDeviceTheme + class LockActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -28,7 +37,7 @@ class LockActivity : ComponentActivity() { setContent { FindMyDeviceTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - LockMessageScreen(Modifier.padding(innerPadding)) + LockMessageScreen(this@LockActivity, Modifier.padding(innerPadding)) } } } @@ -36,7 +45,7 @@ class LockActivity : ComponentActivity() { } @Composable -fun LockMessageScreen(modifier: Modifier) { +fun LockMessageScreen(context: Context, modifier: Modifier) { Column( modifier = modifier .fillMaxSize() @@ -51,5 +60,23 @@ fun LockMessageScreen(modifier: Modifier) { Text( text = Utils.lockMessage ) + + if (Utils.lockPhoneNum != null) { + Button( + onClick = { + val callIntent = Intent(Intent.ACTION_CALL) + callIntent.setData("tel:${Utils.lockPhoneNum}".toUri()) + if (ActivityCompat.checkSelfPermission( + context, + Manifest.permission.CALL_PHONE + ) == PackageManager.PERMISSION_GRANTED + ) { + context.startActivity(callIntent) + } + } + ) { + Text("Call ${Utils.lockPhoneNum}") + } + } } } \ No newline at end of file diff --git a/app/src/main/java/ru/officialdakari/fmd/PermissionsActivity.kt b/app/src/main/java/ru/officialdakari/fmd/PermissionsActivity.kt index 78ae3b6..253cd8c 100644 --- a/app/src/main/java/ru/officialdakari/fmd/PermissionsActivity.kt +++ b/app/src/main/java/ru/officialdakari/fmd/PermissionsActivity.kt @@ -60,6 +60,10 @@ class PermissionsActivity : ComponentActivity() { && ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED } + internal fun isCallPermissionGranted(): Boolean { + return ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED + } + internal fun isNotificationPermissionGranted(): Boolean { return ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED } @@ -135,20 +139,28 @@ class PermissionsActivity : ComponentActivity() { if (!isOverlaysGranted()) { val intent = Intent( Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - "package:ru.officialdakari.fmd".toUri() + "package:${packageName}".toUri() ) startActivityForResult(intent, REQUEST_OVERLAYS_PERMISSION) } checkPermissionsGranted() } + internal fun requestCallPermission() { + if (!isCallPermissionGranted()) { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), REQUEST_CALLS_PERMISSION) + } + checkPermissionsGranted() + } + internal fun checkPermissionsGranted() { if (isSmsPermissionGranted() && isNotificationAccessGranted() && isDeviceAdminGranted() && isLocationAccessGranted() && isNotificationPermissionGranted() - && isOverlaysGranted()) { + && isOverlaysGranted() + && isCallPermissionGranted()) { moveToMainActivity() } } @@ -162,6 +174,7 @@ fun PermissionsScreen(modifier: Modifier = Modifier, context: Context) { var locationAccessGranted by remember { mutableStateOf(false) } var notificationPermissionGranted by remember { mutableStateOf(false) } var overlaysGranted by remember { mutableStateOf(false) } + var callsGranted by remember { mutableStateOf(false) } var ctx = context as PermissionsActivity @@ -172,6 +185,7 @@ fun PermissionsScreen(modifier: Modifier = Modifier, context: Context) { locationAccessGranted = context.isLocationAccessGranted() notificationPermissionGranted = context.isNotificationPermissionGranted() overlaysGranted = context.isOverlaysGranted() + callsGranted = context.isCallPermissionGranted() Log.w("FMD", "SMS state: $smsPermissionGranted | Notification State: $notificationAccessGranted | Device Admin State: $deviceAdminGranted"); @@ -187,6 +201,13 @@ fun PermissionsScreen(modifier: Modifier = Modifier, context: Context) { ) { Text(text = "FindMyDevice needs permissions below to function correctly.") + Button( + onClick = { context.requestCallPermission() }, + enabled = !callsGranted + ) { + Text(text = "Request calls") + } + Button( onClick = { context.requestOverlays() }, enabled = !overlaysGranted @@ -244,4 +265,5 @@ private const val REQUEST_SMS_PERMISSION = 1001 private const val REQUEST_LOCATION_PERMISSION = 1002 private const val REQUEST_NOTIFICATION_PERMISSION = 1003 private const val REQUEST_OVERLAYS_PERMISSION = 1004 -private const val REQUEST_BG_LOCATION_PERMISSION = 1005 \ No newline at end of file +private const val REQUEST_BG_LOCATION_PERMISSION = 1005 +private const val REQUEST_CALLS_PERMISSION = 1006 \ No newline at end of file diff --git a/app/src/main/java/ru/officialdakari/fmd/Utils.kt b/app/src/main/java/ru/officialdakari/fmd/Utils.kt index a1cc357..0e85dd7 100644 --- a/app/src/main/java/ru/officialdakari/fmd/Utils.kt +++ b/app/src/main/java/ru/officialdakari/fmd/Utils.kt @@ -21,6 +21,7 @@ import kotlin.random.Random class Utils { companion object { var lockMessage: String = "Locked by FMD"; + var lockPhoneNum: String = ""; fun lockDevice(context: Context) { val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager diff --git a/app/src/main/java/ru/officialdakari/fmd/services/WebSocketService.kt b/app/src/main/java/ru/officialdakari/fmd/services/WebSocketService.kt index 34d8ad5..7e899b5 100644 --- a/app/src/main/java/ru/officialdakari/fmd/services/WebSocketService.kt +++ b/app/src/main/java/ru/officialdakari/fmd/services/WebSocketService.kt @@ -66,7 +66,8 @@ class WebSocketService: Service() { ring(context) }.on("lock") { val message = it[0] as String - lock(context, message) + val phoneNum = it[1] as String + lock(context, message, phoneNum) }.on("locate") { loc.getLocation({ mSocket!!.emit("location", it.latitude, it.longitude) @@ -86,8 +87,9 @@ class WebSocketService: Service() { } } - private fun lock(context: Context, message: String) { + private fun lock(context: Context, message: String, phoneNum: String) { if (lockIntent != null) { + Utils.lockPhoneNum = phoneNum Utils.lockMessage = message Utils.lockDevice(context) Utils.sleep(1000) {