diff --git a/experimental/federated_plugin/README.md b/experimental/federated_plugin/README.md index 20537a348..2dc52b3cf 100644 --- a/experimental/federated_plugin/README.md +++ b/experimental/federated_plugin/README.md @@ -1,6 +1,6 @@ # federated_plugin -A Flutter plugin sample that shows how to implement a federated plugin to fetch the device location on different platforms. +A Flutter plugin sample that shows how to implement a federated plugin to retrieve current battery level on different platforms. This sample is currently being built. Not all platforms and functionality are in place. diff --git a/experimental/federated_plugin/federated_plugin/android/build.gradle b/experimental/federated_plugin/federated_plugin/android/build.gradle index d237dda9c..8c6bee886 100644 --- a/experimental/federated_plugin/federated_plugin/android/build.gradle +++ b/experimental/federated_plugin/federated_plugin/android/build.gradle @@ -40,5 +40,4 @@ android { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.google.android.gms:play-services-location:17.0.0' } diff --git a/experimental/federated_plugin/federated_plugin/android/src/main/AndroidManifest.xml b/experimental/federated_plugin/federated_plugin/android/src/main/AndroidManifest.xml index e44aed57b..22a910cef 100644 --- a/experimental/federated_plugin/federated_plugin/android/src/main/AndroidManifest.xml +++ b/experimental/federated_plugin/federated_plugin/android/src/main/AndroidManifest.xml @@ -1,5 +1,3 @@ - - diff --git a/experimental/federated_plugin/federated_plugin/android/src/main/kotlin/dev/flutter/federated_plugin/FederatedPlugin.kt b/experimental/federated_plugin/federated_plugin/android/src/main/kotlin/dev/flutter/federated_plugin/FederatedPlugin.kt index cbd9d10a7..c85fecf8b 100644 --- a/experimental/federated_plugin/federated_plugin/android/src/main/kotlin/dev/flutter/federated_plugin/FederatedPlugin.kt +++ b/experimental/federated_plugin/federated_plugin/android/src/main/kotlin/dev/flutter/federated_plugin/FederatedPlugin.kt @@ -4,109 +4,55 @@ package dev.flutter.federated_plugin -import android.Manifest -import android.app.Activity import android.content.Context -import android.content.pm.PackageManager +import android.content.Intent +import android.content.IntentFilter +import android.os.BatteryManager +import android.os.Build import androidx.annotation.NonNull -import androidx.core.app.ActivityCompat.requestPermissions -import androidx.core.content.ContextCompat -import com.google.android.gms.location.LocationServices.getFusedLocationProviderClient import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.embedding.engine.plugins.activity.ActivityAware -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result -import io.flutter.plugin.common.PluginRegistry - -class FederatedPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, PluginRegistry.RequestPermissionsResultListener { +class FederatedPlugin : FlutterPlugin, MethodCallHandler { private lateinit var channel: MethodChannel - private lateinit var context: Context - private lateinit var activity: Activity - private lateinit var result: Result - private val REQUEST_CODE = 1001 + private var context: Context? = null override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { - channel = MethodChannel(flutterPluginBinding.binaryMessenger, "location") + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "battery") channel.setMethodCallHandler(this) context = flutterPluginBinding.applicationContext } override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { - this.result = result - if (call.method == "getLocation") { - // Check for the runtime permission if SDK version is greater than 23. If permissions - // are granted, send the location data back to Dart. If permissions are not granted, - // request for the runtime permissions. - if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP && !checkPermissions()) { - requestPermissions(activity, arrayOf( - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.ACCESS_COARSE_LOCATION - ), REQUEST_CODE) + if (call.method == "getBatteryLevel") { + val batteryLevel: Int + + batteryLevel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val batteryManager = context?.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) + } else { + val intent = IntentFilter(Intent.ACTION_BATTERY_CHANGED).let { intentFilter -> + context?.registerReceiver(null, intentFilter) + } + intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100 / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1) + } + + if (batteryLevel < 0) { + result.error("STATUS_UNAVAILABLE", "Not able to determine battery level.", null) } else { - provideLocation() + result.success(batteryLevel) } } else { result.notImplemented() } } - // Method to fetch and send the last known location of the device to Dart. - private fun provideLocation() { - getFusedLocationProviderClient(context).lastLocation - .addOnSuccessListener { location -> - if (location != null) { - result.success(listOf(location.longitude, location.latitude)) - } else { - result.error("NOT_DETERMINED", "Not able to determine location", null) - } - }.addOnFailureListener { exception -> - result.error("Error", exception.message, null) - } - } - - // Method to check permissions to access the location data. - private fun checkPermissions(): Boolean { - val fineLocationPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) - val coarseLocationPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) - - return fineLocationPermission == PackageManager.PERMISSION_GRANTED && - coarseLocationPermission == PackageManager.PERMISSION_GRANTED - } - - override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { channel.setMethodCallHandler(null) - } - - override fun onDetachedFromActivity() {} - - override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { - activity = binding.activity - } - - override fun onAttachedToActivity(binding: ActivityPluginBinding) { - activity = binding.activity - binding.addRequestPermissionsResultListener(this) - } - - override fun onDetachedFromActivityForConfigChanges() {} - - // Callback for the result after requesting for runtime permissions. If permissions - // are granted, send the location data, or send an error back to Dart if permissions - // are not granted. - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array?, grantResults: IntArray): Boolean { - if (requestCode == REQUEST_CODE && grantResults.isNotEmpty()) { - if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) { - provideLocation() - } else { - result.error("PERMISSION_DENIED", "Permission denied from User", null) - } - } - return false + context = null } } diff --git a/experimental/federated_plugin/federated_plugin/example/lib/main.dart b/experimental/federated_plugin/federated_plugin/example/lib/main.dart index dd32740dc..2eda3a851 100644 --- a/experimental/federated_plugin/federated_plugin/example/lib/main.dart +++ b/experimental/federated_plugin/federated_plugin/example/lib/main.dart @@ -18,15 +18,15 @@ class MyApp extends StatelessWidget { } } -/// Demonstrates how to use the getLocation method from federated_plugin to access -/// location data. +/// Demonstrates how to use the getBatteryLevel method from federated_plugin to retrieve +/// current battery level of device. class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State { - Location location; + int batteryLevel; @override Widget build(BuildContext context) { @@ -40,21 +40,20 @@ class _HomePageState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - location == null + batteryLevel == null ? SizedBox.shrink() : Text( - 'Latitude: ${location.latitude}\n' - 'Longitude: ${location.longitude}', + 'Battery Level: $batteryLevel', style: Theme.of(context).textTheme.headline5, ), SizedBox(height: 16), RaisedButton( - child: Text('Get Location'), + child: Text('Get Battery Level'), onPressed: () async { try { - final result = await getLocation(); + final result = await getBatteryLevel(); setState(() { - location = result; + batteryLevel = result; }); } catch (error) { Scaffold.of(context).showSnackBar( diff --git a/experimental/federated_plugin/federated_plugin/example/test/widget_test.dart b/experimental/federated_plugin/federated_plugin/example/test/widget_test.dart index 94acfb6c0..f40232040 100644 --- a/experimental/federated_plugin/federated_plugin/example/test/widget_test.dart +++ b/experimental/federated_plugin/federated_plugin/example/test/widget_test.dart @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:federated_plugin/federated_plugin.dart'; import 'package:federated_plugin_example/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -10,27 +9,23 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('federated plugin demo tests', () { - final location = Location(latitude: 131.0, longitude: 221.0); + final batteryLevel = 45; setUpAll(() { - MethodChannel('location').setMockMethodCallHandler((call) async { - if (call.method == 'getLocation') { - return [location.longitude, location.latitude]; + MethodChannel('battery').setMockMethodCallHandler((call) async { + if (call.method == 'getBatteryLevel') { + return batteryLevel; } }); }); - testWidgets('get location from platform', (tester) async { + testWidgets('get current battery level from platform', (tester) async { await tester.pumpWidget(MyApp()); - // Tap button to get location from platform. + // Tap button to retrieve current battery level from platform. await tester.tap(find.byType(RaisedButton)); await tester.pumpAndSettle(); - expect( - find.text('Latitude: ${location.latitude}\n' - 'Longitude: ${location.longitude}'), - findsOneWidget, - ); + expect(find.text('Battery Level: $batteryLevel'), findsOneWidget); }); }); } diff --git a/experimental/federated_plugin/federated_plugin/lib/federated_plugin.dart b/experimental/federated_plugin/federated_plugin/lib/federated_plugin.dart index 071cb6c31..6b83ab724 100644 --- a/experimental/federated_plugin/federated_plugin/lib/federated_plugin.dart +++ b/experimental/federated_plugin/federated_plugin/lib/federated_plugin.dart @@ -5,12 +5,10 @@ import 'dart:async'; import 'package:federated_plugin_platform_interface/federated_plugin_platform_interface.dart'; -import 'package:federated_plugin_platform_interface/location_model.dart'; -export 'package:federated_plugin_platform_interface/location_model.dart'; -/// Returns [Location] to provide latitude and longitude. +/// Returns the current battery level of device. /// -/// It uses [FederatedPluginInterface] interface to provide location. -Future getLocation() async { - return await FederatedPluginInterface.instance.getLocation(); +/// It uses [FederatedPluginInterface] interface to provide current battery level. +Future getBatteryLevel() async { + return await FederatedPluginInterface.instance.getBatteryLevel(); } diff --git a/experimental/federated_plugin/federated_plugin/test/federated_plugin_test.dart b/experimental/federated_plugin/federated_plugin/test/federated_plugin_test.dart index a640c560d..e8d8ffd7b 100644 --- a/experimental/federated_plugin/federated_plugin/test/federated_plugin_test.dart +++ b/experimental/federated_plugin/federated_plugin/test/federated_plugin_test.dart @@ -10,17 +10,16 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('Federated Plugin Test', () { - final location = Location(latitude: 131.0, longitude: 221.0); - MethodChannel('location').setMockMethodCallHandler((call) async { - if (call.method == 'getLocation') { - return [location.longitude, location.latitude]; + final batteryLevel = 34; + MethodChannel('battery').setMockMethodCallHandler((call) async { + if (call.method == 'getBatteryLevel') { + return batteryLevel; } }); - test('getLocation method test', () async { - final result = await getLocation(); - expect(result.longitude, location.longitude); - expect(result.latitude, location.latitude); + test('getBatteryLevel method test', () async { + final result = await getBatteryLevel(); + expect(result, batteryLevel); }); }); } diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/lib/battery_method_channel.dart b/experimental/federated_plugin/federated_plugin_platform_interface/lib/battery_method_channel.dart new file mode 100644 index 000000000..1a585a472 --- /dev/null +++ b/experimental/federated_plugin/federated_plugin_platform_interface/lib/battery_method_channel.dart @@ -0,0 +1,17 @@ +// Copyright 2020 The Flutter team. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:federated_plugin_platform_interface/federated_plugin_platform_interface.dart'; +import 'package:flutter/services.dart'; + +/// Implements [FederatedPluginInterface] using [MethodChannel] to fetch +/// battery level from platform. +class BatteryMethodChannel extends FederatedPluginInterface { + static const MethodChannel _methodChannel = MethodChannel('battery'); + + @override + Future getBatteryLevel() async { + return await _methodChannel.invokeMethod('getBatteryLevel'); + } +} diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/lib/federated_plugin_platform_interface.dart b/experimental/federated_plugin/federated_plugin_platform_interface/lib/federated_plugin_platform_interface.dart index 01dc8f276..595c82f9c 100644 --- a/experimental/federated_plugin/federated_plugin_platform_interface/lib/federated_plugin_platform_interface.dart +++ b/experimental/federated_plugin/federated_plugin_platform_interface/lib/federated_plugin_platform_interface.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:federated_plugin_platform_interface/location_method_channel.dart'; -import 'package:federated_plugin_platform_interface/location_model.dart'; +import 'package:federated_plugin_platform_interface/battery_method_channel.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; /// Interface which allows all the platform plugins to implement the same @@ -12,11 +11,11 @@ abstract class FederatedPluginInterface extends PlatformInterface { FederatedPluginInterface() : super(token: _object); static FederatedPluginInterface _federatedPluginInterface = - LocationMethodChannel(); + BatteryMethodChannel(); static final Object _object = Object(); - /// Provides instance of [LocationMethodChannel] to invoke platform calls. + /// Provides instance of [BatteryMethodChannel] to invoke platform calls. static FederatedPluginInterface get instance => _federatedPluginInterface; static set instance(FederatedPluginInterface instance) { @@ -24,8 +23,8 @@ abstract class FederatedPluginInterface extends PlatformInterface { _federatedPluginInterface = instance; } - /// Returns [Location] to provide latitude and longitude. - Future getLocation() async { - throw UnimplementedError('getLocation() has not been implemented.'); + /// Returns the current battery level of device. + Future getBatteryLevel() async { + throw UnimplementedError('getBatteryLevel() has not been implemented.'); } } diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/lib/location_method_channel.dart b/experimental/federated_plugin/federated_plugin_platform_interface/lib/location_method_channel.dart deleted file mode 100644 index ee41a85dd..000000000 --- a/experimental/federated_plugin/federated_plugin_platform_interface/lib/location_method_channel.dart +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2020 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'package:federated_plugin_platform_interface/federated_plugin_platform_interface.dart'; -import 'package:federated_plugin_platform_interface/location_model.dart'; -import 'package:flutter/services.dart'; - -/// Implements [FederatedPluginInterface] using [MethodChannel] to fetch -/// location from platform. -class LocationMethodChannel extends FederatedPluginInterface { - static const MethodChannel _methodChannel = MethodChannel('location'); - - @override - Future getLocation() async { - final result = - await _methodChannel.invokeMethod>('getLocation'); - - return Location( - longitude: result.first as double, - latitude: result.last as double, - ); - } -} diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/lib/location_model.dart b/experimental/federated_plugin/federated_plugin_platform_interface/lib/location_model.dart deleted file mode 100644 index ccf37b7cf..000000000 --- a/experimental/federated_plugin/federated_plugin_platform_interface/lib/location_model.dart +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2020 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// Model to hold the incoming latitude and longitude values from platform. -class Location { - final double latitude; - final double longitude; - - Location({this.latitude, this.longitude}); -} diff --git a/experimental/federated_plugin/federated_plugin_platform_interface/test/federated_plugin_platform_interface_test.dart b/experimental/federated_plugin/federated_plugin_platform_interface/test/federated_plugin_platform_interface_test.dart index dc6ae6634..920694047 100644 --- a/experimental/federated_plugin/federated_plugin_platform_interface/test/federated_plugin_platform_interface_test.dart +++ b/experimental/federated_plugin/federated_plugin_platform_interface/test/federated_plugin_platform_interface_test.dart @@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:federated_plugin_platform_interface/location_method_channel.dart'; -import 'package:federated_plugin_platform_interface/location_model.dart'; +import 'package:federated_plugin_platform_interface/battery_method_channel.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -11,18 +10,17 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('MethodChannel test', () { - final location = Location(latitude: 1.0, longitude: 2.0); - MethodChannel('location').setMockMethodCallHandler((call) async { - if (call.method == 'getLocation') { - return [location.longitude, location.latitude]; + final batteryLevel = 89; + MethodChannel('battery').setMockMethodCallHandler((call) async { + if (call.method == 'getBatteryLevel') { + return batteryLevel; } }); - test('getLocation method test', () async { - final locationMethodChannel = LocationMethodChannel(); - final result = await locationMethodChannel.getLocation(); - expect(result.longitude, location.longitude); - expect(result.latitude, result.latitude); + test('getBatteryLevel method test', () async { + final locationMethodChannel = BatteryMethodChannel(); + final result = await locationMethodChannel.getBatteryLevel(); + expect(result, batteryLevel); }); }); } diff --git a/experimental/federated_plugin/federated_plugin_web/.gitignore b/experimental/federated_plugin/federated_plugin_web/.gitignore index bb431f0d5..89aaf2a97 100644 --- a/experimental/federated_plugin/federated_plugin_web/.gitignore +++ b/experimental/federated_plugin/federated_plugin_web/.gitignore @@ -67,6 +67,9 @@ build/ **/ios/ServiceDefinitions.json **/ios/Runner/GeneratedPluginRegistrant.* +# Web related +lib/generated_plugin_registrant.dart + # Exceptions to above rules. !**/ios/**/default.mode1v3 !**/ios/**/default.mode2v3 diff --git a/experimental/federated_plugin/federated_plugin_web/lib/federated_plugin_web.dart b/experimental/federated_plugin/federated_plugin_web/lib/federated_plugin_web.dart index 611ffa740..2029f0f8c 100644 --- a/experimental/federated_plugin/federated_plugin_web/lib/federated_plugin_web.dart +++ b/experimental/federated_plugin/federated_plugin_web/lib/federated_plugin_web.dart @@ -5,17 +5,17 @@ import 'dart:html' as html; import 'package:federated_plugin_platform_interface/federated_plugin_platform_interface.dart'; -import 'package:federated_plugin_platform_interface/location_model.dart'; import 'package:flutter/services.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; -/// Web Implementation of [FederatedPluginInterface] to provide location. +/// Web Implementation of [FederatedPluginInterface] to retrieve current battery +/// level of device. class FederatedPlugin extends FederatedPluginInterface { - final html.Geolocation _geolocation; + final html.Navigator _navigator; - /// Constructor to override the geolocation object for testing purpose. - FederatedPlugin({html.Geolocation geolocation}) - : _geolocation = geolocation ?? html.window.navigator.geolocation; + /// Constructor to override the navigator object for testing purpose. + FederatedPlugin({html.Navigator navigator}) + : _navigator = navigator ?? html.window.navigator; /// Method to register the plugin which sets [FederatedPlugin] to be the default /// instance of [FederatedPluginInterface]. @@ -23,21 +23,20 @@ class FederatedPlugin extends FederatedPluginInterface { FederatedPluginInterface.instance = FederatedPlugin(); } - /// Returns [Location] to provide latitude and longitude. + /// Returns the current battery level of device. /// - /// If any error, it's assume that user has denied the permission forever. + /// If any error, it's assume that the BatteryManager API is not supported by + /// browser. @override - Future getLocation() async { + Future getBatteryLevel() async { try { - final geoPosition = await _geolocation.getCurrentPosition(); - return Location( - longitude: geoPosition.coords.longitude.toDouble(), - latitude: geoPosition.coords.latitude.toDouble(), - ); + final battery = await _navigator.getBattery() as html.BatteryManager; + // The battery level retrieved is in range of 0.0 to 1.0. + return battery.level * 100 as int; } catch (error) { throw PlatformException( - code: 'PERMISSION_DENIED', - message: 'Permission denied from User', + code: 'STATUS_UNAVAILABLE', + message: 'The plugin is not supported by the browser.', details: null, ); } diff --git a/experimental/federated_plugin/federated_plugin_web/pubspec.yaml b/experimental/federated_plugin/federated_plugin_web/pubspec.yaml index cf6eccd44..20a99b0ce 100644 --- a/experimental/federated_plugin/federated_plugin_web/pubspec.yaml +++ b/experimental/federated_plugin/federated_plugin_web/pubspec.yaml @@ -1,5 +1,5 @@ name: federated_plugin_web -description: Web implementation of federated_plugin to provide location. +description: Web implementation of federated_plugin to retrieve current battery level. version: 0.0.1 homepage: publish_to: none diff --git a/experimental/federated_plugin/federated_plugin_web/test_driver/federated_plugin_web_e2e.dart b/experimental/federated_plugin/federated_plugin_web/test_driver/federated_plugin_web_e2e.dart index ed856b6d0..25bfef88a 100644 --- a/experimental/federated_plugin/federated_plugin_web/test_driver/federated_plugin_web_e2e.dart +++ b/experimental/federated_plugin/federated_plugin_web/test_driver/federated_plugin_web_e2e.dart @@ -9,45 +9,35 @@ import 'package:federated_plugin_web/federated_plugin_web.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; -const kLatitude = 4; -const kLongitude = 3; +const kBatteryLevel = 0.49; -class GeoLocationMock extends Mock implements Geolocation {} +class NavigatorMock extends Mock implements Navigator {} -class GeoPositionMock extends Mock implements Geoposition { +class BatteryManagerMock extends Mock implements BatteryManager { @override - Coordinates get coords => MockCoordinates(); -} - -class MockCoordinates extends Mock implements Coordinates { - @override - num get latitude => kLatitude; - - @override - num get longitude => kLongitude; + num get level => kBatteryLevel; } void main() { E2EWidgetsFlutterBinding.ensureInitialized(); group('FederatedPlugin test', () { - final geoLocationMock = GeoLocationMock(); + final navigatorMock = NavigatorMock(); setUp(() { - when(geoLocationMock.getCurrentPosition()) - .thenAnswer((realInvocation) async => GeoPositionMock()); + when(navigatorMock.getBattery()) + .thenAnswer((realInvocation) async => BatteryManagerMock()); }); - testWidgets('getLocation Method', (tester) async { - final federatedPlugin = FederatedPlugin(geolocation: geoLocationMock); - final location = await federatedPlugin.getLocation(); + testWidgets('getBatteryLevel Method', (tester) async { + final federatedPlugin = FederatedPlugin(navigator: navigatorMock); + final batteryLevel = await federatedPlugin.getBatteryLevel(); - // Verify that getCurrentPosition was called. - verify(geoLocationMock.getCurrentPosition()); + // Verify that getBattery was called. + verify(navigatorMock.getBattery()); - // Verify the values of Location.longitude and Location.latitude. - expect(location.longitude, kLongitude); - expect(location.latitude, kLatitude); + // Verify the battery level. + expect(batteryLevel, kBatteryLevel * 100); }); }); }