From ba9a3d95f6c2e423c436c9c09975a753077351bc Mon Sep 17 00:00:00 2001 From: anhtunz Date: Fri, 14 Mar 2025 22:36:25 +0700 Subject: [PATCH] fix(ui): Fix some ui bugs --- android/app/build.gradle | 28 ++- .../devices/devices_manager_screen.dart | 171 +++++++++--------- lib/feature/main/main_screen.dart | 28 +-- lib/feature/map/map_screen.dart | 20 +- .../map/widget/show_nearest_place.dart | 3 +- lib/product/lang/l10n/app_vi.arb | 6 +- .../permission/notification_permission.dart | 16 ++ lib/product/utils/qr_utils.dart | 2 +- pubspec.lock | 16 +- pubspec.yaml | 4 +- 10 files changed, 174 insertions(+), 120 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index fd80708..c4957b0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -28,6 +28,14 @@ apply plugin: 'com.google.gms.google-services' apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + + android { namespace "com.example.sfm_app" compileSdkVersion 34 @@ -47,6 +55,17 @@ android { sourceSets { main.java.srcDirs += 'src/main/kotlin' } + subprojects { + afterEvaluate { project -> + if (project.plugins.hasPlugin("com.android.application") || + project.plugins.hasPlugin("com.android.library")) { + project.android { + compileSdkVersion 34 + buildToolsVersion "34.0.0" + } + } + } + } defaultConfig { // START: Flutter Local Notifications @@ -61,7 +80,14 @@ android { versionCode flutterVersionCode.toInteger() versionName flutterVersionName } - + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } buildTypes { release { // TODO: Add your own signing config for the release build. diff --git a/lib/feature/devices/devices_manager_screen.dart b/lib/feature/devices/devices_manager_screen.dart index 2883bfc..d71b3c5 100644 --- a/lib/feature/devices/devices_manager_screen.dart +++ b/lib/feature/devices/devices_manager_screen.dart @@ -1,5 +1,7 @@ import 'dart:async'; +import 'package:data_table_2/data_table_2.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'add_new_device_widget.dart'; @@ -85,112 +87,105 @@ class _DevicesManagerScreenState extends State { stream: devicesManagerBloc.streamUserRole, initialData: role, builder: (context, roleSnapshot) { - return CardTheme( - color: Theme.of(context).colorScheme.onPrimary, - shadowColor: - Theme.of(context).colorScheme.onPrimary, - child: PaginatedDataTable( - headingRowHeight: 30, - columnSpacing: 30, - horizontalMargin: 10, - header: Center( - child: Text( - appLocalization(context) - .paginated_data_table_title, - style: context.headlineMediumTextStyle, + return SizedBox( + height: context.dynamicHeight(0.4), + child: CardTheme( + color: Theme.of(context).colorScheme.onPrimary, + shadowColor: + Theme.of(context).colorScheme.onPrimary, + child: PaginatedDataTable2( + headingRowHeight: 30, + columnSpacing: 30, + horizontalMargin: 10, + fixedLeftColumns: 1, + autoRowsToHeight: true, + renderEmptyRowsInTheEnd: false, + dragStartBehavior: DragStartBehavior.down, + minWidth: 950, + header: Center( + child: Text( + appLocalization(context) + .paginated_data_table_title, + style: context.headlineMediumTextStyle, + ), ), - ), - columns: [ - if (roleSnapshot.data == - RoleEnums.ADMIN.name || - roleSnapshot.data == - RoleEnums.USER.name) - DataColumn( - label: Center( - child: Text(appLocalization(context) + columns: [ + if (roleSnapshot.data == + RoleEnums.ADMIN.name || + roleSnapshot.data == + RoleEnums.USER.name) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_deviceName), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_deviceStatus), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_deviceBaterry), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_deviceSignal), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_deviceTemperature), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_deviceHump), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_devicePower), ), - ), - DataColumn( - label: Center( - child: Text(appLocalization(context) + DataColumn( + label: Text(appLocalization(context) .paginated_data_table_column_action), ), - ), - ], - onPageChanged: (int pageIndex) { - // log('Chuyen page: $pageIndex'); - }, - rowsPerPage: - (allDeviceSnapshot.data?.length ?? 1) < 6 - ? (allDeviceSnapshot.data?.length ?? - 0) - : 5, - actions: [ - if (roleSnapshot.data == - RoleEnums.USER.name || - roleSnapshot.data == - RoleEnums.ADMIN.name) - IconButton( - style: ButtonStyle( - backgroundColor: - WidgetStateProperty.all( - Colors.green), - iconColor: - WidgetStateProperty.all( - Colors.white, + ], + onPageChanged: (int pageIndex) { + // log('Chuyen page: $pageIndex'); + }, + // rowsPerPage: + // (allDeviceSnapshot.data?.length ?? 1) < 6 + // ? (allDeviceSnapshot.data?.length ?? + // 0) + // : 5, + + actions: [ + if (roleSnapshot.data == + RoleEnums.USER.name || + roleSnapshot.data == + RoleEnums.ADMIN.name) + IconButton( + style: ButtonStyle( + backgroundColor: + WidgetStateProperty.all( + Colors.green), + iconColor: + WidgetStateProperty.all( + Colors.white, + ), ), - ), - onPressed: () { - ScaffoldMessenger.of(context) - .clearSnackBars(); - addNewDevice(context, - roleSnapshot.data ?? role); - }, - icon: IconConstants.instance - .getMaterialIcon(Icons.add)) - ], - source: DeviceSource( - devices: allDeviceSnapshot.data ?? devices, - context: context, - devicesBloc: devicesManagerBloc, - role: role, + onPressed: () { + ScaffoldMessenger.of(context) + .clearSnackBars(); + addNewDevice(context, + roleSnapshot.data ?? role); + }, + icon: IconConstants.instance + .getMaterialIcon(Icons.add)) + ], + source: DeviceSource( + devices: allDeviceSnapshot.data ?? devices, + context: context, + devicesBloc: devicesManagerBloc, + role: role, + ), ), ), ); diff --git a/lib/feature/main/main_screen.dart b/lib/feature/main/main_screen.dart index 2292610..cd72e95 100644 --- a/lib/feature/main/main_screen.dart +++ b/lib/feature/main/main_screen.dart @@ -9,6 +9,7 @@ import 'package:go_router/go_router.dart'; import 'package:badges/badges.dart' as badges; import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart'; import 'package:sfm_app/feature/sound_notification_test/notification_screen.dart'; +import 'package:sfm_app/product/permission/notification_permission.dart'; import '../settings/profile/profile_model.dart'; import '../../product/extention/context_extention.dart'; import '../../bloc/home_bloc.dart'; @@ -72,6 +73,7 @@ class _MainScreenState extends State with WidgetsBindingObserver { mainBloc.sinkIsVNIcon.add(isVN); mainBloc.sinkThemeMode.add(isLight); LocationPermissionRequest.instance.checkLocationPermission(context); + NotificationPermission.instance.checkNotificationPermission(context); } @override @@ -148,15 +150,15 @@ class _MainScreenState extends State with WidgetsBindingObserver { inactiveIcon: IconConstants.instance.getMaterialIcon(Icons.group_outlined), ), - PersistentBottomNavBarItem( - icon: IconConstants.instance - .getMaterialIcon(Icons.notifications_outlined), - title: appLocalization(context).notification, - activeColorPrimary: Colors.blue, - inactiveColorPrimary: Colors.grey, - inactiveIcon: IconConstants.instance - .getMaterialIcon(Icons.notifications_outlined), - ), + // PersistentBottomNavBarItem( + // icon: IconConstants.instance + // .getMaterialIcon(Icons.notifications_outlined), + // title: appLocalization(context).notification, + // activeColorPrimary: Colors.blue, + // inactiveColorPrimary: Colors.grey, + // inactiveIcon: IconConstants.instance + // .getMaterialIcon(Icons.notifications_outlined), + // ), ]; } @@ -181,10 +183,10 @@ class _MainScreenState extends State with WidgetsBindingObserver { child: const InterFamilyScreen(), blocBuilder: () => InterFamilyBloc(), ), - BlocProvider( + /*BlocProvider( child: const NotificationScreen(), blocBuilder: () => NotificationBloc(), - ), + ),*/ ]; } @@ -221,8 +223,8 @@ class _MainScreenState extends State with WidgetsBindingObserver { }, icon: Icon( themeModeSnapshot.data ?? isLight - ? Icons.dark_mode_outlined - : Icons.light_mode_outlined, + ? Icons.light_mode_outlined + : Icons.dark_mode_outlined, ), ), StreamBuilder( diff --git a/lib/feature/map/map_screen.dart b/lib/feature/map/map_screen.dart index 5949936..bfb173c 100644 --- a/lib/feature/map/map_screen.dart +++ b/lib/feature/map/map_screen.dart @@ -106,7 +106,7 @@ class _MapScreenState extends State with WidgetsBindingObserver { onMapCreated: onMapCreated, markers: markerSnapshot.data ?? markersAll ..addAll(markers), - zoomControlsEnabled: false, + zoomControlsEnabled: true, myLocationEnabled: true, mapToolbarEnabled: false, onCameraMove: (position) { @@ -138,10 +138,10 @@ class _MapScreenState extends State with WidgetsBindingObserver { void checkTheme() async { String theme = await apiServices.checkTheme(); - if (theme == AppThemes.LIGHT.name) { - themeMode = ''; - } else { + if (theme == AppThemes.DARK.name) { themeMode = await _getFileData('assets/map_themes/maps_dark_theme.json'); + } else { + themeMode = ''; } mapBloc.sinkMapTheme.add(themeMode); } @@ -274,10 +274,16 @@ class _MapScreenState extends State with WidgetsBindingObserver { if (response != "") { final data = jsonDecode(response); List result = data['items']; - final devicesList = Device.fromJsonDynamicList(result); - for (var device in devicesList) { - devices.add(device); + if(result.isNotEmpty){ + devices.clear(); + final devicesList = Device.fromJsonDynamicList(result); + for (var device in devicesList) { + devices.add(device); + } + }else{ + } + } } diff --git a/lib/feature/map/widget/show_nearest_place.dart b/lib/feature/map/widget/show_nearest_place.dart index 8d80e81..2db0ec9 100644 --- a/lib/feature/map/widget/show_nearest_place.dart +++ b/lib/feature/map/widget/show_nearest_place.dart @@ -188,8 +188,7 @@ showNearPlacesSideSheet( longitude, ); }, - icon: IconConstants.instance - .getMaterialIcon(Icons.turn_right), + icon: const Icon(Icons.turn_right,color: Colors.white), label: Text(appLocalization(listViewContext) .map_show_direction), ), diff --git a/lib/product/lang/l10n/app_vi.arb b/lib/product/lang/l10n/app_vi.arb index b379d64..f081180 100644 --- a/lib/product/lang/l10n/app_vi.arb +++ b/lib/product/lang/l10n/app_vi.arb @@ -81,12 +81,12 @@ "event_tag_title": "Sự kiện", "description_NOTUSE3": "This is vietnamese language in InterFamily", "interfamily_page_name": "Liên gia", - "my_group_title": "Group của tôi", - "invite_group": "Group tham gia", + "my_group_title": "Nhóm của tôi", + "invite_group": "Nhóm tham gia", "add_new_group": "Thêm nhóm mới", "join_group": "Tham gia nhóm", "group_name_title": "Tên nhóm", - "group_id_title": "ID nhóm", + "group_id_title": "Mã nhóm", "add_new_user_title": "Thêm người dùng", "share_group_title": "Chia sẻ nhóm", "change_group_infomation_title": "Đổi thông tin", diff --git a/lib/product/permission/notification_permission.dart b/lib/product/permission/notification_permission.dart index f7a6dbf..672a2cb 100644 --- a/lib/product/permission/notification_permission.dart +++ b/lib/product/permission/notification_permission.dart @@ -3,9 +3,25 @@ import 'dart:developer'; import 'package:app_settings/app_settings.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; +import 'package:permission_handler/permission_handler.dart'; import '../base/widget/dialog/request_permission_dialog.dart'; class NotificationPermission { + NotificationPermission._init(); + static NotificationPermission? _instance; + static NotificationPermission get instance => + _instance ??= NotificationPermission._init(); + + Future checkNotificationPermission(context) async { + var status = await Permission.notification.status; + log("Status: $status"); + if (status.isDenied || status.isPermanentlyDenied) { + requestNotificationsPermission(context); + return false; + } else { + return true; + } + } FirebaseMessaging messaging = FirebaseMessaging.instance; void requestNotificationsPermission(BuildContext context) async { NotificationSettings settings = await messaging.requestPermission( diff --git a/lib/product/utils/qr_utils.dart b/lib/product/utils/qr_utils.dart index 1357a93..f2f42c4 100644 --- a/lib/product/utils/qr_utils.dart +++ b/lib/product/utils/qr_utils.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart'; +import 'package:flutter_barcode_scanner_plus/flutter_barcode_scanner_plus.dart'; import '../services/language_services.dart'; class QRScanUtils { diff --git a/pubspec.lock b/pubspec.lock index 3c12476..1d9e76b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -97,6 +97,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.6" + data_table_2: + dependency: "direct main" + description: + name: data_table_2 + sha256: "5a540a7b64809eb46b3809c67fc6faa29ca217864341294df66b1f0eb040c20e" + url: "https://pub.dev" + source: hosted + version: "2.5.18" dbus: dependency: transitive description: @@ -238,14 +246,14 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_barcode_scanner: + flutter_barcode_scanner_plus: dependency: "direct main" description: - name: flutter_barcode_scanner - sha256: a4ba37daf9933f451a5e812c753ddd045d6354e4a3280342d895b07fecaab3fa + name: flutter_barcode_scanner_plus + sha256: "75bcf27d12ad6cd075dcfc8d838cffc254dab89cf9d33ec470faa1f9b4f97296" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.8" flutter_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index 992c87f..494838a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,7 +52,8 @@ dependencies: google_maps_cluster_manager_2: ^3.2.0 dropdown_button2: ^2.3.9 maps_launcher: ^2.2.1 - flutter_barcode_scanner: ^2.0.0 +# flutter_barcode_scanner: ^2.0.0 + flutter_barcode_scanner_plus: ^3.0.8 search_choices: ^2.3.1 dio: ^5.7.0 rxdart: ^0.28.0 @@ -65,6 +66,7 @@ dependencies: persistent_bottom_nav_bar: ^6.2.1 win32: ^5.10.0 google_maps_flutter: ^2.10.0 + data_table_2: ^2.5.18 dev_dependencies: flutter_test: