// 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(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(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(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 sendBatteryStateEvent() NotificationCenter.default.addObserver( self, selector: #selector(onBatteryStateDidChange), name: NSNotification.Name.UIDeviceBatteryStateDidChange, object: nil) return nil } @objc private func onBatteryStateDidChange(notification: NSNotification) { sendBatteryStateEvent() } private func sendBatteryStateEvent() { if eventSink == nil { return } let state = UIDevice.current.batteryState switch state { case UIDeviceBatteryState.full: eventSink!("charging") case UIDeviceBatteryState.charging: eventSink!("charging") case UIDeviceBatteryState.unplugged: eventSink!("discharging") default: eventSink!(FlutterError(code: "UNAVAILABLE", message: "Charging status unavailable", details: nil)) } } public func onCancel(withArguments arguments: Any?) -> FlutterError? { NotificationCenter.default.removeObserver(self) eventSink = nil return nil } }