device_info_handler.dart 2.3 KB
import 'dart:io';
import 'dart:ui';

import 'package:appframe/services/dispatcher.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart';

class DeviceInfoHandler extends MessageHandler {
  @override
  Future<Map<String, dynamic>> handleMessage(dynamic params) async {
    var viewPadding = PlatformDispatcher.instance.views.first.viewPadding;
    var devicePixelRatio = PlatformDispatcher.instance.views.first.devicePixelRatio;
    var statusBarHeight = viewPadding.top / devicePixelRatio;

    var deviceInfoPlugin = DeviceInfoPlugin();
    if (Platform.isAndroid) {
      AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo;
      return {
        'abi': '${androidInfo.supportedAbis}',
        'deviceAbi': androidInfo.supportedAbis.isNotEmpty ? androidInfo.supportedAbis[0] : '',
        'benchmarkLevel': -1,
        'brand': androidInfo.brand,
        'model': androidInfo.model,
        'system': androidInfo.version.release,
        'platform': 'Android',
        'cpuType': androidInfo.hardware,
        'memorySize': _getAndroidMemorySize(androidInfo),
        'statusbarHeight': statusBarHeight,
        'titlebarHeight': kToolbarHeight,
      };
    } else if (Platform.isIOS) {
      IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo;
      return {
        'abi': '',
        'deviceAbi': '',
        'benchmarkLevel': -1,
        'brand': 'Apple',
        'model': iosInfo.model,
        'system': iosInfo.systemVersion,
        'platform': 'iOS',
        'cpuType': '',
        'memorySize': (iosInfo.physicalRamSize ~/ (1024 * 1024)).toString(),
        'statusbarHeight': statusBarHeight,
        'titlebarHeight': kToolbarHeight,
      };
    } else {
      return {};
    }
  }

  String _getAndroidMemorySize(AndroidDeviceInfo info) {
    try {
      final file = File('/proc/meminfo');
      final lines = file.readAsLinesSync();
      for (final line in lines) {
        if (line.startsWith('MemTotal:')) {
          final parts = line.trim().split(RegExp(r'\s+'));
          if (parts.length >= 2) {
            final kb = int.tryParse(parts[1]);
            if (kb != null) {
              return (kb ~/ 1024).toString();
            }
          }
        }
      }
    } catch (_) {}

    final raw = info.physicalRamSize;
    return raw.toString();
  }
}