|
|
@@ -23,6 +23,7 @@ import android.view.accessibility.AccessibilityEvent
|
|
|
import android.view.accessibility.AccessibilityNodeInfo
|
|
|
import android.widget.CompoundButton
|
|
|
import android.widget.FrameLayout
|
|
|
+import androidx.core.view.ViewCompat
|
|
|
import androidx.datastore.core.DataStore
|
|
|
import androidx.datastore.preferences.core.Preferences
|
|
|
import androidx.datastore.preferences.preferencesDataStore
|
|
|
@@ -282,15 +283,16 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
override fun onCreate() {
|
|
|
super.onCreate()
|
|
|
Log.i(TAG, "Starting ModifierService")
|
|
|
- Log.i(TAG, "phonekilled: ${Utils.runAsRoot("getprop phonekilled")}")
|
|
|
- if (Build.MODEL.startsWith("SM-F707") || Build.MODEL.startsWith("SM-F711")) {
|
|
|
- if (!Utils.runAsRoot("getprop phonekilled").contains("yes")) {
|
|
|
- Global.killPhoneProcess()
|
|
|
- Utils.runAsRoot("setprop phonekilled yes")
|
|
|
- }
|
|
|
- }
|
|
|
CoroutineScope(Dispatchers.IO).launch {
|
|
|
- Global.syncTime()
|
|
|
+ preparing.postValue(true)
|
|
|
+ delay(2.minutes)
|
|
|
+ if (Global.hasRoot()) {
|
|
|
+ Global.syncTime()
|
|
|
+ if (Build.MODEL.startsWith("SM-F707") || Build.MODEL.startsWith("SM-F711")) {
|
|
|
+ Global.killPhoneProcess(force = true)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ preparing.postValue(false)
|
|
|
}
|
|
|
connect()
|
|
|
}
|
|
|
@@ -680,7 +682,22 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
}
|
|
|
binding.btnInspect.setOnClickListener {
|
|
|
CoroutineScope(Dispatchers.IO).launch {
|
|
|
- traverseNode(rootInActiveWindow, TraverseResult())
|
|
|
+ val res = TraverseResult()
|
|
|
+ traverseNode(rootInActiveWindow, res)
|
|
|
+ if (res.rcsSwitch != null) {
|
|
|
+ Log.i(TAG, "RCS switch isChecked: ${res.rcsSwitch!!.isChecked}")
|
|
|
+ Log.i(TAG, "Clicking RCS switch")
|
|
|
+ val rect = Rect()
|
|
|
+ res.rcsSwitch!!.getBoundsInScreen(rect)
|
|
|
+ Utils.runAsRoot(
|
|
|
+ "input tap ${rect.centerX()} ${rect.centerY()}",
|
|
|
+ "sleep 1",
|
|
|
+ CMD_BACK, "sleep 1",
|
|
|
+ CMD_RCS_SETTINGS_ACTIVITY, "sleep 1",
|
|
|
+ )
|
|
|
+ traverseNode(rootInActiveWindow, res)
|
|
|
+ Log.i(TAG, "RCS switch isChecked: ${res.rcsSwitch!!.isChecked}")
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
binding.btnCheck.setOnClickListener {
|
|
|
@@ -759,7 +776,7 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
rcsConfigureState.postValue(RcsConfigureState.NOT_CONFIGURED)
|
|
|
|
|
|
withContext(Dispatchers.Main) {
|
|
|
- binding.tvLog.text = "requesting number..."
|
|
|
+ binding.tvLog.text = "Requesting number..."
|
|
|
}
|
|
|
|
|
|
val response = KtorClient.put(
|
|
|
@@ -777,7 +794,7 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
Log.i(TAG, "requestNumber response: $rcsNumber")
|
|
|
|
|
|
withContext(Dispatchers.Main) {
|
|
|
- binding.tvLog.text = "requesting success, waiting for logs..."
|
|
|
+ binding.tvLog.text = "Requesting success, waiting for logs..."
|
|
|
}
|
|
|
|
|
|
Global.save(
|
|
|
@@ -802,16 +819,13 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
}
|
|
|
rcsConfigureState.postValue(RcsConfigureState.NOT_CONFIGURED)
|
|
|
resetAll()
|
|
|
- val switchAppear = withTimeoutOrNull(2.minutes) {
|
|
|
- while (true) {
|
|
|
- if (rcsConfigureState.value == RcsConfigureState.WAITING_FOR_DEFAULT_ON) {
|
|
|
- break
|
|
|
- }
|
|
|
- delay(1.seconds)
|
|
|
- }
|
|
|
- true
|
|
|
- } ?: false
|
|
|
- if (!switchAppear) {
|
|
|
+ val switchAppear = waitForRcsState(
|
|
|
+ arrayOf(RcsConfigureState.WAITING_FOR_DEFAULT_ON),
|
|
|
+ 3.minutes
|
|
|
+ )?.let {
|
|
|
+ it == RcsConfigureState.WAITING_FOR_DEFAULT_ON
|
|
|
+ }
|
|
|
+ if (switchAppear != true) {
|
|
|
Log.e(TAG, "RCS not entered default on state, retrying...")
|
|
|
continue
|
|
|
}
|
|
|
@@ -825,26 +839,39 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
Log.e(TAG, "RCS switch not found, retrying...")
|
|
|
continue
|
|
|
}
|
|
|
- val rect = Rect()
|
|
|
- res.rcsSwitch!!.getBoundsInScreen(rect)
|
|
|
- Utils.runAsRoot(
|
|
|
- "input tap ${rect.centerX()} ${rect.centerY()}",
|
|
|
- "sleep 1",
|
|
|
- CMD_BACK,
|
|
|
- CMD_RCS_SETTINGS_ACTIVITY,
|
|
|
- )
|
|
|
- Log.i(TAG, "RCS switch turned on, waiting for state change...")
|
|
|
+ val switchOn = run turnOnSwitch@{
|
|
|
+ repeat(2) {
|
|
|
+ if (res.rcsSwitch!!.isChecked) {
|
|
|
+ Log.i(TAG, "RCS switch turned on")
|
|
|
+ return@turnOnSwitch true
|
|
|
+ }
|
|
|
+ val rect = Rect()
|
|
|
+ res.rcsSwitch!!.getBoundsInScreen(rect)
|
|
|
+ Utils.runAsRoot(
|
|
|
+ "input tap ${rect.centerX()} ${rect.centerY()}",
|
|
|
+ "sleep 1", CMD_BACK, "sleep 1",
|
|
|
+ CMD_RCS_SETTINGS_ACTIVITY, "sleep 1",
|
|
|
+ )
|
|
|
+ traverseNode(rootInActiveWindow, res)
|
|
|
+ if (res.rcsSwitch!!.isChecked) {
|
|
|
+ Log.i(TAG, "RCS switch turned on")
|
|
|
+ return@turnOnSwitch true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ false
|
|
|
+ }
|
|
|
+ if (!switchOn) {
|
|
|
+ Log.e(TAG, "RCS switch not turned on, retrying...")
|
|
|
+ continue
|
|
|
+ }
|
|
|
val resetSuccess = waitForRcsState(
|
|
|
arrayOf(
|
|
|
- RcsConfigureState.READY,
|
|
|
- RcsConfigureState.RETRY
|
|
|
- ), 2.minutes
|
|
|
+ RcsConfigureState.READY
|
|
|
+ ), 3.minutes
|
|
|
)
|
|
|
Log.i(TAG, "waitForRcsState: $resetSuccess")
|
|
|
Global.suspend(gms = true, sms = true)
|
|
|
- delay(1000)
|
|
|
Global.unsuspend(gms = true, sms = true)
|
|
|
- delay(1000)
|
|
|
requestNumberCount = 0
|
|
|
break
|
|
|
}
|
|
|
@@ -864,7 +891,7 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
Log.e(TAG, "RCS number expired, retrying...")
|
|
|
continue
|
|
|
}
|
|
|
- val sendOtpTimeout = ChronoUnit.SECONDS.between(
|
|
|
+ var sendOtpTimeout = ChronoUnit.SECONDS.between(
|
|
|
LocalDateTime.now(),
|
|
|
rcsNumber.expiryTime
|
|
|
).seconds
|
|
|
@@ -872,6 +899,9 @@ class ModifierService : AccessibilityService(), Emitter.Listener {
|
|
|
Log.e(TAG, "OTP timeout too short, retrying...")
|
|
|
continue
|
|
|
}
|
|
|
+ if (sendOtpTimeout > 5.minutes) {
|
|
|
+ sendOtpTimeout = 5.minutes
|
|
|
+ }
|
|
|
if (waitForRcsState(
|
|
|
arrayOf(RcsConfigureState.WAITING_FOR_OTP),
|
|
|
sendOtpTimeout
|