Skip to content

Commit

Permalink
feat(battery_plus)!: Migrate to package:web
Browse files Browse the repository at this point in the history
  • Loading branch information
koji-1009 committed Mar 19, 2024
1 parent 94e454f commit 11b4449
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 51 deletions.
3 changes: 2 additions & 1 deletion packages/battery_plus/battery_plus/example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ name: battery_plus_example
description: Demonstrates how to use the battery_plus plugin.

environment:
sdk: '>=2.18.0 <4.0.0'
sdk: '>=3.3.0 <4.0.0'
flutter: '>=3.19.0'

dependencies:
flutter:
Expand Down
116 changes: 68 additions & 48 deletions packages/battery_plus/battery_plus/lib/src/battery_plus_web.dart
Original file line number Diff line number Diff line change
@@ -1,85 +1,87 @@
import 'dart:async';
import 'dart:html' as html show window, BatteryManager, Navigator;
import 'dart:js_util';
import 'dart:js_interop';

import 'package:battery_plus_platform_interface/battery_plus_platform_interface.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
import 'package:web/web.dart' as web;

/// The web implementation of the BatteryPlatform of the Battery plugin.
class BatteryPlusWebPlugin extends BatteryPlatform {
/// Constructs a BatteryPlusPlugin.
BatteryPlusWebPlugin(html.Navigator navigator)
: _getBattery = navigator.getBattery;
BatteryPlusWebPlugin();

/// A check to determine if this version of the plugin can be used.
// ignore: unnecessary_null_comparison
bool get isSupported => html.window.navigator.getBattery != null;

late final Future<dynamic> Function() _getBattery;
Future<BatteryManager?> _getBatteryManager() async {
try {
return await web.window.navigator.getBattery().toDart;
} on NoSuchMethodError catch (_) {
// BatteryManager API is not supported this User Agent.
return null;
}
}

/// Factory method that initializes the Battery plugin platform with an instance
/// of the plugin for the web.
static void registerWith(Registrar registrar) {
BatteryPlatform.instance = BatteryPlusWebPlugin(html.window.navigator);
BatteryPlatform.instance = BatteryPlusWebPlugin();
}

/// Returns the current battery level in percent.
@override
Future<int> get batteryLevel async {
if (isSupported) {
// level is a number representing the system's battery charge level scaled to a value between 0.0 and 1.0
final batteryManager = await _getBattery() as html.BatteryManager;
final level = batteryManager.level ?? 0;
return level * 100 as int;
final batteryManager = await _getBatteryManager();
if (batteryManager == null) {
return 0;
}
return 0;

// level is a number representing the system's battery charge level scaled to a value between 0.0 and 1.0
final level = batteryManager.level;
return level * 100 as int;
}

/// Returns the current battery state.
@override
Future<BatteryState> get batteryState async {
if (isSupported) {
final battery = await _getBattery() as html.BatteryManager;
if (battery.charging != null) {
return _checkBatteryChargingState(battery.charging!);
}
final batteryManager = await _getBatteryManager();
if (batteryManager == null) {
return BatteryState.unknown;
}
return BatteryState.unknown;

return _checkBatteryChargingState(batteryManager.charging);
}

StreamController<BatteryState>? _batteryChangeStreamController;
late Stream<BatteryState> _batteryChange;

/// Returns a Stream of BatteryState changes.
@override
Stream<BatteryState> get onBatteryStateChanged {
if (_batteryChangeStreamController == null && isSupported) {
_batteryChangeStreamController = StreamController<BatteryState>();

_getBattery().then(
(battery) {
_batteryChangeStreamController!
.add(_checkBatteryChargingState(battery.charging));
setProperty(
battery,
'onchargingchange',
allowInterop(
(event) {
_batteryChangeStreamController!
.add(_checkBatteryChargingState(battery.charging));
},
),
);
},
Stream<BatteryState> get onBatteryStateChanged async* {
final batteryManager = await _getBatteryManager();
if (batteryManager == null) {
yield BatteryState.unknown;
return;
}

if (_batteryChangeStreamController != null) {
yield* _batteryChangeStreamController!.stream.asBroadcastStream();
return;
}

_batteryChangeStreamController = StreamController<BatteryState>();
_batteryChangeStreamController?.add(
_checkBatteryChargingState(batteryManager.charging),
);

batteryManager.onchargingchange = (web.Event _) {
_batteryChangeStreamController?.add(
_checkBatteryChargingState(batteryManager.charging),
);
}.toJS;

_batteryChange =
_batteryChangeStreamController!.stream.asBroadcastStream();
_batteryChangeStreamController?.onCancel = () {
_batteryChangeStreamController?.close();
};

_batteryChangeStreamController?.onCancel = () {
_batteryChangeStreamController?.close();
};
}
return _batteryChange;
yield* _batteryChangeStreamController!.stream.asBroadcastStream();
}

BatteryState _checkBatteryChargingState(bool charging) {
Expand All @@ -90,3 +92,21 @@ class BatteryPlusWebPlugin extends BatteryPlatform {
}
}
}

extension on web.Navigator {
/// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/getBattery
external JSPromise<BatteryManager> getBattery();
}

/// BatteryManager API
/// https://developer.mozilla.org/en-US/docs/Web/API/BatteryManager
extension type BatteryManager(JSObject _) implements JSObject {
/// https://developer.mozilla.org/en-US/docs/Web/API/BatteryManager/level
external double get level;

/// https://developer.mozilla.org/en-US/docs/Web/API/BatteryManager/charging
external bool get charging;

/// https://developer.mozilla.org/en-US/docs/Web/API/BatteryManager/chargingchange_event
external set onchargingchange(JSFunction fn);
}
5 changes: 3 additions & 2 deletions packages/battery_plus/battery_plus/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ dependencies:
battery_plus_platform_interface: ^2.0.0
meta: ^1.8.0
upower: ^0.7.0
web: ^0.5.0

dev_dependencies:
flutter_test:
Expand All @@ -41,5 +42,5 @@ dev_dependencies:
plugin_platform_interface: ^2.1.4

environment:
sdk: ">=2.18.0 <4.0.0"
flutter: ">=3.3.0"
sdk: ">=3.3.0 <4.0.0"
flutter: ">=3.19.0"

0 comments on commit 11b4449

Please sign in to comment.