Device & Package Info Manager

A comprehensive Flutter package for managing device and package information across Flutter applications. This package provides clean, type-safe interfaces for accessing both package and device information with comprehensive utilities for version comparison, validation, caching, and advanced device identification.

Features

πŸ“¦ Package Information Management

  • Complete Package Info: App name, version, build number, installer store, SDK versions
  • Version Utilities: Display version, pre-release detection, version comparison
  • Installation Info: Install time, update time, formatted dates
  • Validation: Package info validation with detailed error reporting
  • Caching: Built-in caching with refresh and clear capabilities
  • Debug Tools: Debug information and comprehensive logging
  • Safe Access: Null-safe getters with fallback values

πŸ“± Device Information Management

  • Device Details: Model, manufacturer, brand, device type detection
  • System Info: OS version, platform details, kernel information
  • Hardware Specs: Architecture support, supported ABIs, board info
  • Platform Detection: Android, iOS, Web, Windows, macOS, Linux support
  • Device Types: Mobile, tablet, desktop, TV, watch, web detection
  • System Features: Hardware capabilities and feature detection
  • Comparison Tools: Device and OS version comparison utilities
  • Debug & Monitoring: Comprehensive device reports and debug info

πŸ” Advanced Device Identification (New!)

  • Persistent User ID: Reliable cross-installation user tracking
  • Device Locale & Region: Automatic locale and region detection
  • Language Preferences: Multi-language preference management
  • Privacy-Safe Identification: Anonymized device identifiers
  • Architecture Detection: Enhanced ARM64, ARM32, x86 detection
  • Cross-Platform Compatibility: Unified API across all platforms

Installation

Add this to your package's pubspec.yaml file:

dependencies:
  device_package_info_manager: ^1.1.2

Then run:

flutter pub get

Quick Start

Package Information

import 'package:device_package_info_manager/device_package_info_manager.dart';

void main() async {
  // Initialize package manager (async factory method)
  final packageManager = await PackageInfoManagerImpl.create();

  // Get complete package info (synchronous after initialization)
  final packageInfo = packageManager.getPackageInfo();
  print('App: ${packageInfo.safeAppName}');
  print('Version: ${packageInfo.displayVersion}');
  print('Full Version: ${packageInfo.fullVersionString}');

  // Check version properties
  print('Is Pre-release: ${packageInfo.isPreRelease}');
  print('Has Valid Version: ${packageInfo.hasValidVersion}');

  // Version comparison
  final otherPackageInfo = AppPackageInfo.empty();
  print('Is Newer: ${packageInfo.isNewerThan(otherPackageInfo)}');

  // Debug and validation
  print('Validation Errors: ${packageManager.getValidationErrors()}');
  packageManager.printPackageInfo();
}

Device Information

import 'package:device_package_info_manager/device_package_info_manager.dart';

void main() async {
  // Initialize device manager (async factory method)
  final deviceManager = await DeviceInfoManagerImpl.create();

  // Get complete device info (synchronous after initialization)
  final deviceInfo = deviceManager.getDeviceInfo();
  print('Device: ${deviceInfo.displayName}');
  print('Manufacturer: ${deviceInfo.manufacturer}');
  print('OS: ${deviceInfo.fullDeviceInfo}');

  // Check device properties
  print('Is Physical Device: ${deviceManager.isPhysicalDevice()}');
  print('Device Type: ${deviceManager.getDeviceType()}');
  print('Supports ARM64: ${deviceManager.supportsArm64()}');

  // Platform detection
  print('Is Android: ${deviceManager.isAndroid()}');
  print('Is iOS: ${deviceManager.isIOS()}');

  // Advanced device identification (NEW!)
  print('Persistent User ID: ${deviceManager.getPersistentUserId()}');
  print('Device Locale: ${deviceManager.getDeviceLocale()}');
  print('Device Region: ${deviceManager.getDeviceRegion()}');
  print('Primary Language: ${deviceManager.getPrimaryLanguage()}');
  print('Preferred Languages: ${deviceManager.getPreferredLanguages()}');

  // Generate comprehensive device report
  print('Device Report: ${deviceManager.generateDeviceReport()}');
  print('Identification Report: ${deviceManager.generateIdentificationReport()}');
}

API Reference

PackageInfoManager

Initialization

// Initialize with async factory method
final packageManager = await PackageInfoManagerImpl.create();

Core Methods

// Get complete package information
AppPackageInfo getPackageInfo()

// Get specific package details
String getAppName()
String getVersion()
String getBuildNumber()
String getPackageName()
String getBuildSignature()
String getInstallerStore()

// Version utilities
String getFullVersionString()
String getDisplayVersion()
bool isPreRelease()
bool hasValidVersion()

// Installation information
DateTime? getInstallTime()
DateTime? getUpdateTime()
String getInstallDateFormatted()
String getUpdateDateFormatted()

// Validation and debugging
bool validatePackageInfo()
List<String> getValidationErrors()
Map<String, String> getDebugInfo()
void printPackageInfo()

DeviceInfoManager

Initialization

// Initialize with async factory method
final deviceManager = await DeviceInfoManagerImpl.create();

Core Methods

// Get complete device information
AppDeviceInfo getDeviceInfo()

// Get specific device details
String getDeviceId()
String getDeviceName()
String getDeviceModel()
String getManufacturer()
String getBrand()
String getOsVersion()
DeviceType getDeviceType()

// Platform detection
bool isPhysicalDevice()
bool isAndroid()
bool isIOS()
bool isWeb()
bool isDesktop()
bool isMobile()
bool isTablet()

// Technical specifications
String? getArchitecture()
List<String> getSupportedAbis()
List<String> getSupported32BitAbis()
List<String> getSupported64BitAbis()
List<String> getSystemFeatures()

// Advanced device identification (NEW!)
String getPersistentUserId()
String? getDeviceLocale()
String getDeviceRegion()
String getPrimaryLanguage()
List<String> getPreferredLanguages()

// Privacy and security
String getAnonymizedDeviceId()
Map<String, String> generatePrivacySafeSummary()

// Debug and monitoring
Map<String, dynamic> getDebugInfo()
String generateDeviceReport()
String generateIdentificationReport()

Models

AppPackageInfo

class AppPackageInfo extends BaseDataModel<AppPackageInfo> {
  final String? appName;
  final String? packageName;
  final String? version;
  final String? buildNumber;
  final String? buildSignature;
  final String? installerStore;
  final DateTime? installTime;
  final DateTime? updateTime;
  final bool isSystemApp;
  final int versionCode;
  final String? targetSdkVersion;
  final String? minSdkVersion;

  // Utility getters
  String get safeAppName;           // Safe app name with fallback
  String get displayVersion;        // Formatted version display
  String get fullVersionString;     // Complete version + build number
  String get displayName;           // App name or package name
  bool get isPreRelease;           // Detects pre-release versions
  bool get hasValidVersion;        // Validates version format
  bool get isInstalled;            // Checks if package is installed
  String get installDateFormatted; // Formatted install date
  String get updateDateFormatted;  // Formatted update date
  bool get hasInstallDate;         // Install date availability
  bool get hasUpdateDate;          // Update date availability

  // Version comparison methods
  bool isNewerThan(AppPackageInfo other);
  bool isOlderThan(AppPackageInfo other);
  bool isSameVersionAs(AppPackageInfo other);
  int compareTo(AppPackageInfo other);
}

AppDeviceInfo

class AppDeviceInfo extends BaseDataModel<AppDeviceInfo> {
  // Basic device information
  final String deviceId;
  final String deviceName;
  final String deviceModel;
  final String manufacturer;
  final String brand;
  final String product;

  // Operating system information
  final String osVersion;
  final String osName;
  final String platformVersion;
  final String platformName;

  // Device characteristics
  final DeviceType deviceType;
  final bool isPhysicalDevice;
  final bool isEmulator;
  final bool isTablet;
  final bool isMobile;
  final bool isDesktop;

  // Technical specifications
  final String? sdkVersion;
  final String? kernelVersion;
  final String? architecture;
  final String? boardName;
  final String? bootloader;
  final String? display;
  final String? fingerprint;
  final String? hardware;
  final String? host;
  final List<String> systemFeatures;
  final List<String> supportedAbis;
  final List<String> supported32BitAbis;
  final List<String> supported64BitAbis;

  // Platform-specific fields
  final String? systemName;        // iOS
  final String? systemVersion;     // iOS
  final String? localizedModel;    // iOS
  final String? identifierForVendor; // iOS
  final Map<String, String> utsname; // Linux/macOS

  // Device identification fields (NEW!)
  final Locale? deviceLocale;      // Device locale setting
  final String? deviceRegion;      // Device region/country
  final List<String> preferredLanguages; // Preferred languages

  // Utility getters
  String get displayName;          // Formatted device display name
  String get fullDeviceInfo;       // Complete device information
  String get safeDeviceName;       // Safe device name with fallback
  String get safeDeviceModel;      // Safe device model with fallback
  String get safeManufacturer;     // Safe manufacturer with fallback
  String get safeBrand;            // Safe brand with fallback
  String get safeOsVersion;        // Safe OS version with fallback
  String get safeOsName;           // Safe OS name with fallback
  String get deviceTypeString;     // Device type as string
  bool get hasValidDeviceInfo;     // Validates device information
  bool get supportsArm64;         // ARM64 architecture support
  bool get supportsArm32;         // ARM32 architecture support
  bool get supportsX86;           // x86 architecture support

  // Advanced identification getters (NEW!)
  String get persistentUserId;     // Reliable persistent user ID
  String get anonymizedDeviceId;   // Privacy-safe device identifier
  String get primaryLanguage;      // Primary language code
  String get safeDeviceRegion;     // Safe region with fallback

  // Comparison methods
  bool isSameDevice(AppDeviceInfo other);
  bool isNewerOsThan(AppDeviceInfo other);
  bool isOlderOsThan(AppDeviceInfo other);
  bool isSameOsVersionAs(AppDeviceInfo other);
  int compareOsVersionWith(AppDeviceInfo other);
}

DeviceType Enum

enum DeviceType {
  unknown,    // Unable to determine device type
  mobile,     // Mobile phones
  tablet,     // Tablet devices
  desktop,    // Desktop computers
  tv,         // Smart TVs
  watch,      // Smartwatches
  web,        // Web browsers
}

Advanced Usage

Device Identification & Privacy

final deviceManager = await DeviceInfoManagerImpl.create();

// Get persistent user ID for cross-installation tracking
final persistentId = deviceManager.getPersistentUserId();
print('Persistent User ID: $persistentId'); // Safe for Firestore document IDs

// Get device locale and language preferences
final locale = deviceManager.getDeviceLocale();
final region = deviceManager.getDeviceRegion();
final languages = deviceManager.getPreferredLanguages();
print('Locale: $locale');
print('Region: $region');
print('Languages: ${languages.join(', ')}');

// Generate privacy-safe analytics data
final privacySummary = deviceManager.generatePrivacySafeSummary();
print('Privacy-safe summary: $privacySummary');

// Create comprehensive identification report
final identificationReport = deviceManager.generateIdentificationReport();
print('Identification Report:\n$identificationReport');

Enhanced Architecture Detection

final deviceManager = await DeviceInfoManagerImpl.create();
final deviceInfo = deviceManager.getDeviceInfo();

// Check architecture support with enhanced detection
if (deviceManager.supportsArm64()) {
  print('Device supports 64-bit ARM architecture');
  print('Supported 64-bit ABIs: ${deviceInfo.supported64BitAbis}');
  // Load ARM64 optimized assets
} else if (deviceManager.supportsArm32()) {
  print('Device supports 32-bit ARM architecture');
  print('Supported 32-bit ABIs: ${deviceInfo.supported32BitAbis}');
  // Load ARM32 compatible assets
} else if (deviceManager.supportsX86()) {
  print('Device supports x86 architecture');
  // Load x86 compatible assets
}

// Check specific architecture compatibility
if (deviceManager.isCompatibleWithArchitecture('arm64')) {
  print('Device is compatible with ARM64');
}

Version Comparison

final packageManager = await PackageInfoManagerImpl.create();
final currentPackage = packageManager.getPackageInfo();

// Create a reference package for comparison
final targetPackage = AppPackageInfo(
  appName: 'MyApp',
  version: '2.0.0',
  buildNumber: '200',
  // ... other fields
);

// Compare versions
if (currentPackage.isOlderThan(targetPackage)) {
  print('Update available!');
} else if (currentPackage.isNewerThan(targetPackage)) {
  print('You have a newer version');
} else {
  print('Versions are the same');
}

// Sort packages by version
final packages = <AppPackageInfo>[/* ... */];
packages.sort((a, b) => a.compareTo(b));

Device Capability Detection

final deviceManager = await DeviceInfoManagerImpl.create();
final deviceInfo = deviceManager.getDeviceInfo();

// Check architecture support
if (deviceManager.supportsArm64()) {
  print('Device supports 64-bit ARM architecture');
  // Load ARM64 optimized assets
}

// Platform-specific logic
switch (deviceManager.getDeviceType()) {
  case DeviceType.mobile:
    // Mobile-specific UI
    break;
  case DeviceType.tablet:
    // Tablet-optimized layout
    break;
  case DeviceType.desktop:
    // Desktop interface
    break;
  default:
    // Default fallback
}

// Feature detection
if (deviceManager.hasFeature('android.hardware.camera')) {
  print('Device has camera support');
}

// OS version compatibility check
if (deviceManager.isCompatibleWithOsVersion('10.0')) {
  print('Device meets minimum OS requirements');
}

Debug and Validation

final packageManager = await PackageInfoManagerImpl.create();
final deviceManager = await DeviceInfoManagerImpl.create();

// Package validation
final validationErrors = packageManager.getValidationErrors();
if (validationErrors.isNotEmpty) {
  print('Package validation errors: $validationErrors');
}

// Debug information
final packageDebugInfo = packageManager.getDebugInfo();
final deviceDebugInfo = deviceManager.getDebugInfo();
print('Package Debug: $packageDebugInfo');
print('Device Debug: $deviceDebugInfo');

// Comprehensive device report
final deviceReport = deviceManager.generateDeviceReport();
print('Device Report: $deviceReport');

// Print formatted information
packageManager.printPackageInfo();

Caching Management

final packageManager = await PackageInfoManagerImpl.create();
final deviceManager = await DeviceInfoManagerImpl.create();

// Check if cached info is available
if (packageManager.hasCachedInfo) {
  final cachedInfo = packageManager.getCachedPackageInfo();
  print('Cached package info: $cachedInfo');
}

// Refresh cache (note: in current implementation, requires new instance)
await packageManager.refreshCache();

// Clear cache
packageManager.clearCache();

Error Handling

try {
  // Initialize managers
  final packageManager = await PackageInfoManagerImpl.create();
  final deviceManager = await DeviceInfoManagerImpl.create();

  // Get information
  final packageInfo = packageManager.getPackageInfo();
  final deviceInfo = deviceManager.getDeviceInfo();

  print('Package: ${packageInfo.safeAppName}');
  print('Device: ${deviceInfo.displayName}');
} catch (e) {
  print('Failed to initialize managers: $e');
  // Use fallback or show error to user
}

// Safe data access with fallbacks
final packageInfo = packageManager.getPackageInfo();
final safeName = packageInfo.safeAppName; // Always returns a valid string
final safeVersion = packageInfo.displayVersion; // Always returns a valid string

Platform Support

Platform Package Info Device Info Specific Features
Android βœ… Full βœ… Full SDK version, supported ABIs, system features, board info, locale detection
iOS βœ… Full βœ… Full System name/version, localized model, vendor identifier, locale detection
Web βœ… Full βœ… Limited Browser info, limited device details, user agent analysis
Windows βœ… Full βœ… Full Windows-specific system information, architecture detection
macOS βœ… Full βœ… Full macOS system details, utsname info, Apple Silicon detection
Linux βœ… Full βœ… Full Linux distribution and system details, architecture detection

Requirements

  • Flutter SDK: >= 3.8.1
  • Dart SDK: >= 3.8.1

Dependencies

This package uses the following trusted dependencies:

Example

Check out the /example folder for a comprehensive demo app that showcases all features:

cd example
flutter run

The example app demonstrates:

  • πŸ“± Complete package information display
  • πŸ”§ Device specifications viewer
  • πŸ“Š Version comparison tools
  • πŸ—οΈ Platform detection examples
  • πŸ› οΈ Error handling patterns
  • πŸ› Debug information and validation
  • πŸ”„ Caching and refresh functionality
  • πŸ” NEW! Device identification demo
  • 🌍 NEW! Locale and language detection
  • πŸ›‘οΈ NEW! Privacy-safe identification

Testing

This package includes comprehensive tests. Run them with:

flutter test

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Ensure all tests pass
  6. Submit a pull request

Please read our contributing guidelines for more details.

Issues & Support

License

This project is licensed under the MIT License - see the LICENSE file for details.

Changelog

See CHANGELOG.md for a detailed list of changes and version history.

Libraries

device_package_info_manager
A comprehensive Flutter package for managing device and package information across Flutter applications.