package com.example.modifier import android.content.Context import android.content.DialogInterface import android.content.Intent import android.net.Uri import android.os.Bundle import android.provider.Settings import android.util.Log import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.NavigationUI.setupWithNavController import com.example.modifier.databinding.ActivityMainBinding import com.example.modifier.service.ModifierService import com.example.modifier.utils.ROOT_ACCESS import com.example.modifier.utils.enableAccessibility import com.example.modifier.utils.enableOverlay import com.example.modifier.utils.getIPAddress import com.example.modifier.utils.hasRootAccess import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class MainActivity : AppCompatActivity() { private lateinit var mBinding: ActivityMainBinding var r = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { requestSystemAlertWindowPermission() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() mBinding = ActivityMainBinding.inflate(layoutInflater) setContentView(mBinding.root) val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val controller = navHostFragment.navController setupWithNavController(mBinding.nav, controller) CoroutineScope(Dispatchers.IO).launch { if (hasRootAccess()) { ROOT_ACCESS = true if (!enableAccessibility()) { val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) delay(1000); finish(); } enableOverlay() } else { if (ModifierService.instance != null) { return@launch } //request system_alert permission withContext(Dispatchers.Main) { requestAccessibilityPermission() } } Log.i("getIPAddress", getIPAddress().joinToString()) } } private fun requestSystemAlertWindowPermission(): Boolean { if (!Settings.canDrawOverlays(this)) { MaterialAlertDialogBuilder(this) .setTitle("Operation Needed") .setMessage("Enable System Alert Window Permission") .setCancelable(false) .setPositiveButton("OK") { _: DialogInterface?, _: Int -> val intent = Intent( Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:$packageName") ) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) r.launch(intent) } .show() return false } return true } private fun requestAccessibilityPermission(): Boolean { if (ModifierService.instance == null) { MaterialAlertDialogBuilder(this@MainActivity) .setTitle("Operation Needed") .setMessage("Enable Accessibility Service") .setCancelable(false) .setPositiveButton("Open Settings") { _: DialogInterface?, _: Int -> val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) r.launch(intent) } .show() return false } return true } }