Initial commit: Uruk Prize Platform architecture, backend core, mobile app, gateway caller & deployment pipeline
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user