Skip to content

Commit 6b3419e

Browse files
authored
Display dynamic island indication when db is updating (#4230)
<!-- Thank you for submitting a Pull Request and helping to improve Home Assistant. Please complete the following sections to help the processing and review of your changes. Please do not delete anything from this template. --> ## Summary <!-- Provide a brief summary of the changes you have made and most importantly what they aim to achieve --> ## Screenshots <!-- If this is a user-facing change not in the frontend, please include screenshots in light and dark mode. --> <img width="1796" height="804" alt="CleanShot 2026-01-16 at 13 11 31@2x" src="https://github.com/user-attachments/assets/4c0be252-f3b6-4ff5-b27e-8b11f19eaee4" /> ## Link to pull request in Documentation repository <!-- Pull requests that add, change or remove functionality must have a corresponding pull request in the Companion App Documentation repository (https://github.com/home-assistant/companion.home-assistant). Please add the number of this pull request after the "#" --> Documentation: home-assistant/companion.home-assistant# ## Any other notes <!-- If there is any other information of note, like if this Pull Request is part of a bigger change, please include it here. -->
1 parent 591f5a6 commit 6b3419e

File tree

17 files changed

+206
-92
lines changed

17 files changed

+206
-92
lines changed

HomeAssistant.xcodeproj/project.pbxproj

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -569,11 +569,6 @@
569569
420B10042B1CF6D800D383D8 /* SharedAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 420B10032B1CF6D800D383D8 /* SharedAssets.xcassets */; };
570570
420B10092B1D12DD00D383D8 /* Colors.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 420B10082B1D129B00D383D8 /* Colors.xcassets */; };
571571
420B100C2B1D204400D383D8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 420B100B2B1D204400D383D8 /* Assets.xcassets */; };
572-
420BE13B2F0FE50C00E20584 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1372F0FE50C00E20584 /* Toast.swift */; };
573-
420BE13C2F0FE50C00E20584 /* WindowExtractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1392F0FE50C00E20584 /* WindowExtractor.swift */; };
574-
420BE13D2F0FE50C00E20584 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1382F0FE50C00E20584 /* ToastView.swift */; };
575-
420BE13E2F0FE50C00E20584 /* PassThroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1362F0FE50C00E20584 /* PassThroughWindow.swift */; };
576-
420BE1412F0FE5B000E20584 /* ToastHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1402F0FE5B000E20584 /* ToastHostingController.swift */; };
577572
420C1BB22CF7DA9100AF22E7 /* ClientEventsLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C1BB12CF7DA9100AF22E7 /* ClientEventsLogView.swift */; };
578573
420C1BB52CF7DC1400AF22E7 /* ClientEventsLogViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C1BB42CF7DC1400AF22E7 /* ClientEventsLogViewModel.swift */; };
579574
420C91502F0C6CAC005D04A6 /* HomeViewCustomizationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420C914F2F0C6CAC005D04A6 /* HomeViewCustomizationView.swift */; };
@@ -902,6 +897,15 @@
902897
429481EB2DA93FA000A8B468 /* WebViewJavascriptCommandsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 429481EA2DA93FA000A8B468 /* WebViewJavascriptCommandsTests.swift */; };
903898
429481ED2DA943E700A8B468 /* ListPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 429481EC2DA943E700A8B468 /* ListPicker.swift */; };
904899
429481EF2DA94B9900A8B468 /* ListPickerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 429481EE2DA94B9900A8B468 /* ListPickerTests.swift */; };
900+
42955C1F2F1A54B700E398E8 /* ToastManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EABD2F0FFB1900FA249B /* ToastManager.swift */; };
901+
42955C202F1A54B700E398E8 /* ToastShowPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EAB22F0FF88800FA249B /* ToastShowPayload.swift */; };
902+
42955C212F1A54B700E398E8 /* ToastHidePayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EAB92F0FF90500FA249B /* ToastHidePayload.swift */; };
903+
42955C222F1A550B00E398E8 /* ExternalBusPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EAB72F0FF8EB00FA249B /* ExternalBusPayload.swift */; };
904+
42955C232F1A552A00E398E8 /* PassThroughWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1362F0FE50C00E20584 /* PassThroughWindow.swift */; };
905+
42955C242F1A552A00E398E8 /* WindowExtractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1392F0FE50C00E20584 /* WindowExtractor.swift */; };
906+
42955C252F1A552A00E398E8 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1382F0FE50C00E20584 /* ToastView.swift */; };
907+
42955C262F1A552A00E398E8 /* ToastHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1402F0FE5B000E20584 /* ToastHostingController.swift */; };
908+
42955C272F1A552A00E398E8 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420BE1372F0FE50C00E20584 /* Toast.swift */; };
905909
4296C36D2B90DB640051B63C /* IntentActionAppEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4296C36B2B90DB630051B63C /* IntentActionAppEntity.swift */; };
906910
4296C36E2B90DB640051B63C /* PerformAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4296C36C2B90DB630051B63C /* PerformAction.swift */; };
907911
4296C3762B91F0F50051B63C /* WidgetActionsAppIntentTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4296C3742B91F0860051B63C /* WidgetActionsAppIntentTimelineProvider.swift */; };
@@ -1072,10 +1076,6 @@
10721076
42D5ACCE2C636F2B00D9C4E2 /* WatchConfigurationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D5ACCD2C636F2B00D9C4E2 /* WatchConfigurationViewModel.swift */; };
10731077
42D5ACD92C64C0E000D9C4E2 /* MagicItemAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D5ACD82C64C0E000D9C4E2 /* MagicItemAddView.swift */; };
10741078
42D5ACDB2C64C82600D9C4E2 /* MagicItemAddViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D5ACDA2C64C82600D9C4E2 /* MagicItemAddViewModel.swift */; };
1075-
42D6EAB32F0FF88800FA249B /* ToastShowPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EAB22F0FF88800FA249B /* ToastShowPayload.swift */; };
1076-
42D6EAB82F0FF8EB00FA249B /* ExternalBusPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EAB72F0FF8EB00FA249B /* ExternalBusPayload.swift */; };
1077-
42D6EABA2F0FF90500FA249B /* ToastHidePayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EAB92F0FF90500FA249B /* ToastHidePayload.swift */; };
1078-
42D6EABE2F0FFB1900FA249B /* ToastManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D6EABD2F0FFB1900FA249B /* ToastManager.swift */; };
10791079
42D996E52D89863A001737A0 /* Bool+HA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D996E42D89863A001737A0 /* Bool+HA.swift */; };
10801080
42D996E62D89863A001737A0 /* Bool+HA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D996E42D89863A001737A0 /* Bool+HA.swift */; };
10811081
42DB4D0B2CEE292D00F6C20D /* AppEntitiesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4297ADA42C89C43F00790812 /* AppEntitiesModel.swift */; };
@@ -6157,17 +6157,17 @@
61576157
isa = PBXGroup;
61586158
children = (
61596159
42D6EAB72F0FF8EB00FA249B /* ExternalBusPayload.swift */,
6160-
42D6EABB2F0FF96400FA249B /* Toast */,
6160+
42D6EAB22F0FF88800FA249B /* ToastShowPayload.swift */,
6161+
42D6EAB92F0FF90500FA249B /* ToastHidePayload.swift */,
61616162
);
61626163
path = ExternalMessageModels;
61636164
sourceTree = "<group>";
61646165
};
61656166
42D6EABB2F0FF96400FA249B /* Toast */ = {
61666167
isa = PBXGroup;
61676168
children = (
6169+
420BE13A2F0FE50C00E20584 /* DynamicIslandToast */,
61686170
42D6EABD2F0FFB1900FA249B /* ToastManager.swift */,
6169-
42D6EAB22F0FF88800FA249B /* ToastShowPayload.swift */,
6170-
42D6EAB92F0FF90500FA249B /* ToastHidePayload.swift */,
61716171
);
61726172
path = Toast;
61736173
sourceTree = "<group>";
@@ -6177,7 +6177,6 @@
61776177
children = (
61786178
42DD84142B14D68C00936F16 /* WebViewExternalBusMessage.swift */,
61796179
42A47A842C45218D00C9B43D /* WebViewExternalMessageHandler.swift */,
6180-
42D6EAB62F0FF8BD00FA249B /* ExternalMessageModels */,
61816180
);
61826181
path = ExternalMessageBus;
61836182
sourceTree = "<group>";
@@ -6866,7 +6865,6 @@
68666865
B679B1FA1E1F3D020071D366 /* Utilities */ = {
68676866
isa = PBXGroup;
68686867
children = (
6869-
420BE13A2F0FE50C00E20584 /* DynamicIslandToast */,
68706868
396F2B4C2C121D2B002F84FD /* Extensions */,
68716869
11DA6B4A27137A60008ADFAF /* InputAccessoryView.swift */,
68726870
115DA28C24F4646500C00BB1 /* MenuManager.swift */,
@@ -7059,6 +7057,8 @@
70597057
428EDB672DAFD9B900A271A1 /* HAEntity+DeviceClass.swift */,
70607058
42F1DA732B4FF9F8002729BC /* MaterialDesignIcons+CarPlay.swift */,
70617059
4206DE582E25045400142E85 /* WebsiteDataStoreHandler.swift */,
7060+
42D6EAB62F0FF8BD00FA249B /* ExternalMessageModels */,
7061+
42D6EABB2F0FF96400FA249B /* Toast */,
70627062
4251AABD2C6CE230004CCC9D /* MagicItem */,
70637063
4264906A2C0F1B40002155CC /* Assist */,
70647064
426740A42B17348700C1DD73 /* Assets */,
@@ -9082,10 +9082,6 @@
90829082
420FE8502B556F7500878E06 /* CarPlayEntitiesListTemplate+Build.swift in Sources */,
90839083
42B95B522BE007E30070F2D4 /* SafeScriptMessageHandler.swift in Sources */,
90849084
42C60F972F08037C0071A6F6 /* SwitchControlsViewModel.swift in Sources */,
9085-
420BE13B2F0FE50C00E20584 /* Toast.swift in Sources */,
9086-
420BE13C2F0FE50C00E20584 /* WindowExtractor.swift in Sources */,
9087-
420BE13D2F0FE50C00E20584 /* ToastView.swift in Sources */,
9088-
420BE13E2F0FE50C00E20584 /* PassThroughWindow.swift in Sources */,
90899085
4228CFFF2DB8E7DD00FC6912 /* WebViewScriptMessageHandler.swift in Sources */,
90909086
11F55EBC25D3A2A3003977AC /* NotificationCategoryListViewController.swift in Sources */,
90919087
1100D51F2496F63400B1073C /* ThemeColors.swift in Sources */,
@@ -9120,17 +9116,14 @@
91209116
42FCCFFA2B9B1C310057783F /* ThreadCredentialsSharingToKeychainViewModel.swift in Sources */,
91219117
42DF7DDE2EC53D50003F3C4A /* SettingsItem.swift in Sources */,
91229118
42C60F9D2F080EE70071A6F6 /* CoverControlsViewModel.swift in Sources */,
9123-
42D6EAB82F0FF8EB00FA249B /* ExternalBusPayload.swift in Sources */,
91249119
B6617EED1CFE79AD004DEE6D /* NSURL+QueryDictionary.swift in Sources */,
91259120
426AB2342EF2A7D400FD5D46 /* ControlOpenSwitch.swift in Sources */,
9126-
42D6EAB32F0FF88800FA249B /* ToastShowPayload.swift in Sources */,
91279121
426AB2352EF2A7D400FD5D46 /* ControlOpenCoverEntityValueProvider.swift in Sources */,
91289122
426AB2362EF2A7D400FD5D46 /* ControlOpenInputBooleanValueProvider.swift in Sources */,
91299123
42C60FAD2F0BEA630071A6F6 /* EditRoomEntitiesView.swift in Sources */,
91309124
426AB2372EF2A7D400FD5D46 /* ControlOpenCamera.swift in Sources */,
91319125
426AB2382EF2A7D400FD5D46 /* ControlOpenLockValueProvider.swift in Sources */,
91329126
426AB2392EF2A7D400FD5D46 /* ControlOpenLightValueProvider.swift in Sources */,
9133-
420BE1412F0FE5B000E20584 /* ToastHostingController.swift in Sources */,
91349127
426AB23A2EF2A7D400FD5D46 /* ControlOpenSensorValueProvider.swift in Sources */,
91359128
426AB23B2EF2A7D400FD5D46 /* ControlOpenSwitchValueProvider.swift in Sources */,
91369129
426AB23C2EF2A7D400FD5D46 /* ControlOpenCoverEntity.swift in Sources */,
@@ -9372,7 +9365,6 @@
93729365
42A47A902C4548E100C9B43D /* ImprovDiscoverView.swift in Sources */,
93739366
113FB1132515A065000AC680 /* ScaleFactorMutator.swift in Sources */,
93749367
4296C37A2B9205450051B63C /* WidgetActionsAppIntent.swift in Sources */,
9375-
42D6EABE2F0FFB1900FA249B /* ToastManager.swift in Sources */,
93769368
428ED98B2E9E4FBF0019113B /* CheckmarkDrawOnView.swift in Sources */,
93779369
1185DFB3271FF53800ED7D9A /* OnboardingAuthStepSensors.swift in Sources */,
93789370
11108D632634C8FE009DAB0F /* LearnMoreButtonRow.swift in Sources */,
@@ -9448,7 +9440,6 @@
94489440
425573CE2B5574F100145217 /* CarPlayAreasViewModel.swift in Sources */,
94499441
42BA1BC92C8864C200A2FC36 /* OpenPageAppIntent.swift in Sources */,
94509442
423622A02F05587800391BD0 /* EntityIconColorProvider.swift in Sources */,
9451-
42D6EABA2F0FF90500FA249B /* ToastHidePayload.swift in Sources */,
94529443
427FEE0E2D9C22310047C00C /* ManualURLEntryView.swift in Sources */,
94539444
428D31A52D0B33AF0025B1D7 /* WidgetSensorsConfig.swift in Sources */,
94549445
119A827C252A3C4700D7000D /* NFCNDEFPayload+Additions.swift in Sources */,
@@ -9968,6 +9959,11 @@
99689959
11AF4D1C249C8AA0006C74C0 /* BatterySensor.swift in Sources */,
99699960
D014EEA92128E192008EA6F5 /* ConnectionInfo.swift in Sources */,
99709961
424151FC2CD8F27100D7A6F9 /* CarPlayConfig.swift in Sources */,
9962+
42955C232F1A552A00E398E8 /* PassThroughWindow.swift in Sources */,
9963+
42955C242F1A552A00E398E8 /* WindowExtractor.swift in Sources */,
9964+
42955C252F1A552A00E398E8 /* ToastView.swift in Sources */,
9965+
42955C262F1A552A00E398E8 /* ToastHostingController.swift in Sources */,
9966+
42955C272F1A552A00E398E8 /* Toast.swift in Sources */,
99719967
11169BC8262BE460005EF90A /* UNNotificationContent+Additions.swift in Sources */,
99729968
42A3B63B2BD91854007BC0F3 /* Color+Codable.swift in Sources */,
99739969
11AF4D14249C7E09006C74C0 /* ActivitySensor.swift in Sources */,
@@ -9983,6 +9979,7 @@
99839979
11F20BFC274D5DA900DFB163 /* Server+Fakes.swift in Sources */,
99849980
42B74A5D2D36A47E00C37304 /* CloseButton.swift in Sources */,
99859981
399792712B7F909900231B54 /* MobileAppConfig.swift in Sources */,
9982+
42955C222F1A550B00E398E8 /* ExternalBusPayload.swift in Sources */,
99869983
D0EEF320214DE3B300D1D360 /* Strings.swift in Sources */,
99879984
42FDCA2B2F0C88A100C92958 /* AppEntityRegistryTable.swift in Sources */,
99889985
11CFD784273662DF0082D557 /* Server.swift in Sources */,
@@ -10003,6 +10000,9 @@
1000310000
117675EF252D5CA80047B1D3 /* WebhookResponseUpdateComplications.swift in Sources */,
1000410001
4298587E2EB1025E00E33710 /* LocationManager.swift in Sources */,
1000510002
11B6774D28303D35006E9B1A /* SecurityExceptions.swift in Sources */,
10003+
42955C1F2F1A54B700E398E8 /* ToastManager.swift in Sources */,
10004+
42955C202F1A54B700E398E8 /* ToastShowPayload.swift in Sources */,
10005+
42955C212F1A54B700E398E8 /* ToastHidePayload.swift in Sources */,
1000610006
110AA55C25B36630005061A0 /* ServerAlerter.swift in Sources */,
1000710007
4278C9C12C8F226500A7B5F4 /* GuaranteedMessages.swift in Sources */,
1000810008
11358AEF24FCA8BE0074C4E2 /* ActiveStateManager.swift in Sources */,

Sources/App/AppDelegate.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
6969
// swiftlint:disable prohibit_environment_assignment
7070
Current.backgroundTask = ApplicationBackgroundTaskRunner()
7171

72+
// Initialize UIApplication wrapper for shared framework
73+
Current.application = {
74+
UIApplication.shared
75+
}
76+
7277
Current.isBackgroundRequestsImmediate = { [lifecycleManager] in
7378
if Current.isCatalyst {
7479
return false
@@ -77,10 +82,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
7782
}
7883
}
7984

80-
Current.isForegroundApp = { [lifecycleManager] in
81-
lifecycleManager.isActive
82-
}
83-
8485
#if targetEnvironment(simulator)
8586
Current.tags = SimulatorTagManager()
8687
#else

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1434,3 +1434,6 @@ Home Assistant is open source, advocates for privacy and runs locally in your ho
14341434
"entity_picker.filter.area.all.title" = "All areas";
14351435
"entity_picker.filter.group_by.title" = "Group by";
14361436
"entity_picker.list.area.no_area.title" = "No area";
1437+
"database_updater.toast.title" = "Updating %@";
1438+
"database_updater.toast.syncing" = "Syncing server data...";
1439+
"database_updater.toast.syncing_with_progress" = "Syncing server data... (%d/%d)";

Sources/App/WebView/ExternalMessageBus/WebViewExternalMessageHandler.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,8 @@ final class WebViewExternalMessageHandler: @preconcurrency WebViewExternalMessag
423423
if #available(iOS 18, *) {
424424
ToastManager.shared.show(
425425
id: payload.id,
426-
symbol: .infoCircleFill,
427-
symbolForegroundStyle: (.white, .accentColor),
426+
symbol: SFSymbol.infoCircleFill.rawValue,
427+
symbolForegroundStyle: (.white, .haPrimary),
428428
title: payload.message,
429429
message: "",
430430
duration: payload.duration

Sources/Shared/API/Webhook/Sensors/FocusSensor.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@ final class FocusSensorUpdateSignaler: BaseSensorUpdateSignaler, SensorProviderU
2121
super.observe()
2222
guard !isObserving else { return }
2323
cancellable = Current.focusStatus.trigger.observe { [weak self] _ in
24+
#if os(watchOS)
25+
self?.signal()
26+
#else
2427
// this means that we will double-update the focus sensor if the app is running
2528
// this feels less likely to happen, but allows us to keep the in-app visual state right
2629
if Current.isForegroundApp() {
2730
self?.signal()
2831
}
32+
#endif
2933
}
3034
isObserving = true
3135

0 commit comments

Comments
 (0)