From d39a4e5d438ceee120bc1ba13c9d7c8ae8dc1d8c Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 16:26:46 -0300 Subject: [PATCH 1/7] chore: split wifi_basic.dart into multiple files --- packages/wifi_basic/lib/wifi_basic.dart | 34 ++----------------- packages/wifi_basic/lib/wifi_generations.dart | 3 ++ packages/wifi_basic/lib/wifi_info.dart | 29 ++++++++++++++++ .../wifi_basic/lib/wifi_network_security.dart | 3 ++ 4 files changed, 38 insertions(+), 31 deletions(-) create mode 100644 packages/wifi_basic/lib/wifi_generations.dart create mode 100644 packages/wifi_basic/lib/wifi_info.dart create mode 100644 packages/wifi_basic/lib/wifi_network_security.dart diff --git a/packages/wifi_basic/lib/wifi_basic.dart b/packages/wifi_basic/lib/wifi_basic.dart index a6e7d1c3..e29f1892 100644 --- a/packages/wifi_basic/lib/wifi_basic.dart +++ b/packages/wifi_basic/lib/wifi_basic.dart @@ -2,37 +2,9 @@ import 'package:async/async.dart'; import 'package:flutter/services.dart'; import 'package:wifi_basic/src/extensions.dart'; -enum WiFiGenerations { unknown, legacy, wifi4, wifi5, wifi6 } - -enum WiFiNetworkSecurity { unknown, none, wep, wpa, wpa2, wpa3 } - -class WiFiInfo { - final String ssid; - final String bssid; - final WiFiNetworkSecurity security; - final bool isHidden; - final int rssi; - final double signalStrength; - final bool hasInternet; - final WiFiGenerations generation; - - bool get isNull => ssid.isEmpty; - - WiFiInfo._fromMap(Map map) - : ssid = map["ssid"], - bssid = map["bssid"], - security = (map["security"] as int?).toWifiNetworkSecurity(), - isHidden = map["isHidden"], - rssi = map["rssi"], - signalStrength = map["signalStrength"], - hasInternet = map["hasInternet"], - generation = (map["generation"] as int?).toWifiGeneration(); - - @override - String toString() => "ssid; $ssid; bssid: $bssid; security: $security; " - "isHidden: $isHidden; rssi: $rssi; signalStrength: $signalStrength; " - "hasInternet: $hasInternet; generation: $generation"; -} +part 'wifi_generations.dart'; +part 'wifi_info.dart'; +part 'wifi_network_security.dart'; class WiFiBasic { WiFiBasic._(); diff --git a/packages/wifi_basic/lib/wifi_generations.dart b/packages/wifi_basic/lib/wifi_generations.dart new file mode 100644 index 00000000..24d8ba64 --- /dev/null +++ b/packages/wifi_basic/lib/wifi_generations.dart @@ -0,0 +1,3 @@ +part of 'wifi_basic.dart'; + +enum WiFiGenerations { unknown, legacy, wifi4, wifi5, wifi6 } diff --git a/packages/wifi_basic/lib/wifi_info.dart b/packages/wifi_basic/lib/wifi_info.dart new file mode 100644 index 00000000..435aa5ba --- /dev/null +++ b/packages/wifi_basic/lib/wifi_info.dart @@ -0,0 +1,29 @@ +part of 'wifi_basic.dart'; + +class WiFiInfo { + final String ssid; + final String bssid; + final WiFiNetworkSecurity security; + final bool isHidden; + final int rssi; + final double signalStrength; + final bool hasInternet; + final WiFiGenerations generation; + + bool get isNull => ssid.isEmpty; + + WiFiInfo._fromMap(Map map) + : ssid = map["ssid"], + bssid = map["bssid"], + security = (map["security"] as int?).toWifiNetworkSecurity(), + isHidden = map["isHidden"], + rssi = map["rssi"], + signalStrength = map["signalStrength"], + hasInternet = map["hasInternet"], + generation = (map["generation"] as int?).toWifiGeneration(); + + @override + String toString() => "ssid; $ssid; bssid: $bssid; security: $security; " + "isHidden: $isHidden; rssi: $rssi; signalStrength: $signalStrength; " + "hasInternet: $hasInternet; generation: $generation"; +} diff --git a/packages/wifi_basic/lib/wifi_network_security.dart b/packages/wifi_basic/lib/wifi_network_security.dart new file mode 100644 index 00000000..1f824440 --- /dev/null +++ b/packages/wifi_basic/lib/wifi_network_security.dart @@ -0,0 +1,3 @@ +part of 'wifi_basic.dart'; + +enum WiFiNetworkSecurity { unknown, none, wep, wpa, wpa2, wpa3 } From ab2cc81a14dc4a79bc91bccf2d72dcca08f88962 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 16:38:13 -0300 Subject: [PATCH 2/7] feat: override WiFiInfo.== and .hashCode --- packages/wifi_basic/lib/wifi_basic.dart | 1 + packages/wifi_basic/lib/wifi_info.dart | 29 +++++++++++++++++++++++++ packages/wifi_basic/pubspec.yaml | 1 + 3 files changed, 31 insertions(+) diff --git a/packages/wifi_basic/lib/wifi_basic.dart b/packages/wifi_basic/lib/wifi_basic.dart index e29f1892..d079581f 100644 --- a/packages/wifi_basic/lib/wifi_basic.dart +++ b/packages/wifi_basic/lib/wifi_basic.dart @@ -1,4 +1,5 @@ import 'package:async/async.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/services.dart'; import 'package:wifi_basic/src/extensions.dart'; diff --git a/packages/wifi_basic/lib/wifi_info.dart b/packages/wifi_basic/lib/wifi_info.dart index 435aa5ba..8b47e270 100644 --- a/packages/wifi_basic/lib/wifi_info.dart +++ b/packages/wifi_basic/lib/wifi_info.dart @@ -1,6 +1,8 @@ part of 'wifi_basic.dart'; class WiFiInfo { + static const Equality _equality = DeepCollectionEquality(); + final String ssid; final String bssid; final WiFiNetworkSecurity security; @@ -22,6 +24,33 @@ class WiFiInfo { hasInternet = map["hasInternet"], generation = (map["generation"] as int?).toWifiGeneration(); + @override + bool operator ==(Object other) => + identical(this, other) || + (runtimeType == other.runtimeType && + other is WiFiInfo && + _equality.equals(ssid, other.ssid) && + _equality.equals(bssid, other.bssid) && + _equality.equals(security, other.security) && + _equality.equals(isHidden, other.isHidden) && + _equality.equals(rssi, other.rssi) && + _equality.equals(signalStrength, other.signalStrength) && + _equality.equals(hasInternet, other.hasInternet) && + _equality.equals(generation, other.generation)); + + @override + int get hashCode => Object.hash( + runtimeType, + _equality.hash(ssid), + _equality.hash(bssid), + _equality.hash(security), + _equality.hash(isHidden), + _equality.hash(rssi), + _equality.hash(signalStrength), + _equality.hash(hasInternet), + _equality.hash(generation), + ); + @override String toString() => "ssid; $ssid; bssid: $bssid; security: $security; " "isHidden: $isHidden; rssi: $rssi; signalStrength: $signalStrength; " diff --git a/packages/wifi_basic/pubspec.yaml b/packages/wifi_basic/pubspec.yaml index 1bb75586..2ad4e48e 100644 --- a/packages/wifi_basic/pubspec.yaml +++ b/packages/wifi_basic/pubspec.yaml @@ -11,6 +11,7 @@ dependencies: flutter: sdk: flutter async: ^2.8.0 + collection: ^1.15.0 dev_dependencies: flutter_test: From 4448253b97d612c8f145ddbe3f091edb02d20c10 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 16:43:14 -0300 Subject: [PATCH 3/7] refactor: add casts to WiFiInfo._fromMap --- packages/wifi_basic/lib/wifi_info.dart | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/wifi_basic/lib/wifi_info.dart b/packages/wifi_basic/lib/wifi_info.dart index 8b47e270..59aa3aaf 100644 --- a/packages/wifi_basic/lib/wifi_info.dart +++ b/packages/wifi_basic/lib/wifi_info.dart @@ -15,13 +15,13 @@ class WiFiInfo { bool get isNull => ssid.isEmpty; WiFiInfo._fromMap(Map map) - : ssid = map["ssid"], - bssid = map["bssid"], + : ssid = map["ssid"] as String, + bssid = map["bssid"] as String, security = (map["security"] as int?).toWifiNetworkSecurity(), - isHidden = map["isHidden"], - rssi = map["rssi"], - signalStrength = map["signalStrength"], - hasInternet = map["hasInternet"], + isHidden = map["isHidden"] as bool, + rssi = map["rssi"] as int, + signalStrength = map["signalStrength"] as double, + hasInternet = map["hasInternet"] as bool, generation = (map["generation"] as int?).toWifiGeneration(); @override From 6f513667f5b42f5a3cc7b38fa0352ee9718b2a89 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 16:46:21 -0300 Subject: [PATCH 4/7] refactor: add class name to WiFiInfo.toString --- packages/wifi_basic/lib/wifi_info.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/wifi_basic/lib/wifi_info.dart b/packages/wifi_basic/lib/wifi_info.dart index 59aa3aaf..09096272 100644 --- a/packages/wifi_basic/lib/wifi_info.dart +++ b/packages/wifi_basic/lib/wifi_info.dart @@ -52,7 +52,8 @@ class WiFiInfo { ); @override - String toString() => "ssid; $ssid; bssid: $bssid; security: $security; " - "isHidden: $isHidden; rssi: $rssi; signalStrength: $signalStrength; " - "hasInternet: $hasInternet; generation: $generation"; + String toString() => "WiFiInfo(ssid: $ssid, bssid: $bssid, " + "security: $security, isHidden: $isHidden, rssi: $rssi, " + "signalStrength: $signalStrength, hasInternet: $hasInternet, " + "generation: $generation)"; } From 6050f38426f24c021e0c7929129e1b417a02b650 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 16:53:21 -0300 Subject: [PATCH 5/7] refactor: add casts to _channel.invokeMethod itself --- packages/wifi_basic/lib/wifi_basic.dart | 50 ++++++++++++++++--------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/packages/wifi_basic/lib/wifi_basic.dart b/packages/wifi_basic/lib/wifi_basic.dart index d079581f..8885fc48 100644 --- a/packages/wifi_basic/lib/wifi_basic.dart +++ b/packages/wifi_basic/lib/wifi_basic.dart @@ -15,21 +15,37 @@ class WiFiBasic { final _isSupportedMemo = AsyncMemoizer(); final _getGenerationMemo = AsyncMemoizer(); - Future isSupported() => _isSupportedMemo - .runOnce(() async => await _channel.invokeMethod('isSupported')); - - Future getGeneration() => _getGenerationMemo.runOnce( - () async => (await _channel.invokeMethod("getGeneration") as int?) - .toWifiGeneration()); - - Future isEnabled() async => await _channel.invokeMethod('isEnabled'); - - Future setEnabled(bool enabled) async => - await _channel.invokeMethod('setEnabled', {"enabled": enabled}); - - Future openSettings() async => - await _channel.invokeMethod("openSettings"); - - Future getCurrentInfo() async => - WiFiInfo._fromMap(await _channel.invokeMapMethod("getCurrentInfo") ?? {}); + Future isSupported() { + return _isSupportedMemo.runOnce(() async { + return (await _channel.invokeMethod('isSupported'))!; + }); + } + + Future getGeneration() { + return _getGenerationMemo.runOnce(() async { + return (await _channel.invokeMethod("getGeneration")) + .toWifiGeneration(); + }); + } + + Future isEnabled() async { + return (await _channel.invokeMethod('isEnabled'))!; + } + + Future setEnabled(bool enabled) async { + return (await _channel.invokeMethod( + 'setEnabled', + {"enabled": enabled}, + ))!; + } + + Future openSettings() async { + await _channel.invokeMethod("openSettings"); + } + + Future getCurrentInfo() async { + return WiFiInfo._fromMap( + await _channel.invokeMapMethod("getCurrentInfo") ?? {}, + ); + } } From f65fddf5077d880ce7b26ee9c0030a5a821e1d4d Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 17:07:31 -0300 Subject: [PATCH 6/7] refactor: make WifiBasic.getCurrentInfo return null if invokeMapMethod result in null --- packages/wifi_basic/lib/wifi_basic.dart | 12 ++++--- packages/wifi_basic/lib/wifi_info.dart | 3 +- packages/wifi_basic/test/wifi_basic_test.dart | 35 ++++++++----------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/wifi_basic/lib/wifi_basic.dart b/packages/wifi_basic/lib/wifi_basic.dart index 8885fc48..5d8cd02c 100644 --- a/packages/wifi_basic/lib/wifi_basic.dart +++ b/packages/wifi_basic/lib/wifi_basic.dart @@ -1,5 +1,6 @@ import 'package:async/async.dart'; import 'package:collection/collection.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:wifi_basic/src/extensions.dart'; @@ -43,9 +44,12 @@ class WiFiBasic { await _channel.invokeMethod("openSettings"); } - Future getCurrentInfo() async { - return WiFiInfo._fromMap( - await _channel.invokeMapMethod("getCurrentInfo") ?? {}, - ); + Future getCurrentInfo() async { + final result = + await _channel.invokeMapMethod("getCurrentInfo"); + + if (result == null) return null; + + return WiFiInfo.fromMap(result); } } diff --git a/packages/wifi_basic/lib/wifi_info.dart b/packages/wifi_basic/lib/wifi_info.dart index 09096272..0ea656e6 100644 --- a/packages/wifi_basic/lib/wifi_info.dart +++ b/packages/wifi_basic/lib/wifi_info.dart @@ -14,7 +14,8 @@ class WiFiInfo { bool get isNull => ssid.isEmpty; - WiFiInfo._fromMap(Map map) + @visibleForTesting + WiFiInfo.fromMap(Map map) : ssid = map["ssid"] as String, bssid = map["bssid"] as String, security = (map["security"] as int?).toWifiNetworkSecurity(), diff --git a/packages/wifi_basic/test/wifi_basic_test.dart b/packages/wifi_basic/test/wifi_basic_test.dart index 9e3f3ffb..030ff3a9 100644 --- a/packages/wifi_basic/test/wifi_basic_test.dart +++ b/packages/wifi_basic/test/wifi_basic_test.dart @@ -2,9 +2,8 @@ import 'dart:math'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:wifi_basic/wifi_basic.dart'; - import 'package:wifi_basic/src/extensions.dart' show ToEnumExtension; +import 'package:wifi_basic/wifi_basic.dart'; void main() { const channel = MethodChannel('wifi_basic'); @@ -86,25 +85,21 @@ void main() { }); test("test getCurrentInfo", () async { - mockHandlers["getCurrentInfo"] = (_) => { - "ssid": "my-wifi", - "bssid": "02:00:00:00:00:00", - "security": 0, - "isHidden": false, - "rssi": -100, - "signalStrength": 1.0, - "hasInternet": true, - "generation": -1, - }; + final value = { + "ssid": "my-wifi", + "bssid": "02:00:00:00:00:00", + "security": 0, + "isHidden": false, + "rssi": -100, + "signalStrength": 1.0, + "hasInternet": true, + "generation": -1, + }; + mockHandlers["getCurrentInfo"] = (_) => value; + final info = await WiFiBasic.instance.getCurrentInfo(); - expect(info.ssid, "my-wifi"); - expect(info.bssid, "02:00:00:00:00:00"); - expect(info.security, WiFiNetworkSecurity.none); - expect(info.isHidden, false); - expect(info.rssi, -100); - expect(info.signalStrength, 1.0); - expect(info.hasInternet, true); - expect(info.generation, WiFiGenerations.unknown); + + expect(info, WiFiInfo.fromMap(value)); }); test("test ToEnumExtension.toWifiGeneration", () async { From 6241700e951b1fd8fef38c8905e2e1e8d44f0844 Mon Sep 17 00:00:00 2001 From: Fernando Santos Date: Sat, 11 Dec 2021 17:30:18 -0300 Subject: [PATCH 7/7] refactor: better extensions.dart organization --- packages/wifi_basic/lib/src/extensions.dart | 48 ++++++++++----- packages/wifi_basic/lib/wifi_basic.dart | 4 +- packages/wifi_basic/lib/wifi_info.dart | 6 +- packages/wifi_basic/test/wifi_basic_test.dart | 61 +++++++++++-------- 4 files changed, 75 insertions(+), 44 deletions(-) diff --git a/packages/wifi_basic/lib/src/extensions.dart b/packages/wifi_basic/lib/src/extensions.dart index 8618d26b..1ca83bee 100644 --- a/packages/wifi_basic/lib/src/extensions.dart +++ b/packages/wifi_basic/lib/src/extensions.dart @@ -1,22 +1,42 @@ import 'package:wifi_basic/wifi_basic.dart'; -extension ToEnumExtension on int? { - WiFiGenerations toWifiGeneration() { - if (this == null || this! < 0 || this! > 6) { - return WiFiGenerations.unknown; +extension WiFiGenerationsExtension on WiFiGenerations { + static WiFiGenerations fromInt(int? value) { + switch (value) { + case 0: + case 1: + case 2: + case 3: + return WiFiGenerations.legacy; + case 4: + return WiFiGenerations.wifi4; + case 5: + return WiFiGenerations.wifi5; + case 6: + return WiFiGenerations.wifi6; + default: + return WiFiGenerations.unknown; } - // legacy - if less than 3 - if (this! <= 3) return WiFiGenerations.legacy; - // convert generationInt -> generationEnum - return WiFiGenerations.values[this! - 2]; } +} - WiFiNetworkSecurity toWifiNetworkSecurity() { - if (this == null || - this! < 0 || - this! > WiFiNetworkSecurity.values.length) { - return WiFiNetworkSecurity.unknown; +extension WiFiNetworkSecurityExtension on WiFiNetworkSecurity { + static WiFiNetworkSecurity fromInt(int? value) { + switch (value) { + case 0: + return WiFiNetworkSecurity.unknown; + case 1: + return WiFiNetworkSecurity.none; + case 2: + return WiFiNetworkSecurity.wep; + case 3: + return WiFiNetworkSecurity.wpa; + case 4: + return WiFiNetworkSecurity.wpa2; + case 5: + return WiFiNetworkSecurity.wpa3; + default: + return WiFiNetworkSecurity.unknown; } - return WiFiNetworkSecurity.values[this! + 1]; } } diff --git a/packages/wifi_basic/lib/wifi_basic.dart b/packages/wifi_basic/lib/wifi_basic.dart index 5d8cd02c..0ceffa8d 100644 --- a/packages/wifi_basic/lib/wifi_basic.dart +++ b/packages/wifi_basic/lib/wifi_basic.dart @@ -24,8 +24,8 @@ class WiFiBasic { Future getGeneration() { return _getGenerationMemo.runOnce(() async { - return (await _channel.invokeMethod("getGeneration")) - .toWifiGeneration(); + final generation = await _channel.invokeMethod("getGeneration"); + return WiFiGenerationsExtension.fromInt(generation); }); } diff --git a/packages/wifi_basic/lib/wifi_info.dart b/packages/wifi_basic/lib/wifi_info.dart index 0ea656e6..56ac416a 100644 --- a/packages/wifi_basic/lib/wifi_info.dart +++ b/packages/wifi_basic/lib/wifi_info.dart @@ -18,12 +18,14 @@ class WiFiInfo { WiFiInfo.fromMap(Map map) : ssid = map["ssid"] as String, bssid = map["bssid"] as String, - security = (map["security"] as int?).toWifiNetworkSecurity(), + security = + WiFiNetworkSecurityExtension.fromInt(map["security"] as int?), isHidden = map["isHidden"] as bool, rssi = map["rssi"] as int, signalStrength = map["signalStrength"] as double, hasInternet = map["hasInternet"] as bool, - generation = (map["generation"] as int?).toWifiGeneration(); + generation = + WiFiGenerationsExtension.fromInt(map["generation"] as int?); @override bool operator ==(Object other) => diff --git a/packages/wifi_basic/test/wifi_basic_test.dart b/packages/wifi_basic/test/wifi_basic_test.dart index 030ff3a9..e12b3080 100644 --- a/packages/wifi_basic/test/wifi_basic_test.dart +++ b/packages/wifi_basic/test/wifi_basic_test.dart @@ -2,7 +2,7 @@ import 'dart:math'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:wifi_basic/src/extensions.dart' show ToEnumExtension; +import 'package:wifi_basic/src/extensions.dart'; import 'package:wifi_basic/wifi_basic.dart'; void main() { @@ -96,37 +96,46 @@ void main() { "generation": -1, }; mockHandlers["getCurrentInfo"] = (_) => value; - final info = await WiFiBasic.instance.getCurrentInfo(); expect(info, WiFiInfo.fromMap(value)); }); - test("test ToEnumExtension.toWifiGeneration", () async { - // test for unknown - expect((-1).toWifiGeneration(), WiFiGenerations.unknown); - // test for legacy - expect(Random().nextInt(3).toWifiGeneration(), WiFiGenerations.legacy); - // test for wifi4, wifi5 and wifi6 - expect(4.toWifiGeneration(), WiFiGenerations.wifi4); - expect(5.toWifiGeneration(), WiFiGenerations.wifi5); - expect(6.toWifiGeneration(), WiFiGenerations.wifi6); - // test for unknown again - expect( - (7 + Random().nextInt(10)).toWifiGeneration(), WiFiGenerations.unknown); + test("test WiFiGenerationsExtension", () { + final intValues = [-1, 0, 1, 2, 3, 4, 5, 6, 7, null]; + + final enumValues = intValues.map(WiFiGenerationsExtension.fromInt).toList(); + + expect(enumValues, [ + WiFiGenerations.unknown, + WiFiGenerations.legacy, + WiFiGenerations.legacy, + WiFiGenerations.legacy, + WiFiGenerations.legacy, + WiFiGenerations.wifi4, + WiFiGenerations.wifi5, + WiFiGenerations.wifi6, + WiFiGenerations.unknown, + WiFiGenerations.unknown, + ]); }); - test("test ToEnumExtension.toWifiNetworkSecurity", () { - // test for unknown - expect((-1).toWifiNetworkSecurity(), WiFiNetworkSecurity.unknown); - // test for values - expect(0.toWifiNetworkSecurity(), WiFiNetworkSecurity.none); - expect(1.toWifiNetworkSecurity(), WiFiNetworkSecurity.wep); - expect(2.toWifiNetworkSecurity(), WiFiNetworkSecurity.wpa); - expect(3.toWifiNetworkSecurity(), WiFiNetworkSecurity.wpa2); - expect(4.toWifiNetworkSecurity(), WiFiNetworkSecurity.wpa3); - // test for unknown again - expect((7 + Random().nextInt(10)).toWifiNetworkSecurity(), - WiFiNetworkSecurity.unknown); + test("test WiFiNetworkSecurityExtension", () { + final intValues = [-1, 0, 1, 2, 3, 4, 5, 6, null]; + + final enumValues = + intValues.map(WiFiNetworkSecurityExtension.fromInt).toList(); + + expect(enumValues, [ + WiFiNetworkSecurity.unknown, + WiFiNetworkSecurity.unknown, + WiFiNetworkSecurity.none, + WiFiNetworkSecurity.wep, + WiFiNetworkSecurity.wpa, + WiFiNetworkSecurity.wpa2, + WiFiNetworkSecurity.wpa3, + WiFiNetworkSecurity.unknown, + WiFiNetworkSecurity.unknown, + ]); }); }