2026-10-19 20:08:27 +02:00
|
|
|
import Cocoa
|
|
|
|
|
import FlutterMacOS
|
|
|
|
|
|
|
|
|
|
class MainFlutterWindow: NSWindow {
|
2026-10-21 16:40:43 +02:00
|
|
|
/// The channel halkyon_app's SecretScreen asks to keep the window out of
|
|
|
|
|
/// screenshots and screen recordings while something secret shows (the
|
|
|
|
|
/// recovery phrase, recovery codes, an authenticator's key), and how many
|
|
|
|
|
/// show: counted, as several may at once.
|
|
|
|
|
private var screenGuard: FlutterMethodChannel?
|
|
|
|
|
private var secretsShown = 0
|
|
|
|
|
|
2026-10-19 20:08:27 +02:00
|
|
|
override func awakeFromNib() {
|
|
|
|
|
let flutterViewController = FlutterViewController()
|
|
|
|
|
let windowFrame = self.frame
|
|
|
|
|
self.contentViewController = flutterViewController
|
|
|
|
|
self.setFrame(windowFrame, display: true)
|
|
|
|
|
|
|
|
|
|
RegisterGeneratedPlugins(registry: flutterViewController)
|
2026-10-21 16:40:43 +02:00
|
|
|
guardScreen(messenger: flutterViewController.engine.binaryMessenger)
|
2026-10-19 20:08:27 +02:00
|
|
|
|
|
|
|
|
super.awakeFromNib()
|
|
|
|
|
}
|
2026-10-21 16:40:43 +02:00
|
|
|
|
|
|
|
|
private func guardScreen(messenger: FlutterBinaryMessenger) {
|
|
|
|
|
let channel = FlutterMethodChannel(
|
|
|
|
|
name: "app.halkyon/screen_guard", binaryMessenger: messenger)
|
|
|
|
|
channel.setMethodCallHandler { [weak self] call, result in
|
|
|
|
|
guard let self = self else {
|
|
|
|
|
result(nil)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
switch call.method {
|
|
|
|
|
case "hold":
|
|
|
|
|
self.secretsShown += 1
|
|
|
|
|
self.sharingType = .none
|
|
|
|
|
result(nil)
|
|
|
|
|
case "release":
|
|
|
|
|
self.secretsShown = max(0, self.secretsShown - 1)
|
|
|
|
|
if self.secretsShown == 0 {
|
|
|
|
|
self.sharingType = .readOnly
|
|
|
|
|
}
|
|
|
|
|
result(nil)
|
|
|
|
|
default:
|
|
|
|
|
result(FlutterMethodNotImplemented)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
screenGuard = channel
|
|
|
|
|
}
|
2026-10-19 20:08:27 +02:00
|
|
|
}
|