blob: 25b7d46cdb1153a9c4503327a08150b4e3dbb379 [file] [log] [blame]
// Copyright 2017 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/services.dart';
/// Provides device and operating system information.
class DeviceInfoPlugin {
/// No work is done when instantiating the plugin. It's safe to call this
/// repeatedly or in performance-sensitive blocks.
DeviceInfoPlugin();
/// Channel used to communicate to native code.
static const MethodChannel channel =
MethodChannel('plugins.flutter.io/device_info');
/// This information does not change from call to call. Cache it.
AndroidDeviceInfo _cachedAndroidDeviceInfo;
/// Information derived from `android.os.Build`.
///
/// See: https://developer.android.com/reference/android/os/Build.html
Future<AndroidDeviceInfo> get androidInfo async =>
_cachedAndroidDeviceInfo ??= AndroidDeviceInfo._fromMap(await channel
.invokeMapMethod<String, dynamic>('getAndroidDeviceInfo'));
/// This information does not change from call to call. Cache it.
IosDeviceInfo _cachedIosDeviceInfo;
/// Information derived from `UIDevice`.
///
/// See: https://developer.apple.com/documentation/uikit/uidevice
Future<IosDeviceInfo> get iosInfo async =>
_cachedIosDeviceInfo ??= IosDeviceInfo._fromMap(
await channel.invokeMapMethod<String, dynamic>('getIosDeviceInfo'));
}
/// Information derived from `android.os.Build`.
///
/// See: https://developer.android.com/reference/android/os/Build.html
class AndroidDeviceInfo {
AndroidDeviceInfo._({
this.version,
this.board,
this.bootloader,
this.brand,
this.device,
this.display,
this.fingerprint,
this.hardware,
this.host,
this.id,
this.manufacturer,
this.model,
this.product,
List<String> supported32BitAbis,
List<String> supported64BitAbis,
List<String> supportedAbis,
this.tags,
this.type,
this.isPhysicalDevice,
this.androidId,
List<String> systemFeatures,
}) : supported32BitAbis = List<String>.unmodifiable(supported32BitAbis),
supported64BitAbis = List<String>.unmodifiable(supported64BitAbis),
supportedAbis = List<String>.unmodifiable(supportedAbis),
systemFeatures = List<String>.unmodifiable(systemFeatures);
/// Android operating system version values derived from `android.os.Build.VERSION`.
final AndroidBuildVersion version;
/// The name of the underlying board, like "goldfish".
final String board;
/// The system bootloader version number.
final String bootloader;
/// The consumer-visible brand with which the product/hardware will be associated, if any.
final String brand;
/// The name of the industrial design.
final String device;
/// A build ID string meant for displaying to the user.
final String display;
/// A string that uniquely identifies this build.
final String fingerprint;
/// The name of the hardware (from the kernel command line or /proc).
final String hardware;
/// Hostname.
final String host;
/// Either a changelist number, or a label like "M4-rc20".
final String id;
/// The manufacturer of the product/hardware.
final String manufacturer;
/// The end-user-visible name for the end product.
final String model;
/// The name of the overall product.
final String product;
/// An ordered list of 32 bit ABIs supported by this device.
final List<String> supported32BitAbis;
/// An ordered list of 64 bit ABIs supported by this device.
final List<String> supported64BitAbis;
/// An ordered list of ABIs supported by this device.
final List<String> supportedAbis;
/// Comma-separated tags describing the build, like "unsigned,debug".
final String tags;
/// The type of build, like "user" or "eng".
final String type;
/// `false` if the application is running in an emulator, `true` otherwise.
final bool isPhysicalDevice;
/// The Android hardware device ID that is unique between the device + user and app signing.
final String androidId;
/// Describes what features are available on the current device.
///
/// This can be used to check if the device has, for example, a front-facing
/// camera, or a touchscreen. However, in many cases this is not the best
/// API to use. For example, if you are interested in bluetooth, this API
/// can tell you if the device has a bluetooth radio, but it cannot tell you
/// if bluetooth is currently enabled, or if you have been granted the
/// necessary permissions to use it. Please *only* use this if there is no
/// other way to determine if a feature is supported.
///
/// This data comes from Android's PackageManager.getSystemAvailableFeatures,
/// and many of the common feature strings to look for are available in
/// PackageManager's public documentation:
/// https://developer.android.com/reference/android/content/pm/PackageManager
final List<String> systemFeatures;
/// Deserializes from the message received from [_kChannel].
static AndroidDeviceInfo _fromMap(Map<String, dynamic> map) {
return AndroidDeviceInfo._(
version:
AndroidBuildVersion._fromMap(map['version']?.cast<String, dynamic>()),
board: map['board'],
bootloader: map['bootloader'],
brand: map['brand'],
device: map['device'],
display: map['display'],
fingerprint: map['fingerprint'],
hardware: map['hardware'],
host: map['host'],
id: map['id'],
manufacturer: map['manufacturer'],
model: map['model'],
product: map['product'],
supported32BitAbis: _fromList(map['supported32BitAbis']),
supported64BitAbis: _fromList(map['supported64BitAbis']),
supportedAbis: _fromList(map['supportedAbis']),
tags: map['tags'],
type: map['type'],
isPhysicalDevice: map['isPhysicalDevice'],
androidId: map['androidId'],
systemFeatures: _fromList(map['systemFeatures']),
);
}
/// Deserializes message as List<String>
static List<String> _fromList(dynamic message) {
final List<dynamic> list = message;
return List<String>.from(list);
}
}
/// Version values of the current Android operating system build derived from
/// `android.os.Build.VERSION`.
///
/// See: https://developer.android.com/reference/android/os/Build.VERSION.html
class AndroidBuildVersion {
AndroidBuildVersion._({
this.baseOS,
this.codename,
this.incremental,
this.previewSdkInt,
this.release,
this.sdkInt,
this.securityPatch,
});
/// The base OS build the product is based on.
final String baseOS;
/// The current development codename, or the string "REL" if this is a release build.
final String codename;
/// The internal value used by the underlying source control to represent this build.
final String incremental;
/// The developer preview revision of a prerelease SDK.
final int previewSdkInt;
/// The user-visible version string.
final String release;
/// The user-visible SDK version of the framework.
///
/// Possible values are defined in: https://developer.android.com/reference/android/os/Build.VERSION_CODES.html
final int sdkInt;
/// The user-visible security patch level.
final String securityPatch;
/// Deserializes from the map message received from [_kChannel].
static AndroidBuildVersion _fromMap(Map<String, dynamic> map) {
return AndroidBuildVersion._(
baseOS: map['baseOS'],
codename: map['codename'],
incremental: map['incremental'],
previewSdkInt: map['previewSdkInt'],
release: map['release'],
sdkInt: map['sdkInt'],
securityPatch: map['securityPatch'],
);
}
}
/// Information derived from `UIDevice`.
///
/// See: https://developer.apple.com/documentation/uikit/uidevice
class IosDeviceInfo {
IosDeviceInfo._({
this.name,
this.systemName,
this.systemVersion,
this.model,
this.localizedModel,
this.identifierForVendor,
this.isPhysicalDevice,
this.utsname,
});
/// Device name.
final String name;
/// The name of the current operating system.
final String systemName;
/// The current operating system version.
final String systemVersion;
/// Device model.
final String model;
/// Localized name of the device model.
final String localizedModel;
/// Unique UUID value identifying the current device.
final String identifierForVendor;
/// `false` if the application is running in a simulator, `true` otherwise.
final bool isPhysicalDevice;
/// Operating system information derived from `sys/utsname.h`.
final IosUtsname utsname;
/// Deserializes from the map message received from [_kChannel].
static IosDeviceInfo _fromMap(Map<String, dynamic> map) {
return IosDeviceInfo._(
name: map['name'],
systemName: map['systemName'],
systemVersion: map['systemVersion'],
model: map['model'],
localizedModel: map['localizedModel'],
identifierForVendor: map['identifierForVendor'],
isPhysicalDevice: map['isPhysicalDevice'] == 'true',
utsname: IosUtsname._fromMap(map['utsname']?.cast<String, dynamic>()),
);
}
}
/// Information derived from `utsname`.
/// See http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysutsname.h.html for details.
class IosUtsname {
IosUtsname._({
this.sysname,
this.nodename,
this.release,
this.version,
this.machine,
});
/// Operating system name.
final String sysname;
/// Network node name.
final String nodename;
/// Release level.
final String release;
/// Version level.
final String version;
/// Hardware type (e.g. 'iPhone7,1' for iPhone 6 Plus).
final String machine;
/// Deserializes from the map message received from [_kChannel].
static IosUtsname _fromMap(Map<String, dynamic> map) {
return IosUtsname._(
sysname: map['sysname'],
nodename: map['nodename'],
release: map['release'],
version: map['version'],
machine: map['machine'],
);
}
}