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) {