package com.anas4tech.noteable import android.content.Intent import android.net.Uri import android.os.Build import android.provider.Settings import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private lateinit var edgeOverlayChannel: MethodChannel private var overlayPermissionResult: MethodChannel.Result? = null override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) edgeOverlayChannel = MethodChannel( flutterEngine.dartExecutor.binaryMessenger, EDGE_OVERLAY_CHANNEL ) edgeOverlayChannel.setMethodCallHandler { call, result -> when (call.method) { "hasPermission" -> result.success(canDrawOverlays()) "requestPermission" -> requestOverlayPermission(result) "start" -> { if (!canDrawOverlays()) { result.success(false) } else { val serviceIntent = Intent(this, EdgeNotesOverlayService::class.java) .setAction(EdgeNotesOverlayService.ACTION_START) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(serviceIntent) } else { startService(serviceIntent) } result.success(true) } } "stop" -> { stopService(Intent(this, EdgeNotesOverlayService::class.java)) result.success(null) } "isRunning" -> result.success(EdgeNotesOverlayService.isRunning(this)) "refresh" -> { if (EdgeNotesOverlayService.isRunning(this)) { startService( Intent(this, EdgeNotesOverlayService::class.java) .setAction(EdgeNotesOverlayService.ACTION_REFRESH) ) } result.success(null) } else -> result.notImplemented() } } } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) } @Deprecated("Deprecated in Android") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == OVERLAY_PERMISSION_REQUEST) { overlayPermissionResult?.success(canDrawOverlays()) overlayPermissionResult = null } } private fun canDrawOverlays(): Boolean = Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.canDrawOverlays(this) private fun requestOverlayPermission(result: MethodChannel.Result) { if (canDrawOverlays()) { result.success(true) return } if (overlayPermissionResult != null) { result.error( "permission_request_in_progress", "Overlay permission request is already active.", null ) return } overlayPermissionResult = result val settingsIntent = Intent( Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName") ) startActivityForResult(settingsIntent, OVERLAY_PERMISSION_REQUEST) } private companion object { const val EDGE_OVERLAY_CHANNEL = "com.anas4tech.noteable/edge_overlay" const val OVERLAY_PERMISSION_REQUEST = 4182 } }