From da754b8d05940c1227a26470a156c9daae84c4ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Mata?= Date: Wed, 18 Feb 2026 00:23:02 +0100 Subject: [PATCH] Version number to bundle files --- mobile/android/app/build.gradle | 22 +++++++++++++++++-- .../plugins/GeneratedPluginRegistrant.java | 5 +++++ .../contents.xcworkspacedata | 7 ++++++ mobile/ios/Runner/GeneratedPluginRegistrant.m | 7 ++++++ mobile/lib/screens/settings_screen.dart | 12 +++++++++- mobile/lib/services/device_service.dart | 8 ++++--- mobile/pubspec.lock | 16 ++++++++++++++ mobile/pubspec.yaml | 3 ++- 8 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/mobile/android/app/build.gradle b/mobile/android/app/build.gradle index 4d3d96942..83eb22840 100644 --- a/mobile/android/app/build.gradle +++ b/mobile/android/app/build.gradle @@ -4,6 +4,24 @@ plugins { id "dev.flutter.flutter-gradle-plugin" } +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') def hasKeystore = false @@ -49,8 +67,8 @@ android { applicationId "am.sure.mobile" minSdkVersion 24 targetSdkVersion flutter.targetSdkVersion - versionCode 1 - versionName "1.0.0" + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName } buildTypes { diff --git a/mobile/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/mobile/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java index ba9a79390..a345a0caa 100644 --- a/mobile/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ b/mobile/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -30,6 +30,11 @@ public final class GeneratedPluginRegistrant { } catch (Exception e) { Log.e(TAG, "Error registering plugin flutter_secure_storage, com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin", e); } + try { + flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin package_info_plus, dev.fluttercommunity.plus.packageinfo.PackageInfoPlugin", e); + } try { flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin()); } catch (Exception e) { diff --git a/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/mobile/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/mobile/ios/Runner/GeneratedPluginRegistrant.m b/mobile/ios/Runner/GeneratedPluginRegistrant.m index 5705b470d..5c010e574 100644 --- a/mobile/ios/Runner/GeneratedPluginRegistrant.m +++ b/mobile/ios/Runner/GeneratedPluginRegistrant.m @@ -24,6 +24,12 @@ @import flutter_secure_storage_darwin; #endif +#if __has_include() +#import +#else +@import package_info_plus; +#endif + #if __has_include() #import #else @@ -54,6 +60,7 @@ [AppLinksIosPlugin registerWithRegistrar:[registry registrarForPlugin:@"AppLinksIosPlugin"]]; [ConnectivityPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"ConnectivityPlusPlugin"]]; [FlutterSecureStorageDarwinPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterSecureStorageDarwinPlugin"]]; + [FPPPackageInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FPPPackageInfoPlusPlugin"]]; [PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]]; [SharedPreferencesPlugin registerWithRegistrar:[registry registrarForPlugin:@"SharedPreferencesPlugin"]]; [SqflitePlugin registerWithRegistrar:[registry registrarForPlugin:@"SqflitePlugin"]]; diff --git a/mobile/lib/screens/settings_screen.dart b/mobile/lib/screens/settings_screen.dart index bf2518e4d..16a51fc77 100644 --- a/mobile/lib/screens/settings_screen.dart +++ b/mobile/lib/screens/settings_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; import '../providers/auth_provider.dart'; import '../services/offline_storage_service.dart'; @@ -14,11 +15,20 @@ class SettingsScreen extends StatefulWidget { class _SettingsScreenState extends State { bool _groupByType = false; + String? _appVersion; @override void initState() { super.initState(); _loadPreferences(); + _loadAppVersion(); + } + + Future _loadAppVersion() async { + final packageInfo = await PackageInfo.fromPlatform(); + if (mounted) { + setState(() => _appVersion = packageInfo.version); + } } Future _loadPreferences() async { @@ -179,7 +189,7 @@ class _SettingsScreenState extends State { // App version ListTile( leading: const Icon(Icons.info_outline), - title: const Text('App Version: 0.6.8'), + title: Text('App Version: ${_appVersion ?? '…'}'), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/mobile/lib/services/device_service.dart b/mobile/lib/services/device_service.dart index 22b9ccbef..6a45cb2ce 100644 --- a/mobile/lib/services/device_service.dart +++ b/mobile/lib/services/device_service.dart @@ -1,5 +1,6 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; class DeviceService { @@ -7,20 +8,21 @@ class DeviceService { Future> getDeviceInfo() async { final prefs = await SharedPreferences.getInstance(); - + final packageInfo = await PackageInfo.fromPlatform(); + // Get or generate device ID String? deviceId = prefs.getString(_deviceIdKey); if (deviceId == null) { deviceId = _generateDeviceId(); await prefs.setString(_deviceIdKey, deviceId); } - + return { 'device_id': deviceId, 'device_name': _getDeviceName(), 'device_type': _getDeviceType(), 'os_version': _getOsVersion(), - 'app_version': '1.0.0', + 'app_version': packageInfo.version, }; } diff --git a/mobile/pubspec.lock b/mobile/pubspec.lock index fd516dab1..b00dc2ebb 100644 --- a/mobile/pubspec.lock +++ b/mobile/pubspec.lock @@ -384,6 +384,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: "direct main" description: diff --git a/mobile/pubspec.yaml b/mobile/pubspec.yaml index 24c23e10e..b1e538be9 100644 --- a/mobile/pubspec.yaml +++ b/mobile/pubspec.yaml @@ -1,7 +1,7 @@ name: sure_mobile description: A mobile app for Sure personal finance management publish_to: 'none' -version: 1.0.0+1 +version: 0.6.8-alpha.11 environment: sdk: '>=3.0.0 <4.0.0' @@ -23,6 +23,7 @@ dependencies: app_links: ^6.4.0 url_launcher: ^6.2.5 flutter_svg: ^2.2.0 + package_info_plus: ^8.0.0 dev_dependencies: flutter_test: