From b40fb7aba446e97ac3878affb6405ef6c7177324 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 17 Aug 2025 15:50:14 +0300 Subject: [PATCH 1/5] android config upgraded --- android/build.gradle | 1 + android/gradle.properties | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index dd29c274..55524878 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,6 +3,7 @@ buildscript { repositories { google() mavenCentral() + maven { url "https://jitpack.io" } maven {url 'https://developer.huawei.com/repo/'} } diff --git a/android/gradle.properties b/android/gradle.properties index b20905ec..898e4d70 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,3 @@ -org.gradle.jvmargs=-Xmx2048m +org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m android.useAndroidX=true -android.enableJetifier=true - +android.enableJetifier=true \ No newline at end of file From e3a97c0ae94aa5c164434194a6b37e21d13182d4 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 18 Aug 2025 16:00:55 +0300 Subject: [PATCH 2/5] enable engineer time picker issue fixed, session expired dialog issue fixed. --- lib/models/user.dart | 1 + lib/new_views/pages/splash_page.dart | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/models/user.dart b/lib/models/user.dart index b7a50619..75045ac0 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -297,6 +297,7 @@ class AssetGroup { data['id'] = id; data['name'] = name; data['code'] = code; + data['enabledEngineerTimer'] = enabledEngineerTimer; return data; } } diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index 3e3cbc97..ec2bfe10 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -85,9 +85,7 @@ class _SplashPageState extends State { setState(() { loading = false; }); - if (isValid && _settingProvider.isLocalAuthEnable) { - handleLocalAuth(); - } else { + if (isValid == false) { showDialog( context: context, builder: (BuildContext cxt) => SingleBtnDialog( @@ -99,6 +97,12 @@ class _SplashPageState extends State { Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); }), ); + } else { + if (isValid && _settingProvider.isLocalAuthEnable) { + handleLocalAuth(); + return; + } + Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } } } From c1b1f37eecafcffd92f7e5149df7d5eb8872032c Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 19 Aug 2025 10:43:00 +0300 Subject: [PATCH 3/5] asset search loading ui fixed. --- .../equipment/single_device_picker.dart | 80 ++++++++++--------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index ee519455..97aa83b4 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -47,10 +47,7 @@ class _MyAssetsPageState extends State { _getDevice(String result, {bool isQr = false}) async { _devicesProvider.reset(); - await _devicesProvider.getAssets( - search: DeviceSearch(assetNo: result, assetSerialNumber: ""), - isQr: isQr, - ); + await _devicesProvider.getAssets(search: DeviceSearch(assetNo: result, assetSerialNumber: ""), isQr: isQr); _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); } @@ -144,7 +141,7 @@ class _MyAssetsPageState extends State { ), body: SafeArea( child: LoadingManager( - isLoading: _devicesProvider.isLoading, + isLoading: false, stateCode: _devicesProvider.stateCode, isFailedLoading: _devicesProvider.devices == null, onRefresh: () async { @@ -155,49 +152,54 @@ class _MyAssetsPageState extends State { children: [ Expanded( child: _searchableList.isEmpty - ? NoDataFound(message: context.translation.noDeviceFound) + ? NoDataFound(message: context.translation.noDeviceFound).center : LazyLoading( nextPage: _devicesProvider.nextPage, onLazyLoad: () async { - await _devicesProvider.getDevicesList( - user: _userProvider.user!, - host: _settingProvider.host!, - hospitalId: _userProvider.user!.clientId!, - search: _searchAsset?.copyWith(assetSerialNumber: snController.text, assetNo: numberController.text), + await _devicesProvider.getAssets( + // user: _userProvider.user!, + // host: _settingProvider.host!, + // hospitalId: _userProvider.user!.clientId!, + search: _searchAsset, // serialNumber: snController.text, // number: numberController.text, ); }, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 500), - child: showListView - ? ListView.separated( - padding: const EdgeInsets.all(16), - itemCount: _searchableList.length, - separatorBuilder: (listContext, itemIndex) => 8.height, - itemBuilder: (listContext, itemIndex) { - return AssetItemListView( - device: _searchableList[itemIndex], - onPressed: (device) { - widget.fromBottomBar ? Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id) : Navigator.of(context).pop(device); - // Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id); + child: Stack( + children: [ + AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + child: showListView + ? ListView.separated( + padding: const EdgeInsets.all(16), + itemCount: _searchableList.length, + separatorBuilder: (listContext, itemIndex) => 8.height, + itemBuilder: (listContext, itemIndex) { + return AssetItemListView( + device: _searchableList[itemIndex], + onPressed: (device) { + widget.fromBottomBar ? Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id) : Navigator.of(context).pop(device); + // Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id); + }, + ); }, - ); - }, - ) - : GridView.builder( - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 188 / 261, crossAxisSpacing: 12, mainAxisSpacing: 12), - itemCount: _searchableList.length, - padding: const EdgeInsets.all(16), - itemBuilder: (context, index) { - return AssetItemGridView( - device: _searchableList[index], - onPressed: (device) { - widget.fromBottomBar ? Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id) : Navigator.of(context).pop(device); + ) + : GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 188 / 261, crossAxisSpacing: 12, mainAxisSpacing: 12), + itemCount: _searchableList.length, + padding: const EdgeInsets.all(16), + itemBuilder: (context, index) { + return AssetItemGridView( + device: _searchableList[index], + onPressed: (device) { + widget.fromBottomBar ? Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id) : Navigator.of(context).pop(device); + }, + ); }, - ); - }, - ), + ), + ), + if (_devicesProvider.isLoading) Align(alignment: Alignment.bottomCenter, child: const CircularProgressIndicator().paddingOnly(top: 16, bottom: 16)), + ], ), )), ], From df8f0e7298f0c5c48874ea19308643ea5392ea38 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 19 Aug 2025 10:48:03 +0300 Subject: [PATCH 4/5] remember me username and password improvement. --- lib/controllers/providers/settings/setting_provider.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index a88736f3..6e1a1e87 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -69,6 +69,9 @@ class SettingProvider extends ChangeNotifier { await prefs.setBool(ASettings.rememberMe, rememberMe); await prefs.setString(ASettings.userName, username); await prefs.setString(ASettings.password, password); + + this.username = username; + this.password = password; } void selectAssetGroup(User user) { @@ -85,7 +88,7 @@ class SettingProvider extends ChangeNotifier { setAssetGroup(_assetGroup); } - Future setAssetGroup(AssetGroup? assetGroup) async { + void setAssetGroup(AssetGroup? assetGroup) { _assetGroup = assetGroup; ApiManager.instance.assetGroup = _assetGroup!; notifyListeners(); From 19ee892d675c48b670c22bd9cac0db4142bee2b3 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 19 Aug 2025 11:38:23 +0300 Subject: [PATCH 5/5] app timer, time and date picker color improvements. --- .../widgets/date_and_time/date_picker.dart | 36 ++++++++++++++++++ lib/views/widgets/timer/app_timer.dart | 38 ++++++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index b06f414c..f9e06b5d 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -82,6 +82,42 @@ class ADatePicker extends StatelessWidget { initialDate: DateTime.now(), firstDate: from ?? DateTime.now(), lastDate: to ?? DateTime.now(), + builder: (BuildContext context, Widget? child) { + final ThemeData currentTheme = Theme.of(context); + return Theme( + data: currentTheme.copyWith( + datePickerTheme: DatePickerThemeData( + headerBackgroundColor: AppColor.primary10, + headerForegroundColor: Colors.white, + backgroundColor: currentTheme.colorScheme.surface, + dayForegroundColor: MaterialStateColor.resolveWith((states) { + if (states.contains(MaterialState.selected)) return Colors.white; + if (states.contains(MaterialState.disabled)) return Colors.grey.withOpacity(0.6); + return currentTheme.colorScheme.onSurface; + }), + dayBackgroundColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent), + yearForegroundColor: MaterialStateColor.resolveWith((states) { + if (states.contains(MaterialState.selected)) return Colors.white; + if (states.contains(MaterialState.disabled)) return Colors.grey.withOpacity(0.6); + return currentTheme.colorScheme.onSurface; + }), + yearBackgroundColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent), + // todayForegroundColor: MaterialStateColor.resolveWith((states) => AppColor.primary10), + // todayBorder: BorderSide(color: AppColor.primary10.withOpacity(0.7)), + dividerColor: Colors.grey.withOpacity(0.2), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + inputDecorationTheme: const InputDecorationTheme( + focusedBorder: UnderlineInputBorder(borderSide: BorderSide(color: AppColor.primary10, width: 2)), + ), + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom(foregroundColor: AppColor.primary10), + ), + iconTheme: IconThemeData(color: AppColor.primary10.withOpacity(0.7)), + ), + child: child!, + ); + }, ); if (picked != null && onDatePicker != null) { onDatePicker!(picked); // Use null-aware operator diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 93270c9e..84179d92 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -171,6 +171,24 @@ class _AppTimerState extends State { showTimePicker( context: context, initialTime: TimeOfDay.now(), + builder: (BuildContext context, Widget? child) { + final ThemeData currentTheme = Theme.of(context); + return Theme( + data: currentTheme.copyWith( + timePickerTheme: TimePickerThemeData( + dialHandColor: AppColor.primary10, + dialBackgroundColor: Colors.grey.withOpacity(0.1), + hourMinuteColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.grey.withOpacity(0.1)), + dayPeriodColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent), + dayPeriodTextColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? Colors.white : AppColor.primary10), + dayPeriodBorderSide: BorderSide(color: Colors.grey.withOpacity(0.2)), + entryModeIconColor: AppColor.primary10, + ), + textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: AppColor.primary10)), + ), + child: child!, + ); + }, ).then((selectedTime) { if (selectedTime != null) { _pickerStartAt = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); @@ -205,6 +223,24 @@ class _AppTimerState extends State { showTimePicker( context: context, initialTime: TimeOfDay.now(), + builder: (BuildContext context, Widget? child) { + final ThemeData currentTheme = Theme.of(context); + return Theme( + data: currentTheme.copyWith( + timePickerTheme: TimePickerThemeData( + dialHandColor: AppColor.primary10, + dialBackgroundColor: Colors.grey.withOpacity(0.1), + hourMinuteColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.grey.withOpacity(0.1)), + dayPeriodColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? AppColor.primary10 : Colors.transparent), + dayPeriodTextColor: MaterialStateColor.resolveWith((states) => states.contains(MaterialState.selected) ? Colors.white : AppColor.primary10), + dayPeriodBorderSide: BorderSide(color: Colors.grey.withOpacity(0.2)), + entryModeIconColor: AppColor.primary10, + ), + textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(foregroundColor: AppColor.primary10)), + ), + child: child!, + ); + }, ).then((selectedTime) { if (selectedTime != null) { selectedDate = selectedDate.add(Duration(hours: selectedTime.hour, minutes: selectedTime.minute)); @@ -256,7 +292,7 @@ class _AppTimerState extends State { color: context.isDark && !widget.enabled ? AppColor.neutral60 : !widget.enabled - // backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, + // backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, ? AppColor.neutral40 : AppColor.fieldBgColor(context), borderRadius: BorderRadius.circular(10),