diff --git a/packages/device_info_plus/device_info_plus/CHANGELOG.md b/packages/device_info_plus/device_info_plus/CHANGELOG.md index 4989e9f9ab..9c1d94b8a0 100644 --- a/packages/device_info_plus/device_info_plus/CHANGELOG.md +++ b/packages/device_info_plus/device_info_plus/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.2.0 + +- add `deviceInfo` + ## 3.1.1 - add toMap to WebBrowserInfo diff --git a/packages/device_info_plus/device_info_plus/README.md b/packages/device_info_plus/device_info_plus/README.md index c7d9d7dcd7..c2cf690175 100644 --- a/packages/device_info_plus/device_info_plus/README.md +++ b/packages/device_info_plus/device_info_plus/README.md @@ -37,6 +37,17 @@ WebBrowserInfo webBrowserInfo = await deviceInfo.webBrowserInfo; print('Running on ${webBrowserInfo.userAgent}'); // e.g. "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0" ``` +One common use case for this plugin is obtaining device information for telemetry or crash-reporting purposes. In this scenario your app is not interested in specific properties, instead it wants to send all it knows about the device to your backend service for further analysis. You can leverage `deviceInfo` property, which returns platform-specific device information in a generic way. You then use it's `toMap` method to serialize all known properties to a `Map`. Your backend service should be prepared to handle new properties, which can be added to this plugin in the future. + +```dart +import 'package:device_info_plus/device_info_plus.dart'; + +final deviceInfoPlugin = DeviceInfoPlugin(); +final deviceInfo = await deviceInfoPlugin.deviceInfo; +final map = deviceInfo.toMap(); +// Push [map] to your service. +``` + You will find links to the API docs on the [pub page](https://pub.dev/packages/device_info_plus). Check out our documentation website to learn more. [Plus plugins documentation](https://plus.fluttercommunity.dev/docs/overview) diff --git a/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e.dart b/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e.dart index 89d6ddd73b..f4024faf4b 100644 --- a/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e.dart +++ b/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e.dart @@ -19,41 +19,50 @@ void main() { WindowsDeviceInfo windowsInfo; LinuxDeviceInfo linuxInfo; MacOsDeviceInfo macosInfo; + BaseDeviceInfo deviceInfo; setUpAll(() async { final deviceInfoPlugin = DeviceInfoPlugin(); - if (Platform.isIOS) { - iosInfo = await deviceInfoPlugin.iosInfo; - } else if (Platform.isAndroid) { - androidInfo = await deviceInfoPlugin.androidInfo; - } else if (Platform.isWindows) { - windowsInfo = await deviceInfoPlugin.windowsInfo; - } else if (Platform.isLinux) { - linuxInfo = await deviceInfoPlugin.linuxInfo; - } else if (Platform.isMacOS) { - macosInfo = await deviceInfoPlugin.macOsInfo; - } - if (kIsWeb) { webBrowserInfo = await deviceInfoPlugin.webBrowserInfo; + } else { + if (Platform.isIOS) { + iosInfo = await deviceInfoPlugin.iosInfo; + } else if (Platform.isAndroid) { + androidInfo = await deviceInfoPlugin.androidInfo; + } else if (Platform.isWindows) { + windowsInfo = await deviceInfoPlugin.windowsInfo; + } else if (Platform.isLinux) { + linuxInfo = await deviceInfoPlugin.linuxInfo; + } else if (Platform.isMacOS) { + macosInfo = await deviceInfoPlugin.macOsInfo; + } } + + deviceInfo = await deviceInfoPlugin.deviceInfo; }); testWidgets('Can get non-null device model', (WidgetTester tester) async { - if (Platform.isIOS) { - expect(iosInfo.model, isNotNull); - } else if (Platform.isAndroid) { - expect(androidInfo.model, isNotNull); - } else if (Platform.isWindows) { - expect(windowsInfo.computerName, isNotNull); - } else if (Platform.isLinux) { - expect(linuxInfo.name, isNotNull); - } else if (Platform.isMacOS) { - expect(macosInfo.computerName, isNotNull); - } - if (kIsWeb) { expect(webBrowserInfo.userAgent, isNotNull); + expect(deviceInfo, same(webBrowserInfo)); + } else { + if (Platform.isIOS) { + expect(iosInfo.model, isNotNull); + expect(deviceInfo, same(iosInfo)); + } else if (Platform.isAndroid) { + expect(androidInfo.model, isNotNull); + expect(deviceInfo, same(androidInfo)); + } else if (Platform.isWindows) { + expect(windowsInfo.computerName, isNotNull); + expect(deviceInfo, same(windowsInfo)); + } else if (Platform.isLinux) { + expect(linuxInfo.name, isNotNull); + expect(deviceInfo, same(linuxInfo)); + } else if (Platform.isMacOS) { + expect(macosInfo.computerName, isNotNull); + expect(deviceInfo, same(macosInfo)); + } } }); } diff --git a/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e_test.dart b/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e_test.dart index 8e1cc79484..0296772236 100644 --- a/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e_test.dart +++ b/packages/device_info_plus/device_info_plus/example/test_driver/device_info_plus_e2e_test.dart @@ -4,16 +4,6 @@ // @dart=2.9 -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; -import 'package:flutter_driver/flutter_driver.dart'; +import 'package:integration_test/integration_test_driver.dart'; -Future main() async { - final driver = await FlutterDriver.connect(); - final data = - await driver.requestData(null, timeout: const Duration(minutes: 1)); - await driver.close(); - final Map result = jsonDecode(data); - exit(result['result'] == 'true' ? 0 : 1); -} +Future main() => integrationDriver(); diff --git a/packages/device_info_plus/device_info_plus/lib/device_info_plus.dart b/packages/device_info_plus/device_info_plus/lib/device_info_plus.dart index a4c777f12a..d431925f3c 100644 --- a/packages/device_info_plus/device_info_plus/lib/device_info_plus.dart +++ b/packages/device_info_plus/device_info_plus/lib/device_info_plus.dart @@ -3,12 +3,15 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import 'package:device_info_plus_platform_interface/device_info_plus_platform_interface.dart'; +import 'package:flutter/foundation.dart'; export 'package:device_info_plus_platform_interface/device_info_plus_platform_interface.dart' show AndroidBuildVersion, AndroidDeviceInfo, + BaseDeviceInfo, IosDeviceInfo, IosUtsname, LinuxDeviceInfo, @@ -76,4 +79,25 @@ class DeviceInfoPlugin { /// Returns device information for Windows. Future get windowsInfo async => _cachedWindowsDeviceInfo ??= await _platform.windowsInfo()!; + + /// Returns device information for the current platform. + Future get deviceInfo async { + if (kIsWeb) { + return webBrowserInfo; + } else { + if (Platform.isAndroid) { + return androidInfo; + } else if (Platform.isIOS) { + return iosInfo; + } else if (Platform.isLinux) { + return linuxInfo; + } else if (Platform.isMacOS) { + return macOsInfo; + } else if (Platform.isWindows) { + return windowsInfo; + } + } + + throw UnsupportedError('Unsupported platform'); + } } diff --git a/packages/device_info_plus/device_info_plus/pubspec.yaml b/packages/device_info_plus/device_info_plus/pubspec.yaml index 94a4d3506d..bd8b488c94 100644 --- a/packages/device_info_plus/device_info_plus/pubspec.yaml +++ b/packages/device_info_plus/device_info_plus/pubspec.yaml @@ -1,7 +1,7 @@ name: device_info_plus description: Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on. -version: 3.1.1 +version: 3.2.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ @@ -25,7 +25,7 @@ flutter: dependencies: flutter: sdk: flutter - device_info_plus_platform_interface: ^2.2.0 + device_info_plus_platform_interface: ^2.3.0 device_info_plus_linux: ^2.1.0 device_info_plus_macos: ^2.2.0 device_info_plus_web: ^2.1.0 diff --git a/packages/device_info_plus/device_info_plus_platform_interface/CHANGELOG.md b/packages/device_info_plus/device_info_plus_platform_interface/CHANGELOG.md index f2ab65f034..0ae924dada 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/CHANGELOG.md +++ b/packages/device_info_plus/device_info_plus_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.3.0 + +- add `BaseDeviceInfo` + ## 2.2.1 - add toMap to WebBrowserInfo diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/device_info_plus_platform_interface.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/device_info_plus_platform_interface.dart index 12ef1ccf0d..335939a10f 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/device_info_plus_platform_interface.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/device_info_plus_platform_interface.dart @@ -17,11 +17,11 @@ import 'model/web_browser_info.dart'; import 'model/windows_device_info.dart'; export 'model/android_device_info.dart'; +export 'model/base_device_info.dart'; export 'model/ios_device_info.dart'; export 'model/linux_device_info.dart'; export 'model/macos_device_info.dart'; export 'model/web_browser_info.dart'; -export 'model/macos_device_info.dart'; export 'model/windows_device_info.dart'; /// The interface that implementations of device_info must implement. diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/android_device_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/android_device_info.dart index e08bed3fea..c3359af22c 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/android_device_info.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/android_device_info.dart @@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'base_device_info.dart'; + /// Information derived from `android.os.Build`. /// /// See: https://developer.android.com/reference/android/os/Build.html -class AndroidDeviceInfo { +class AndroidDeviceInfo implements BaseDeviceInfo { /// Android device Info class. AndroidDeviceInfo({ required this.version, @@ -110,7 +112,8 @@ class AndroidDeviceInfo { /// https://developer.android.com/reference/android/content/pm/PackageManager final List systemFeatures; - /// Serializes [ AndroidDeviceInfo ] to map. + /// Serializes [AndroidDeviceInfo] to map. + @override Map toMap() { return { 'id': id, diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/base_device_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/base_device_info.dart new file mode 100644 index 0000000000..7de045e28f --- /dev/null +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/base_device_info.dart @@ -0,0 +1,5 @@ +/// The base class for platform's device info. +abstract class BaseDeviceInfo { + /// Serializes device info properties to a map. + Map toMap(); +} diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/ios_device_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/ios_device_info.dart index a4614d1eb6..cbd29ecdd2 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/ios_device_info.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/ios_device_info.dart @@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'base_device_info.dart'; + /// Information derived from `UIDevice`. /// /// See: https://developer.apple.com/documentation/uikit/uidevice -class IosDeviceInfo { +class IosDeviceInfo implements BaseDeviceInfo { /// IOS device info class. const IosDeviceInfo({ this.name, @@ -57,7 +59,8 @@ class IosDeviceInfo { ); } - /// Serializes [ IosDeviceInfo ] to a map. + /// Serializes [IosDeviceInfo] to a map. + @override Map toMap() { return { 'name': name, diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/linux_device_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/linux_device_info.dart index c152c6e972..cbddf49a7c 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/linux_device_info.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/linux_device_info.dart @@ -2,12 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'base_device_info.dart'; + /// Device information for a Linux system. /// /// See: /// - https://www.freedesktop.org/software/systemd/man/os-release.html /// - https://www.freedesktop.org/software/systemd/man/machine-id.html -class LinuxDeviceInfo { +class LinuxDeviceInfo implements BaseDeviceInfo { /// Constructs a LinuxDeviceInfo. /// A string identifying the operating system, without a version component, @@ -137,4 +139,22 @@ class LinuxDeviceInfo { /// boot. The machine ID is hexadecimal, 32-character, lowercase ID. When /// decoded from hexadecimal, this corresponds to a 16-byte/128-bit value. final String? machineId; + + /// Serializes [LinuxDeviceInfo] to a map. + @override + Map toMap() { + return { + 'name': name, + 'version': version, + 'id': id, + 'idLike': idLike, + 'versionCodename': versionCodename, + 'versionId': versionId, + 'prettyName': prettyName, + 'buildId': buildId, + 'variant': variant, + 'variantId': variantId, + 'machineId': machineId, + }; + } } diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/macos_device_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/macos_device_info.dart index e5e2e37322..5f9a154ccc 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/macos_device_info.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/macos_device_info.dart @@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'base_device_info.dart'; + /// Object encapsulating MACOS device information. -class MacOsDeviceInfo { +class MacOsDeviceInfo implements BaseDeviceInfo { /// Constructs a MacOsDeviceInfo. const MacOsDeviceInfo({ required this.computerName, @@ -52,7 +54,8 @@ class MacOsDeviceInfo { /// Device GUID final String? systemGUID; - /// Serializes [ MacOsDeviceInfo ] to map. + /// Serializes [MacOsDeviceInfo] to map. + @override Map toMap() { return { 'arch': arch, diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/web_browser_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/web_browser_info.dart index 1ae7be5e65..59eaea9079 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/web_browser_info.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/web_browser_info.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'base_device_info.dart'; + /// List of supported browsers enum BrowserName { /// Mozilla Firefox @@ -32,7 +34,7 @@ enum BrowserName { /// Information derived from `navigator`. /// /// See: https://developer.mozilla.org/en-US/docs/Web/API/Window/navigator -class WebBrowserInfo { +class WebBrowserInfo implements BaseDeviceInfo { /// Web Browser info class. WebBrowserInfo({ required this.appCodeName, @@ -126,7 +128,8 @@ class WebBrowserInfo { ); } - /// Serializes [ WebBrowserInfo ] to a map. + /// Serializes [WebBrowserInfo] to a map. + @override Map toMap() { return { 'browserName': browserName, diff --git a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/windows_device_info.dart b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/windows_device_info.dart index c7c9127aa7..c7bdbc5788 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/lib/model/windows_device_info.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/lib/model/windows_device_info.dart @@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'base_device_info.dart'; + /// Object encapsulating WINDOWS device information. -class WindowsDeviceInfo { +class WindowsDeviceInfo implements BaseDeviceInfo { /// Constructs a [WindowsDeviceInfo]. WindowsDeviceInfo({ required this.computerName, @@ -20,4 +22,14 @@ class WindowsDeviceInfo { /// The physically installed memory in the computer. /// This may not be the same as available memory. final int systemMemoryInMegabytes; + + /// Serializes [WindowsDeviceInfo] to a map. + @override + Map toMap() { + return { + 'computerName': computerName, + 'numberOfCores': numberOfCores, + 'systemMemoryInMegabytes': systemMemoryInMegabytes, + }; + } } diff --git a/packages/device_info_plus/device_info_plus_platform_interface/pubspec.yaml b/packages/device_info_plus/device_info_plus_platform_interface/pubspec.yaml index a23881d055..956bae0556 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/pubspec.yaml +++ b/packages/device_info_plus/device_info_plus_platform_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: device_info_plus_platform_interface description: A common platform interface for the device_info_plus plugin. -version: 2.2.1 +version: 2.3.0 homepage: https://plus.fluttercommunity.dev/ repository: https://github.com/fluttercommunity/plus_plugins/tree/main/packages/ diff --git a/packages/device_info_plus/device_info_plus_platform_interface/test/method_channel_device_info_test.dart b/packages/device_info_plus/device_info_plus_platform_interface/test/method_channel_device_info_test.dart index d793d2beda..974452ee0a 100644 --- a/packages/device_info_plus/device_info_plus_platform_interface/test/method_channel_device_info_test.dart +++ b/packages/device_info_plus/device_info_plus_platform_interface/test/method_channel_device_info_test.dart @@ -27,6 +27,19 @@ void main() { return ({ 'name': 'iPhone 10', }); + case 'getMacosDeviceInfo': + return ({ + 'arch': '', + 'model': 'MacBookPro', + 'activeCPUs': 0, + 'memorySize': 0, + 'cpuFrequency': 0, + 'hostName': '', + 'osRelease': '', + 'computerName': '', + 'kernelVersion': '', + 'systemGUID': null, + }); default: return null; } @@ -42,5 +55,10 @@ void main() { final result = await methodChannelDeviceInfo.iosInfo(); expect(result.name, 'iPhone 10'); }); + + test('macosInfo', () async { + final result = await methodChannelDeviceInfo.macosInfo(); + expect(result.model, 'MacBookPro'); + }); }); } diff --git a/packages/device_info_plus/device_info_plus_platform_interface/test/model/linux_device_info_test.dart b/packages/device_info_plus/device_info_plus_platform_interface/test/model/linux_device_info_test.dart new file mode 100644 index 0000000000..096fe532a9 --- /dev/null +++ b/packages/device_info_plus/device_info_plus_platform_interface/test/model/linux_device_info_test.dart @@ -0,0 +1,36 @@ +import 'package:device_info_plus_platform_interface/model/linux_device_info.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('$LinuxDeviceInfo', () { + test('toMap should return map with correct key and map', () { + final linuxDeviceInfo = LinuxDeviceInfo( + name: 'name', + version: 'version', + id: 'id', + idLike: ['idLike'], + versionCodename: 'versionCodename', + versionId: 'versionId', + prettyName: 'prettyName', + buildId: 'buildId', + variant: 'variant', + variantId: 'variantId', + machineId: 'machineId', + ); + + expect(linuxDeviceInfo.toMap(), { + 'name': 'name', + 'version': 'version', + 'id': 'id', + 'idLike': ['idLike'], + 'versionCodename': 'versionCodename', + 'versionId': 'versionId', + 'prettyName': 'prettyName', + 'buildId': 'buildId', + 'variant': 'variant', + 'variantId': 'variantId', + 'machineId': 'machineId', + }); + }); + }); +} diff --git a/packages/device_info_plus/device_info_plus_platform_interface/test/model/windows_device_info_test.dart b/packages/device_info_plus/device_info_plus_platform_interface/test/model/windows_device_info_test.dart new file mode 100644 index 0000000000..4bf89b7f0a --- /dev/null +++ b/packages/device_info_plus/device_info_plus_platform_interface/test/model/windows_device_info_test.dart @@ -0,0 +1,20 @@ +import 'package:device_info_plus_platform_interface/model/windows_device_info.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('$WindowsDeviceInfo', () { + test('toMap should return map with correct key and map', () { + final windowsDeviceInfo = WindowsDeviceInfo( + computerName: 'computerName', + numberOfCores: 4, + systemMemoryInMegabytes: 16, + ); + + expect(windowsDeviceInfo.toMap(), { + 'computerName': 'computerName', + 'numberOfCores': 4, + 'systemMemoryInMegabytes': 16, + }); + }); + }); +}