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 }