Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 854cfd5

Browse files
authored
[battery] Port battery to use platform interface (#2980)
1 parent ae806de commit 854cfd5

File tree

4 files changed

+43
-116
lines changed

4 files changed

+43
-116
lines changed

packages/battery/battery/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.0.5
2+
3+
* Ported to use platform interface.
4+
15
## 1.0.4+1
26

37
* Moved everything from battery to battery/battery

packages/battery/battery/lib/battery.dart

Lines changed: 7 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,19 @@
44

55
import 'dart:async';
66

7-
import 'package:flutter/services.dart';
8-
import 'package:meta/meta.dart' show visibleForTesting;
7+
import 'package:battery_platform_interface/battery_platform_interface.dart';
98

10-
/// Indicates the current battery state.
11-
enum BatteryState {
12-
/// The battery is completely full of energy.
13-
full,
14-
15-
/// The battery is currently storing energy.
16-
charging,
17-
18-
/// The battery is currently losing energy.
19-
discharging
20-
}
9+
export 'package:battery_platform_interface/battery_platform_interface.dart'
10+
show BatteryState;
2111

2212
/// API for accessing information about the battery of the device the Flutter
2313
/// app is currently running on.
2414
class Battery {
25-
/// Initializes the plugin and starts listening for potential platform events.
26-
factory Battery() {
27-
if (_instance == null) {
28-
final MethodChannel methodChannel =
29-
const MethodChannel('plugins.flutter.io/battery');
30-
final EventChannel eventChannel =
31-
const EventChannel('plugins.flutter.io/charging');
32-
_instance = Battery.private(methodChannel, eventChannel);
33-
}
34-
return _instance;
35-
}
36-
37-
/// This constructor is only used for testing and shouldn't be accessed by
38-
/// users of the plugin. It may break or change at any time.
39-
@visibleForTesting
40-
Battery.private(this._methodChannel, this._eventChannel);
41-
42-
static Battery _instance;
43-
44-
final MethodChannel _methodChannel;
45-
final EventChannel _eventChannel;
46-
Stream<BatteryState> _onBatteryStateChanged;
47-
4815
/// Returns the current battery level in percent.
49-
Future<int> get batteryLevel => _methodChannel
50-
.invokeMethod<int>('getBatteryLevel')
51-
.then<int>((dynamic result) => result);
16+
Future<int> get batteryLevel async =>
17+
await BatteryPlatform.instance.batteryLevel();
5218

5319
/// Fires whenever the battery state changes.
54-
Stream<BatteryState> get onBatteryStateChanged {
55-
if (_onBatteryStateChanged == null) {
56-
_onBatteryStateChanged = _eventChannel
57-
.receiveBroadcastStream()
58-
.map((dynamic event) => _parseBatteryState(event));
59-
}
60-
return _onBatteryStateChanged;
61-
}
62-
}
63-
64-
BatteryState _parseBatteryState(String state) {
65-
switch (state) {
66-
case 'full':
67-
return BatteryState.full;
68-
case 'charging':
69-
return BatteryState.charging;
70-
case 'discharging':
71-
return BatteryState.discharging;
72-
default:
73-
throw ArgumentError('$state is not a valid BatteryState.');
74-
}
20+
Stream<BatteryState> get onBatteryStateChanged =>
21+
BatteryPlatform.instance.onBatteryStateChanged();
7522
}

packages/battery/battery/pubspec.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: battery
22
description: Flutter plugin for accessing information about the battery state
33
(full, charging, discharging) on Android and iOS.
44
homepage: https://github.com/flutter/plugins/tree/master/packages/battery/battery
5-
version: 1.0.4+1
5+
version: 1.0.5
66

77
flutter:
88
plugin:
@@ -17,13 +17,15 @@ dependencies:
1717
flutter:
1818
sdk: flutter
1919
meta: ^1.0.5
20+
battery_platform_interface: ^1.0.0
2021

2122
dev_dependencies:
2223
async: ^2.0.8
2324
test: ^1.3.0
24-
mockito: 3.0.0
25+
mockito: ^4.1.1
2526
flutter_test:
2627
sdk: flutter
28+
plugin_platform_interface: ^1.0.0
2729
integration_test:
2830
path: ../../integration_test
2931
pedantic: ^1.8.0

packages/battery/battery/test/battery_test.dart

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,42 @@
44

55
import 'dart:async';
66

7-
import 'package:async/async.dart';
8-
import 'package:flutter/services.dart';
7+
import 'package:battery_platform_interface/battery_platform_interface.dart';
8+
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
99
import 'package:test/test.dart';
1010
import 'package:battery/battery.dart';
1111
import 'package:mockito/mockito.dart';
1212

1313
void main() {
14-
MockMethodChannel methodChannel;
15-
MockEventChannel eventChannel;
16-
Battery battery;
17-
18-
setUp(() {
19-
methodChannel = MockMethodChannel();
20-
eventChannel = MockEventChannel();
21-
battery = Battery.private(methodChannel, eventChannel);
22-
});
23-
24-
test('batteryLevel', () async {
25-
when(methodChannel.invokeMethod<int>('getBatteryLevel'))
26-
.thenAnswer((Invocation invoke) => Future<int>.value(42));
27-
expect(await battery.batteryLevel, 42);
28-
});
29-
30-
group('battery state', () {
31-
StreamController<String> controller;
32-
33-
setUp(() {
34-
controller = StreamController<String>();
35-
when(eventChannel.receiveBroadcastStream())
36-
.thenAnswer((Invocation invoke) => controller.stream);
37-
});
38-
39-
tearDown(() {
40-
controller.close();
14+
group('battery', () {
15+
Battery battery;
16+
MockBatteryPlatform fakePlatform;
17+
setUp(() async {
18+
fakePlatform = MockBatteryPlatform();
19+
BatteryPlatform.instance = fakePlatform;
20+
battery = Battery();
4121
});
42-
43-
test('calls receiveBroadcastStream once', () {
44-
battery.onBatteryStateChanged;
45-
battery.onBatteryStateChanged;
46-
battery.onBatteryStateChanged;
47-
verify(eventChannel.receiveBroadcastStream()).called(1);
22+
test('batteryLevel', () async {
23+
int result = await battery.batteryLevel;
24+
expect(result, 42);
4825
});
49-
50-
test('receive values', () async {
51-
final StreamQueue<BatteryState> queue =
52-
StreamQueue<BatteryState>(battery.onBatteryStateChanged);
53-
54-
controller.add("full");
55-
expect(await queue.next, BatteryState.full);
56-
57-
controller.add("discharging");
58-
expect(await queue.next, BatteryState.discharging);
59-
60-
controller.add("charging");
61-
expect(await queue.next, BatteryState.charging);
62-
63-
controller.add("illegal");
64-
expect(queue.next, throwsArgumentError);
26+
test('onBatteryStateChanged', () async {
27+
BatteryState result = await battery.onBatteryStateChanged.first;
28+
expect(result, BatteryState.full);
6529
});
6630
});
6731
}
6832

69-
class MockMethodChannel extends Mock implements MethodChannel {}
70-
71-
class MockEventChannel extends Mock implements EventChannel {}
33+
class MockBatteryPlatform extends Mock
34+
with MockPlatformInterfaceMixin
35+
implements BatteryPlatform {
36+
Future<int> batteryLevel() async {
37+
return 42;
38+
}
39+
40+
Stream<BatteryState> onBatteryStateChanged() {
41+
StreamController<BatteryState> result = StreamController<BatteryState>();
42+
result.add(BatteryState.full);
43+
return result.stream;
44+
}
45+
}

0 commit comments

Comments
 (0)