Skip to content

Commit

Permalink
perf: SnapshotPage, FixedTimeText
Browse files Browse the repository at this point in the history
  • Loading branch information
lisonge committed Jan 12, 2025
1 parent 49db6fb commit b686865
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 85 deletions.
24 changes: 0 additions & 24 deletions app/src/main/kotlin/li/songe/gkd/data/ComplexSnapshot.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package li.songe.gkd.data

import com.blankj.utilcode.util.ScreenUtils
import kotlinx.serialization.Serializable
import li.songe.gkd.app
import li.songe.gkd.service.A11yService
import li.songe.gkd.service.getAndUpdateCurrentRules
import li.songe.gkd.service.safeActiveWindow

@Serializable
data class ComplexSnapshot(
Expand All @@ -32,26 +28,6 @@ data class ComplexSnapshot(
val nodes: List<NodeInfo>,
) : BaseSnapshot


fun createComplexSnapshot(): ComplexSnapshot {
val currentAbNode = A11yService.instance?.safeActiveWindow
val appId = currentAbNode?.packageName?.toString()
val currentActivityId = getAndUpdateCurrentRules().topActivity.activityId

return ComplexSnapshot(
id = System.currentTimeMillis(),

appId = appId,
activityId = currentActivityId,

screenHeight = ScreenUtils.getScreenHeight(),
screenWidth = ScreenUtils.getScreenWidth(),
isLandscape = ScreenUtils.isLandscape(),

nodes = info2nodeList(currentAbNode)
)
}

fun ComplexSnapshot.toSnapshot(): Snapshot {
return Snapshot(
id = id,
Expand Down
38 changes: 30 additions & 8 deletions app/src/main/kotlin/li/songe/gkd/debug/SnapshotExt.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package li.songe.gkd.debug

import android.graphics.Bitmap
import android.view.accessibility.AccessibilityNodeInfo
import androidx.core.graphics.set
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.LogUtils
Expand All @@ -12,15 +13,16 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeoutOrNull
import kotlinx.serialization.encodeToString
import li.songe.gkd.data.ComplexSnapshot
import li.songe.gkd.data.RpcError
import li.songe.gkd.data.createComplexSnapshot
import li.songe.gkd.data.info2nodeList
import li.songe.gkd.data.toSnapshot
import li.songe.gkd.db.DbSet
import li.songe.gkd.notif.notify
import li.songe.gkd.notif.snapshotNotif
import li.songe.gkd.service.A11yService
import li.songe.gkd.service.getAndUpdateCurrentRules
import li.songe.gkd.service.safeActiveWindow
import li.songe.gkd.util.appInfoCacheFlow
import li.songe.gkd.util.keepNullJson
import li.songe.gkd.util.snapshotFolder
Expand Down Expand Up @@ -83,20 +85,40 @@ object SnapshotExt {

private val captureLoading = MutableStateFlow(false)

private fun createComplexSnapshot(rootNode: AccessibilityNodeInfo): ComplexSnapshot {
val currentActivityId = getAndUpdateCurrentRules().topActivity.activityId

return ComplexSnapshot(
id = System.currentTimeMillis(),

appId = rootNode.packageName.toString(),
activityId = currentActivityId,

screenHeight = ScreenUtils.getScreenHeight(),
screenWidth = ScreenUtils.getScreenWidth(),
isLandscape = ScreenUtils.isLandscape(),

nodes = info2nodeList(rootNode)
)
}

suspend fun captureSnapshot(skipScreenshot: Boolean = false): ComplexSnapshot {
if (!A11yService.isRunning.value) {
throw RpcError("无障碍不可用")
throw RpcError("无障碍不可用,请先授权")
}
if (captureLoading.value) {
throw RpcError("正在保存快照,不可重复操作")
}
captureLoading.value = true
if (storeFlow.value.showSaveSnapshotToast) {
toast("正在保存快照...")
}

try {
val snapshotDef = coroutineScope { async(Dispatchers.IO) { createComplexSnapshot() } }
val rootNode =
A11yService.instance?.safeActiveWindow
?: throw RpcError("当前应用没有无障碍信息,捕获失败")
if (storeFlow.value.showSaveSnapshotToast) {
toast("正在保存快照...")
}
val snapshotDef =
coroutineScope { async(Dispatchers.IO) { createComplexSnapshot(rootNode) } }
val bitmapDef = coroutineScope {// TODO 也许在分屏模式下可能需要处理
async(Dispatchers.IO) {
if (skipScreenshot) {
Expand Down
5 changes: 2 additions & 3 deletions app/src/main/kotlin/li/songe/gkd/debug/SnapshotTileService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,13 @@ class SnapshotTileService : TileService() {
return System.currentTimeMillis() - startTime > 3000L
}

val timeoutText = "没有检测到界面切换,捕获失败"
while (true) {
val latestAppId = service.safeActiveWindowAppId
if (latestAppId == null) {
// https://github.com/gkd-kit/gkd/issues/713
delay(250)
if (timeout()) {
toast(timeoutText)
toast("当前应用没有无障碍信息,捕获失败")
break
}
} else if (latestAppId != oldAppId) {
Expand All @@ -60,7 +59,7 @@ class SnapshotTileService : TileService() {
service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK)
delay(500)
if (timeout()) {
toast(timeoutText)
toast("未检测到界面切换,捕获失败")
break
}
}
Expand Down
26 changes: 17 additions & 9 deletions app/src/main/kotlin/li/songe/gkd/ui/ActionLogPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,10 @@ import li.songe.gkd.data.switch
import li.songe.gkd.db.DbSet
import li.songe.gkd.ui.component.AppNameText
import li.songe.gkd.ui.component.EmptyText
import li.songe.gkd.ui.component.FixedTimeText
import li.songe.gkd.ui.component.LocalNumberCharWidth
import li.songe.gkd.ui.component.StartEllipsisText
import li.songe.gkd.ui.component.measureNumberTextWidth
import li.songe.gkd.ui.component.waitResult
import li.songe.gkd.ui.style.EmptyHeight
import li.songe.gkd.ui.style.itemHorizontalPadding
Expand Down Expand Up @@ -115,6 +118,7 @@ fun ActionLogPage() {
setPreviewConfigFlow(MutableStateFlow(null))
}
})
val timeTextWidth = measureNumberTextWidth(MaterialTheme.typography.bodySmall)

val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
Scaffold(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = {
Expand Down Expand Up @@ -159,14 +163,18 @@ fun ActionLogPage() {
) { i ->
val item = actionDataItems[i] ?: return@items
val lastItem = if (i > 0) actionDataItems[i - 1] else null
ActionLogCard(
i = i,
item = item,
lastItem = lastItem,
onClick = {
previewActionLog = item.t0
}
)
CompositionLocalProvider(
LocalNumberCharWidth provides timeTextWidth
) {
ActionLogCard(
i = i,
item = item,
lastItem = lastItem,
onClick = {
previewActionLog = item.t0
}
)
}
}
item {
Spacer(modifier = Modifier.height(EmptyHeight))
Expand Down Expand Up @@ -360,7 +368,7 @@ private fun ActionLogCard(
Column(
modifier = Modifier.weight(1f)
) {
Text(
FixedTimeText(
text = actionLog.date,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.secondary,
Expand Down
12 changes: 10 additions & 2 deletions app/src/main/kotlin/li/songe/gkd/ui/ActivityLogPage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,10 @@ import li.songe.gkd.data.ActivityLog
import li.songe.gkd.db.DbSet
import li.songe.gkd.ui.component.AppNameText
import li.songe.gkd.ui.component.EmptyText
import li.songe.gkd.ui.component.FixedTimeText
import li.songe.gkd.ui.component.LocalNumberCharWidth
import li.songe.gkd.ui.component.StartEllipsisText
import li.songe.gkd.ui.component.measureNumberTextWidth
import li.songe.gkd.ui.component.waitResult
import li.songe.gkd.ui.style.EmptyHeight
import li.songe.gkd.ui.style.itemHorizontalPadding
Expand All @@ -66,6 +69,7 @@ fun ActivityLogPage() {
val logCount by vm.logCountFlow.collectAsState()
val list = vm.pagingDataFlow.collectAsLazyPagingItems()

val timeTextWidth = measureNumberTextWidth(MaterialTheme.typography.bodySmall)
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()
Scaffold(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = {
TopAppBar(
Expand Down Expand Up @@ -111,7 +115,11 @@ fun ActivityLogPage() {
) { i ->
val actionLog = list[i] ?: return@items
val lastActionLog = if (i > 0) list[i - 1] else null
ActivityLogCard(i = i, actionLog = actionLog, lastActionLog = lastActionLog)
CompositionLocalProvider(
LocalNumberCharWidth provides timeTextWidth
) {
ActivityLogCard(i = i, actionLog = actionLog, lastActionLog = lastActionLog)
}
}
item {
Spacer(modifier = Modifier.height(EmptyHeight))
Expand Down Expand Up @@ -159,7 +167,7 @@ private fun ActivityLogCard(
Column(
modifier = Modifier.weight(1f)
) {
Text(
FixedTimeText(
text = actionLog.date,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.secondary,
Expand Down
Loading

0 comments on commit b686865

Please sign in to comment.