Compare commits

...

6 Commits

Author SHA1 Message Date
Imran Remtulla
4c5b9304c0 Merge pull request #409 from ImranR98/dev
Bugfix for prev. commit
2023-03-31 15:40:18 -04:00
Imran Remtulla
4cfe6af044 Bugfix for prev. commit 2023-03-31 15:39:52 -04:00
Imran Remtulla
3f0c4068dd Merge pull request #408 from ImranR98/dev
Bugfix #405 + general categories bugfixes
2023-03-31 15:37:11 -04:00
Imran Remtulla
7981ca29c5 Bugfix #405 + general categories bugfixes 2023-03-31 15:36:51 -04:00
Imran Remtulla
187efa8fc5 Merge pull request #406 from ImranR98/dev
Fixed Mullvad web scraping (again)
2023-03-31 09:25:50 -04:00
Imran Remtulla
cd27ff7f2d Fixed Mullvad web scraping (again) 2023-03-31 09:24:15 -04:00
8 changed files with 75 additions and 26 deletions

View File

@@ -1,7 +1,6 @@
import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/app_sources/html.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart';
@@ -29,24 +28,41 @@ class Mullvad extends AppSource {
String standardUrl,
Map<String, dynamic> additionalSettings,
) async {
var details = await HTML().getLatestAPKDetails(
'$standardUrl/en/download/android', additionalSettings);
var fileName = details.apkUrls[0].split('/').last;
var versionMatch = RegExp('[0-9]+(\\.[0-9]+)+').firstMatch(fileName);
if (versionMatch == null) {
throw NoVersionError();
Response res = await get(Uri.parse('$standardUrl/en/download/android'));
if (res.statusCode == 200) {
var versions = parse(res.body)
.querySelectorAll('p')
.map((e) => e.innerHtml)
.where((p) => p.contains('Latest version: '))
.map((e) {
var match = RegExp('[0-9]+(\\.[0-9]+)*').firstMatch(e);
if (match == null) {
return '';
} else {
return e.substring(match.start, match.end);
}
})
.where((element) => element.isNotEmpty)
.toList();
if (versions.isEmpty) {
throw NoVersionError();
}
String? changeLog;
try {
changeLog = (await GitHub().getLatestAPKDetails(
'https://github.com/mullvad/mullvadvpn-app',
{'fallbackToOlderReleases': true}))
.changeLog;
} catch (e) {
// Ignore
}
return APKDetails(
versions[0],
['https://mullvad.net/download/app/apk/latest'],
AppNames(name, 'Mullvad-VPN'),
changeLog: changeLog);
} else {
throw getObtainiumHttpError(res);
}
details.version = fileName.substring(versionMatch.start, versionMatch.end);
details.names = AppNames(name, 'Mullvad-VPN');
try {
details.changeLog = (await GitHub().getLatestAPKDetails(
'https://github.com/mullvad/mullvadvpn-app',
{'fallbackToOlderReleases': true}))
.changeLog;
} catch (e) {
print(e);
// Ignore
}
return details;
}
}

View File

@@ -21,7 +21,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart';
// ignore: implementation_imports
import 'package:easy_localization/src/localization.dart';
const String currentVersion = '0.11.17';
const String currentVersion = '0.11.19';
const String currentReleaseTag =
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES

View File

@@ -448,7 +448,8 @@ class AppsPageState extends State<AppsPage> {
.app
.categories
.map((e) =>
Color(settingsProvider.categories[e]!).withAlpha(255))
Color(settingsProvider.categories[e] ?? transparent)
.withAlpha(255))
.toList(),
Color(transparent)
])),

View File

@@ -133,7 +133,7 @@ class _ImportExportPageState extends State<ImportExportPage> {
}
}
});
settingsProvider.categories = cats;
appsProvider.addMissingCategories(settingsProvider);
showError(tr('importedX', args: [plural('apps', value)]), context);
});
} else {

View File

@@ -6,6 +6,7 @@ import 'package:obtainium/components/custom_app_bar.dart';
import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/main.dart';
import 'package:obtainium/providers/apps_provider.dart';
import 'package:obtainium/providers/logs_provider.dart';
import 'package:obtainium/providers/settings_provider.dart';
import 'package:obtainium/providers/source_provider.dart';
@@ -444,6 +445,7 @@ class _CategoryEditorSelectorState extends State<CategoryEditorSelector> {
@override
Widget build(BuildContext context) {
var settingsProvider = context.watch<SettingsProvider>();
var appsProvider = context.watch<AppsProvider>();
storedValues = settingsProvider.categories.map((key, value) => MapEntry(
key,
MapEntry(value,
@@ -467,8 +469,9 @@ class _CategoryEditorSelectorState extends State<CategoryEditorSelector> {
if (!isBuilding) {
storedValues =
values['categories'] as Map<String, MapEntry<int, bool>>;
settingsProvider.categories =
storedValues.map((key, value) => MapEntry(key, value.key));
settingsProvider.setCategories(
storedValues.map((key, value) => MapEntry(key, value.key)),
appsProvider: appsProvider);
if (widget.onSelected != null) {
widget.onSelected!(storedValues.keys
.where((k) => storedValues[k]!.value)

View File

@@ -757,6 +757,18 @@ class AppsProvider with ChangeNotifier {
await intent.launch();
}
addMissingCategories(SettingsProvider settingsProvider) {
var cats = settingsProvider.categories;
apps.forEach((key, value) {
for (var c in value.app.categories) {
if (!cats.containsKey(c)) {
cats[c] = generateRandomLightColor().value;
}
}
});
settingsProvider.setCategories(cats, appsProvider: this);
}
Future<App?> checkUpdate(String appId) async {
App? currentApp = apps[appId]!.app;
SourceProvider sourceProvider = SourceProvider();

View File

@@ -7,6 +7,8 @@ import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/main.dart';
import 'package:obtainium/providers/apps_provider.dart';
import 'package:obtainium/providers/source_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:shared_preferences/shared_preferences.dart';
@@ -160,7 +162,22 @@ class SettingsProvider with ChangeNotifier {
Map<String, int> get categories =>
Map<String, int>.from(jsonDecode(prefs?.getString('categories') ?? '{}'));
set categories(Map<String, int> cats) {
void setCategories(Map<String, int> cats, {AppsProvider? appsProvider}) {
if (appsProvider != null) {
List<App> changedApps = appsProvider.apps.values
.map((a) {
var n1 = a.app.categories.length;
a.app.categories.removeWhere((c) => !cats.keys.contains(c));
return n1 > a.app.categories.length ? a.app : null;
})
.where((element) => element != null)
.map((e) => e as App)
.toList();
if (changedApps.isNotEmpty) {
appsProvider.saveApps(changedApps,
attemptToCorrectInstallStatus: false);
}
}
prefs?.setString('categories', jsonEncode(cats));
notifyListeners();
}

View File

@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 0.11.17+139 # When changing this, update the tag in main() accordingly
version: 0.11.19+141 # When changing this, update the tag in main() accordingly
environment:
sdk: '>=2.18.2 <3.0.0'