ScreenController.kt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package com.example.modifier.service
  2. import android.accessibilityservice.AccessibilityService
  3. import android.graphics.Rect
  4. import android.view.accessibility.AccessibilityNodeInfo
  5. import com.example.modifier.TraverseResult
  6. import com.example.modifier.constants.CMD_BACK
  7. import com.example.modifier.constants.CMD_RCS_SETTINGS_ACTIVITY
  8. import com.example.modifier.utils.currentActivity
  9. import com.example.modifier.utils.shellRun
  10. import kotlinx.coroutines.delay
  11. class ScreenController(val context: AccessibilityService, private val inspector: ScreenInspector) {
  12. suspend fun toggleRcsSwitch(state: Boolean, retry: Int = 3): Boolean {
  13. val res = TraverseResult()
  14. shellRun(CMD_RCS_SETTINGS_ACTIVITY, "sleep 2")
  15. val success = run repeatBlock@{
  16. repeat(retry) {
  17. res.rcsSwitch = null
  18. inspector.traverseNode(res)
  19. if (res.rcsSwitch == null) {
  20. shellRun(CMD_BACK, "sleep 0.5", CMD_RCS_SETTINGS_ACTIVITY, "sleep 1")
  21. } else {
  22. if (res.rcsSwitch!!.isChecked == state) {
  23. return@repeatBlock true
  24. }
  25. val rect = Rect()
  26. res.rcsSwitch!!.getBoundsInScreen(rect)
  27. if (state) {
  28. shellRun(
  29. "input tap ${rect.centerX()} ${rect.centerY()}", "sleep 1",
  30. )
  31. val btn =
  32. context.rootInActiveWindow.findAccessibilityNodeInfosByViewId("android:id/button1")
  33. .firstOrNull()
  34. if (btn != null) {
  35. btn.performAction(AccessibilityNodeInfo.ACTION_CLICK)
  36. delay(1000)
  37. }
  38. while (currentActivity()?.contains("RcsSettingsActivity") == true ||
  39. currentActivity()?.contains("TurnOffRcsActivity") == true
  40. ) {
  41. shellRun(CMD_BACK)
  42. delay(500)
  43. }
  44. shellRun(CMD_RCS_SETTINGS_ACTIVITY, "sleep 1")
  45. } else {
  46. shellRun(
  47. "input tap ${rect.centerX()} ${rect.centerY()}", "sleep 1",
  48. )
  49. if (currentActivity()?.contains("TurnOffRcsActivity") == true) {
  50. inspector.traverseNode(res)
  51. if (res.closeBtn != null) {
  52. val rect1 = Rect()
  53. res.closeBtn!!.getBoundsInScreen(rect1)
  54. shellRun(
  55. "input tap ${rect1.centerX()} ${rect1.centerY()}", "sleep 1",
  56. )
  57. }
  58. } else {
  59. context.rootInActiveWindow.findAccessibilityNodeInfosByViewId("android:id/button1")
  60. .firstOrNull()?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
  61. }
  62. delay(1000)
  63. while (currentActivity()?.contains("RcsSettingsActivity") == true ||
  64. currentActivity()?.contains("TurnOffRcsActivity") == true
  65. ) {
  66. shellRun(CMD_BACK)
  67. delay(500)
  68. }
  69. shellRun(CMD_RCS_SETTINGS_ACTIVITY, "sleep 1")
  70. }
  71. res.rcsSwitch = null
  72. inspector.traverseNode(res)
  73. if (res.rcsSwitch?.isChecked == state) {
  74. return@repeatBlock true
  75. }
  76. }
  77. }
  78. false
  79. }
  80. while (currentActivity()?.contains("RcsSettingsActivity") == true) {
  81. shellRun(CMD_BACK)
  82. delay(500)
  83. }
  84. return success
  85. }
  86. }