mirror of
https://github.com/revanced/revanced-manager.git
synced 2025-05-02 06:44:25 +02:00
fix: improve update manager button
This commit is contained in:
parent
389eae1447
commit
6d3ea7a991
@ -1,13 +1,23 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||||
import 'package:github/github.dart';
|
import 'package:github/github.dart';
|
||||||
import 'package:revanced_manager/models/patched_application.dart';
|
|
||||||
import 'package:timeago/timeago.dart';
|
import 'package:timeago/timeago.dart';
|
||||||
|
|
||||||
class GithubAPI {
|
class GithubAPI {
|
||||||
final GitHub _github = GitHub();
|
final GitHub _github = GitHub();
|
||||||
|
|
||||||
Future<File?> latestRelease(String org, repoName) async {
|
Future<String?> latestReleaseVersion(String org, repoName) async {
|
||||||
|
try {
|
||||||
|
var latestRelease = await _github.repositories.getLatestRelease(
|
||||||
|
RepositorySlug(org, repoName),
|
||||||
|
);
|
||||||
|
return latestRelease.tagName;
|
||||||
|
} on Exception {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<File?> latestReleaseFile(String org, repoName) async {
|
||||||
try {
|
try {
|
||||||
var latestRelease = await _github.repositories.getLatestRelease(
|
var latestRelease = await _github.repositories.getLatestRelease(
|
||||||
RepositorySlug(org, repoName),
|
RepositorySlug(org, repoName),
|
||||||
@ -51,15 +61,4 @@ class GithubAPI {
|
|||||||
return List.empty();
|
return List.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> hasUpdates(PatchedApplication app, String org, repoName) async {
|
|
||||||
// TODO: get status based on last update time on the folder of this app?
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String> 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';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:revanced_manager/constants.dart';
|
import 'package:revanced_manager/constants.dart';
|
||||||
import 'package:revanced_manager/services/github_api.dart';
|
import 'package:revanced_manager/services/github_api.dart';
|
||||||
|
|
||||||
@ -6,14 +7,43 @@ class ManagerAPI {
|
|||||||
final GithubAPI _githubAPI = GithubAPI();
|
final GithubAPI _githubAPI = GithubAPI();
|
||||||
|
|
||||||
Future<File?> downloadPatches() async {
|
Future<File?> downloadPatches() async {
|
||||||
return await _githubAPI.latestRelease(ghOrg, patchesRepo);
|
return await _githubAPI.latestReleaseFile(ghOrg, patchesRepo);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<File?> downloadIntegrations() async {
|
Future<File?> downloadIntegrations() async {
|
||||||
return await _githubAPI.latestRelease(ghOrg, integrationsRepo);
|
return await _githubAPI.latestReleaseFile(ghOrg, integrationsRepo);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<File?> downloadManager() async {
|
Future<File?> downloadManager() async {
|
||||||
return await _githubAPI.latestRelease(ghOrg, managerRepo);
|
return await _githubAPI.latestReleaseFile(
|
||||||
|
'Aunali321',
|
||||||
|
'revanced-manager-flutter',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String?> getLatestPatchesVersion() async {
|
||||||
|
return await _githubAPI.latestReleaseVersion(ghOrg, patchesRepo);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String?> getLatestManagerVersion() async {
|
||||||
|
return await _githubAPI.latestReleaseVersion(
|
||||||
|
'Aunali321',
|
||||||
|
'revanced-manager-flutter',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> getCurrentManagerVersion() async {
|
||||||
|
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
||||||
|
return packageInfo.version;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> hasAppUpdates(String packageName) async {
|
||||||
|
// TODO: get status based on last update time on the folder of this app?
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> getAppChangelog(String packageName) async {
|
||||||
|
// TODO: get changelog based on last commits on the folder of this app?
|
||||||
|
return 'to be implemented';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|||||||
import 'package:injectable/injectable.dart';
|
import 'package:injectable/injectable.dart';
|
||||||
import 'package:revanced_manager/app/app.locator.dart';
|
import 'package:revanced_manager/app/app.locator.dart';
|
||||||
import 'package:revanced_manager/app/app.router.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/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/manager_api.dart';
|
||||||
import 'package:revanced_manager/services/patcher_api.dart';
|
import 'package:revanced_manager/services/patcher_api.dart';
|
||||||
import 'package:revanced_manager/ui/views/patcher/patcher_viewmodel.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 {
|
class HomeViewModel extends BaseViewModel {
|
||||||
final NavigationService _navigationService = locator<NavigationService>();
|
final NavigationService _navigationService = locator<NavigationService>();
|
||||||
final ManagerAPI _managerAPI = ManagerAPI();
|
final ManagerAPI _managerAPI = ManagerAPI();
|
||||||
final GithubAPI _githubAPI = GithubAPI();
|
|
||||||
final PatcherAPI _patcherAPI = locator<PatcherAPI>();
|
final PatcherAPI _patcherAPI = locator<PatcherAPI>();
|
||||||
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
||||||
FlutterLocalNotificationsPlugin();
|
FlutterLocalNotificationsPlugin();
|
||||||
@ -56,7 +53,7 @@ class HomeViewModel extends BaseViewModel {
|
|||||||
List<String> patchedApps = prefs.getStringList('patchedApps') ?? [];
|
List<String> patchedApps = prefs.getStringList('patchedApps') ?? [];
|
||||||
for (String str in patchedApps) {
|
for (String str in patchedApps) {
|
||||||
PatchedApplication app = PatchedApplication.fromJson(json.decode(str));
|
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) {
|
if (hasUpdates == isUpdatable) {
|
||||||
list.add(app);
|
list.add(app);
|
||||||
}
|
}
|
||||||
@ -64,6 +61,23 @@ class HomeViewModel extends BaseViewModel {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> 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 {
|
void updateManager(BuildContext context) async {
|
||||||
File? managerApk = await _managerAPI.downloadManager();
|
File? managerApk = await _managerAPI.downloadManager();
|
||||||
if (managerApk != null) {
|
if (managerApk != null) {
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:revanced_manager/app/app.locator.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/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/views/home/home_viewmodel.dart';
|
||||||
import 'package:revanced_manager/ui/widgets/application_item.dart';
|
import 'package:revanced_manager/ui/widgets/application_item.dart';
|
||||||
|
|
||||||
@ -11,7 +10,7 @@ class AvailableUpdatesCard extends StatelessWidget {
|
|||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final GithubAPI _githubAPI = GithubAPI();
|
final ManagerAPI _managerAPI = ManagerAPI();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -28,10 +27,8 @@ class AvailableUpdatesCard extends StatelessWidget {
|
|||||||
physics: const NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
itemCount: snapshot.data!.length,
|
itemCount: snapshot.data!.length,
|
||||||
itemBuilder: (context, index) => FutureBuilder<String>(
|
itemBuilder: (context, index) => FutureBuilder<String>(
|
||||||
future: _githubAPI.getChangelog(
|
future: _managerAPI.getAppChangelog(
|
||||||
snapshot.data![index],
|
snapshot.data![index].packageName,
|
||||||
ghOrg,
|
|
||||||
patchesRepo,
|
|
||||||
),
|
),
|
||||||
initialData: '',
|
initialData: '',
|
||||||
builder: (context, snapshot2) => ApplicationItem(
|
builder: (context, snapshot2) => ApplicationItem(
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:revanced_manager/app/app.locator.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/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/views/home/home_viewmodel.dart';
|
||||||
import 'package:revanced_manager/ui/widgets/application_item.dart';
|
import 'package:revanced_manager/ui/widgets/application_item.dart';
|
||||||
|
|
||||||
@ -11,7 +10,7 @@ class InstalledAppsCard extends StatelessWidget {
|
|||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final GithubAPI _githubAPI = GithubAPI();
|
final ManagerAPI _managerAPI = ManagerAPI();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -28,10 +27,8 @@ class InstalledAppsCard extends StatelessWidget {
|
|||||||
physics: const NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
itemCount: snapshot.data!.length,
|
itemCount: snapshot.data!.length,
|
||||||
itemBuilder: (context, index) => FutureBuilder<String>(
|
itemBuilder: (context, index) => FutureBuilder<String>(
|
||||||
future: _githubAPI.getChangelog(
|
future: _managerAPI.getAppChangelog(
|
||||||
snapshot.data![index],
|
snapshot.data![index].packageName,
|
||||||
ghOrg,
|
|
||||||
patchesRepo,
|
|
||||||
),
|
),
|
||||||
initialData: '',
|
initialData: '',
|
||||||
builder: (context, snapshot2) => ApplicationItem(
|
builder: (context, snapshot2) => ApplicationItem(
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_i18n/flutter_i18n.dart';
|
import 'package:flutter_i18n/flutter_i18n.dart';
|
||||||
import 'package:google_fonts/google_fonts.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/services/github_api.dart';
|
||||||
import 'package:revanced_manager/constants.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';
|
import 'package:revanced_manager/ui/widgets/patch_text_button.dart';
|
||||||
|
|
||||||
class LatestCommitCard extends StatefulWidget {
|
class LatestCommitCard extends StatefulWidget {
|
||||||
@ -96,14 +98,23 @@ class _LatestCommitCardState extends State<LatestCommitCard> {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
PatchTextButton(
|
FutureBuilder<bool>(
|
||||||
text: FlutterI18n.translate(
|
future: locator<HomeViewModel>().hasManagerUpdates(),
|
||||||
context,
|
initialData: false,
|
||||||
'latestCommitCard.updateButton',
|
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,
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -32,6 +32,7 @@ dependencies:
|
|||||||
http: ^0.13.4
|
http: ^0.13.4
|
||||||
injectable: ^1.5.3
|
injectable: ^1.5.3
|
||||||
json_annotation: ^4.6.0
|
json_annotation: ^4.6.0
|
||||||
|
package_info_plus: ^1.4.3+1
|
||||||
path_provider: ^2.0.11
|
path_provider: ^2.0.11
|
||||||
root: ^2.0.2
|
root: ^2.0.2
|
||||||
share_extend: ^2.0.0
|
share_extend: ^2.0.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user