add call button on locked

This commit is contained in:
OfficialDakari 2025-06-03 13:46:44 +05:00
parent 5cf048bbd5
commit 030ecf8221
5 changed files with 60 additions and 7 deletions

View File

@ -19,6 +19,7 @@
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

View File

@ -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}")
}
}
}
}

View File

@ -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
private const val REQUEST_BG_LOCATION_PERMISSION = 1005
private const val REQUEST_CALLS_PERMISSION = 1006

View File

@ -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

View File

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