diff --git a/lib/screens/about.dart b/lib/screens/about.dart index 3feeca14..00ed59d0 100644 --- a/lib/screens/about.dart +++ b/lib/screens/about.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:island/services/udid.native.dart'; +import 'package:island/services/udid.dart' as udid; import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:material_symbols_icons/symbols.dart'; @@ -68,7 +68,7 @@ class _AboutScreenState extends ConsumerState { try { final deviceInfoPlugin = DeviceInfoPlugin(); _deviceInfo = await deviceInfoPlugin.deviceInfo; - _deviceUdid = await getUdid(); + _deviceUdid = await udid.getUdid(); if (mounted) { setState(() {}); } @@ -174,12 +174,20 @@ class _AboutScreenState extends ConsumerState { context, title: 'Device Information', children: [ - _buildInfoItem( - context, - icon: Symbols.label, - label: 'aboutDeviceName'.tr(), - value: - _deviceInfo?.data['name'] ?? 'unknown'.tr(), + FutureBuilder( + future: udid.getDeviceName(), + builder: (context, snapshot) { + final value = + snapshot.hasData + ? snapshot.data! + : 'unknown'.tr(); + return _buildInfoItem( + context, + icon: Symbols.label, + label: 'aboutDeviceName'.tr(), + value: value, + ); + }, ), _buildInfoItem( context, diff --git a/lib/screens/auth/login.dart b/lib/screens/auth/login.dart index 1ad0b925..bd57ffe3 100644 --- a/lib/screens/auth/login.dart +++ b/lib/screens/auth/login.dart @@ -1,9 +1,6 @@ import 'dart:convert'; -import 'dart:io'; import 'dart:math' as math; - import 'package:animations/animations.dart'; -import 'package:device_info_plus/device_info_plus.dart'; import 'package:dio/dio.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; @@ -42,22 +39,6 @@ final Map kFactorTypes = { 4: ('authFactorPin', 'authFactorPinDescription', Symbols.nest_secure_alarm), }; -Future getDeviceName() async { - if (kIsWeb) return null; - String? name; - if (Platform.isIOS) { - final deviceInfo = await DeviceInfoPlugin().iosInfo; - name = deviceInfo.name; - } else if (Platform.isAndroid) { - final deviceInfo = await DeviceInfoPlugin().androidInfo; - name = deviceInfo.name; - } else if (Platform.isWindows) { - final deviceInfo = await DeviceInfoPlugin().windowsInfo; - name = deviceInfo.computerName; - } - return name; -} - class LoginScreen extends HookConsumerWidget { const LoginScreen({super.key}); diff --git a/lib/services/udid.dart b/lib/services/udid.dart index 1dff1c30..4e0f0c2c 100644 --- a/lib/services/udid.dart +++ b/lib/services/udid.dart @@ -1 +1,3 @@ -export 'udid.native.dart' if (dart.library.html) 'udid.web.dart'; +export 'udid.native.dart' + if (dart.library.html) 'udid.web.dart' + if (dart.library.io) 'udid.native.dart'; diff --git a/lib/services/udid.native.dart b/lib/services/udid.native.dart index 1faa2731..7fe7d890 100644 --- a/lib/services/udid.native.dart +++ b/lib/services/udid.native.dart @@ -1,3 +1,6 @@ +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_udid/flutter_udid.dart'; String? _cachedUdid; @@ -9,3 +12,18 @@ Future getUdid() async { _cachedUdid = await FlutterUdid.consistentUdid; return _cachedUdid!; } + +Future getDeviceName() async { + DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; + return androidInfo.device; + } else if (Platform.isIOS) { + IosDeviceInfo iosInfo = await deviceInfo.iosInfo; + return iosInfo.name; + } else if (Platform.isLinux || Platform.isMacOS || Platform.isWindows) { + return Platform.localHostname; + } else { + return 'unknown'.tr(); + } +} diff --git a/lib/services/udid.web.dart b/lib/services/udid.web.dart index d8052a29..5997e08d 100644 --- a/lib/services/udid.web.dart +++ b/lib/services/udid.web.dart @@ -9,3 +9,18 @@ Future getUdid() async { final hash = sha256.convert(bytes); return hash.toString(); } + +Future getDeviceName() async { + final userAgent = window.navigator.userAgent; + if (userAgent.contains('Chrome') && !userAgent.contains('Edg')) { + return 'Chrome'; + } else if (userAgent.contains('Firefox')) { + return 'Firefox'; + } else if (userAgent.contains('Safari') && !userAgent.contains('Chrome')) { + return 'Safari'; + } else if (userAgent.contains('Edg')) { + return 'Edge'; + } else { + return 'Browser'; + } +} diff --git a/lib/widgets/check_in.dart b/lib/widgets/check_in.dart index 07794a8b..41f7cd5b 100644 --- a/lib/widgets/check_in.dart +++ b/lib/widgets/check_in.dart @@ -228,7 +228,7 @@ class CheckInWidget extends HookConsumerWidget { ), Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, - spacing: 3, + crossAxisAlignment: CrossAxisAlignment.end, children: [ AnimatedSwitcher( duration: const Duration(milliseconds: 300), @@ -244,7 +244,7 @@ class CheckInWidget extends HookConsumerWidget { loading: () => Text('checkInNone').tr().fontSize(15).bold(), error: (err, stack) => Text('error').tr().fontSize(15).bold(), ), - ), + ).padding(right: 4), IconButton.outlined( iconSize: 16, visualDensity: const VisualDensity(