Skip to content

Commit

Permalink
feat: Use ReVanced API v4
Browse files Browse the repository at this point in the history
  • Loading branch information
oSumAtrIX committed Nov 10, 2024
1 parent 44b8d4c commit 7b7d91d
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 57 deletions.
55 changes: 40 additions & 15 deletions lib/services/manager_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class ManagerAPI {
final String patcherRepo = 'revanced-patcher';
final String cliRepo = 'revanced-cli';
late SharedPreferences _prefs;
Map<String, List>? contributors;
List<Patch> patches = [];
List<Option> options = [];
Patch? selectedPatch;
Expand All @@ -44,7 +45,7 @@ class ManagerAPI {
String keystoreFile =
'/sdcard/Android/data/app.revanced.manager.flutter/files/revanced-manager.keystore';
String defaultKeystorePassword = 's3cur3p@ssw0rd';
String defaultApiUrl = 'https://api.revanced.app/v3';
String defaultApiUrl = 'https://api.revanced.app/v4';
String defaultRepoUrl = 'https://api.github.com';
String defaultPatcherRepo = 'revanced/revanced-patcher';
String defaultPatchesRepo = 'revanced/revanced-patches';
Expand All @@ -66,16 +67,23 @@ class ManagerAPI {
releaseBuild = !(await getCurrentManagerVersion()).contains('-dev');
}

// Migrate to new API URL if not done yet as the old one is sunset.
final bool hasMigratedToLatestApi =
_prefs.getBool('migratedToLatestApiUrl') ?? false;
if (!hasMigratedToLatestApi) {
final String apiUrl = getApiUrl().toLowerCase();
if (apiUrl.contains('releases.revanced.app') ||
(apiUrl.contains('api.revanced.app') &&
!apiUrl.contains('v3'))) {
await setApiUrl(''); // Reset to default.
_prefs.setBool('migratedToLatestApiUrl', true);
final hasMigratedToNewMigrationSystem = _prefs.getBool('migratedToNewApiPrefSystem') ?? false;
if (!hasMigratedToNewMigrationSystem) {
final apiUrl = getApiUrl().toLowerCase();

final isReleases = apiUrl.contains('releases.revanced.app');
final isV2 = apiUrl.contains('api.revanced.app/v2');
final isV3 = apiUrl.contains('api.revanced.app/v3');

if (isReleases || isV2 || isV3) {
await resetApiUrl();
// At this point, the preference is removed.
// Now, no more migration is needed because:
// If the user touches the API URL,
// it will be remembered forever as intended.
// On the other hand, if the user resets it or sets it to the default,
// the URL will be updated whenever the app is updated.
_prefs.setBool('migratedToNewApiPrefSystem', true);
}
}

Expand All @@ -99,12 +107,25 @@ class ManagerAPI {
return _prefs.getString('apiUrl') ?? defaultApiUrl;
}

Future<void> resetApiUrl() async {
await _prefs.remove('apiUrl');
await _revancedAPI.clearAllCache();
_toast.showBottom(t.settingsView.restartAppForChanges);
}

Future<void> setApiUrl(String url) async {
if (url.isEmpty || url == ' ') {
url = defaultApiUrl;
url = url.toLowerCase();

if (url == defaultApiUrl) {
return;
}
await _revancedAPI.clearAllCache();

if (!url.startsWith('http')) {
url = 'https://$url';
}

await _prefs.setString('apiUrl', url);
await _revancedAPI.clearAllCache();
_toast.showBottom(t.settingsView.restartAppForChanges);
}

Expand Down Expand Up @@ -406,7 +427,7 @@ class ManagerAPI {
}

Future<Map<String, List<dynamic>>> getContributors() async {
return await _revancedAPI.getContributors();
return contributors ??= await _revancedAPI.getContributors();
}

Future<List<Patch>> getPatches() async {
Expand Down Expand Up @@ -438,6 +459,10 @@ class ManagerAPI {
}

Future<File?> downloadPatches() async {
if (!isUsingAlternativeSources()) {
return await _revancedAPI.getLatestReleaseFile('patches');
}

try {
final String repoName = getPatchesRepo();
final String currentVersion = await getCurrentPatchesVersion();
Expand Down
4 changes: 2 additions & 2 deletions lib/services/revanced_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class RevancedAPI {
}
return getToolsLock.synchronized(() async {
try {
final response = await _dio.get('/$toolName/latest');
final response = await _dio.get('/$toolName');
return response.data;
} on Exception catch (e) {
if (kDebugMode) {
Expand Down Expand Up @@ -89,7 +89,7 @@ class RevancedAPI {
toolName,
);
if (release != null) {
final String url = release['assets'][0]['download_url'];
final String url = release['download_url'];
return await _downloadManager.getSingleFile(url);
}
} on Exception catch (e) {
Expand Down
26 changes: 7 additions & 19 deletions lib/ui/views/contributors/contributors_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,13 @@ class ContributorsView extends StatelessWidget {
sliver: SliverList(
delegate: SliverChildListDelegate.fixed(
<Widget>[
ContributorsCard(
title: 'ReVanced Patcher',
contributors: model.patcherContributors,
),
const SizedBox(height: 20),
ContributorsCard(
title: 'ReVanced Patches',
contributors: model.patchesContributors,
),
const SizedBox(height: 20),
ContributorsCard(
title: 'ReVanced CLI',
contributors: model.cliContributors,
),
const SizedBox(height: 20),
ContributorsCard(
title: 'ReVanced Manager',
contributors: model.managerContributors,
),
for (final String tool in model.contributors.keys) ...[
ContributorsCard(
title: tool,
contributors: model.contributors[tool]!,
),
const SizedBox(height: 20),
],
SizedBox(height: MediaQuery.viewPaddingOf(context).bottom),
],
),
Expand Down
14 changes: 2 additions & 12 deletions lib/ui/views/contributors/contributors_viewmodel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,10 @@ import 'package:stacked/stacked.dart';

class ContributorsViewModel extends BaseViewModel {
final ManagerAPI _managerAPI = locator<ManagerAPI>();
List<dynamic> patcherContributors = [];
List<dynamic> patchesContributors = [];
List<dynamic> cliContributors = [];
List<dynamic> managerContributors = [];

String repoName(String repo) => repo.split('/').last;
Map<String, List<dynamic>> contributors = {};

Future<void> getContributors() async {
final Map<String, List<dynamic>> contributors =
await _managerAPI.getContributors();
patcherContributors = contributors[repoName(_managerAPI.defaultPatcherRepo)] ?? [];
patchesContributors = contributors[repoName(_managerAPI.defaultPatchesRepo)] ?? [];
cliContributors = contributors[repoName(_managerAPI.defaultCliRepo)] ?? [];
managerContributors = contributors[repoName(_managerAPI.defaultManagerRepo)] ?? [];
contributors = await _managerAPI.getContributors();
notifyListeners();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ class SManageApiUrl extends BaseViewModel {
final TextEditingController _apiUrlController = TextEditingController();

Future<void> showApiUrlDialog(BuildContext context) async {
final String apiUrl = _managerAPI.getApiUrl();
_apiUrlController.text = apiUrl.replaceAll('https://', '');
final apiUrl = _managerAPI.getApiUrl();

_apiUrlController.text = apiUrl;
return showDialog(
context: context,
builder: (context) => AlertDialog(
Expand Down Expand Up @@ -60,11 +61,7 @@ class SManageApiUrl extends BaseViewModel {
),
FilledButton(
onPressed: () {
String apiUrl = _apiUrlController.text;
if (!apiUrl.startsWith('https')) {
apiUrl = 'https://$apiUrl';
}
_managerAPI.setApiUrl(apiUrl);
_managerAPI.setApiUrl(_apiUrlController.text);
Navigator.of(context).pop();
},
child: Text(t.okButton),
Expand All @@ -87,7 +84,7 @@ class SManageApiUrl extends BaseViewModel {
),
FilledButton(
onPressed: () {
_managerAPI.setApiUrl('');
_managerAPI.resetApiUrl();
Navigator.of(context)
..pop()
..pop();
Expand Down
2 changes: 1 addition & 1 deletion lib/ui/widgets/contributorsView/contributors_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class _ContributorsCardState extends State<ContributorsCard> {
child: GestureDetector(
onTap: () => launchUrl(
Uri.parse(
widget.contributors[index]['html_url'],
widget.contributors[index]['url'],
),
mode: LaunchMode.externalApplication,
),
Expand Down

0 comments on commit 7b7d91d

Please sign in to comment.