From 4f7eb5568ce2f4e9a4d27b7a8f6950addde2e54a Mon Sep 17 00:00:00 2001 From: Maurice Parrish Date: Tue, 13 Oct 2020 13:19:08 -0700 Subject: [PATCH] [wifi_info_flutter_plugin_interface] implement wifi platform interface (#3134) --- .../example/test/widget_test.dart | 27 ----- .../CHANGELOG.md | 5 +- .../README.md | 30 +++-- .../lib/src/enums.dart | 24 ++++ .../src/method_channel_wifi_info_flutter.dart | 58 +++++++++ .../wifi_info_flutter_platform_interface.dart | 77 +++++++++++- .../pubspec.yaml | 46 ++----- ...method_channel_wifi_info_flutter_test.dart | 114 ++++++++++++++++++ ..._info_flutter_platform_interface_test.dart | 13 -- 9 files changed, 299 insertions(+), 95 deletions(-) delete mode 100644 packages/wifi_info_flutter/wifi_info_flutter/example/test/widget_test.dart create mode 100644 packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/enums.dart create mode 100644 packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/method_channel_wifi_info_flutter.dart create mode 100644 packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/method_channel_wifi_info_flutter_test.dart delete mode 100644 packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/wifi_info_flutter_platform_interface_test.dart diff --git a/packages/wifi_info_flutter/wifi_info_flutter/example/test/widget_test.dart b/packages/wifi_info_flutter/wifi_info_flutter/example/test/widget_test.dart deleted file mode 100644 index 1857e9a37942..000000000000 --- a/packages/wifi_info_flutter/wifi_info_flutter/example/test/widget_test.dart +++ /dev/null @@ -1,27 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:wifi_info_flutter_example/main.dart'; - -void main() { - testWidgets('Verify Platform version', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that platform version is retrieved. - expect( - find.byWidgetPredicate( - (Widget widget) => - widget is Text && widget.data.startsWith('Running on:'), - ), - findsOneWidget, - ); - }); -} diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/CHANGELOG.md b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/CHANGELOG.md index ac071598e5d4..b376d30e41f5 100644 --- a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/CHANGELOG.md +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,4 @@ -## [0.0.1] - TODO: Add release date. +## 0.0.1 -* TODO: Describe initial release. +* Initial release of package. Includes support for retrieving wifi name, wifi BSSID, wifi ip address +and requesting location service authorization. diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/README.md b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/README.md index 88ac7acc6f04..f2039c3d5865 100644 --- a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/README.md +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/README.md @@ -1,14 +1,26 @@ # wifi_info_flutter_platform_interface -A new Flutter package project. +A common platform interface for the [`wifi_info_flutter`][1] plugin. -## Getting Started +This interface allows platform-specific implementations of the `wifi_info_flutter` +plugin, as well as the plugin itself, to ensure they are supporting the +same interface. -This project is a starting point for a Dart -[package](https://flutter.dev/developing-packages/), -a library module containing code that can be shared easily across -multiple Flutter or Dart projects. +# Usage -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +To implement a new platform-specific implementation of `wifi_info_flutter`, extend +[`WifiInfoFlutterPlatform`][2] with an implementation that performs the +platform-specific behavior, and when you register your plugin, set the default +`WifiInfoFlutterPlatform` by calling +`WifiInfoFlutterPlatform.instance = MyPlatformWifiInfoFlutter()`. + +# Note on breaking changes + +Strongly prefer non-breaking changes (such as adding a method to the interface) +over breaking changes for this package. + +See https://flutter.dev/go/platform-interface-breaking-changes for a discussion +on why a less-clean interface is preferable to a breaking change. + +[1]: ../ +[2]: lib/wifi_info_flutter_platform_interface.dart diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/enums.dart b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/enums.dart new file mode 100644 index 000000000000..4529938b4761 --- /dev/null +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/enums.dart @@ -0,0 +1,24 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// The status of the location service authorization. +enum LocationAuthorizationStatus { + /// The authorization of the location service is not determined. + notDetermined, + + /// This app is not authorized to use location. + restricted, + + /// User explicitly denied the location service. + denied, + + /// User authorized the app to access the location at any time. + authorizedAlways, + + /// User authorized the app to access the location when the app is visible to them. + authorizedWhenInUse, + + /// Status unknown. + unknown +} diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/method_channel_wifi_info_flutter.dart b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/method_channel_wifi_info_flutter.dart new file mode 100644 index 000000000000..ef390c3cde1e --- /dev/null +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/src/method_channel_wifi_info_flutter.dart @@ -0,0 +1,58 @@ +// Copyright 2020 The Chromium 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 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import '../wifi_info_flutter_platform_interface.dart'; + +/// An implementation of [WifiInfoFlutterPlatform] that uses method channels. +class MethodChannelWifiInfoFlutter extends WifiInfoFlutterPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + MethodChannel methodChannel = + MethodChannel('plugins.flutter.io/wifi_info_flutter'); + + @override + Future getWifiName() async { + return methodChannel.invokeMethod('wifiName'); + } + + @override + Future getWifiBSSID() { + return methodChannel.invokeMethod('wifiBSSID'); + } + + @override + Future getWifiIP() { + return methodChannel.invokeMethod('wifiIPAddress'); + } + + @override + Future requestLocationServiceAuthorization({ + bool requestAlwaysLocationUsage = false, + }) { + return methodChannel.invokeMethod( + 'requestLocationServiceAuthorization', [ + requestAlwaysLocationUsage + ]).then(_parseLocationAuthorizationStatus); + } + + @override + Future getLocationServiceAuthorization() { + return methodChannel + .invokeMethod('getLocationServiceAuthorization') + .then(_parseLocationAuthorizationStatus); + } +} + +/// Convert a String to a LocationAuthorizationStatus value. +LocationAuthorizationStatus _parseLocationAuthorizationStatus(String result) { + return LocationAuthorizationStatus.values.firstWhere( + (LocationAuthorizationStatus status) => result == describeEnum(status), + orElse: () => LocationAuthorizationStatus.unknown, + ); +} diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/wifi_info_flutter_platform_interface.dart b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/wifi_info_flutter_platform_interface.dart index 7aa6f0b86660..85034b2cbbff 100644 --- a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/wifi_info_flutter_platform_interface.dart +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/lib/wifi_info_flutter_platform_interface.dart @@ -1,7 +1,74 @@ -library wifi_info_flutter_platform_interface; +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. -/// A Calculator. -class Calculator { - /// Returns [value] plus 1. - int addOne(int value) => value + 1; +import 'dart:async'; + +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'src/enums.dart'; +import 'src/method_channel_wifi_info_flutter.dart'; + +export 'src/enums.dart'; + +/// The interface that implementations of wifi_info_flutter must implement. +/// +/// Platform implementations should extend this class rather than implement it +/// as `wifi_info_flutter` does not consider newly added methods to be breaking +/// changes. Extending this class (using `extends`) ensures that the subclass +/// will get the default implementation, while platform implementations that +/// `implements` this interface will be broken by newly added +/// [ConnectivityPlatform] methods. +abstract class WifiInfoFlutterPlatform extends PlatformInterface { + /// Constructs a WifiInfoFlutterPlatform. + WifiInfoFlutterPlatform() : super(token: _token); + + static final Object _token = Object(); + + static WifiInfoFlutterPlatform _instance = MethodChannelWifiInfoFlutter(); + + /// The default instance of [WifiInfoFlutterPlatform] to use. + /// + /// Defaults to [MethodChannelWifiInfoFlutter]. + static WifiInfoFlutterPlatform get instance => _instance; + + /// Set the default instance of [WifiInfoFlutterPlatform] to use. + /// + /// Platform-specific plugins should set this with their own platform-specific + /// class that extends [WifiInfoFlutterPlatform] when they register + /// themselves. + static set instance(WifiInfoFlutterPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + /// Obtains the wifi name (SSID) of the connected network + Future getWifiName() { + throw UnimplementedError('getWifiName() has not been implemented.'); + } + + /// Obtains the wifi BSSID of the connected network. + Future getWifiBSSID() { + throw UnimplementedError('getWifiBSSID() has not been implemented.'); + } + + /// Obtains the IP address of the connected wifi network + Future getWifiIP() { + throw UnimplementedError('getWifiIP() has not been implemented.'); + } + + /// Request to authorize the location service (Only on iOS). + Future requestLocationServiceAuthorization( + {bool requestAlwaysLocationUsage = false}) { + throw UnimplementedError( + 'requestLocationServiceAuthorization() has not been implemented.', + ); + } + + /// Get the current location service authorization (Only on iOS). + Future getLocationServiceAuthorization() { + throw UnimplementedError( + 'getLocationServiceAuthorization() has not been implemented.', + ); + } } diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/pubspec.yaml b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/pubspec.yaml index 4b167fd4a1d5..9a79da6864ea 100644 --- a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/pubspec.yaml +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/pubspec.yaml @@ -1,53 +1,21 @@ name: wifi_info_flutter_platform_interface -description: A new Flutter package project. -version: 0.0.1 +description: A common platform interface for the wifi_info_flutter plugin. +version: 1.0.0 +# NOTE: We strongly prefer non-breaking changes, even at the expense of a +# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes homepage: https://github.com/flutter/plugins/tree/master/packages/wifi_info_flutter/wifi_info_flutter_platform_interface +publish_to: none environment: sdk: ">=2.7.0 <3.0.0" flutter: ">=1.17.0 <2.0.0" dependencies: + plugin_platform_interface: ^1.0.3 flutter: sdk: flutter dev_dependencies: + pedantic: ^1.9.2 flutter_test: sdk: flutter - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - - # To add assets to your package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # To add custom fonts to your package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/method_channel_wifi_info_flutter_test.dart b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/method_channel_wifi_info_flutter_test.dart new file mode 100644 index 000000000000..b48b2c4110bb --- /dev/null +++ b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/method_channel_wifi_info_flutter_test.dart @@ -0,0 +1,114 @@ +// Copyright 2020 The Chromium 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 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:wifi_info_flutter_platform_interface/src/enums.dart'; +import 'package:wifi_info_flutter_platform_interface/src/method_channel_wifi_info_flutter.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('$MethodChannelWifiInfoFlutter', () { + final List log = []; + MethodChannelWifiInfoFlutter methodChannelWifiInfoFlutter; + + setUp(() async { + methodChannelWifiInfoFlutter = MethodChannelWifiInfoFlutter(); + + methodChannelWifiInfoFlutter.methodChannel + .setMockMethodCallHandler((MethodCall methodCall) async { + log.add(methodCall); + switch (methodCall.method) { + case 'wifiName': + return '1337wifi'; + case 'wifiBSSID': + return 'c0:ff:33:c0:d3:55'; + case 'wifiIPAddress': + return '127.0.0.1'; + case 'requestLocationServiceAuthorization': + return 'authorizedAlways'; + case 'getLocationServiceAuthorization': + return 'authorizedAlways'; + default: + return null; + } + }); + log.clear(); + }); + + test('getWifiName', () async { + final String result = await methodChannelWifiInfoFlutter.getWifiName(); + expect(result, '1337wifi'); + expect( + log, + [ + isMethodCall( + 'wifiName', + arguments: null, + ), + ], + ); + }); + + test('getWifiBSSID', () async { + final String result = await methodChannelWifiInfoFlutter.getWifiBSSID(); + expect(result, 'c0:ff:33:c0:d3:55'); + expect( + log, + [ + isMethodCall( + 'wifiBSSID', + arguments: null, + ), + ], + ); + }); + + test('getWifiIP', () async { + final String result = await methodChannelWifiInfoFlutter.getWifiIP(); + expect(result, '127.0.0.1'); + expect( + log, + [ + isMethodCall( + 'wifiIPAddress', + arguments: null, + ), + ], + ); + }); + + test('requestLocationServiceAuthorization', () async { + final LocationAuthorizationStatus result = + await methodChannelWifiInfoFlutter + .requestLocationServiceAuthorization(); + expect(result, LocationAuthorizationStatus.authorizedAlways); + expect( + log, + [ + isMethodCall( + 'requestLocationServiceAuthorization', + arguments: [false], + ), + ], + ); + }); + + test('getLocationServiceAuthorization', () async { + final LocationAuthorizationStatus result = + await methodChannelWifiInfoFlutter.getLocationServiceAuthorization(); + expect(result, LocationAuthorizationStatus.authorizedAlways); + expect( + log, + [ + isMethodCall( + 'getLocationServiceAuthorization', + arguments: null, + ), + ], + ); + }); + }); +} diff --git a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/wifi_info_flutter_platform_interface_test.dart b/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/wifi_info_flutter_platform_interface_test.dart deleted file mode 100644 index d104d40e56d3..000000000000 --- a/packages/wifi_info_flutter/wifi_info_flutter_platform_interface/test/wifi_info_flutter_platform_interface_test.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -import 'package:wifi_info_flutter_platform_interface/wifi_info_flutter_platform_interface.dart'; - -void main() { - test('adds one to input values', () { - final calculator = Calculator(); - expect(calculator.addOne(2), 3); - expect(calculator.addOne(-7), -6); - expect(calculator.addOne(0), 1); - expect(() => calculator.addOne(null), throwsNoSuchMethodError); - }); -}