121 lines
4.3 KiB
Kotlin
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
|
|
}
|