// 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 "AppDelegate.h" #import #import "GeneratedPluginRegistrant.h" @interface AppDelegate () @end @implementation AppDelegate { FlutterEventSink _eventSink; } - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { self.pluginRegistrant = self; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (void)registerWithRegistry:(NSObject*)registry { [GeneratedPluginRegistrant registerWithRegistry:registry]; NSObject* registrar = [registry registrarForPlugin:@"samples.flutter.io"]; FlutterMethodChannel* batteryChannel = [FlutterMethodChannel methodChannelWithName:@"samples.flutter.io/battery" binaryMessenger:registrar.messenger]; __weak typeof(self) weakSelf = self; [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { if ([@"getBatteryLevel" isEqualToString:call.method]) { int batteryLevel = [weakSelf getBatteryLevel]; if (batteryLevel == -1) { result([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Battery info unavailable" details:nil]); } else { result(@(batteryLevel)); } } else { result(FlutterMethodNotImplemented); } }]; FlutterEventChannel* chargingChannel = [FlutterEventChannel eventChannelWithName:@"samples.flutter.io/charging" binaryMessenger:registrar.messenger]; [chargingChannel setStreamHandler:self]; } - (int)getBatteryLevel { UIDevice* device = UIDevice.currentDevice; device.batteryMonitoringEnabled = YES; if (device.batteryState == UIDeviceBatteryStateUnknown) { return -1; } else { return ((int)(device.batteryLevel * 100)); } } - (FlutterError*)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)eventSink { _eventSink = eventSink; [[UIDevice currentDevice] setBatteryMonitoringEnabled:YES]; [self sendBatteryStateEvent]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onBatteryStateDidChange:) name:UIDeviceBatteryStateDidChangeNotification object:nil]; return nil; } - (void)onBatteryStateDidChange:(NSNotification*)notification { [self sendBatteryStateEvent]; } - (void)sendBatteryStateEvent { if (!_eventSink) return; UIDeviceBatteryState state = [[UIDevice currentDevice] batteryState]; switch (state) { case UIDeviceBatteryStateFull: case UIDeviceBatteryStateCharging: _eventSink(@"charging"); break; case UIDeviceBatteryStateUnplugged: _eventSink(@"discharging"); break; default: _eventSink([FlutterError errorWithCode:@"UNAVAILABLE" message:@"Charging status unavailable" details:nil]); break; } } - (FlutterError*)onCancelWithArguments:(id)arguments { [[NSNotificationCenter defaultCenter] removeObserver:self]; _eventSink = nil; return nil; } @end