diff --git a/packages/battery/battery/CHANGELOG.md b/packages/battery/battery/CHANGELOG.md index 2cf470d17e00..a36ee67172bb 100644 --- a/packages/battery/battery/CHANGELOG.md +++ b/packages/battery/battery/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.5 + +* Ported to use platform interface. + ## 1.0.4+1 * Moved everything from battery to battery/battery diff --git a/packages/battery/battery/lib/battery.dart b/packages/battery/battery/lib/battery.dart index 091b001f749f..e3943e49599a 100644 --- a/packages/battery/battery/lib/battery.dart +++ b/packages/battery/battery/lib/battery.dart @@ -4,72 +4,19 @@ import 'dart:async'; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart' show visibleForTesting; +import 'package:battery_platform_interface/battery_platform_interface.dart'; -/// Indicates the current battery state. -enum BatteryState { - /// The battery is completely full of energy. - full, - - /// The battery is currently storing energy. - charging, - - /// The battery is currently losing energy. - discharging -} +export 'package:battery_platform_interface/battery_platform_interface.dart' + show BatteryState; /// API for accessing information about the battery of the device the Flutter /// app is currently running on. class Battery { - /// Initializes the plugin and starts listening for potential platform events. - factory Battery() { - if (_instance == null) { - final MethodChannel methodChannel = - const MethodChannel('plugins.flutter.io/battery'); - final EventChannel eventChannel = - const EventChannel('plugins.flutter.io/charging'); - _instance = Battery.private(methodChannel, eventChannel); - } - return _instance; - } - - /// This constructor is only used for testing and shouldn't be accessed by - /// users of the plugin. It may break or change at any time. - @visibleForTesting - Battery.private(this._methodChannel, this._eventChannel); - - static Battery _instance; - - final MethodChannel _methodChannel; - final EventChannel _eventChannel; - Stream _onBatteryStateChanged; - /// Returns the current battery level in percent. - Future get batteryLevel => _methodChannel - .invokeMethod('getBatteryLevel') - .then((dynamic result) => result); + Future get batteryLevel async => + await BatteryPlatform.instance.batteryLevel(); /// Fires whenever the battery state changes. - Stream get onBatteryStateChanged { - if (_onBatteryStateChanged == null) { - _onBatteryStateChanged = _eventChannel - .receiveBroadcastStream() - .map((dynamic event) => _parseBatteryState(event)); - } - return _onBatteryStateChanged; - } -} - -BatteryState _parseBatteryState(String state) { - switch (state) { - case 'full': - return BatteryState.full; - case 'charging': - return BatteryState.charging; - case 'discharging': - return BatteryState.discharging; - default: - throw ArgumentError('$state is not a valid BatteryState.'); - } + Stream get onBatteryStateChanged => + BatteryPlatform.instance.onBatteryStateChanged(); } diff --git a/packages/battery/battery/pubspec.yaml b/packages/battery/battery/pubspec.yaml index 5e0549a07f97..7cd1b761f0f8 100644 --- a/packages/battery/battery/pubspec.yaml +++ b/packages/battery/battery/pubspec.yaml @@ -2,7 +2,7 @@ name: battery description: Flutter plugin for accessing information about the battery state (full, charging, discharging) on Android and iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/battery/battery -version: 1.0.4+1 +version: 1.0.5 flutter: plugin: @@ -17,13 +17,15 @@ dependencies: flutter: sdk: flutter meta: ^1.0.5 + battery_platform_interface: ^1.0.0 dev_dependencies: async: ^2.0.8 test: ^1.3.0 - mockito: 3.0.0 + mockito: ^4.1.1 flutter_test: sdk: flutter + plugin_platform_interface: ^1.0.0 integration_test: path: ../../integration_test pedantic: ^1.8.0 diff --git a/packages/battery/battery/test/battery_test.dart b/packages/battery/battery/test/battery_test.dart index 93d69604c83a..5c789207d7eb 100644 --- a/packages/battery/battery/test/battery_test.dart +++ b/packages/battery/battery/test/battery_test.dart @@ -4,68 +4,42 @@ import 'dart:async'; -import 'package:async/async.dart'; -import 'package:flutter/services.dart'; +import 'package:battery_platform_interface/battery_platform_interface.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'package:test/test.dart'; import 'package:battery/battery.dart'; import 'package:mockito/mockito.dart'; void main() { - MockMethodChannel methodChannel; - MockEventChannel eventChannel; - Battery battery; - - setUp(() { - methodChannel = MockMethodChannel(); - eventChannel = MockEventChannel(); - battery = Battery.private(methodChannel, eventChannel); - }); - - test('batteryLevel', () async { - when(methodChannel.invokeMethod('getBatteryLevel')) - .thenAnswer((Invocation invoke) => Future.value(42)); - expect(await battery.batteryLevel, 42); - }); - - group('battery state', () { - StreamController controller; - - setUp(() { - controller = StreamController(); - when(eventChannel.receiveBroadcastStream()) - .thenAnswer((Invocation invoke) => controller.stream); - }); - - tearDown(() { - controller.close(); + group('battery', () { + Battery battery; + MockBatteryPlatform fakePlatform; + setUp(() async { + fakePlatform = MockBatteryPlatform(); + BatteryPlatform.instance = fakePlatform; + battery = Battery(); }); - - test('calls receiveBroadcastStream once', () { - battery.onBatteryStateChanged; - battery.onBatteryStateChanged; - battery.onBatteryStateChanged; - verify(eventChannel.receiveBroadcastStream()).called(1); + test('batteryLevel', () async { + int result = await battery.batteryLevel; + expect(result, 42); }); - - test('receive values', () async { - final StreamQueue queue = - StreamQueue(battery.onBatteryStateChanged); - - controller.add("full"); - expect(await queue.next, BatteryState.full); - - controller.add("discharging"); - expect(await queue.next, BatteryState.discharging); - - controller.add("charging"); - expect(await queue.next, BatteryState.charging); - - controller.add("illegal"); - expect(queue.next, throwsArgumentError); + test('onBatteryStateChanged', () async { + BatteryState result = await battery.onBatteryStateChanged.first; + expect(result, BatteryState.full); }); }); } -class MockMethodChannel extends Mock implements MethodChannel {} - -class MockEventChannel extends Mock implements EventChannel {} +class MockBatteryPlatform extends Mock + with MockPlatformInterfaceMixin + implements BatteryPlatform { + Future batteryLevel() async { + return 42; + } + + Stream onBatteryStateChanged() { + StreamController result = StreamController(); + result.add(BatteryState.full); + return result.stream; + } +}