Files
urukprize/gateway-caller/app/src/main/java/com/intaleq/flashcall/PermissionHelper.kt
T

121 lines
4.3 KiB
Kotlin

package com.intaleq.flashcall
import android.Manifest
import android.app.Activity
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
object PermissionHelper {
private val REQUIRED_PERMISSIONS = arrayOf(
Manifest.permission.CALL_PHONE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.SEND_SMS
)
fun areAllPermissionsGranted(context: Context): Boolean {
return REQUIRED_PERMISSIONS.all { permission ->
ContextCompat.checkSelfPermission(context, permission) ==
android.content.pm.PackageManager.PERMISSION_GRANTED
}
}
fun requestAllPermissions(activity: Activity) {
val permissionsToRequest = REQUIRED_PERMISSIONS.filter { permission ->
ContextCompat.checkSelfPermission(activity, permission) !=
android.content.pm.PackageManager.PERMISSION_GRANTED
}
if (permissionsToRequest.isNotEmpty()) {
// Show rationale for any permission that was previously denied
val shouldShowRationale = permissionsToRequest.any { permission ->
ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)
}
if (shouldShowRationale) {
// In a production app you'd show a dialog here explaining why
// For now, just request the permissions directly
ActivityCompat.requestPermissions(
activity,
permissionsToRequest.toTypedArray(),
REQUEST_CODE_PERMISSIONS
)
} else {
ActivityCompat.requestPermissions(
activity,
permissionsToRequest.toTypedArray(),
REQUEST_CODE_PERMISSIONS
)
}
}
// Also request battery optimization exemption
requestBatteryOptimizationExemption(activity)
// Request SYSTEM_ALERT_WINDOW (Draw over other apps) for Android 10+ background activity starts
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(activity)) {
try {
val intent = Intent(
Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:${activity.packageName}")
)
activity.startActivity(intent)
} catch (e: Exception) {
// Ignore if not available
}
}
}
fun requestBatteryOptimizationExemption(activity: Activity) {
val powerManager = activity.getSystemService(Context.POWER_SERVICE) as PowerManager
val packageName = activity.packageName
if (!powerManager.isIgnoringBatteryOptimizations(packageName)) {
try {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
data = Uri.parse("package:$packageName")
}
activity.startActivity(intent)
} catch (e: Exception) {
// Fallback: open battery optimization settings
try {
val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
activity.startActivity(intent)
} catch (e2: Exception) {
// Cannot open settings, ignore
}
}
}
}
fun shouldShowCallPhoneRationale(activity: Activity): Boolean {
return ActivityCompat.shouldShowRequestPermissionRationale(
activity,
Manifest.permission.CALL_PHONE
)
}
fun shouldShowReadPhoneStateRationale(activity: Activity): Boolean {
return ActivityCompat.shouldShowRequestPermissionRationale(
activity,
Manifest.permission.READ_PHONE_STATE
)
}
fun shouldShowSendSmsRationale(activity: Activity): Boolean {
return ActivityCompat.shouldShowRequestPermissionRationale(
activity,
Manifest.permission.SEND_SMS
)
}
const val REQUEST_CODE_PERMISSIONS = 1001
}