add call button on locked
This commit is contained in:
parent
5cf048bbd5
commit
030ecf8221
|
|
@ -19,6 +19,7 @@
|
||||||
<uses-permission android:name="android.permission.SEND_SMS" />
|
<uses-permission android:name="android.permission.SEND_SMS" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
||||||
<uses-permission android:name="android.permission.READ_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_FINE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
package ru.officialdakari.fmd
|
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.os.Bundle
|
||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import androidx.activity.ComponentActivity
|
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.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Button
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.Scaffold
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
|
@ -16,8 +22,11 @@ import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.compose.ui.unit.em
|
import androidx.compose.ui.unit.em
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
|
import androidx.core.net.toUri
|
||||||
import ru.officialdakari.fmd.ui.theme.FindMyDeviceTheme
|
import ru.officialdakari.fmd.ui.theme.FindMyDeviceTheme
|
||||||
|
|
||||||
|
|
||||||
class LockActivity : ComponentActivity() {
|
class LockActivity : ComponentActivity() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
@ -28,7 +37,7 @@ class LockActivity : ComponentActivity() {
|
||||||
setContent {
|
setContent {
|
||||||
FindMyDeviceTheme {
|
FindMyDeviceTheme {
|
||||||
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
||||||
LockMessageScreen(Modifier.padding(innerPadding))
|
LockMessageScreen(this@LockActivity, Modifier.padding(innerPadding))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -36,7 +45,7 @@ class LockActivity : ComponentActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LockMessageScreen(modifier: Modifier) {
|
fun LockMessageScreen(context: Context, modifier: Modifier) {
|
||||||
Column(
|
Column(
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
|
|
@ -51,5 +60,23 @@ fun LockMessageScreen(modifier: Modifier) {
|
||||||
Text(
|
Text(
|
||||||
text = Utils.lockMessage
|
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}")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -60,6 +60,10 @@ class PermissionsActivity : ComponentActivity() {
|
||||||
&& ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) == PackageManager.PERMISSION_GRANTED
|
&& 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 {
|
internal fun isNotificationPermissionGranted(): Boolean {
|
||||||
return ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
|
return ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED
|
||||||
}
|
}
|
||||||
|
|
@ -135,20 +139,28 @@ class PermissionsActivity : ComponentActivity() {
|
||||||
if (!isOverlaysGranted()) {
|
if (!isOverlaysGranted()) {
|
||||||
val intent = Intent(
|
val intent = Intent(
|
||||||
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||||
"package:ru.officialdakari.fmd".toUri()
|
"package:${packageName}".toUri()
|
||||||
)
|
)
|
||||||
startActivityForResult(intent, REQUEST_OVERLAYS_PERMISSION)
|
startActivityForResult(intent, REQUEST_OVERLAYS_PERMISSION)
|
||||||
}
|
}
|
||||||
checkPermissionsGranted()
|
checkPermissionsGranted()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun requestCallPermission() {
|
||||||
|
if (!isCallPermissionGranted()) {
|
||||||
|
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), REQUEST_CALLS_PERMISSION)
|
||||||
|
}
|
||||||
|
checkPermissionsGranted()
|
||||||
|
}
|
||||||
|
|
||||||
internal fun checkPermissionsGranted() {
|
internal fun checkPermissionsGranted() {
|
||||||
if (isSmsPermissionGranted()
|
if (isSmsPermissionGranted()
|
||||||
&& isNotificationAccessGranted()
|
&& isNotificationAccessGranted()
|
||||||
&& isDeviceAdminGranted()
|
&& isDeviceAdminGranted()
|
||||||
&& isLocationAccessGranted()
|
&& isLocationAccessGranted()
|
||||||
&& isNotificationPermissionGranted()
|
&& isNotificationPermissionGranted()
|
||||||
&& isOverlaysGranted()) {
|
&& isOverlaysGranted()
|
||||||
|
&& isCallPermissionGranted()) {
|
||||||
moveToMainActivity()
|
moveToMainActivity()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -162,6 +174,7 @@ fun PermissionsScreen(modifier: Modifier = Modifier, context: Context) {
|
||||||
var locationAccessGranted by remember { mutableStateOf(false) }
|
var locationAccessGranted by remember { mutableStateOf(false) }
|
||||||
var notificationPermissionGranted by remember { mutableStateOf(false) }
|
var notificationPermissionGranted by remember { mutableStateOf(false) }
|
||||||
var overlaysGranted by remember { mutableStateOf(false) }
|
var overlaysGranted by remember { mutableStateOf(false) }
|
||||||
|
var callsGranted by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
var ctx = context as PermissionsActivity
|
var ctx = context as PermissionsActivity
|
||||||
|
|
||||||
|
|
@ -172,6 +185,7 @@ fun PermissionsScreen(modifier: Modifier = Modifier, context: Context) {
|
||||||
locationAccessGranted = context.isLocationAccessGranted()
|
locationAccessGranted = context.isLocationAccessGranted()
|
||||||
notificationPermissionGranted = context.isNotificationPermissionGranted()
|
notificationPermissionGranted = context.isNotificationPermissionGranted()
|
||||||
overlaysGranted = context.isOverlaysGranted()
|
overlaysGranted = context.isOverlaysGranted()
|
||||||
|
callsGranted = context.isCallPermissionGranted()
|
||||||
|
|
||||||
Log.w("FMD", "SMS state: $smsPermissionGranted | Notification State: $notificationAccessGranted | Device Admin State: $deviceAdminGranted");
|
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.")
|
Text(text = "FindMyDevice needs permissions below to function correctly.")
|
||||||
|
|
||||||
|
Button(
|
||||||
|
onClick = { context.requestCallPermission() },
|
||||||
|
enabled = !callsGranted
|
||||||
|
) {
|
||||||
|
Text(text = "Request calls")
|
||||||
|
}
|
||||||
|
|
||||||
Button(
|
Button(
|
||||||
onClick = { context.requestOverlays() },
|
onClick = { context.requestOverlays() },
|
||||||
enabled = !overlaysGranted
|
enabled = !overlaysGranted
|
||||||
|
|
@ -244,4 +265,5 @@ private const val REQUEST_SMS_PERMISSION = 1001
|
||||||
private const val REQUEST_LOCATION_PERMISSION = 1002
|
private const val REQUEST_LOCATION_PERMISSION = 1002
|
||||||
private const val REQUEST_NOTIFICATION_PERMISSION = 1003
|
private const val REQUEST_NOTIFICATION_PERMISSION = 1003
|
||||||
private const val REQUEST_OVERLAYS_PERMISSION = 1004
|
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
|
||||||
|
|
@ -21,6 +21,7 @@ import kotlin.random.Random
|
||||||
class Utils {
|
class Utils {
|
||||||
companion object {
|
companion object {
|
||||||
var lockMessage: String = "Locked by FMD";
|
var lockMessage: String = "Locked by FMD";
|
||||||
|
var lockPhoneNum: String = "";
|
||||||
|
|
||||||
fun lockDevice(context: Context) {
|
fun lockDevice(context: Context) {
|
||||||
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,8 @@ class WebSocketService: Service() {
|
||||||
ring(context)
|
ring(context)
|
||||||
}.on("lock") {
|
}.on("lock") {
|
||||||
val message = it[0] as String
|
val message = it[0] as String
|
||||||
lock(context, message)
|
val phoneNum = it[1] as String
|
||||||
|
lock(context, message, phoneNum)
|
||||||
}.on("locate") {
|
}.on("locate") {
|
||||||
loc.getLocation({
|
loc.getLocation({
|
||||||
mSocket!!.emit("location", it.latitude, it.longitude)
|
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) {
|
if (lockIntent != null) {
|
||||||
|
Utils.lockPhoneNum = phoneNum
|
||||||
Utils.lockMessage = message
|
Utils.lockMessage = message
|
||||||
Utils.lockDevice(context)
|
Utils.lockDevice(context)
|
||||||
Utils.sleep(1000) {
|
Utils.sleep(1000) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue