// Copyright 2017 The Chromium 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 UIKit import Flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate, FlutterStreamHandler { private var eventSink: FlutterEventSink?; override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { GeneratedPluginRegistrant.register(with: self); let controller : FlutterViewController = window?.rootViewController as! FlutterViewController; let batteryChannel = FlutterMethodChannel.init(name: "samples.flutter.io/battery", binaryMessenger: controller); batteryChannel.setMethodCallHandler({ (call: FlutterMethodCall, result: FlutterResult) -> Void in if ("getBatteryLevel" == call.method) { self.receiveBatteryLevel(result: result); } else { result(FlutterMethodNotImplemented); } }); let chargingChannel = FlutterEventChannel.init(name: "samples.flutter.io/charging", binaryMessenger: controller); chargingChannel.setStreamHandler(self); return super.application(application, didFinishLaunchingWithOptions: launchOptions); } private func receiveBatteryLevel(result: FlutterResult) { let device = UIDevice.current; device.isBatteryMonitoringEnabled = true; if (device.batteryState == UIDeviceBatteryState.unknown) { result(FlutterError.init(code: "UNAVAILABLE", message: "Battery info unavailable", details: nil)); } else { result(Int(device.batteryLevel * 100)); } } public func onListen(withArguments arguments: Any?, eventSink: @escaping FlutterEventSink) -> FlutterError? { self.eventSink = eventSink; UIDevice.current.isBatteryMonitoringEnabled = true; self.sendBatteryStateEvent(); NotificationCenter.default.addObserver( self, selector: #selector(onBatteryStateDidChange), name: NSNotification.Name.UIDeviceBatteryStateDidChange, object: nil) return nil; } @objc private func onBatteryStateDidChange(notification: NSNotification) { self.sendBatteryStateEvent(); } private func sendBatteryStateEvent() { if (eventSink == nil) { return; } let state = UIDevice.current.batteryState; switch state { case UIDeviceBatteryState.full: eventSink!("charging"); break; case UIDeviceBatteryState.charging: eventSink!("charging"); break; case UIDeviceBatteryState.unplugged: eventSink!("discharging"); break; default: eventSink!(FlutterError.init(code: "UNAVAILABLE", message: "Charging status unavailable", details: nil)); break; } } public func onCancel(withArguments arguments: Any?) -> FlutterError? { NotificationCenter.default.removeObserver(self); eventSink = nil; return nil; } }