From 6d3ea7a99166c5b67d525289d9919077edfc6eb8 Mon Sep 17 00:00:00 2001 From: Alberto Ponces Date: Thu, 18 Aug 2022 17:32:58 +0100 Subject: [PATCH] fix: improve update manager button --- lib/services/github_api.dart | 25 ++++++++------- lib/services/manager_api.dart | 36 ++++++++++++++++++++-- lib/ui/views/home/home_viewmodel.dart | 22 ++++++++++--- lib/ui/widgets/available_updates_card.dart | 11 +++---- lib/ui/widgets/installed_apps_card.dart | 11 +++---- lib/ui/widgets/latest_commit_card.dart | 25 ++++++++++----- pubspec.yaml | 1 + 7 files changed, 90 insertions(+), 41 deletions(-) diff --git a/lib/services/github_api.dart b/lib/services/github_api.dart index 09f461ea..f9275b30 100644 --- a/lib/services/github_api.dart +++ b/lib/services/github_api.dart @@ -1,13 +1,23 @@ import 'dart:io'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:github/github.dart'; -import 'package:revanced_manager/models/patched_application.dart'; import 'package:timeago/timeago.dart'; class GithubAPI { final GitHub _github = GitHub(); - Future latestRelease(String org, repoName) async { + Future latestReleaseVersion(String org, repoName) async { + try { + var latestRelease = await _github.repositories.getLatestRelease( + RepositorySlug(org, repoName), + ); + return latestRelease.tagName; + } on Exception { + return null; + } + } + + Future latestReleaseFile(String org, repoName) async { try { var latestRelease = await _github.repositories.getLatestRelease( RepositorySlug(org, repoName), @@ -51,15 +61,4 @@ class GithubAPI { return List.empty(); } } - - Future hasUpdates(PatchedApplication app, String org, repoName) async { - // TODO: get status based on last update time on the folder of this app? - return true; - } - - Future getChangelog( - PatchedApplication app, String org, repoName) async { - // TODO: get changelog based on last commits on the folder of this app? - return 'fix: incorrect fingerprint version'; - } } diff --git a/lib/services/manager_api.dart b/lib/services/manager_api.dart index 6bde4a76..a64cf8e3 100644 --- a/lib/services/manager_api.dart +++ b/lib/services/manager_api.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/services/github_api.dart'; @@ -6,14 +7,43 @@ class ManagerAPI { final GithubAPI _githubAPI = GithubAPI(); Future downloadPatches() async { - return await _githubAPI.latestRelease(ghOrg, patchesRepo); + return await _githubAPI.latestReleaseFile(ghOrg, patchesRepo); } Future downloadIntegrations() async { - return await _githubAPI.latestRelease(ghOrg, integrationsRepo); + return await _githubAPI.latestReleaseFile(ghOrg, integrationsRepo); } Future downloadManager() async { - return await _githubAPI.latestRelease(ghOrg, managerRepo); + return await _githubAPI.latestReleaseFile( + 'Aunali321', + 'revanced-manager-flutter', + ); + } + + Future getLatestPatchesVersion() async { + return await _githubAPI.latestReleaseVersion(ghOrg, patchesRepo); + } + + Future getLatestManagerVersion() async { + return await _githubAPI.latestReleaseVersion( + 'Aunali321', + 'revanced-manager-flutter', + ); + } + + Future getCurrentManagerVersion() async { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + return packageInfo.version; + } + + Future hasAppUpdates(String packageName) async { + // TODO: get status based on last update time on the folder of this app? + return true; + } + + Future getAppChangelog(String packageName) async { + // TODO: get changelog based on last commits on the folder of this app? + return 'to be implemented'; } } diff --git a/lib/ui/views/home/home_viewmodel.dart b/lib/ui/views/home/home_viewmodel.dart index 95e3669a..fe51583e 100644 --- a/lib/ui/views/home/home_viewmodel.dart +++ b/lib/ui/views/home/home_viewmodel.dart @@ -8,9 +8,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:injectable/injectable.dart'; import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/app/app.router.dart'; -import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/models/patched_application.dart'; -import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/services/patcher_api.dart'; import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.dart'; @@ -22,7 +20,6 @@ import 'package:stacked_services/stacked_services.dart'; class HomeViewModel extends BaseViewModel { final NavigationService _navigationService = locator(); final ManagerAPI _managerAPI = ManagerAPI(); - final GithubAPI _githubAPI = GithubAPI(); final PatcherAPI _patcherAPI = locator(); final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); @@ -56,7 +53,7 @@ class HomeViewModel extends BaseViewModel { List patchedApps = prefs.getStringList('patchedApps') ?? []; for (String str in patchedApps) { PatchedApplication app = PatchedApplication.fromJson(json.decode(str)); - bool hasUpdates = await _githubAPI.hasUpdates(app, ghOrg, patchesRepo); + bool hasUpdates = await _managerAPI.hasAppUpdates(app.packageName); if (hasUpdates == isUpdatable) { list.add(app); } @@ -64,6 +61,23 @@ class HomeViewModel extends BaseViewModel { return list; } + Future hasManagerUpdates() async { + String? latestVersion = await _managerAPI.getLatestManagerVersion(); + String currentVersion = await _managerAPI.getCurrentManagerVersion(); + if (latestVersion != null) { + try { + int latestVersionInt = + int.parse(latestVersion.replaceFirst('v', '').replaceAll('.', '')); + int currentVersionInt = + int.parse(currentVersion.replaceFirst('v', '').replaceAll('.', '')); + return latestVersionInt > currentVersionInt; + } on Exception { + return false; + } + } + return false; + } + void updateManager(BuildContext context) async { File? managerApk = await _managerAPI.downloadManager(); if (managerApk != null) { diff --git a/lib/ui/widgets/available_updates_card.dart b/lib/ui/widgets/available_updates_card.dart index 22b1d0c1..e2af29a3 100644 --- a/lib/ui/widgets/available_updates_card.dart +++ b/lib/ui/widgets/available_updates_card.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/models/patched_application.dart'; -import 'package:revanced_manager/services/github_api.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/application_item.dart'; @@ -11,7 +10,7 @@ class AvailableUpdatesCard extends StatelessWidget { Key? key, }) : super(key: key); - final GithubAPI _githubAPI = GithubAPI(); + final ManagerAPI _managerAPI = ManagerAPI(); @override Widget build(BuildContext context) { @@ -28,10 +27,8 @@ class AvailableUpdatesCard extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemCount: snapshot.data!.length, itemBuilder: (context, index) => FutureBuilder( - future: _githubAPI.getChangelog( - snapshot.data![index], - ghOrg, - patchesRepo, + future: _managerAPI.getAppChangelog( + snapshot.data![index].packageName, ), initialData: '', builder: (context, snapshot2) => ApplicationItem( diff --git a/lib/ui/widgets/installed_apps_card.dart b/lib/ui/widgets/installed_apps_card.dart index a9c4df2f..be039b91 100644 --- a/lib/ui/widgets/installed_apps_card.dart +++ b/lib/ui/widgets/installed_apps_card.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:revanced_manager/app/app.locator.dart'; -import 'package:revanced_manager/constants.dart'; import 'package:revanced_manager/models/patched_application.dart'; -import 'package:revanced_manager/services/github_api.dart'; +import 'package:revanced_manager/services/manager_api.dart'; import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/application_item.dart'; @@ -11,7 +10,7 @@ class InstalledAppsCard extends StatelessWidget { Key? key, }) : super(key: key); - final GithubAPI _githubAPI = GithubAPI(); + final ManagerAPI _managerAPI = ManagerAPI(); @override Widget build(BuildContext context) { @@ -28,10 +27,8 @@ class InstalledAppsCard extends StatelessWidget { physics: const NeverScrollableScrollPhysics(), itemCount: snapshot.data!.length, itemBuilder: (context, index) => FutureBuilder( - future: _githubAPI.getChangelog( - snapshot.data![index], - ghOrg, - patchesRepo, + future: _managerAPI.getAppChangelog( + snapshot.data![index].packageName, ), initialData: '', builder: (context, snapshot2) => ApplicationItem( diff --git a/lib/ui/widgets/latest_commit_card.dart b/lib/ui/widgets/latest_commit_card.dart index 203b9eb8..16407e36 100644 --- a/lib/ui/widgets/latest_commit_card.dart +++ b/lib/ui/widgets/latest_commit_card.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_i18n/flutter_i18n.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:revanced_manager/app/app.locator.dart'; import 'package:revanced_manager/services/github_api.dart'; import 'package:revanced_manager/constants.dart'; +import 'package:revanced_manager/ui/views/home/home_viewmodel.dart'; import 'package:revanced_manager/ui/widgets/patch_text_button.dart'; class LatestCommitCard extends StatefulWidget { @@ -96,14 +98,23 @@ class _LatestCommitCardState extends State { ), ], ), - PatchTextButton( - text: FlutterI18n.translate( - context, - 'latestCommitCard.updateButton', + FutureBuilder( + future: locator().hasManagerUpdates(), + initialData: false, + builder: (context, snapshot) => Opacity( + opacity: snapshot.hasData && snapshot.data! ? 1.0 : 0.5, + child: PatchTextButton( + text: FlutterI18n.translate( + context, + 'latestCommitCard.updateButton', + ), + onPressed: snapshot.hasData && snapshot.data! + ? widget.onPressed + : () => {}, + backgroundColor: Theme.of(context).colorScheme.secondary, + borderColor: Theme.of(context).colorScheme.secondary, + ), ), - onPressed: widget.onPressed, - backgroundColor: Theme.of(context).colorScheme.secondary, - borderColor: Theme.of(context).colorScheme.secondary, ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index dc796b32..6b63b18c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: http: ^0.13.4 injectable: ^1.5.3 json_annotation: ^4.6.0 + package_info_plus: ^1.4.3+1 path_provider: ^2.0.11 root: ^2.0.2 share_extend: ^2.0.0