Skip to content

Commit 35e52f7

Browse files
authored
Add auto-refresh for WebViewController after 5+ minutes in background with user setting (#4269)
1 parent 2e5f992 commit 35e52f7

File tree

5 files changed

+56
-0
lines changed

5 files changed

+56
-0
lines changed

Sources/App/Resources/en.lproj/Localizable.strings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,7 @@ Home Assistant is open source, advocates for privacy and runs locally in your ho
844844
"settings_details.general.body" = "Basic App configuration, App Icon and web page settings.";
845845
"settings_details.general.device_name.title" = "Device Name";
846846
"settings_details.general.full_screen.title" = "Full Screen";
847+
"settings_details.general.refresh_after_inactive.title" = "Refresh After 5 Min Inactive";
847848
"settings_details.general.launch_on_login.title" = "Launch App on Login";
848849
"settings_details.general.links.title" = "Links";
849850
"settings_details.general.menu_bar_text.title" = "Menu Bar Text";

Sources/App/Scenes/WebViewSceneDelegate.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ final class WebViewSceneDelegate: NSObject, UIWindowSceneDelegate {
1111

1212
private var updateDatabaseTask: Task<Void, Never>?
1313

14+
/// Stores the timestamp when the app enters background, used to determine if auto-refresh is needed on reactivation
15+
var backgroundTimestamp: Date?
16+
17+
/// Time threshold (in seconds) after which WebViewController should refresh when returning from background
18+
private let backgroundRefreshThreshold: TimeInterval = 5 * 60
19+
1420
// swiftlint:disable cyclomatic_complexity
1521
func scene(
1622
_ scene: UIScene,
@@ -119,6 +125,9 @@ final class WebViewSceneDelegate: NSObject, UIWindowSceneDelegate {
119125
DataWidgetsUpdater.update()
120126
Current.modelManager.unsubscribe()
121127
Current.appDatabaseUpdater.stop()
128+
129+
// Record timestamp when app enters background
130+
backgroundTimestamp = Date()
122131
}
123132

124133
func sceneDidBecomeActive(_ scene: UIScene) {
@@ -128,6 +137,22 @@ final class WebViewSceneDelegate: NSObject, UIWindowSceneDelegate {
128137
}
129138
cleanWidgetsCache()
130139
updateLocation()
140+
141+
// Check if app was in background for 5 minutes or more
142+
if let backgroundTimestamp {
143+
let timeInterval = Date().timeIntervalSince(backgroundTimestamp)
144+
145+
if timeInterval >= backgroundRefreshThreshold, Current.settingsStore.refreshWebViewAfterInactive {
146+
// Refresh WebViewController if it exists
147+
// Note: webViewControllerPromise is a Guarantee, which cannot fail in PromiseKit
148+
windowController?.webViewControllerPromise.done { webViewController in
149+
webViewController.refresh()
150+
}
151+
}
152+
153+
// Clear the timestamp
154+
self.backgroundTimestamp = nil
155+
}
131156
}
132157

133158
func windowScene(

Sources/App/Settings/General/GeneralSettingsView.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct GeneralSettingsView: View {
4444
pageZoomPicker
4545
pinchZoom
4646
fullScreen
47+
refreshAfterInactive
4748
}
4849
}
4950
.id(redrawHelper)
@@ -172,6 +173,18 @@ struct GeneralSettingsView: View {
172173
}
173174
}
174175

176+
@ViewBuilder
177+
private var refreshAfterInactive: some View {
178+
Toggle(isOn: .init(get: {
179+
Current.settingsStore.refreshWebViewAfterInactive
180+
}, set: { newValue in
181+
Current.settingsStore.refreshWebViewAfterInactive = newValue
182+
redrawView()
183+
})) {
184+
Text(L10n.SettingsDetails.General.RefreshAfterInactive.title)
185+
}
186+
}
187+
175188
// MARK: - Mac
176189

177190
#if targetEnvironment(macCatalyst)

Sources/Shared/Resources/Swiftgen/Strings.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3219,6 +3219,10 @@ public enum L10n {
32193219
/// Pinch to Zoom
32203220
public static var title: String { return L10n.tr("Localizable", "settings_details.general.pinch_to_zoom.title") }
32213221
}
3222+
public enum RefreshAfterInactive {
3223+
/// Refresh After 5 Min Inactive
3224+
public static var title: String { return L10n.tr("Localizable", "settings_details.general.refresh_after_inactive.title") }
3225+
}
32223226
public enum Restoration {
32233227
/// Remember Last Page
32243228
public static var title: String { return L10n.tr("Localizable", "settings_details.general.restoration.title") }

Sources/Shared/Settings/SettingsStore.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,19 @@ public class SettingsStore {
188188
}
189189
}
190190

191+
public var refreshWebViewAfterInactive: Bool {
192+
get {
193+
if let value = prefs.object(forKey: "refreshWebViewAfterInactive") as? NSNumber {
194+
return value.boolValue
195+
} else {
196+
return true // Default to ON
197+
}
198+
}
199+
set {
200+
prefs.set(newValue, forKey: "refreshWebViewAfterInactive")
201+
}
202+
}
203+
191204
public var macNativeFeaturesOnly: Bool {
192205
get {
193206
prefs.bool(forKey: "macNativeFeaturesOnly")

0 commit comments

Comments
 (0)