better anti evasion

This commit is contained in:
minish 2025-09-22 17:06:54 -04:00
parent 0b96b5bb52
commit 70b269254a
Signed by: min
SSH Key Fingerprint: SHA256:mf+pUTmK92Y57BuCjlkBdd82LqztTfDCQIUp0fCKABc
4 changed files with 28 additions and 22 deletions

View File

@ -14,7 +14,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:label="digica settings" android:label="@string/app_settings_name"
android:theme="@style/Theme.Digica"> android:theme="@style/Theme.Digica">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -26,7 +26,8 @@
android:name=".service.DigicaService" android:name=".service.DigicaService"
android:exported="false" android:exported="false"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/accessibility_service_label"> android:label="@string/accessibility_service_label"
tools:ignore="AccessibilityPolicy">
<intent-filter> <intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" /> <action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter> </intent-filter>

View File

@ -1,20 +1,21 @@
package rip.min.digica.service package rip.min.digica.service
import android.accessibilityservice.AccessibilityService import android.accessibilityservice.AccessibilityService
import android.annotation.SuppressLint
import android.content.ComponentName import android.content.ComponentName
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Handler import android.os.Handler
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent
import androidx.collection.emptyLongSet
import java.util.Calendar import java.util.Calendar
@SuppressLint("AccessibilityPolicy")
class DigicaService : AccessibilityService() { class DigicaService : AccessibilityService() {
private lateinit var appLabel: String private lateinit var appLabel: String
private lateinit var serviceLabel: String private lateinit var serviceLabel: String
private var wasLastViewingAppInfo = false private var wasLastViewingThisAppInfo = false
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -28,25 +29,30 @@ class DigicaService : AccessibilityService() {
} }
override fun onAccessibilityEvent(event: AccessibilityEvent?) { override fun onAccessibilityEvent(event: AccessibilityEvent?) {
if (event == null) return if (event == null || event.packageName == null) return
if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { if (event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
val pkgName = event.packageName.toString() val pkgName = event.packageName.toString()
val className = event.className; val className = event.className
// Is force stop dialog possibly open? val commonSettingsRoot = rootInActiveWindow?.getChild(0)?.getChild(0)?.getChild(0)
val possiblyForceStop = pkgName == "com.android.settings" ?.getChild(0)?.getChild(0)
// Is force stop dialog open?
val forceStop = pkgName == "com.android.settings"
&& className == "androidx.compose.ui.window.DialogWrapper" && className == "androidx.compose.ui.window.DialogWrapper"
&& commonSettingsRoot?.childCount == 4
// Check if we are on App info page in settings // Is user trying to force stop?
if (pkgName == "com.android.settings") { val attemptingForceStop = wasLastViewingThisAppInfo && forceStop
if (className == "com.android.settings.spa.SpaActivity"
&& event.text.getOrNull(0) == "App info" // Check if the last app info page visited was this app's
) wasLastViewingAppInfo = true; if (pkgName == "com.android.settings"
// If we did not switch to what is maybe the force stop dialog, && className == "com.android.settings.spa.SpaActivity"
// reset the flag && commonSettingsRoot?.childCount == 1
else if (!possiblyForceStop) ) {
wasLastViewingAppInfo = false; wasLastViewingThisAppInfo =
commonSettingsRoot.getChild(0)?.text.toString() == appLabel
} }
// Is user trying to uninstall this app? // Is user trying to uninstall this app?
@ -65,9 +71,6 @@ class DigicaService : AccessibilityService() {
|| pkgName == "com.aliucord" || pkgName == "com.aliucord"
|| pkgName == "app.revanced.android.youtube" || pkgName == "app.revanced.android.youtube"
// Is user trying to force stop?
val attemptingForceStop = possiblyForceStop && wasLastViewingAppInfo;
// Get time // Get time
val cal = Calendar.getInstance() val cal = Calendar.getInstance()
val day = cal.get(Calendar.DAY_OF_WEEK) val day = cal.get(Calendar.DAY_OF_WEEK)
@ -101,6 +104,7 @@ class DigicaService : AccessibilityService() {
) { ) {
// Stop them from doing that // Stop them from doing that
Log.i("DigicaService", "Preventing action") Log.i("DigicaService", "Preventing action")
Log.d("DigicaService", event.toString())
leaveDelayed(100L) leaveDelayed(100L)
leaveDelayed(200L) leaveDelayed(200L)
} }

View File

@ -1,5 +1,6 @@
<resources> <resources>
<string name="app_name">digica</string> <string name="app_name">digica</string>
<string name="accessibility_service_label">digica ☆</string> <string name="app_settings_name">digica settings</string>
<string name="accessibility_service_label">digica service</string>
<string name="accessibility_service_description">allows digica to function</string> <string name="accessibility_service_description">allows digica to function</string>
</resources> </resources>

View File

@ -4,6 +4,6 @@
android:accessibilityFlags="flagDefault" android:accessibilityFlags="flagDefault"
android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFeedbackType="feedbackGeneric"
android:notificationTimeout="0" android:notificationTimeout="0"
android:canRetrieveWindowContent="false" android:canRetrieveWindowContent="true"
android:settingsActivity="rip.min.digica.MainActivity" android:settingsActivity="rip.min.digica.MainActivity"
/> />