diff --git a/.github/workflows/release-beta.yaml b/.github/workflows/release-beta.yaml index b3cd1eb..472e119 100644 --- a/.github/workflows/release-beta.yaml +++ b/.github/workflows/release-beta.yaml @@ -4,9 +4,13 @@ on: workflow_dispatch: inputs: version: - description: "Version (beta)" + description: "Version" required: true - default: "1.0.0-beta.1" + default: "1.0.0" + beta-number: + description: "Beta number" + required: true + default: "1" number: description: "Build number" required: true @@ -18,8 +22,11 @@ jobs: env: ANDROID_AAB_RELEASE_PATH: build/app/outputs/bundle/release ANDROID_APK_RELEASE_PATH: build/app/outputs/apk/release + VERSION_NAME: ${{ github.event.inputs.version }}-beta.${{ github.event.inputs.beta-number }} steps: - uses: actions/checkout@v3 + with: + ref: beta - name: Decode android/app/keystore.jks run: echo "${{ secrets.KEYSTORE_JKS }}" | base64 --decode > android/app/keystore.jks - name: Decode android/key.properties @@ -27,7 +34,7 @@ jobs: - name: Decode .env run: echo "${{ secrets.ENV }}" | base64 --decode > .env - name: Update version in YAML - run: sed -i 's/99.99.99+99/${{ github.event.inputs.version }}+${{ github.event.inputs.number }}/g' pubspec.yaml + run: sed -i 's/99.99.99+99/${{ env.VERSION_NAME }}+${{ github.event.inputs.number }}/g' pubspec.yaml - name: Update KeyStore password in gradle properties run: sed -i 's/#{KEYSTORE_PASS}#/${{ secrets.KEYSTORE_PASS }}/g' android/key.properties - name: Update KeyStore key password in gradle properties @@ -44,26 +51,30 @@ jobs: - run: flutter build apk --release - run: flutter build appbundle --release - name: Rename apk - run: mv $ANDROID_APK_RELEASE_PATH/app-release.apk $ANDROID_APK_RELEASE_PATH/AdGuardHomeManager_${{ github.event.inputs.version }}_Android.apk + run: mv $ANDROID_APK_RELEASE_PATH/app-release.apk $ANDROID_APK_RELEASE_PATH/AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.apk - name: Rename aab - run: mv $ANDROID_AAB_RELEASE_PATH/app-release.aab $ANDROID_AAB_RELEASE_PATH/AdGuardHomeManager_${{ github.event.inputs.version }}_Android.aab + run: mv $ANDROID_AAB_RELEASE_PATH/app-release.aab $ANDROID_AAB_RELEASE_PATH/AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.aab - name: Copy apk to project root - run: cp $ANDROID_APK_RELEASE_PATH/AdGuardHomeManager_${{ github.event.inputs.version }}_Android.apk AdGuardHomeManager_${{ github.event.inputs.version }}_Android.apk + run: cp $ANDROID_APK_RELEASE_PATH/AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.apk AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.apk - name: Copy aab to project root - run: cp $ANDROID_AAB_RELEASE_PATH/AdGuardHomeManager_${{ github.event.inputs.version }}_Android.aab AdGuardHomeManager_${{ github.event.inputs.version }}_Android.aab + run: cp $ANDROID_AAB_RELEASE_PATH/AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.aab AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.aab - name: Upload artifact uses: actions/upload-artifact@v3 with: name: android path: | - AdGuardHomeManager_${{ github.event.inputs.version }}_Android.aab - AdGuardHomeManager_${{ github.event.inputs.version }}_Android.apk + AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.aab + AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.apk release-builds-github: name: Release beta build to GitHub runs-on: ubuntu-latest needs: [build-android] + env: + VERSION_NAME: ${{ github.event.inputs.version }}-beta.${{ github.event.inputs.beta-number }} steps: - uses: actions/checkout@v3 + with: + ref: beta - name: Create builds directory run: mkdir releases - name: Download Android artifacts @@ -76,8 +87,8 @@ jobs: with: artifacts: "releases/*" token: ${{ secrets.GH_TOKEN }} - tag: '${{ github.event.inputs.version }}_(${{ github.event.inputs.number }})' - name: v${{ github.event.inputs.version }} + tag: '${{ env.VERSION_NAME }}_(${{ github.event.inputs.number }})' + name: v${{ env.VERSION_NAME }} draft: true prerelease: true commit: ${{ github.sha }} @@ -85,8 +96,12 @@ jobs: name: Release Android beta build to the Google Play Store runs-on: ubuntu-latest needs: [build-android] + env: + VERSION_NAME: ${{ github.event.inputs.version }}-beta.${{ github.event.inputs.beta-number }} steps: - uses: actions/checkout@v3 + with: + ref: beta - name: Download Android artifacts uses: actions/download-artifact@v3 with: @@ -96,7 +111,7 @@ jobs: with: serviceAccountJsonPlainText: ${{ secrets.PLAYSTORE_ACCOUNT_KEY }} packageName: com.jgeek00.adguard_home_manager - releaseFiles: AdGuardHomeManager_${{ github.event.inputs.version }}_Android.aab + releaseFiles: AdGuardHomeManager_${{ env.VERSION_NAME }}_Android.aab track: beta status: draft - releaseName: ${{ github.event.inputs.version }} \ No newline at end of file + releaseName: ${{ env.VERSION_NAME }} \ No newline at end of file diff --git a/lib/functions/compare_versions.dart b/lib/functions/compare_versions.dart index 4bdc178..33ae8fe 100644 --- a/lib/functions/compare_versions.dart +++ b/lib/functions/compare_versions.dart @@ -39,7 +39,7 @@ bool compareVersions({ } else { // stable final current = currentVersion.replaceAll('v', ''); - final newV = currentVersion.replaceAll('v', ''); + final newV = newVersion.replaceAll('v', ''); final currentSplit = current.split('.').map((e) => int.parse(e)).toList(); final newSplit = newV.split('.').map((e) => int.parse(e)).toList(); @@ -159,26 +159,34 @@ bool gitHubUpdateExists({ : gitHubReleases.firstWhere((release) => release.prerelease == false); final versionNumberRegex = RegExp(r'\(\d+\)'); - final releaseNumberExtracted = versionNumberRegex.allMatches(release.tagName).first.group(0); + final releaseNumberExtractedMatches = versionNumberRegex.allMatches(release.tagName); - if (releaseNumberExtracted != null) { - final releaseNumber = releaseNumberExtracted.replaceAll(RegExp(r'\(|\)'), ''); - try { - final newReleaseParsed = int.parse(releaseNumber); - final currentReleaseParsed = int.parse(currentBuildNumber); - if (newReleaseParsed > currentReleaseParsed) { - return true; - } - else { + if (releaseNumberExtractedMatches.isNotEmpty) { + final releaseNumberExtracted = releaseNumberExtractedMatches.first.group(0); + + if (releaseNumberExtracted != null) { + final releaseNumber = releaseNumberExtracted.replaceAll(RegExp(r'\(|\)'), ''); + try { + final newReleaseParsed = int.parse(releaseNumber); + final currentReleaseParsed = int.parse(currentBuildNumber); + if (newReleaseParsed > currentReleaseParsed) { + return true; + } + else { + return false; + } + } catch (e) { + Sentry.captureMessage("Invalid release number. Current release: $currentBuildNumber. New release: $releaseNumber"); return false; } - } catch (e) { - Sentry.captureMessage("Invalid release number. Current release: $currentBuildNumber. New release: $releaseNumber"); + } + else { + Sentry.captureMessage("Invalid release number. Tagname: ${release.tagName}"); return false; } } else { - Sentry.captureMessage("Invalid release number. Tagname: ${release.tagName}"); + Sentry.captureMessage("No matches. ${release.tagName}"); return false; } } \ No newline at end of file diff --git a/lib/functions/copy_clipboard.dart b/lib/functions/copy_clipboard.dart index 87c8135..fbd13ec 100644 --- a/lib/functions/copy_clipboard.dart +++ b/lib/functions/copy_clipboard.dart @@ -3,18 +3,21 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:adguard_home_manager/config/globals.dart'; + void copyToClipboard({ - required BuildContext context, required String value, required String successMessage }) async { - await Clipboard.setData( - ClipboardData(text: value) - ); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(successMessage), - backgroundColor: Colors.green, - ) - ); + if (scaffoldMessengerKey.currentState != null) { + await Clipboard.setData( + ClipboardData(text: value) + ); + scaffoldMessengerKey.currentState!.showSnackBar( + SnackBar( + content: Text(successMessage), + backgroundColor: Colors.green, + ) + ); + } } \ No newline at end of file diff --git a/lib/models/update_available.dart b/lib/models/update_available.dart index ee766e0..c370e33 100644 --- a/lib/models/update_available.dart +++ b/lib/models/update_available.dart @@ -18,7 +18,6 @@ class UpdateAvailableData { final bool? canAutoupdate; final bool disabled; String? changelog; - bool? updateAvailable; UpdateAvailableData({ required this.currentVersion, @@ -28,7 +27,6 @@ class UpdateAvailableData { required this.canAutoupdate, required this.disabled, this.changelog, - this.updateAvailable }); factory UpdateAvailableData.fromJson(Map json) => UpdateAvailableData( @@ -39,7 +37,15 @@ class UpdateAvailableData { canAutoupdate: json["can_autoupdate"], disabled: json["disabled"], changelog: json["changelog"], - updateAvailable: json['update_available'] + ); + + factory UpdateAvailableData.fromJsonUpdate(Map json) => UpdateAvailableData( + currentVersion: json["current_version"], + newVersion: json["new_version"], + announcement: json["announcement"], + announcementUrl: json["announcement_url"], + canAutoupdate: json["can_autoupdate"], + disabled: json["disabled"], ); Map toJson() => { @@ -50,6 +56,5 @@ class UpdateAvailableData { "can_autoupdate": canAutoupdate, "disabled": disabled, "changelog": changelog, - "update_available": updateAvailable }; } diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index 4b45394..c745260 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:sqflite/sqflite.dart'; @@ -6,7 +8,6 @@ import 'package:adguard_home_manager/models/update_available.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/conversions.dart'; import 'package:adguard_home_manager/services/db/queries.dart'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/constants/enums.dart'; class ServersProvider with ChangeNotifier { @@ -16,6 +17,8 @@ class ServersProvider with ChangeNotifier { Server? _selectedServer; ApiClient? _apiClient; + bool _updatingServer = false; + final UpdateAvailable _updateAvailable = UpdateAvailable( loadStatus: LoadStatus.loading, data: null, @@ -37,6 +40,10 @@ class ServersProvider with ChangeNotifier { return _updateAvailable; } + bool get updatingServer { + return _updatingServer; + } + void setDbInstance(Database db) { _dbInstance = db; } @@ -68,6 +75,11 @@ class ServersProvider with ChangeNotifier { notifyListeners(); } + void setUpdatingServer(bool status) { + _updatingServer = status; + notifyListeners(); + } + Future createServer(Server server) async { final saved = await saveServerQuery(_dbInstance!, server); if (saved == null) { @@ -155,7 +167,9 @@ class ServersProvider with ChangeNotifier { } } - void checkServerUpdatesAvailable(Server server) async { + void checkServerUpdatesAvailable({ + required Server server, + }) async { setUpdateAvailableLoadStatus(LoadStatus.loading, true); final result = await _apiClient!.checkServerUpdates(); if (result['result'] == 'success') { @@ -164,12 +178,6 @@ class ServersProvider with ChangeNotifier { if (gitHubResult['result'] == 'success') { data.changelog = gitHubResult['body']; } - data.updateAvailable = data.newVersion != null - ? compareVersions( - currentVersion: data.currentVersion, - newVersion: data.newVersion!, - ) - : false; setUpdateAvailableData(data); setUpdateAvailableLoadStatus(LoadStatus.loaded, true); } @@ -178,18 +186,12 @@ class ServersProvider with ChangeNotifier { } } - void clearUpdateAvailable(Server server, String newCurrentVersion) { - if (_updateAvailable.data != null) { - _updateAvailable.data!.updateAvailable = null; - _updateAvailable.data!.currentVersion = newCurrentVersion; - notifyListeners(); - } - } - Future initializateServer(Server server) async { final serverStatus = await _apiClient!.getServerStatus(); if (serverStatus['result'] == 'success') { - checkServerUpdatesAvailable(server); // Do not await + checkServerUpdatesAvailable( // Do not await + server: server, + ); } } @@ -229,4 +231,39 @@ class ServersProvider with ChangeNotifier { return null; } } + + void recheckPeriodServerUpdated() { + if (_selectedServer != null) { + setUpdatingServer(true); + Server server = _selectedServer!; + Timer.periodic( + const Duration(seconds: 2), + (timer) async { + if (_selectedServer != null && _selectedServer == server) { + final result = await _apiClient!.checkServerUpdates(); + if (result['result'] == 'success') { + UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result['data']); + if (data.currentVersion == data.newVersion) { + final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); + if (gitHubResult['result'] == 'success') { + data.changelog = gitHubResult['body']; + } + setUpdateAvailableData(data); + timer.cancel(); + setUpdatingServer(false); + } + } + else { + timer.cancel(); + setUpdatingServer(false); + } + } + else { + timer.cancel(); + setUpdatingServer(false); + } + } + ); + } + } } \ No newline at end of file diff --git a/lib/providers/status_provider.dart b/lib/providers/status_provider.dart index 7fa1682..5a4ef73 100644 --- a/lib/providers/status_provider.dart +++ b/lib/providers/status_provider.dart @@ -290,10 +290,12 @@ class StatusProvider with ChangeNotifier { required String domain, required String newStatus }) async { + if (_serverStatus == null) return false; + final rules = await _serversProvider!.apiClient!.getFilteringRules(); if (rules['result'] == 'success') { - FilteringStatus oldStatus = serverStatus!.filteringStatus; + FilteringStatus oldStatus = _serverStatus!.filteringStatus; List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); if (newStatus == 'block') { @@ -302,7 +304,7 @@ class StatusProvider with ChangeNotifier { else if (newStatus == 'unblock') { newRules.add("@@||$domain^"); } - FilteringStatus newObj = serverStatus!.filteringStatus; + FilteringStatus newObj = _serverStatus!.filteringStatus; newObj.userRules = newRules; _filteringStatus = newObj; diff --git a/lib/screens/clients/active_client_tile.dart b/lib/screens/clients/active_client_tile.dart index c3e55cf..26cb30f 100644 --- a/lib/screens/clients/active_client_tile.dart +++ b/lib/screens/clients/active_client_tile.dart @@ -35,7 +35,6 @@ class ActiveClientTile extends StatelessWidget { icon: Icons.copy_rounded, action: () { copyToClipboard( - context: context, value: client.name != '' ? client.name! : client.ip, @@ -58,7 +57,6 @@ class ActiveClientTile extends StatelessWidget { icon: Icons.copy_rounded, onTap: () { copyToClipboard( - context: context, value: client.name != '' ? client.name! : client.ip, @@ -137,7 +135,6 @@ class ActiveClientTile extends StatelessWidget { icon: Icons.copy_rounded, onTap: () { copyToClipboard( - context: context, value: client.name != '' ? client.name! : client.ip, diff --git a/lib/screens/clients/added_client_tile.dart b/lib/screens/clients/added_client_tile.dart index ff6d566..c63c816 100644 --- a/lib/screens/clients/added_client_tile.dart +++ b/lib/screens/clients/added_client_tile.dart @@ -55,7 +55,6 @@ class AddedClientTile extends StatelessWidget { icon: Icons.copy_rounded, onTap: () { copyToClipboard( - context: context, value: client.ids.toString().replaceAll(RegExp(r'^\[|\]$'), ''), successMessage: AppLocalizations.of(context)!.copiedClipboard, ); @@ -189,7 +188,6 @@ class AddedClientTile extends StatelessWidget { icon: Icons.copy_rounded, onTap: () { copyToClipboard( - context: context, value: client.ids.toString().replaceAll(RegExp(r'^\[|\]$'), ''), successMessage: AppLocalizations.of(context)!.copiedClipboard, ); diff --git a/lib/screens/filters/filters_triple_column.dart b/lib/screens/filters/filters_triple_column.dart index c481749..de0ffb0 100644 --- a/lib/screens/filters/filters_triple_column.dart +++ b/lib/screens/filters/filters_triple_column.dart @@ -249,7 +249,6 @@ class FiltersTripleColumn extends StatelessWidget { icon: Icons.copy_rounded, onTap: () { copyToClipboard( - context: context, value: filteringProvider.filtering!.userRules[index], successMessage: AppLocalizations.of(context)!.copiedClipboard, ); @@ -266,7 +265,6 @@ class FiltersTripleColumn extends StatelessWidget { title: AppLocalizations.of(context)!.copyClipboard, icon: Icons.copy_rounded, action: () => copyToClipboard( - context: context, value: filteringProvider.filtering!.userRules[index], successMessage: AppLocalizations.of(context)!.copiedClipboard, ) diff --git a/lib/screens/filters/list_options_menu.dart b/lib/screens/filters/list_options_menu.dart index 6482ecd..1d644a0 100644 --- a/lib/screens/filters/list_options_menu.dart +++ b/lib/screens/filters/list_options_menu.dart @@ -87,7 +87,6 @@ class ListOptionsMenu extends StatelessWidget { onTap: () { Navigator.pop(context); // Closes the context menu copyToClipboard( - context: context, value: list.url, successMessage: AppLocalizations.of(context)!.listUrlCopied ); @@ -114,7 +113,6 @@ class ListOptionsMenu extends StatelessWidget { title: AppLocalizations.of(context)!.copyListUrl, icon: Icons.copy_rounded, action: () => copyToClipboard( - context: context, value: list.url, successMessage: AppLocalizations.of(context)!.listUrlCopied ) diff --git a/lib/screens/settings/app_logs/app_logs.dart b/lib/screens/settings/app_logs/app_logs.dart index 48a3c9d..19a8502 100644 --- a/lib/screens/settings/app_logs/app_logs.dart +++ b/lib/screens/settings/app_logs/app_logs.dart @@ -25,7 +25,6 @@ class AppLogs extends StatelessWidget { IconButton( onPressed: appConfigProvider.logs.isNotEmpty ? () => copyToClipboard( - context: context, value: jsonEncode(appConfigProvider.logs.map((log) => log.toMap()).toList()), successMessage: AppLocalizations.of(context)!.logsCopiedClipboard ) diff --git a/lib/screens/settings/server_info/server_info.dart b/lib/screens/settings/server_info/server_info.dart index 35bbd82..a6a9fcc 100644 --- a/lib/screens/settings/server_info/server_info.dart +++ b/lib/screens/settings/server_info/server_info.dart @@ -48,12 +48,12 @@ class _ServerInformationWidgetState extends State { if (mounted) { if (result['result'] == 'success') { setState(() { - serverInfo.loadStatus = LoadStatus.loaded; serverInfo.data = result['data']; + serverInfo.loadStatus = LoadStatus.loaded; }); } else { - setState(() => serverInfo.loadStatus = LoadStatus.loaded); + setState(() => serverInfo.loadStatus = LoadStatus.error); } } } diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index b0763f6..f3a08ba 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -188,8 +188,7 @@ class SettingsWidget extends StatelessWidget { title: AppLocalizations.of(context)!.updates, subtitle: AppLocalizations.of(context)!.updatesDescription, trailing: serversProvider.updateAvailable.data != null && - serversProvider.updateAvailable.data!.updateAvailable != null && - serversProvider.updateAvailable.data!.updateAvailable == true + serversProvider.updateAvailable.data!.canAutoupdate == true ? Container( width: 10, height: 10, diff --git a/lib/screens/settings/update_server/update.dart b/lib/screens/settings/update_server/update.dart index f84e01a..3467994 100644 --- a/lib/screens/settings/update_server/update.dart +++ b/lib/screens/settings/update_server/update.dart @@ -40,7 +40,7 @@ class UpdateScreen extends StatelessWidget { processModal.close(); if (result['result'] == 'success') { - serversProvider.clearUpdateAvailable(serversProvider.selectedServer!, serversProvider.updateAvailable.data!.newVersion!); + serversProvider.recheckPeriodServerUpdated(); showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.requestStartUpdateSuccessful, @@ -79,7 +79,9 @@ class UpdateScreen extends StatelessWidget { color: Theme.of(context).colorScheme.onSurfaceVariant, ), tooltip: AppLocalizations.of(context)!.checkUpdates, - onPressed: () => serversProvider.checkServerUpdatesAvailable(serversProvider.selectedServer!) + onPressed: () => serversProvider.checkServerUpdatesAvailable( + server: serversProvider.selectedServer!, + ) ), ], ), @@ -97,11 +99,9 @@ class UpdateScreen extends StatelessWidget { ], ) : Icon( - serversProvider.updateAvailable.data!.updateAvailable != null - ? serversProvider.updateAvailable.data!.updateAvailable == true - ? Icons.system_update_rounded - : Icons.system_security_update_good_rounded - : Icons.system_security_update_warning_rounded, + serversProvider.updateAvailable.data!.canAutoupdate == true + ? Icons.system_update_rounded + : Icons.system_security_update_good_rounded, size: 40, color: Theme.of(context).colorScheme.primary, ), @@ -109,11 +109,9 @@ class UpdateScreen extends StatelessWidget { Text( serversProvider.updateAvailable.loadStatus == LoadStatus.loading ? AppLocalizations.of(context)!.checkingUpdates - : serversProvider.updateAvailable.data!.updateAvailable != null - ? serversProvider.updateAvailable.data!.updateAvailable == true - ? AppLocalizations.of(context)!.updateAvailable - : AppLocalizations.of(context)!.serverUpdated - : AppLocalizations.of(context)!.unknownStatus, + : serversProvider.updateAvailable.data!.canAutoupdate == true + ? AppLocalizations.of(context)!.updateAvailable + : AppLocalizations.of(context)!.serverUpdated, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w400 @@ -127,7 +125,7 @@ class UpdateScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true + serversProvider.updateAvailable.data!.canAutoupdate == true ? AppLocalizations.of(context)!.newVersion : AppLocalizations.of(context)!.currentVersion, style: const TextStyle( @@ -136,11 +134,9 @@ class UpdateScreen extends StatelessWidget { ), const SizedBox(height: 4), Text( - serversProvider.updateAvailable.data!.updateAvailable != null - ? serversProvider.updateAvailable.data!.updateAvailable == true - ? serversProvider.updateAvailable.data!.newVersion ?? 'N/A' - : serversProvider.updateAvailable.data!.currentVersion - : "N/A", + serversProvider.updateAvailable.data!.canAutoupdate == true + ? serversProvider.updateAvailable.data!.newVersion ?? 'N/A' + : serversProvider.updateAvailable.data!.currentVersion, style: TextStyle( fontSize: 12, fontWeight: FontWeight.w700, @@ -153,11 +149,13 @@ class UpdateScreen extends StatelessWidget { FilledButton.icon( icon: const Icon(Icons.download_rounded), label: Text(AppLocalizations.of(context)!.updateNow), - onPressed: serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true - ? serversProvider.updateAvailable.data!.canAutoupdate != null && serversProvider.updateAvailable.data!.canAutoupdate == true - ? () => update() - : () => showAutoUpdateUnavailableModal() - : null + onPressed: serversProvider.updatingServer == true + ? null + : serversProvider.updateAvailable.data!.canAutoupdate == true + ? serversProvider.updateAvailable.data!.canAutoupdate != null && serversProvider.updateAvailable.data!.canAutoupdate == true + ? () => update() + : () => showAutoUpdateUnavailableModal() + : null ) ], ), @@ -174,7 +172,7 @@ class UpdateScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( - "Changelog ${serversProvider.updateAvailable.data!.updateAvailable == true + "Changelog ${serversProvider.updateAvailable.data!.canAutoupdate == true ? serversProvider.updateAvailable.data!.newVersion : serversProvider.updateAvailable.data!.currentVersion}", style: TextStyle( diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index c28733e..cb384b4 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -2007,21 +2007,18 @@ class ApiClient { final result = await Future.wait([ apiRequest( urlPath: '/version.json', - method: 'get', + method: 'post', server: server, type: 'check_server_updates', - body: json.encode({ + body: { "recheck_now": true - }) + } ), apiRequest( urlPath: '/status', method: 'get', server: server, type: 'check_server_updates', - body: json.encode({ - "recheck_now": true - }) ), ]); diff --git a/lib/widgets/bottom_nav_bar.dart b/lib/widgets/bottom_nav_bar.dart index 8465844..366fe2c 100644 --- a/lib/widgets/bottom_nav_bar.dart +++ b/lib/widgets/bottom_nav_bar.dart @@ -66,8 +66,7 @@ class BottomNavBar extends StatelessWidget { if ( screen.name == 'settings' && serversProvider.updateAvailable.data != null && - serversProvider.updateAvailable.data!.updateAvailable != null && - serversProvider.updateAvailable.data!.updateAvailable == true + serversProvider.updateAvailable.data!.canAutoupdate == true ) Positioned( bottom: 0, right: -12, diff --git a/lib/widgets/servers_list/servers_list_item.dart b/lib/widgets/servers_list/servers_list_item.dart index fb3364e..724be22 100644 --- a/lib/widgets/servers_list/servers_list_item.dart +++ b/lib/widgets/servers_list/servers_list_item.dart @@ -145,7 +145,9 @@ class _ServersListItemState extends State with SingleTickerProv statusProvider.setServerStatusData( data: serverStatus['data'] ); - serversProvider.checkServerUpdatesAvailable(server); + serversProvider.checkServerUpdatesAvailable( + server: server, + ); statusProvider.setServerStatusLoad(LoadStatus.loaded); } else { diff --git a/lib/widgets/servers_list/servers_tile_item.dart b/lib/widgets/servers_list/servers_tile_item.dart index fd274d6..c45b90e 100644 --- a/lib/widgets/servers_list/servers_tile_item.dart +++ b/lib/widgets/servers_list/servers_tile_item.dart @@ -112,7 +112,9 @@ class _ServersTileItemState extends State with SingleTickerProv statusProvider.setServerStatusData( data: serverStatus['data'] ); - serversProvider.checkServerUpdatesAvailable(server); + serversProvider.checkServerUpdatesAvailable( + server: server, + ); statusProvider.setServerStatusLoad(LoadStatus.loaded); } else {