MainFlutterWindow.swift 2.79 KB
Newer Older
1 2 3 4 5 6 7
// 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

8
class MainFlutterWindow: NSWindow {
9
  private let powerSource = PowerSource()
10
  private let stateChangeHandler = PowerSourceStateChangeHandler()
11 12 13
  private var eventSink: FlutterEventSink?

  override func awakeFromNib() {
14
    let flutterViewController = FlutterViewController()
15 16
    let windowFrame = self.frame
    self.contentViewController = flutterViewController
17
    self.displayIfNeeded()
18 19 20 21 22 23 24
    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)
25
    batteryChannel.setMethodCallHandler { [powerSource = self.powerSource] (call, result) in
26 27
      switch call.method {
      case "getBatteryLevel":
28 29 30 31 32 33
        guard powerSource.hasBattery() else {
          result(
            FlutterError(
              code: "NO_BATTERY",
              message: "Device does not have a battery",
              details: nil))
34 35
          return
        }
36
        guard let level = powerSource.getCurrentCapacity() else {
37 38 39 40 41
          result(
            FlutterError(
              code: "UNAVAILABLE",
              message: "Battery info unavailable",
              details: nil))
42
          return
43 44 45 46 47
        }
        result(level)
      default:
        result(FlutterMethodNotImplemented)
      }
48
    }
49 50 51 52 53 54 55 56 57 58 59 60

    // Register charging event channel.
    let chargingChannel = FlutterEventChannel(
      name: "samples.flutter.io/charging",
      binaryMessenger: registrar.messenger)
    chargingChannel.setStreamHandler(self)

    RegisterGeneratedPlugins(registry: flutterViewController)

    super.awakeFromNib()
  }

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
  /// 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 {
77 78 79 80 81
  func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink)
    -> FlutterError?
  {
    self.eventSink = events
    self.emitPowerStatusEvent()
82
    self.stateChangeHandler.delegate = self
83 84 85 86
    return nil
  }

  func onCancel(withArguments arguments: Any?) -> FlutterError? {
87
    self.stateChangeHandler.delegate = nil
88 89 90
    self.eventSink = nil
    return nil
  }
91
}
92

93 94
extension MainFlutterWindow: PowerSourceStateChangeDelegate {
  func didChangePowerSourceState() {
95 96 97
    self.emitPowerStatusEvent()
  }
}