MainActivity.kt 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package com.example.modifier
  2. import android.content.Context
  3. import android.content.DialogInterface
  4. import android.content.Intent
  5. import android.net.Uri
  6. import android.os.Bundle
  7. import android.provider.Settings
  8. import android.util.Log
  9. import androidx.activity.enableEdgeToEdge
  10. import androidx.activity.result.contract.ActivityResultContracts
  11. import androidx.appcompat.app.AppCompatActivity
  12. import androidx.navigation.fragment.NavHostFragment
  13. import androidx.navigation.ui.NavigationUI.setupWithNavController
  14. import com.example.modifier.databinding.ActivityMainBinding
  15. import com.example.modifier.service.ModifierService
  16. import com.example.modifier.utils.ROOT_ACCESS
  17. import com.example.modifier.utils.enableAccessibility
  18. import com.example.modifier.utils.enableOverlay
  19. import com.example.modifier.utils.getIPAddress
  20. import com.example.modifier.utils.hasRootAccess
  21. import com.google.android.material.dialog.MaterialAlertDialogBuilder
  22. import kotlinx.coroutines.CoroutineScope
  23. import kotlinx.coroutines.Dispatchers
  24. import kotlinx.coroutines.delay
  25. import kotlinx.coroutines.launch
  26. import kotlinx.coroutines.withContext
  27. class MainActivity : AppCompatActivity() {
  28. private lateinit var mBinding: ActivityMainBinding
  29. var r = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
  30. requestSystemAlertWindowPermission()
  31. }
  32. override fun onCreate(savedInstanceState: Bundle?) {
  33. super.onCreate(savedInstanceState)
  34. enableEdgeToEdge()
  35. mBinding = ActivityMainBinding.inflate(layoutInflater)
  36. setContentView(mBinding.root)
  37. val navHostFragment =
  38. supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
  39. val controller = navHostFragment.navController
  40. setupWithNavController(mBinding.nav, controller)
  41. CoroutineScope(Dispatchers.IO).launch {
  42. if (hasRootAccess()) {
  43. ROOT_ACCESS = true
  44. if (!enableAccessibility()) {
  45. val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
  46. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  47. startActivity(intent)
  48. delay(1000);
  49. finish();
  50. }
  51. enableOverlay()
  52. } else {
  53. if (ModifierService.instance != null) {
  54. return@launch
  55. }
  56. //request system_alert permission
  57. withContext(Dispatchers.Main) {
  58. requestAccessibilityPermission()
  59. }
  60. }
  61. Log.i("getIPAddress", getIPAddress().joinToString())
  62. }
  63. }
  64. private fun requestSystemAlertWindowPermission(): Boolean {
  65. if (!Settings.canDrawOverlays(this)) {
  66. MaterialAlertDialogBuilder(this)
  67. .setTitle("Operation Needed")
  68. .setMessage("Enable System Alert Window Permission")
  69. .setCancelable(false)
  70. .setPositiveButton("OK") { _: DialogInterface?, _: Int ->
  71. val intent = Intent(
  72. Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
  73. Uri.parse("package:$packageName")
  74. )
  75. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  76. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
  77. r.launch(intent)
  78. }
  79. .show()
  80. return false
  81. }
  82. return true
  83. }
  84. private fun requestAccessibilityPermission(): Boolean {
  85. if (ModifierService.instance == null) {
  86. MaterialAlertDialogBuilder(this@MainActivity)
  87. .setTitle("Operation Needed")
  88. .setMessage("Enable Accessibility Service")
  89. .setCancelable(false)
  90. .setPositiveButton("Open Settings") { _: DialogInterface?, _: Int ->
  91. val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
  92. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  93. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
  94. r.launch(intent)
  95. }
  96. .show()
  97. return false
  98. }
  99. return true
  100. }
  101. }