Initial commit: Uruk Prize Platform architecture, backend core, mobile app, gateway caller & deployment pipeline

This commit is contained in:
Hamza-Ayed
2026-09-18 17:12:05 +03:00
commit 879dd36f1b
1149 changed files with 97122 additions and 0 deletions
@@ -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
}