Skip to content

Commit 24c4069

Browse files
committed
feat: TrackService (#1321)
1 parent 9927fdf commit 24c4069

File tree

8 files changed

+383
-8
lines changed

8 files changed

+383
-8
lines changed

app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ kotlin {
197197
"-opt-in=androidx.compose.ui.ExperimentalComposeUiApi",
198198
"-opt-in=androidx.compose.foundation.layout.ExperimentalLayoutApi",
199199
"-Xcontext-parameters",
200+
"-Xexplicit-backing-fields",
200201
"-XXLanguage:+MultiDollarInterpolation",
201202
)
202203
}

app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,15 @@
174174
<property
175175
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
176176
android:value="Display a text card for users to show a11y event log" />
177+
178+
</service>
179+
<service
180+
android:name=".service.TrackService"
181+
android:exported="false"
182+
android:foregroundServiceType="specialUse">
183+
<property
184+
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
185+
android:value="Show Action Track" />
177186
</service>
178187
<service
179188
android:name=".service.ExposeService"

app/src/main/kotlin/li/songe/gkd/App.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import android.content.pm.ApplicationInfo
1212
import android.content.pm.PackageInfo
1313
import android.content.pm.PackageManager
1414
import android.database.ContentObserver
15+
import android.hardware.display.DisplayManager
1516
import android.net.Uri
1617
import android.os.PowerManager
1718
import android.provider.Settings
1819
import android.util.Log
20+
import android.view.Display
1921
import android.view.WindowManager
2022
import android.view.accessibility.AccessibilityManager
2123
import android.view.inputmethod.InputMethodManager
@@ -188,11 +190,20 @@ class App : Application() {
188190
val appOpsManager by lazy { app.getSystemService(APP_OPS_SERVICE) as AppOpsManager }
189191
val inputMethodManager by lazy { app.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager }
190192
val windowManager by lazy { app.getSystemService(WINDOW_SERVICE) as WindowManager }
193+
val displayManager by lazy { app.getSystemService(DISPLAY_SERVICE) as DisplayManager }
191194
val keyguardManager by lazy { app.getSystemService(KEYGUARD_SERVICE) as KeyguardManager }
192195
val clipboardManager by lazy { app.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager }
193196
val powerManager by lazy { getSystemService(POWER_SERVICE) as PowerManager }
194197
val a11yManager by lazy { getSystemService(ACCESSIBILITY_SERVICE) as AccessibilityManager }
195198

199+
val compatDisplay: Display
200+
get() = if (AndroidTarget.R) {
201+
displayManager.getDisplay(Display.DEFAULT_DISPLAY)
202+
} else {
203+
@Suppress("DEPRECATION")
204+
windowManager.defaultDisplay
205+
}
206+
196207
override fun onCreate() {
197208
super.onCreate()
198209
LogUtils.d()

app/src/main/kotlin/li/songe/gkd/data/GkdAction.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import kotlinx.coroutines.delay
88
import kotlinx.serialization.Serializable
99
import li.songe.gkd.a11y.A11yRuleEngine
1010
import li.songe.gkd.service.A11yService
11+
import li.songe.gkd.service.TrackService
1112
import li.songe.gkd.shizuku.casted
1213
import li.songe.gkd.shizuku.shizukuContextFlow
1314
import li.songe.gkd.util.ScreenUtils
@@ -40,6 +41,7 @@ sealed class ActionPerformer(val action: String) {
4041
node: AccessibilityNodeInfo,
4142
locationProps: RawSubscription.LocationProps,
4243
): ActionResult {
44+
TrackService.addA11yNodePosition(node)
4345
return ActionResult(
4446
action = action,
4547
result = node.performAction(AccessibilityNodeInfo.ACTION_CLICK)
@@ -63,6 +65,7 @@ sealed class ActionPerformer(val action: String) {
6365
position = x to y,
6466
)
6567
}
68+
TrackService.addXyPosition(x, y)
6669
return ActionResult(
6770
action = action,
6871
result = if (shizukuContextFlow.value.tap(x, y)) {
@@ -105,6 +108,7 @@ sealed class ActionPerformer(val action: String) {
105108
node: AccessibilityNodeInfo,
106109
locationProps: RawSubscription.LocationProps,
107110
): ActionResult {
111+
TrackService.addA11yNodePosition(node)
108112
return ActionResult(
109113
action = action,
110114
result = node.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK).apply {
@@ -134,6 +138,7 @@ sealed class ActionPerformer(val action: String) {
134138
position = x to y,
135139
)
136140
}
141+
TrackService.addXyPosition(x, y)
137142
return ActionResult(
138143
action = action,
139144
result = if (shizukuContextFlow.value.tap(x, y, LONG_DURATION)) {
@@ -222,6 +227,7 @@ sealed class ActionPerformer(val action: String) {
222227
position = endX to endY,
223228
)
224229
}
230+
TrackService.addSwipePosition(startX, startY, endX, endY, swipeArg.duration)
225231
return if (shizukuContextFlow.value.swipe(
226232
startX,
227233
startY,

app/src/main/kotlin/li/songe/gkd/notif/Notif.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import li.songe.gkd.service.ButtonService
2222
import li.songe.gkd.service.EventService
2323
import li.songe.gkd.service.HttpService
2424
import li.songe.gkd.service.ScreenshotService
25+
import li.songe.gkd.service.TrackService
2526
import li.songe.gkd.util.AndroidTarget
2627
import li.songe.gkd.util.componentName
2728
import kotlin.reflect.KClass
@@ -151,3 +152,10 @@ val eventNotif = Notif(
151152
uri = "gkd://page/1",
152153
stopService = EventService::class,
153154
)
155+
156+
val trackNotif = Notif(
157+
id = 108,
158+
title = "轨迹服务正在运行",
159+
uri = "gkd://page?tab=3",
160+
stopService = TrackService::class,
161+
)

0 commit comments

Comments
 (0)