Skip to content

Commit 6db18d6

Browse files
committed
perf: use LocalMainViewModel
1 parent 7f89418 commit 6db18d6

31 files changed

+150
-140
lines changed

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import li.songe.gkd.ui.component.ShareDataDialog
4949
import li.songe.gkd.ui.component.SubsSheet
5050
import li.songe.gkd.ui.theme.AppTheme
5151
import li.songe.gkd.util.EditGithubCookieDlg
52+
import li.songe.gkd.util.LocalMainViewModel
5253
import li.songe.gkd.util.LocalNavController
5354
import li.songe.gkd.util.ShortUrlSet
5455
import li.songe.gkd.util.UpgradeDialog
@@ -91,10 +92,11 @@ class MainActivity : ComponentActivity() {
9192
}
9293
setContent {
9394
val navController = rememberNavController()
94-
AppTheme {
95-
CompositionLocalProvider(
96-
LocalNavController provides navController
97-
) {
95+
CompositionLocalProvider(
96+
LocalNavController provides navController,
97+
LocalMainViewModel provides mainVm
98+
) {
99+
AppTheme {
98100
DestinationsNavHost(
99101
navController = navController,
100102
navGraph = NavGraphs.root

app/src/main/kotlin/li/songe/gkd/debug/FloatingService.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import li.songe.gkd.notif.notifyService
2020
import li.songe.gkd.permission.canDrawOverlaysState
2121
import li.songe.gkd.permission.notificationState
2222
import li.songe.gkd.util.launchTry
23+
import li.songe.gkd.util.stopServiceByClass
2324
import kotlin.math.sqrt
2425

2526
class FloatingService : ExpandableBubbleService() {
@@ -94,8 +95,6 @@ class FloatingService : ExpandableBubbleService() {
9495
if (!canDrawOverlaysState.checkOrToast()) return
9596
app.startForegroundService(Intent(app, FloatingService::class.java))
9697
}
97-
fun stop() {
98-
app.stopService(Intent(app, FloatingService::class.java))
99-
}
98+
fun stop() = stopServiceByClass(FloatingService::class)
10099
}
101100
}

app/src/main/kotlin/li/songe/gkd/debug/HttpService.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import li.songe.gkd.util.isPortAvailable
5353
import li.songe.gkd.util.keepNullJson
5454
import li.songe.gkd.util.launchTry
5555
import li.songe.gkd.util.map
56+
import li.songe.gkd.util.stopServiceByClass
5657
import li.songe.gkd.util.storeFlow
5758
import li.songe.gkd.util.subsItemsFlow
5859
import li.songe.gkd.util.toast
@@ -125,9 +126,7 @@ class HttpService : Service(), OnCreate, OnDestroy {
125126
val httpServerFlow = MutableStateFlow<ServerType?>(null)
126127
val isRunning = MutableStateFlow(false)
127128
val localNetworkIpsFlow = MutableStateFlow(emptyList<String>())
128-
fun stop() {
129-
app.stopService(Intent(app, HttpService::class.java))
130-
}
129+
fun stop() = stopServiceByClass(HttpService::class)
131130

132131
fun start() {
133132
if (!notificationState.checkOrToast()) return

app/src/main/kotlin/li/songe/gkd/debug/ScreenshotService.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import li.songe.gkd.util.OnCreate
1111
import li.songe.gkd.util.OnDestroy
1212
import li.songe.gkd.util.ScreenshotUtil
1313
import li.songe.gkd.util.componentName
14+
import li.songe.gkd.util.stopServiceByClass
1415
import li.songe.gkd.util.useAliveFlow
1516
import li.songe.gkd.util.useLogLifecycle
1617
import java.lang.ref.WeakReference
@@ -61,8 +62,6 @@ class ScreenshotService : Service(), OnCreate, OnDestroy {
6162
app.startForegroundService(intent)
6263
}
6364

64-
fun stop() {
65-
app.stopService(Intent(app, ScreenshotService::class.java))
66-
}
65+
fun stop() = stopServiceByClass(ScreenshotService::class)
6766
}
6867
}

app/src/main/kotlin/li/songe/gkd/service/ManageService.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import li.songe.gkd.util.OnDestroy
1919
import li.songe.gkd.util.actionCountFlow
2020
import li.songe.gkd.util.getSubsStatus
2121
import li.songe.gkd.util.ruleSummaryFlow
22+
import li.songe.gkd.util.stopServiceByClass
2223
import li.songe.gkd.util.storeFlow
2324
import li.songe.gkd.util.useAliveFlow
2425

@@ -50,9 +51,7 @@ class ManageService : Service(), OnCreate, OnDestroy {
5051
app.startForegroundService(Intent(app, ManageService::class.java))
5152
}
5253

53-
fun stop() {
54-
app.stopService(Intent(app, ManageService::class.java))
55-
}
54+
fun stop() = stopServiceByClass(ManageService::class)
5655

5756
fun autoStart() {
5857
// 在[系统重启]/[被其它高权限应用重启]时自动打开通知栏状态服务

app/src/main/kotlin/li/songe/gkd/ui/AboutPage.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package li.songe.gkd.ui
22

3+
import androidx.activity.compose.LocalActivity
34
import androidx.compose.animation.graphics.res.animatedVectorResource
45
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
56
import androidx.compose.animation.graphics.vector.AnimatedImageVector
@@ -42,7 +43,6 @@ import androidx.compose.runtime.setValue
4243
import androidx.compose.ui.Alignment
4344
import androidx.compose.ui.Modifier
4445
import androidx.compose.ui.input.nestedscroll.nestedScroll
45-
import androidx.compose.ui.platform.LocalContext
4646
import androidx.compose.ui.res.colorResource
4747
import androidx.compose.ui.text.style.TextDecoration
4848
import androidx.compose.ui.unit.dp
@@ -64,6 +64,7 @@ import li.songe.gkd.ui.style.EmptyHeight
6464
import li.songe.gkd.ui.style.itemPadding
6565
import li.songe.gkd.ui.style.titleItemPadding
6666
import li.songe.gkd.util.ISSUES_URL
67+
import li.songe.gkd.util.LocalMainViewModel
6768
import li.songe.gkd.util.LocalNavController
6869
import li.songe.gkd.util.ProfileTransitions
6970
import li.songe.gkd.util.REPOSITORY_URL
@@ -87,7 +88,8 @@ import li.songe.gkd.util.toast
8788
@Composable
8889
fun AboutPage() {
8990
val navController = LocalNavController.current
90-
val context = LocalContext.current as MainActivity
91+
val context = LocalActivity.current as MainActivity
92+
val mainVm = LocalMainViewModel.current
9193
val store by storeFlow.collectAsState()
9294

9395
var showInfoDlg by remember { mutableStateOf(false) }
@@ -151,7 +153,7 @@ fun AboutPage() {
151153
text = "分享到其他应用", modifier = Modifier
152154
.clickable(onClick = throttle {
153155
showShareLogDlg = false
154-
context.mainVm.viewModelScope.launchTry(Dispatchers.IO) {
156+
mainVm.viewModelScope.launchTry(Dispatchers.IO) {
155157
val logZipFile = buildLogFile()
156158
context.shareFile(logZipFile, "分享日志文件")
157159
}
@@ -162,7 +164,7 @@ fun AboutPage() {
162164
text = "保存到下载", modifier = Modifier
163165
.clickable(onClick = throttle {
164166
showShareLogDlg = false
165-
context.mainVm.viewModelScope.launchTry(Dispatchers.IO) {
167+
mainVm.viewModelScope.launchTry(Dispatchers.IO) {
166168
val logZipFile = buildLogFile()
167169
context.saveFileToDownloads(logZipFile)
168170
}
@@ -174,7 +176,7 @@ fun AboutPage() {
174176
modifier = Modifier
175177
.clickable(onClick = throttle {
176178
showShareLogDlg = false
177-
context.mainVm.uploadOptions.startTask(
179+
mainVm.uploadOptions.startTask(
178180
getFile = { buildLogFile() }
179181
)
180182
})
@@ -278,7 +280,7 @@ fun AboutPage() {
278280
)
279281
}
280282
if (META.updateEnabled) {
281-
val checkUpdating by context.mainVm.updateStatus.checkUpdatingFlow.collectAsState()
283+
val checkUpdating by mainVm.updateStatus.checkUpdatingFlow.collectAsState()
282284
Text(
283285
text = "更新",
284286
modifier = Modifier.titleItemPadding(),
@@ -299,10 +301,10 @@ fun AboutPage() {
299301
title = "更新渠道",
300302
option = UpdateChannelOption.allSubObject.findOption(store.updateChannel)
301303
) {
302-
if (context.mainVm.updateStatus.checkUpdatingFlow.value) return@TextMenu
304+
if (mainVm.updateStatus.checkUpdatingFlow.value) return@TextMenu
303305
if (it.value == UpdateChannelOption.Beta.value) {
304-
context.mainVm.viewModelScope.launchTry {
305-
context.mainVm.dialogFlow.waitResult(
306+
mainVm.viewModelScope.launchTry {
307+
mainVm.dialogFlow.waitResult(
306308
title = "版本渠道",
307309
text = "测试版本渠道更新快\n但不稳定可能存在较多BUG\n请谨慎使用",
308310
)
@@ -316,9 +318,9 @@ fun AboutPage() {
316318
Row(
317319
modifier = Modifier
318320
.clickable(
319-
onClick = throttle(fn = context.mainVm.viewModelScope.launchAsFn {
320-
if (context.mainVm.updateStatus.checkUpdatingFlow.value) return@launchAsFn
321-
val newVersion = context.mainVm.updateStatus.checkUpdate()
321+
onClick = throttle(fn = mainVm.viewModelScope.launchAsFn {
322+
if (mainVm.updateStatus.checkUpdatingFlow.value) return@launchAsFn
323+
val newVersion = mainVm.updateStatus.checkUpdate()
322324
if (newVersion == null) {
323325
toast("暂无更新")
324326
}
@@ -372,8 +374,8 @@ fun AboutPage() {
372374
private fun AnimatedLogoIcon(
373375
modifier: Modifier = Modifier
374376
) {
375-
val context = LocalContext.current as MainActivity
376-
val enableDarkTheme by context.mainVm.enableDarkThemeFlow.collectAsState()
377+
val mainVm = LocalMainViewModel.current
378+
val enableDarkTheme by mainVm.enableDarkThemeFlow.collectAsState()
377379
val darkTheme = enableDarkTheme ?: isSystemInDarkTheme()
378380
var atEnd by remember { mutableStateOf(false) }
379381
val animation = AnimatedImageVector.animatedVectorResource(id = SafeR.ic_logo_animation)

app/src/main/kotlin/li/songe/gkd/ui/ActionLogPage.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package li.songe.gkd.ui
22

3-
import androidx.activity.compose.LocalActivity
43
import androidx.compose.foundation.background
54
import androidx.compose.foundation.clickable
65
import androidx.compose.foundation.layout.Column
@@ -54,7 +53,6 @@ import com.ramcosta.composedestinations.generated.destinations.SubsAppGroupListP
5453
import com.ramcosta.composedestinations.utils.toDestinationsNavigator
5554
import kotlinx.coroutines.flow.SharingStarted
5655
import kotlinx.coroutines.flow.stateIn
57-
import li.songe.gkd.MainActivity
5856
import li.songe.gkd.data.ActionLog
5957
import li.songe.gkd.data.ExcludeData
6058
import li.songe.gkd.data.RawSubscription
@@ -72,6 +70,7 @@ import li.songe.gkd.ui.component.waitResult
7270
import li.songe.gkd.ui.style.EmptyHeight
7371
import li.songe.gkd.ui.style.itemHorizontalPadding
7472
import li.songe.gkd.ui.style.scaffoldPadding
73+
import li.songe.gkd.util.LocalMainViewModel
7574
import li.songe.gkd.util.LocalNavController
7675
import li.songe.gkd.util.ProfileTransitions
7776
import li.songe.gkd.util.appInfoCacheFlow
@@ -88,7 +87,7 @@ fun ActionLogPage(
8887
subsId: Long? = null,
8988
appId: String? = null,
9089
) {
91-
val context = LocalActivity.current as MainActivity
90+
val mainVm = LocalMainViewModel.current
9291
val navController = LocalNavController.current
9392
val vm = viewModel<ActionLogVm>()
9493
val actionDataItems = vm.pagingDataFlow.collectAsLazyPagingItems()
@@ -128,15 +127,15 @@ fun ActionLogPage(
128127
},
129128
actions = {
130129
if (actionDataItems.itemCount > 0) {
131-
IconButton(onClick = throttle(fn = context.mainVm.viewModelScope.launchAsFn {
130+
IconButton(onClick = throttle(fn = mainVm.viewModelScope.launchAsFn {
132131
val text = if (subsId != null) {
133132
"确定删除当前订阅所有触发记录?"
134133
} else if (appId != null) {
135134
"确定删除当前应用所有触发记录?"
136135
} else {
137136
"确定删除所有触发记录?"
138137
}
139-
context.mainVm.dialogFlow.waitResult(
138+
mainVm.dialogFlow.waitResult(
140139
title = "删除记录",
141140
text = text,
142141
error = true,
@@ -213,7 +212,7 @@ private fun ActionLogCard(
213212
subsId: Long?,
214213
appId: String?,
215214
) {
216-
val context = LocalActivity.current as MainActivity
215+
val mainVm = LocalMainViewModel.current
217216
val (actionLog, group, rule) = item
218217
val lastActionLog = lastItem?.first
219218
val isDiffApp = actionLog.appId != lastActionLog?.appId
@@ -274,7 +273,7 @@ private fun ActionLogCard(
274273
text = subscription?.name ?: "id=${actionLog.subsId}",
275274
modifier = Modifier.clickable(onClick = throttle {
276275
if (subsItemsFlow.value.any { it.id == actionLog.subsId }) {
277-
context.mainVm.sheetSubsIdFlow.value = actionLog.subsId
276+
mainVm.sheetSubsIdFlow.value = actionLog.subsId
278277
} else {
279278
toast("订阅不存在")
280279
}

app/src/main/kotlin/li/songe/gkd/ui/AdvancedPage.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ import li.songe.gkd.ui.component.updateDialogOptions
8181
import li.songe.gkd.ui.style.EmptyHeight
8282
import li.songe.gkd.ui.style.itemPadding
8383
import li.songe.gkd.ui.style.titleItemPadding
84+
import li.songe.gkd.util.LocalMainViewModel
8485
import li.songe.gkd.util.LocalNavController
8586
import li.songe.gkd.util.ProfileTransitions
8687
import li.songe.gkd.util.ShortUrlSet
@@ -98,6 +99,7 @@ import rikka.shizuku.Shizuku
9899
@Composable
99100
fun AdvancedPage() {
100101
val context = LocalActivity.current as MainActivity
102+
val mainVm = LocalMainViewModel.current
101103
val vm = viewModel<AdvancedVm>()
102104
val navController = LocalNavController.current
103105
val store by storeFlow.collectAsState()
@@ -204,7 +206,7 @@ fun AdvancedPage() {
204206
Shizuku.requestPermission(Activity.RESULT_OK)
205207
} catch (e: Exception) {
206208
LogUtils.d("Shizuku授权错误", e.message)
207-
context.mainVm.shizukuErrorFlow.value = true
209+
mainVm.shizukuErrorFlow.value = true
208210
}
209211
})
210212
ShizukuFragment(false)
@@ -367,7 +369,7 @@ fun AdvancedPage() {
367369
subtitle = "触发截屏时保存快照",
368370
suffix = "查看限制",
369371
onSuffixClick = {
370-
context.mainVm.dialogFlow.updateDialogOptions(
372+
mainVm.dialogFlow.updateDialogOptions(
371373
title = "限制说明",
372374
text = "仅支持部分小米设备截屏触发\n\n只保存节点信息不保存图片, 用户需要在快照记录里替换截图",
373375
)
@@ -408,7 +410,7 @@ fun AdvancedPage() {
408410
},
409411
imageVector = Icons.Outlined.Edit,
410412
onClick = {
411-
context.mainVm.showEditCookieDlgFlow.value = true
413+
mainVm.showEditCookieDlgFlow.value = true
412414
}
413415
)
414416

@@ -447,7 +449,7 @@ fun AdvancedPage() {
447449
subtitle = "添加透明悬浮窗",
448450
suffix = "查看作用",
449451
onSuffixClick = {
450-
context.mainVm.dialogFlow.updateDialogOptions(
452+
mainVm.dialogFlow.updateDialogOptions(
451453
title = "悬浮窗作用",
452454
text = "1.提高 GKD 前台优先级, 降低被系统杀死概率\n2.提高点击响应速度, 关闭后可能导致点击缓慢或不点击",
453455
)
@@ -530,7 +532,7 @@ private fun ShizukuFragment(enabled: Boolean = true) {
530532

531533
@Composable
532534
private fun ShizukuTitleCard() {
533-
val context = LocalActivity.current as MainActivity
535+
val mainVm = LocalMainViewModel.current
534536
Row(
535537
modifier = Modifier
536538
.fillMaxWidth()
@@ -547,7 +549,7 @@ private fun ShizukuTitleCard() {
547549
if (shizukuVersionCode != null && shizukuVersionCode < shizukuMiniVersionCode) {
548550
Row(
549551
modifier = Modifier.clickable(onClick = throttle {
550-
context.mainVm.dialogFlow.updateDialogOptions(
552+
mainVm.dialogFlow.updateDialogOptions(
551553
title = "版本过低",
552554
text = "检测到 Shizuku 版本过低, 可能影响 GKD 正常运行, 建议自行更新至最新版本后再使用",
553555
)

app/src/main/kotlin/li/songe/gkd/ui/AppConfigPage.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package li.songe.gkd.ui
22

3-
import androidx.activity.compose.LocalActivity
43
import androidx.compose.animation.core.AnimationConstants
54
import androidx.compose.foundation.layout.Box
65
import androidx.compose.foundation.layout.Column
@@ -50,7 +49,6 @@ import com.ramcosta.composedestinations.generated.destinations.SubsAppGroupListP
5049
import com.ramcosta.composedestinations.utils.toDestinationsNavigator
5150
import kotlinx.coroutines.delay
5251
import kotlinx.coroutines.flow.update
53-
import li.songe.gkd.MainActivity
5452
import li.songe.gkd.data.ResolvedGroup
5553
import li.songe.gkd.ui.component.AppNameText
5654
import li.songe.gkd.ui.component.EmptyText
@@ -62,6 +60,7 @@ import li.songe.gkd.ui.style.menuPadding
6260
import li.songe.gkd.ui.style.scaffoldPadding
6361
import li.songe.gkd.ui.style.titleItemPadding
6462
import li.songe.gkd.util.LOCAL_SUBS_ID
63+
import li.songe.gkd.util.LocalMainViewModel
6564
import li.songe.gkd.util.LocalNavController
6665
import li.songe.gkd.util.ProfileTransitions
6766
import li.songe.gkd.util.RuleSortOption
@@ -73,7 +72,7 @@ import li.songe.gkd.util.throttle
7372
@Destination<RootGraph>(style = ProfileTransitions::class)
7473
@Composable
7574
fun AppConfigPage(appId: String) {
76-
val context = LocalActivity.current as MainActivity
75+
val mainVm = LocalMainViewModel.current
7776
val navController = LocalNavController.current
7877
val vm = viewModel<AppConfigVm>()
7978
val ruleSortType by vm.ruleSortTypeFlow.collectAsState()
@@ -166,11 +165,11 @@ fun AppConfigPage(appId: String) {
166165
},
167166
floatingActionButton = {
168167
FloatingActionButton(
169-
onClick = throttle(context.mainVm.viewModelScope.launchAsFn {
168+
onClick = throttle(mainVm.viewModelScope.launchAsFn {
170169
navController.toDestinationsNavigator()
171170
.navigate(SubsAppGroupListPageDestination(LOCAL_SUBS_ID, appId))
172171
delay(AnimationConstants.DefaultDurationMillis + 150L)
173-
context.mainVm.ruleGroupState.editOrAddGroupFlow.value = ShowGroupState(
172+
mainVm.ruleGroupState.editOrAddGroupFlow.value = ShowGroupState(
174173
subsId = LOCAL_SUBS_ID,
175174
appId = appId,
176175
groupKey = null

0 commit comments

Comments
 (0)