mirrored_repositories/awesome-flutter/examples/plugins/packages/device_info/device_info_platform_interface/lib
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/// Information derived from `UIDevice`.
///
/// See: https://developer.apple.com/documentation/uikit/uidevice
class IosDeviceInfo {
  /// IOS device info class.
  IosDeviceInfo({
    required this.name,
    required this.systemName,
    required this.systemVersion,
    required this.model,
    required this.localizedModel,
    required this.identifierForVendor,
    required this.isPhysicalDevice,
    required this.utsname,
  });

  /// Device name.
  ///
  /// The value is an empty String if it is not available.
  final String name;

  /// The name of the current operating system.
  ///
  /// The value is an empty String if it is not available.
  final String systemName;

  /// The current operating system version.
  ///
  /// The value is an empty String if it is not available.
  final String systemVersion;

  /// Device model.
  ///
  /// The value is an empty String if it is not available.
  final String model;

  /// Localized name of the device model.
  ///
  /// The value is an empty String if it is not available.
  final String localizedModel;

  /// Unique UUID value identifying the current device.
  ///
  /// The value is an empty String if it is not available.
  final String identifierForVendor;

  /// The value is `true` if the application is running on a physical device.
  ///
  /// The value is `false` when the application is running on a simulator, or the value is unavailable.
  final bool isPhysicalDevice;

  /// Operating system information derived from `sys/utsname.h`.
  ///
  /// The value is an empty String if it is not available.
  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'] != null
          ? map['isPhysicalDevice'] == 'true'
          : false,
      utsname: IosUtsname._fromMap(map['utsname'] != null
          ? map['utsname'].cast<String, dynamic>()
          : <String, dynamic>{}),
    );
  }
}

/// Information derived from `utsname`.
/// See http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysutsname.h.html for details.
class IosUtsname {
  IosUtsname._({
    required this.sysname,
    required this.nodename,
    required this.release,
    required this.version,
    required this.machine,
  });

  /// Operating system name.
  ///
  /// The value is an empty String if it is not available.
  final String sysname;

  /// Network node name.
  ///
  /// The value is an empty String if it is not available.
  final String nodename;

  /// Release level.
  ///
  /// The value is an empty String if it is not available.
  final String release;

  /// Version level.
  ///
  /// The value is an empty String if it is not available.
  final String version;

  /// Hardware type (e.g. 'iPhone7,1' for iPhone 6 Plus).
  ///
  /// The value is an empty String if it is not available.
  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'] ?? '',
    );
  }
}
