| // 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() |
| } |
| } |