Skip to content

Commit

Permalink
Fix crash when closing the macos app from full screen (#2567)
Browse files Browse the repository at this point in the history
<!-- 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 -->
Strong reference was causing a crash when closing macos app from full
screen.

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## 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. -->
  • Loading branch information
bgoncal authored Feb 12, 2024
1 parent 75c5b4a commit 4cc467a
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
6 changes: 6 additions & 0 deletions Sources/App/Scenes/WebViewSceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ final class WebViewSceneDelegate: NSObject, UIWindowSceneDelegate {
#endif
}

func sceneWillResignActive(_ scene: UIScene) {
#if targetEnvironment(macCatalyst)
WindowScenesManager.shared.sceneWillResignActive(scene)
#endif
}

func sceneDidDisconnect(_ scene: UIScene) {
windowController = nil
window = nil
Expand Down
15 changes: 13 additions & 2 deletions Sources/App/Scenes/WindowScenesManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,24 @@ final class WindowScenesManager {
startObservingScene(scene)
}

func sceneWillResignActive(_ scene: UIScene) {
stopObservingScene(scene)
}

func didDiscardScene(_ scene: UIScene) {
stopObservingScene(scene)
}

private func startObservingScene(_ scene: UIWindowScene) {
let observer = WindowSizeObserver(windowScene: scene)
windowSizeObservers.append(observer)
}

func didDiscardScene(_ scene: UIScene) {
windowSizeObservers.removeAll(where: { $0.observedScene == scene })
private func stopObservingScene(_ scene: UIScene) {
windowSizeObservers.first { observer in
observer.observedScene == scene
}?.stopObserving()
windowSizeObservers.removeAll { $0.observedScene == scene }
}

private func sceneFrameIsValid(_ sceneFrame: CGRect, screenSize: CGSize) -> Bool {
Expand Down
10 changes: 8 additions & 2 deletions Sources/App/Scenes/WindowSizeObserver.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Foundation
import Shared
import UIKit

final class WindowSizeObserver: NSObject {
Expand All @@ -8,9 +9,9 @@ final class WindowSizeObserver: NSObject {
init(windowScene: UIWindowScene) {
self.observedScene = windowScene
super.init()
#if targetEnvironment(macCatalyst)

guard Current.isCatalyst else { return }
startObserving()
#endif
}

private func startObserving() {
Expand All @@ -23,6 +24,11 @@ final class WindowSizeObserver: NSObject {
}
#endif
}

public func stopObserving() {
observation?.invalidate()
observation = nil
}
}

enum ScenesWindowSizeConfig {
Expand Down

0 comments on commit 4cc467a

Please sign in to comment.