android: Home view model no longer re-reads the Wi-Fi SSID on every signal-strength tick (state recomputed only when the transports change); energy plan: no shared network-callback hub, why
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
1 parent
f5b15a0394
commit
5998c0fc46
2 files changed
+19
-6
No files matched your search
+12
-1
@@ -199,7 +199,14 @@ class HomeViewModel(app: Application) : AndroidViewModel(app), VpnStateService.V
|
|||||||
{
|
{
|
||||||
synchronized(underlyingNetworks)
|
synchronized(underlyingNetworks)
|
||||||
{
|
{
|
||||||
underlyingNetworks[network] = capabilities
|
val previous = underlyingNetworks.put(network, capabilities)
|
||||||
|
/* fired on every signal-strength tick: the published state (network
|
||||||
|
* kinds, SSID) only depends on the transports, and reading the SSID
|
||||||
|
* is a system call, so unchanged transports end here */
|
||||||
|
if (previous != null && sameTransports(previous, capabilities))
|
||||||
|
{
|
||||||
|
return
|
||||||
|
}
|
||||||
publishNetworks()
|
publishNetworks()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -214,6 +221,10 @@ class HomeViewModel(app: Application) : AndroidViewModel(app), VpnStateService.V
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun sameTransports(a: NetworkCapabilities, b: NetworkCapabilities): Boolean =
|
||||||
|
a.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == b.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) &&
|
||||||
|
a.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == b.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
|
||||||
|
|
||||||
private fun publishNetworks()
|
private fun publishNetworks()
|
||||||
{
|
{
|
||||||
_networkAvailable.value = underlyingNetworks.isNotEmpty()
|
_networkAvailable.value = underlyingNetworks.isNotEmpty()
|
||||||
|
|||||||
@@ -69,11 +69,13 @@
|
|||||||
Что остаётся: замерить число будильников (`dumpsys alarm`) за ночь и, если вклад велик, добавить в профиль **необязательную** настройку,
|
Что остаётся: замерить число будильников (`dumpsys alarm`) за ночь и, если вклад велик, добавить в профиль **необязательную** настройку,
|
||||||
не меняя умолчание; рекомендовать значения по результатам теста на конкретной сети пользователя.
|
не меняя умолчание; рекомендовать значения по результатам теста на конкретной сети пользователя.
|
||||||
|
|
||||||
### C. Единый хаб сетевых колбэков (средний эффект, средняя сложность)
|
### C. Сетевые колбэки — единый хаб отклонён, исправлен один шумный
|
||||||
`registerNetworkCallback` вызывают минимум семь компонентов: `CharonVpnService`, `NetworkManager`, `NetworkMonitor`,
|
Разбор показал, что хаб не нужен: `NetworkMonitor` и `WhiteListManager` уже отсекают тики уровня сигнала в `onCapabilitiesChanged`,
|
||||||
`WhiteListManager`, `HealthCheckManager`, `PauseManager`, `HomeViewModel`. Каждое изменение сети будит их все и дублирует
|
`PauseManager` регистрируется только на время паузы, проверка здоровья — только при включённой функции и соединённом VPN,
|
||||||
работу (запросы SSID, перепроверки). Сделать один подписчик в приложении, раздающий состояние через `StateFlow`;
|
а `NetworkManager` и `UnderlyingNetworkTracker` в `CharonVpnService` — часть самого туннеля (трогать нельзя по разделу 5).
|
||||||
остальные подписываются на него. Попутно уменьшает риск лимита колбэков (в `HomeViewModel` он уже обрабатывается `catch`).
|
Выигрыш от объединения — единицы вызовов Binder на смену сети при заметном риске для автоподключения и белых списков.
|
||||||
|
Исправлено единственное реальное место: `HomeViewModel.onCapabilitiesChanged` на каждый тик сигнала Wi-Fi заново читал SSID (системный вызов);
|
||||||
|
теперь состояние пересчитывается только при смене транспорта.
|
||||||
|
|
||||||
### D. Опрос переднего приложения в сценариях (средний эффект, низкая сложность)
|
### D. Опрос переднего приложения в сценариях (средний эффект, низкая сложность)
|
||||||
`ScenarioEngine.poll` — каждые 4 с `UsageStatsManager.queryEvents` (IPC), пока есть сценарий с триггером «приложение».
|
`ScenarioEngine.poll` — каждые 4 с `UsageStatsManager.queryEvents` (IPC), пока есть сценарий с триггером «приложение».
|
||||||
|
|||||||
Reference in new issue
Block a user