blob: 239c019ddf57b5d53dda2b309aec1686a9a3a5d8 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import Cocoa
import FlutterMacOS
class MainFlutterWindow: NSWindow {
private let powerSource = PowerSource()
private let stateChangeHandler = PowerSourceStateChangeHandler()
private var eventSink: FlutterEventSink?
override func awakeFromNib() {
let flutterViewController = FlutterViewController()
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.displayIfNeeded()
self.setFrame(windowFrame, display: true)
// Register battery method channel.
let registrar = flutterViewController.registrar(forPlugin: "BatteryLevel")
let batteryChannel = FlutterMethodChannel(
name: "samples.flutter.io/battery",
binaryMessenger: registrar.messenger)
batteryChannel.setMethodCallHandler { [powerSource = self.powerSource] (call, result) in
switch call.method {
case "getBatteryLevel":
guard powerSource.hasBattery() else {
result(
FlutterError(
code: "NO_BATTERY",
message: "Device does not have a battery",
details: nil))
return
}
guard let level = powerSource.getCurrentCapacity() else {
result(
FlutterError(
code: "UNAVAILABLE",
message: "Battery info unavailable",
details: nil))
return
}
result(level)
default:
result(FlutterMethodNotImplemented)
}
}
// Register charging event channel.
let chargingChannel = FlutterEventChannel(
name: "samples.flutter.io/charging",
binaryMessenger: registrar.messenger)
chargingChannel.setStreamHandler(self)
RegisterGeneratedPlugins(registry: flutterViewController)
super.awakeFromNib()
}
/// Emit a power status event to the registered event sink.
func emitPowerStatusEvent() {
if let sink = self.eventSink {
switch self.powerSource.getPowerState() {
case .ac:
sink("charging")
case .battery:
sink("discharging")
case .unknown:
sink("UNAVAILABLE")
}
}
}
}
extension MainFlutterWindow: FlutterStreamHandler {
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink)
-> FlutterError?
{
self.eventSink = events
self.emitPowerStatusEvent()
self.stateChangeHandler.delegate = self
return nil
}
func onCancel(withArguments arguments: Any?) -> FlutterError? {
self.stateChangeHandler.delegate = nil
self.eventSink = nil
return nil
}
}
extension MainFlutterWindow: PowerSourceStateChangeDelegate {
func didChangePowerSourceState() {
self.emitPowerStatusEvent()
}
}