Compare commits

...

15 Commits

Author SHA1 Message Date
Imran Remtulla
ca1371260c Merge pull request #568 from ImranR98/dev
App ID Filter (#564), Apps Page Bottom Buttons Menu UI Changes
2023-05-14 14:19:37 -04:00
Imran Remtulla
03c2ce9a01 Changes to bottom buttons UI on Apps page 2023-05-14 14:18:31 -04:00
Imran Remtulla
eda5fec37c Added App ID Filter 2023-05-14 13:57:01 -04:00
Imran Remtulla
e21c6297ff Merge pull request #567 from ImranR98/dev
Add Tags-Only Support for GitHub (and Codeberg) Track-Only Apps (#566), Increase Size of Changelog Touch Target (#565), Make All Sources Accessible in Override Menu (#543), Other Bugfixes
2023-05-14 13:49:00 -04:00
Imran Remtulla
c6297ea449 Increment version 2023-05-14 13:45:48 -04:00
Imran Remtulla
e33cc00266 Make all sources override-eligible to account for subdomains 2023-05-14 13:42:09 -04:00
Imran Remtulla
96c92c8df9 Add 'tags-only' support (for Track-Only) to GitHub (and Codeberg) 2023-05-14 13:25:09 -04:00
Imran Remtulla
e256ada2dc Adjust Apps list trailing UI spacing and touch area 2023-05-14 12:53:40 -04:00
Imran Remtulla
eb0be196da Fix 'Please Wait' message on Apps page 2023-05-14 12:40:26 -04:00
Imran Remtulla
1606ad3442 Fix potential date parse error in SoureHut 2023-05-14 12:39:21 -04:00
Imran Remtulla
d212f13345 Fixed code smells 2023-05-14 12:29:37 -04:00
Imran Remtulla
f80c9ec33e Merge pull request #563 from ImranR98/dev
Flutter version - related change
2023-05-13 02:36:09 -04:00
Imran Remtulla
7681e23de9 Flutter version - related change 2023-05-13 02:35:44 -04:00
Imran Remtulla
22a60df40e Merge pull request #562 from ImranR98/dev
Fixed breaking bug for some sources (#561)
2023-05-13 02:32:23 -04:00
Imran Remtulla
431a01f2a5 Fixed breaking bug for some sources (#561) 2023-05-13 02:32:06 -04:00
31 changed files with 246 additions and 222 deletions

View File

@@ -26,6 +26,6 @@ subprojects {
project.evaluationDependsOn(':app') project.evaluationDependsOn(':app')
} }
task clean(type: Delete) { tasks.register("clean", Delete) {
delete rootProject.buildDir delete rootProject.buildDir
} }

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "Ja, als aktualisiert markieren", "yesMarkUpdated": "Ja, als aktualisiert markieren",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "App ID oder Name", "appIdOrName": "App ID oder Name",
"appId": "App ID",
"appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden", "appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden",
"reposHaveMultipleApps": "Repos können mehrere Apps enthalten", "reposHaveMultipleApps": "Repos können mehrere Apps enthalten",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "Yes, Mark as Updated", "yesMarkUpdated": "Yes, Mark as Updated",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "App ID or Name", "appIdOrName": "App ID or Name",
"appId": "App ID",
"appWithIdOrNameNotFound": "No App was found with that ID or Name", "appWithIdOrNameNotFound": "No App was found with that ID or Name",
"reposHaveMultipleApps": "Repos may contain multiple Apps", "reposHaveMultipleApps": "Repos may contain multiple Apps",
"fdroidThirdPartyRepo": "F-Droid Third-Party Repo", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "Sí, Marcar como Actualizada", "yesMarkUpdated": "Sí, Marcar como Actualizada",
"fdroid": "Repositorio oficial de F-Droid", "fdroid": "Repositorio oficial de F-Droid",
"appIdOrName": "ID o Nombre de la Aplicación", "appIdOrName": "ID o Nombre de la Aplicación",
"appId": "ID de la Aplicación",
"appWithIdOrNameNotFound": "No se han encontrado aplicaciones con esa ID o nombre", "appWithIdOrNameNotFound": "No se han encontrado aplicaciones con esa ID o nombre",
"reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones", "reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones",
"fdroidThirdPartyRepo": "Rpositorios de terceros de F-Droid", "fdroidThirdPartyRepo": "Rpositorios de terceros de F-Droid",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "بله، علامت گذاری به عنوان به روز شده", "yesMarkUpdated": "بله، علامت گذاری به عنوان به روز شده",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "شناسه یا نام برنامه", "appIdOrName": "شناسه یا نام برنامه",
"appId": "App ID",
"appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد", "appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد",
"reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد", "reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد",
"fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid", "fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "Oui, marquer comme mis à jour", "yesMarkUpdated": "Oui, marquer comme mis à jour",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "ID ou nom de l'application", "appIdOrName": "ID ou nom de l'application",
"appId": "ID de l'application",
"appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom", "appWithIdOrNameNotFound": "Aucune application n'a été trouvée avec cet identifiant ou ce nom",
"reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications", "reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications",
"fdroidThirdPartyRepo": "Dépôt tiers F-Droid", "fdroidThirdPartyRepo": "Dépôt tiers F-Droid",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "Igen, megjelölés frissítettként", "yesMarkUpdated": "Igen, megjelölés frissítettként",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "App ID vagy név", "appIdOrName": "App ID vagy név",
"appId": "App ID",
"appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", "appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel",
"reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", "reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak",
"fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", "fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "Sì, contrassegna come aggiornato", "yesMarkUpdated": "Sì, contrassegna come aggiornato",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "ID o nome dell'App", "appIdOrName": "ID o nome dell'App",
"appId": "ID dell'App",
"appWithIdOrNameNotFound": "Non è stata trovata alcuna App con quell'ID o nome", "appWithIdOrNameNotFound": "Non è stata trovata alcuna App con quell'ID o nome",
"reposHaveMultipleApps": "I repository possono contenere più App", "reposHaveMultipleApps": "I repository possono contenere più App",
"fdroidThirdPartyRepo": "Repository F-Droid di terze parti", "fdroidThirdPartyRepo": "Repository F-Droid di terze parti",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "はい、アップデート済みとしてマークします", "yesMarkUpdated": "はい、アップデート済みとしてマークします",
"fdroid": "F-Droid Official", "fdroid": "F-Droid Official",
"appIdOrName": "アプリのIDまたは名前", "appIdOrName": "アプリのIDまたは名前",
"appId": "App ID",
"appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした", "appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした",
"reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります", "reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります",
"fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ", "fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ",

View File

@@ -180,6 +180,7 @@
"yesMarkUpdated": "是,标记为已更新", "yesMarkUpdated": "是,标记为已更新",
"fdroid": "F-Droid 官方存储库", "fdroid": "F-Droid 官方存储库",
"appIdOrName": "应用 ID 或名称", "appIdOrName": "应用 ID 或名称",
"appId": "App ID",
"appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用", "appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用",
"reposHaveMultipleApps": "存储库中可能包含多个应用", "reposHaveMultipleApps": "存储库中可能包含多个应用",
"fdroidThirdPartyRepo": "F-Droid 第三方存储库", "fdroidThirdPartyRepo": "F-Droid 第三方存储库",

View File

@@ -1,6 +1,5 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@@ -85,7 +84,6 @@ class APKCombo extends AppSource {
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
String appId = tryInferringAppId(standardUrl)!; String appId = tryInferringAppId(standardUrl)!;
String host = Uri.parse(standardUrl).host;
var preres = await sourceRequest(standardUrl); var preres = await sourceRequest(standardUrl);
if (preres.statusCode != 200) { if (preres.statusCode != 200) {
throw getObtainiumHttpError(preres); throw getObtainiumHttpError(preres);

View File

@@ -1,6 +1,5 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';

View File

@@ -1,6 +1,4 @@
import 'dart:convert';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:http/http.dart';
import 'package:obtainium/app_sources/github.dart'; import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
@@ -9,7 +7,6 @@ import 'package:obtainium/providers/source_provider.dart';
class Codeberg extends AppSource { class Codeberg extends AppSource {
Codeberg() { Codeberg() {
host = 'codeberg.org'; host = 'codeberg.org';
overrideEligible = true;
additionalSourceSpecificSettingFormItems = []; additionalSourceSpecificSettingFormItems = [];
@@ -58,10 +55,10 @@ class Codeberg extends AppSource {
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
return gh.getLatestAPKDetailsCommon( return await gh.getLatestAPKDetailsCommon2(standardUrl, additionalSettings,
'https://$host/api/v1/repos${standardUrl.substring('https://$host'.length)}/releases?per_page=100', (bool useTagUrl) async {
standardUrl, return 'https://$host/api/v1/repos${standardUrl.substring('https://$host'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100';
additionalSettings); }, null);
} }
AppNames getAppNames(String standardUrl) { AppNames getAppNames(String standardUrl) {

View File

@@ -1,6 +1,5 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart';
import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@@ -8,7 +7,6 @@ import 'package:obtainium/providers/source_provider.dart';
class FDroidRepo extends AppSource { class FDroidRepo extends AppSource {
FDroidRepo() { FDroidRepo() {
name = tr('fdroidThirdPartyRepo'); name = tr('fdroidThirdPartyRepo');
overrideEligible = true;
additionalSourceAppSpecificSettingFormItems = [ additionalSourceAppSpecificSettingFormItems = [
[ [

View File

@@ -13,7 +13,6 @@ import 'package:url_launcher/url_launcher_string.dart';
class GitHub extends AppSource { class GitHub extends AppSource {
GitHub() { GitHub() {
host = 'github.com'; host = 'github.com';
overrideEligible = true;
additionalSourceSpecificSettingFormItems = [ additionalSourceSpecificSettingFormItems = [
GeneratedFormTextField('github-creds', GeneratedFormTextField('github-creds',
@@ -143,15 +142,17 @@ class GitHub extends AppSource {
} else if (b == null) { } else if (b == null) {
return 1; return 1;
} else { } else {
var stdFormats = findStandardFormatsForVersion(a['tag_name'], true) var nameA = a['tag_name'] ?? a['name'];
.intersection(findStandardFormatsForVersion(b['tag_name'], true)); var nameB = b['tag_name'] ?? b['name'];
var stdFormats = findStandardFormatsForVersion(nameA, true)
.intersection(findStandardFormatsForVersion(nameB, true));
if (stdFormats.isNotEmpty) { if (stdFormats.isNotEmpty) {
var reg = RegExp(stdFormats.first); var reg = RegExp(stdFormats.first);
var matchA = reg.firstMatch(a['tag_name']); var matchA = reg.firstMatch(nameA);
var matchB = reg.firstMatch(b['tag_name']); var matchB = reg.firstMatch(nameB);
return compareAlphaNumeric( return compareAlphaNumeric(
(a['tag_name'] as String).substring(matchA!.start, matchA.end), (nameA as String).substring(matchA!.start, matchA.end),
(b['tag_name'] as String).substring(matchB!.start, matchB.end)); (nameB as String).substring(matchB!.start, matchB.end));
} else { } else {
return getReleaseDateFromRelease(a)! return getReleaseDateFromRelease(a)!
.compareTo(getReleaseDateFromRelease(b)!); .compareTo(getReleaseDateFromRelease(b)!);
@@ -191,7 +192,7 @@ class GitHub extends AppSource {
if (targetRelease == null) { if (targetRelease == null) {
throw NoReleasesError(); throw NoReleasesError();
} }
String? version = targetRelease['tag_name']; String? version = targetRelease['tag_name'] ?? targetRelease['name'];
DateTime? releaseDate = getReleaseDateFromRelease(targetRelease); DateTime? releaseDate = getReleaseDateFromRelease(targetRelease);
if (version == null) { if (version == null) {
throw NoVersionError(); throw NoVersionError();
@@ -211,15 +212,35 @@ class GitHub extends AppSource {
} }
} }
getLatestAPKDetailsCommon2(
String standardUrl,
Map<String, dynamic> additionalSettings,
Future<String> Function(bool) reqUrlGenerator,
dynamic Function(Response)? onHttpErrorCode) async {
try {
return await getLatestAPKDetailsCommon(
await reqUrlGenerator(false), standardUrl, additionalSettings,
onHttpErrorCode: onHttpErrorCode);
} catch (err) {
if (err is NoReleasesError && additionalSettings['trackOnly'] == true) {
return await getLatestAPKDetailsCommon(
await reqUrlGenerator(true), standardUrl, additionalSettings,
onHttpErrorCode: onHttpErrorCode);
} else {
rethrow;
}
}
}
@override @override
Future<APKDetails> getLatestAPKDetails( Future<APKDetails> getLatestAPKDetails(
String standardUrl, String standardUrl,
Map<String, dynamic> additionalSettings, Map<String, dynamic> additionalSettings,
) async { ) async {
return getLatestAPKDetailsCommon( return await getLatestAPKDetailsCommon2(standardUrl, additionalSettings,
'https://${await getCredentialPrefixIfAny()}api.$host/repos${standardUrl.substring('https://$host'.length)}/releases?per_page=100', (bool useTagUrl) async {
standardUrl, return 'https://${await getCredentialPrefixIfAny()}api.$host/repos${standardUrl.substring('https://$host'.length)}/${useTagUrl ? 'tags' : 'releases'}?per_page=100';
additionalSettings, onHttpErrorCode: (Response res) { }, (Response res) {
rateLimitErrorCheck(res); rateLimitErrorCheck(res);
}); });
} }

View File

@@ -14,7 +14,6 @@ import 'package:url_launcher/url_launcher_string.dart';
class GitLab extends AppSource { class GitLab extends AppSource {
GitLab() { GitLab() {
host = 'gitlab.com'; host = 'gitlab.com';
overrideEligible = true;
canSearch = true; canSearch = true;
additionalSourceSpecificSettingFormItems = [ additionalSourceSpecificSettingFormItems = [
@@ -83,12 +82,12 @@ class GitLab extends AppSource {
} }
var json = jsonDecode(res.body) as List<dynamic>; var json = jsonDecode(res.body) as List<dynamic>;
Map<String, List<String>> results = {}; Map<String, List<String>> results = {};
json.forEach((element) { for (var element in json) {
results['https://$host/${element['path_with_namespace']}'] = [ results['https://$host/${element['path_with_namespace']}'] = [
element['name_with_namespace'], element['name_with_namespace'],
element['description'] ?? tr('noDescription') element['description'] ?? tr('noDescription')
]; ];
}); }
return results; return results;
} }

View File

@@ -85,10 +85,6 @@ bool _isNumeric(String s) {
} }
class HTML extends AppSource { class HTML extends AppSource {
HTML() {
overrideEligible = true;
}
@override @override
// TODO: implement requestHeaders choice, hardcoded for now // TODO: implement requestHeaders choice, hardcoded for now
Map<String, String>? get requestHeaders => { Map<String, String>? get requestHeaders => {

View File

@@ -1,4 +1,3 @@
import 'package:http/http.dart';
import 'package:obtainium/app_sources/fdroid.dart'; import 'package:obtainium/app_sources/fdroid.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';

View File

@@ -6,11 +6,9 @@ import 'package:obtainium/providers/source_provider.dart';
class Jenkins extends AppSource { class Jenkins extends AppSource {
Jenkins() { Jenkins() {
overrideEligible = true;
overrideVersionDetectionFormDefault('releaseDateAsVersion', true); overrideVersionDetectionFormDefault('releaseDateAsVersion', true);
} }
@override
String trimJobUrl(String url) { String trimJobUrl(String url) {
RegExp standardUrlRegEx = RegExp('.*/job/[^/]+'); RegExp standardUrlRegEx = RegExp('.*/job/[^/]+');
RegExpMatch? match = standardUrlRegEx.firstMatch(url); RegExpMatch? match = standardUrlRegEx.firstMatch(url);

View File

@@ -6,7 +6,6 @@ import 'package:obtainium/providers/source_provider.dart';
class SourceForge extends AppSource { class SourceForge extends AppSource {
SourceForge() { SourceForge() {
host = 'sourceforge.net'; host = 'sourceforge.net';
overrideEligible = true;
} }
@override @override

View File

@@ -1,6 +1,5 @@
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/app_sources/github.dart';
import 'package:obtainium/app_sources/html.dart'; import 'package:obtainium/app_sources/html.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';
@@ -10,7 +9,6 @@ import 'package:easy_localization/easy_localization.dart';
class SourceHut extends AppSource { class SourceHut extends AppSource {
SourceHut() { SourceHut() {
host = 'git.sr.ht'; host = 'git.sr.ht';
overrideEligible = true;
additionalSourceAppSpecificSettingFormItems = [ additionalSourceAppSpecificSettingFormItems = [
[ [
@@ -58,11 +56,19 @@ class SourceHut extends AppSource {
throw NoVersionError(); throw NoVersionError();
} }
String? releaseDateString = entry.querySelector('pubDate')?.innerHtml; String? releaseDateString = entry.querySelector('pubDate')?.innerHtml;
var link = entry.querySelector('link');
String releasePage = '$standardUrl/refs/$version'; String releasePage = '$standardUrl/refs/$version';
DateTime? releaseDate = releaseDateString != null DateTime? releaseDate;
? DateFormat('EEE, dd MMM yyyy HH:mm:ss Z').parse(releaseDateString) try {
: null; releaseDate = releaseDateString != null
? DateFormat('E, dd MMM yyyy HH:mm:ss Z').parse(releaseDateString)
: null;
releaseDate = releaseDateString != null
? DateFormat('EEE, dd MMM yyyy HH:mm:ss Z')
.parse(releaseDateString)
: null;
} catch (e) {
// ignore
}
var res2 = await sourceRequest(releasePage); var res2 = await sourceRequest(releasePage);
List<MapEntry<String, String>> apkUrls = []; List<MapEntry<String, String>> apkUrls = [];
if (res2.statusCode == 200) { if (res2.statusCode == 200) {

View File

@@ -1,6 +1,5 @@
import 'package:html/parser.dart'; import 'package:html/parser.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/app_sources/html.dart';
import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/providers/source_provider.dart'; import 'package:obtainium/providers/source_provider.dart';

View File

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

View File

@@ -321,10 +321,8 @@ class _AddAppPageState extends State<AddAppPage> {
'overrideSource', 'overrideSource',
defaultValue: HTML().runtimeType.toString(), defaultValue: HTML().runtimeType.toString(),
[ [
...sourceProvider.sources ...sourceProvider.sources.map(
.where((s) => s.overrideEligible) (s) => MapEntry(s.runtimeType.toString(), s.name))
.map((s) =>
MapEntry(s.runtimeType.toString(), s.name))
], ],
label: tr('overrideSource')) label: tr('overrideSource'))
] ]

View File

@@ -32,6 +32,7 @@ class _AppPageState extends State<AppPage> {
getUpdate(String id) { getUpdate(String id) {
appsProvider.checkUpdate(id).catchError((e) { appsProvider.checkUpdate(id).catchError((e) {
showError(e, context); showError(e, context);
return null;
}); });
} }

View File

@@ -61,8 +61,6 @@ class AppsPageState extends State<AppsPage> {
var settingsProvider = context.watch<SettingsProvider>(); var settingsProvider = context.watch<SettingsProvider>();
var sourceProvider = SourceProvider(); var sourceProvider = SourceProvider();
var listedApps = appsProvider.getAppValues().toList(); var listedApps = appsProvider.getAppValues().toList();
var currentFilterIsUpdatesOnly =
filter.isIdenticalTo(updatesOnlyFilter, settingsProvider);
refresh() { refresh() {
HapticFeedback.lightImpact(); HapticFeedback.lightImpact();
@@ -71,6 +69,7 @@ class AppsPageState extends State<AppsPage> {
}); });
return appsProvider.checkUpdates().catchError((e) { return appsProvider.checkUpdates().catchError((e) {
showError(e, context); showError(e, context);
return <App>[];
}).whenComplete(() { }).whenComplete(() {
setState(() { setState(() {
refreshingSince = null; refreshingSince = null;
@@ -128,6 +127,11 @@ class AppsPageState extends State<AppsPage> {
} }
} }
} }
if (filter.idFilter.isNotEmpty) {
if (!app.app.id.contains(filter.idFilter)) {
return false;
}
}
if (filter.categoryFilter.isNotEmpty && if (filter.categoryFilter.isNotEmpty &&
filter.categoryFilter filter.categoryFilter
.intersection(app.app.categories.toSet()) .intersection(app.app.categories.toSet())
@@ -379,6 +383,7 @@ class AppsPageState extends State<AppsPage> {
[listedApps[appIndex].app.id], [listedApps[appIndex].app.id],
globalNavigatorKey.currentContext).catchError((e) { globalNavigatorKey.currentContext).catchError((e) {
showError(e, context); showError(e, context);
return <String>[];
}); });
}, },
icon: Icon( icon: Icon(
@@ -441,37 +446,35 @@ class AppsPageState extends State<AppsPage> {
width: 10, width: 10,
) )
: const SizedBox.shrink(), : const SizedBox.shrink(),
Column( GestureDetector(
mainAxisAlignment: MainAxisAlignment.center, onTap: showChangesFn,
crossAxisAlignment: CrossAxisAlignment.end, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.center,
Row(mainAxisSize: MainAxisSize.min, children: [ crossAxisAlignment: CrossAxisAlignment.end,
Container(
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width / 4),
child: Text(
getVersionText(index),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.end,
)),
]),
Row(
mainAxisSize: MainAxisSize.min,
children: [ children: [
GestureDetector( Row(mainAxisSize: MainAxisSize.min, children: [
onTap: showChangesFn, Container(
child: Text( constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width / 4),
child: Text(getVersionText(index),
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.end)),
]),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
getChangesButtonString(index, showChangesFn != null), getChangesButtonString(index, showChangesFn != null),
style: TextStyle( style: TextStyle(
fontStyle: FontStyle.italic, fontStyle: FontStyle.italic,
decoration: showChangesFn != null decoration: showChangesFn != null
? TextDecoration.underline ? TextDecoration.underline
: TextDecoration.none), : TextDecoration.none),
)) )
],
),
], ],
), ))
],
)
], ],
); );
@@ -540,15 +543,20 @@ class AppsPageState extends State<AppsPage> {
: FontWeight.normal)), : FontWeight.normal)),
trailing: listedApps[index].downloadProgress != null trailing: listedApps[index].downloadProgress != null
? SizedBox( ? SizedBox(
width: 110, width: 90,
child: Text(tr('percentProgress', args: [ child: Text(
listedApps[index].downloadProgress! >= 0 listedApps[index].downloadProgress! >= 0
? listedApps[index] ? tr('percentProgress', args: [
.downloadProgress! listedApps[index]
.toInt() .downloadProgress!
.toString() .toInt()
: tr('pleaseWait') .toString()
]))) ])
: tr('pleaseWait'),
textAlign: (listedApps[index].downloadProgress! >= 0)
? TextAlign.start
: TextAlign.end,
))
: trailingRow, : trailingRow,
onTap: () { onTap: () {
if (selectedAppIds.isNotEmpty) { if (selectedAppIds.isNotEmpty) {
@@ -681,6 +689,7 @@ class AppsPageState extends State<AppsPage> {
settingsProvider: settingsProvider) settingsProvider: settingsProvider)
.catchError((e) { .catchError((e) {
showError(e, context); showError(e, context);
return <String>[];
}); });
} }
}); });
@@ -876,44 +885,41 @@ class AppsPageState extends State<AppsPage> {
}); });
} }
getMainBottomButtonsRow() { getMainBottomButtons() {
return Row( return [
mainAxisAlignment: MainAxisAlignment.spaceEvenly, IconButton(
children: [
IconButton(
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
onPressed: selectedAppIds.isEmpty onPressed: getMassObtainFunction(),
? null tooltip: selectedAppIds.isEmpty
: () { ? tr('installUpdateApps')
appsProvider.removeAppsWithModal( : tr('installUpdateSelectedApps'),
context, selectedApps.toList()); icon: const Icon(
}, Icons.file_download_outlined,
tooltip: tr('removeSelectedApps'), )),
icon: const Icon(Icons.delete_outline_outlined), IconButton(
), visualDensity: VisualDensity.compact,
IconButton( onPressed: selectedAppIds.isEmpty
visualDensity: VisualDensity.compact, ? null
onPressed: getMassObtainFunction(), : () {
tooltip: selectedAppIds.isEmpty appsProvider.removeAppsWithModal(
? tr('installUpdateApps') context, selectedApps.toList());
: tr('installUpdateSelectedApps'), },
icon: const Icon( tooltip: tr('removeSelectedApps'),
Icons.file_download_outlined, icon: const Icon(Icons.delete_outline_outlined),
)), ),
IconButton( IconButton(
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
onPressed: selectedAppIds.isEmpty ? null : launchCategorizeDialog(), onPressed: selectedAppIds.isEmpty ? null : launchCategorizeDialog(),
tooltip: tr('categorize'), tooltip: tr('categorize'),
icon: const Icon(Icons.category_outlined), icon: const Icon(Icons.category_outlined),
), ),
IconButton( IconButton(
visualDensity: VisualDensity.compact, visualDensity: VisualDensity.compact,
onPressed: selectedAppIds.isEmpty ? null : showMoreOptionsDialog, onPressed: selectedAppIds.isEmpty ? null : showMoreOptionsDialog,
tooltip: tr('more'), tooltip: tr('more'),
icon: const Icon(Icons.more_horiz), icon: const Icon(Icons.more_horiz),
), ),
], ];
);
} }
showFilterDialog() async { showFilterDialog() async {
@@ -935,6 +941,12 @@ class AppsPageState extends State<AppsPage> {
required: false, required: false,
defaultValue: vals['author']) defaultValue: vals['author'])
], ],
[
GeneratedFormTextField('appId',
label: tr('appId'),
required: false,
defaultValue: vals['appId'])
],
[ [
GeneratedFormSwitch('upToDateApps', GeneratedFormSwitch('upToDateApps',
label: tr('upToDateApps'), label: tr('upToDateApps'),
@@ -980,50 +992,33 @@ class AppsPageState extends State<AppsPage> {
} }
getFilterButtonsRow() { getFilterButtonsRow() {
var isFilterOff = filter.isIdenticalTo(neutralFilter, settingsProvider);
return Row( return Row(
children: [ children: [
getSelectAllButton(), getSelectAllButton(),
IconButton(
color: Theme.of(context).colorScheme.primary,
style: const ButtonStyle(visualDensity: VisualDensity.compact),
tooltip: isFilterOff ? tr('filter') : tr('filterActive'),
onPressed: isFilterOff
? showFilterDialog
: () {
setState(() {
filter = AppsFilter();
});
},
icon: Icon(isFilterOff
? Icons.filter_list_rounded
: Icons.filter_list_off_rounded)),
const SizedBox(
width: 10,
),
const VerticalDivider(), const VerticalDivider(),
Expanded( Expanded(
child: SingleChildScrollView( child: Row(
scrollDirection: Axis.horizontal, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
child: getMainBottomButtonsRow())), children: getMainBottomButtons(),
const VerticalDivider(), )),
IconButton(
visualDensity: VisualDensity.compact,
onPressed: () {
setState(() {
if (currentFilterIsUpdatesOnly) {
filter = AppsFilter();
} else {
filter = updatesOnlyFilter;
}
});
},
tooltip: currentFilterIsUpdatesOnly
? tr('removeOutdatedFilter')
: tr('showOutdatedOnly'),
icon: Icon(
currentFilterIsUpdatesOnly
? Icons.update_disabled_rounded
: Icons.update_rounded,
color: Theme.of(context).colorScheme.primary,
),
),
TextButton.icon(
style: const ButtonStyle(visualDensity: VisualDensity.compact),
label: Text(
filter.isIdenticalTo(neutralFilter, settingsProvider)
? tr('filter')
: tr('filterActive'),
style: TextStyle(
fontWeight:
filter.isIdenticalTo(neutralFilter, settingsProvider)
? FontWeight.normal
: FontWeight.bold),
),
onPressed: showFilterDialog,
icon: const Icon(Icons.filter_list_rounded))
], ],
); );
} }
@@ -1066,6 +1061,7 @@ class AppsPageState extends State<AppsPage> {
class AppsFilter { class AppsFilter {
late String nameFilter; late String nameFilter;
late String authorFilter; late String authorFilter;
late String idFilter;
late bool includeUptodate; late bool includeUptodate;
late bool includeNonInstalled; late bool includeNonInstalled;
late Set<String> categoryFilter; late Set<String> categoryFilter;
@@ -1074,6 +1070,7 @@ class AppsFilter {
AppsFilter( AppsFilter(
{this.nameFilter = '', {this.nameFilter = '',
this.authorFilter = '', this.authorFilter = '',
this.idFilter = '',
this.includeUptodate = true, this.includeUptodate = true,
this.includeNonInstalled = true, this.includeNonInstalled = true,
this.categoryFilter = const {}, this.categoryFilter = const {},
@@ -1083,6 +1080,7 @@ class AppsFilter {
return { return {
'appName': nameFilter, 'appName': nameFilter,
'author': authorFilter, 'author': authorFilter,
'appId': idFilter,
'upToDateApps': includeUptodate, 'upToDateApps': includeUptodate,
'nonInstalledApps': includeNonInstalled, 'nonInstalledApps': includeNonInstalled,
'sourceFilter': sourceFilter 'sourceFilter': sourceFilter
@@ -1092,6 +1090,7 @@ class AppsFilter {
setFormValuesFromMap(Map<String, dynamic> values) { setFormValuesFromMap(Map<String, dynamic> values) {
nameFilter = values['appName']!; nameFilter = values['appName']!;
authorFilter = values['author']!; authorFilter = values['author']!;
idFilter = values['appId']!;
includeUptodate = values['upToDateApps']; includeUptodate = values['upToDateApps'];
includeNonInstalled = values['nonInstalledApps']; includeNonInstalled = values['nonInstalledApps'];
sourceFilter = values['sourceFilter']; sourceFilter = values['sourceFilter'];
@@ -1100,6 +1099,7 @@ class AppsFilter {
bool isIdenticalTo(AppsFilter other, SettingsProvider settingsProvider) => bool isIdenticalTo(AppsFilter other, SettingsProvider settingsProvider) =>
authorFilter.trim() == other.authorFilter.trim() && authorFilter.trim() == other.authorFilter.trim() &&
nameFilter.trim() == other.nameFilter.trim() && nameFilter.trim() == other.nameFilter.trim() &&
idFilter.trim() == other.idFilter.trim() &&
includeUptodate == other.includeUptodate && includeUptodate == other.includeUptodate &&
includeNonInstalled == other.includeNonInstalled && includeNonInstalled == other.includeNonInstalled &&
settingsProvider.setEqual(categoryFilter, other.categoryFilter) && settingsProvider.setEqual(categoryFilter, other.categoryFilter) &&

View File

@@ -323,8 +323,8 @@ class _ImportExportPageState extends State<ImportExportPage> {
], ],
), ),
if (importInProgress) if (importInProgress)
Column( const Column(
children: const [ children: [
SizedBox( SizedBox(
height: 14, height: 14,
), ),

View File

@@ -145,7 +145,8 @@ class AppsProvider with ChangeNotifier {
} }
var client = Client(); var client = Client();
StreamedResponse response = await client.send(req); StreamedResponse response = await client.send(req);
var ext = response.headers['content-disposition']!.split('.').last; String ext =
response.headers['content-disposition']?.split('.').last ?? 'apk';
if (ext.endsWith('"') || ext.endsWith("other")) { if (ext.endsWith('"') || ext.endsWith("other")) {
ext = ext.substring(0, ext.length - 1); ext = ext.substring(0, ext.length - 1);
} }

View File

@@ -7,7 +7,6 @@ import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:html/dom.dart'; import 'package:html/dom.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:obtainium/app_sources/apkcombo.dart';
import 'package:obtainium/app_sources/apkmirror.dart'; import 'package:obtainium/app_sources/apkmirror.dart';
import 'package:obtainium/app_sources/apkpure.dart'; import 'package:obtainium/app_sources/apkpure.dart';
import 'package:obtainium/app_sources/codeberg.dart'; import 'package:obtainium/app_sources/codeberg.dart';
@@ -318,7 +317,6 @@ abstract class AppSource {
late String name; late String name;
bool enforceTrackOnly = false; bool enforceTrackOnly = false;
bool changeLogIfAnyIsMarkDown = true; bool changeLogIfAnyIsMarkDown = true;
bool overrideEligible = false;
AppSource() { AppSource() {
name = runtimeType.toString(); name = runtimeType.toString();

View File

@@ -5,18 +5,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: android_alarm_manager_plus name: android_alarm_manager_plus
sha256: "88a8001851fdc9bd54fa4e30d0277bb900a50f3d86ff244da7f027400bf23ac0" sha256: ed5fb34f8befc382fb4800b02aa86a34d279b911e1c05752f702d12fcfe26e0e
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "3.0.0"
android_intent_plus: android_intent_plus:
dependency: "direct main" dependency: "direct main"
description: description:
name: android_intent_plus name: android_intent_plus
sha256: "04cbc7c332a6f0bba88fed354de78813e9d24049c1800aaf10f449c7adc22603" sha256: f79fbb8ccb64b5584d19caa9c3d15613bf21cfbd829a6ca7f089fb5dfd43f8aa
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.9" version: "4.0.0"
android_package_installer: android_package_installer:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -54,10 +54,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.10.0" version: "2.11.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@@ -70,10 +70,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1" version: "1.3.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@@ -86,10 +86,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0" version: "1.17.1"
convert: convert:
dependency: transitive dependency: transitive
description: description:
@@ -142,10 +142,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: device_info_plus name: device_info_plus
sha256: f52ab3b76b36ede4d135aab80194df8925b553686f0fa12226b4e2d658e45903 sha256: "9b1a0c32b2a503f8fe9f8764fac7b5fcd4f6bd35d8f49de5350bccf9e2a33b8a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.2.2" version: "9.0.0"
device_info_plus_platform_interface: device_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -166,10 +166,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: easy_localization name: easy_localization
sha256: "6a2e99fa0bfe5765bf4c6ca9b137d5de2c75593007178c5e4cd2ae985f870080" sha256: f30e9b20ed4d1b890171c30241d9b9c43efe21fee55dee7bd68f94daf269ea75
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.2-dev.2"
easy_logger: easy_logger:
dependency: transitive dependency: transitive
description: description:
@@ -190,10 +190,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.0.2"
file: file:
dependency: transitive dependency: transitive
description: description:
@@ -206,10 +206,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: b85eb92b175767fdaa0c543bf3b0d1f610fe966412ea72845fe5ba7801e763ff sha256: c7a8e25ca60e7f331b153b0cb3d405828f18d3e72a6fa1d9440c86556fffc877
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.2.10" version: "5.3.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -235,26 +235,26 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_local_notifications name: flutter_local_notifications
sha256: "2876372952b65ca7f684e698eba22bda1cf581fa071dd30ba2f01900f507d0d1" sha256: ee6ee56855aa920899b68586b538474d086c149932220b47b92502cbfb5ba5e5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "14.0.0+1" version: "14.0.0+2"
flutter_local_notifications_linux: flutter_local_notifications_linux:
dependency: transitive dependency: transitive
description: description:
name: flutter_local_notifications_linux name: flutter_local_notifications_linux
sha256: "909bb95de05a2e793503a2437146285a2f600cd0b3f826e26b870a334d8586d7" sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0+1"
flutter_local_notifications_platform_interface: flutter_local_notifications_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: flutter_local_notifications_platform_interface name: flutter_local_notifications_platform_interface
sha256: "63235c42de5b6c99846969a27ad0209c401e6b77b0498939813725b5791c107c" sha256: "7cf643d6d5022f3baed0be777b0662cce5919c0a7b86e700299f22dc4ae660ef"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.0.0" version: "7.0.0+1"
flutter_localizations: flutter_localizations:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -330,26 +330,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: intl name: intl
sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.17.0" version: "0.18.0"
js: js:
dependency: transitive dependency: transitive
description: description:
name: js name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.5" version: "0.6.7"
lints: lints:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" sha256: "6b0206b0bf4f04961fc5438198ccb3a885685cd67d4d4a32cc20ad7f8adbe015"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.1.0"
markdown: markdown:
dependency: transitive dependency: transitive
description: description:
@@ -362,10 +362,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.13" version: "0.12.15"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
@@ -378,10 +378,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.0" version: "1.9.1"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@@ -418,10 +418,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.2" version: "1.8.3"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -514,10 +514,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: petitparser name: petitparser
sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.0" version: "5.4.0"
platform: platform:
dependency: transitive dependency: transitive
description: description:
@@ -562,10 +562,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: share_plus name: share_plus
sha256: b1f15232d41e9701ab2f04181f21610c36c83a12ae426b79b4bd011c567934b1 sha256: "322a1ec9d9fe07e2e2252c098ce93d12dbd06133cc4c00ffe6a4ef505c295c17"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.4" version: "7.0.0"
share_plus_platform_interface: share_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -703,10 +703,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.16" version: "0.5.1"
timezone: timezone:
dependency: transitive dependency: transitive
description: description:
@@ -719,26 +719,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.2"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
name: url_launcher name: url_launcher
sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.10" version: "6.1.11"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_android name: url_launcher_android
sha256: "22f8db4a72be26e9e3a4aa3f194b1f7afbc76d20ec141f84be1d787db2155cbd" sha256: "7aac14be5f4731b923cc697ae2d42043945076cd0dbb8806baecc92c1dc88891"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.31" version: "6.0.33"
url_launcher_ios: url_launcher_ios:
dependency: transitive dependency: transitive
description: description:
@@ -831,18 +831,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: webview_flutter_wkwebview name: webview_flutter_wkwebview
sha256: "61f33512810bf1ee9ac89761a4b02663ff64e8227b7dc80654642acd660fd49d" sha256: "4646bb68297803bdbb96d46853e8fcb560d6cb5e04153fa64581535767875dfe"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.4.2" version: "3.4.3"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.4" version: "4.1.4"
win32_registry:
dependency: transitive
description:
name: win32_registry
sha256: "1c52f994bdccb77103a6231ad4ea331a244dbcef5d1f37d8462f713143b0bfae"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
@@ -855,10 +863,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: xml name: xml
sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.2.2" version: "6.3.0"
sdks: sdks:
dart: ">=2.19.0 <3.0.0" dart: ">=3.0.0-417 <4.0.0"
flutter: ">=3.4.0-17.0.pre" flutter: ">=3.4.0-17.0.pre"

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 # 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 # 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. # of the product and file versions while build-number is used as the build suffix.
version: 0.13.2+166 # When changing this, update the tag in main() accordingly version: 0.13.4+168 # When changing this, update the tag in main() accordingly
environment: environment:
sdk: '>=2.18.2 <3.0.0' sdk: '>=2.18.2 <3.0.0'
@@ -48,20 +48,20 @@ dependencies:
url_launcher: ^6.1.5 url_launcher: ^6.1.5
permission_handler: ^10.0.0 permission_handler: ^10.0.0
fluttertoast: ^8.0.9 fluttertoast: ^8.0.9
device_info_plus: ^8.0.0 device_info_plus: ^9.0.0
file_picker: ^5.2.10 file_picker: ^5.2.10
animations: ^2.0.4 animations: ^2.0.4
android_package_installer: android_package_installer:
git: git:
url: https://github.com/ImranR98/android_package_installer url: https://github.com/ImranR98/android_package_installer
ref: main ref: main
share_plus: ^6.0.1 share_plus: ^7.0.0
installed_apps: ^1.3.1 installed_apps: ^1.3.1
package_archive_info: ^0.1.0 package_archive_info: ^0.1.0
android_alarm_manager_plus: ^2.1.0 android_alarm_manager_plus: ^3.0.0
sqflite: ^2.2.0+3 sqflite: ^2.2.0+3
easy_localization: ^3.0.1 easy_localization: ^3.0.1
android_intent_plus: ^3.1.5 android_intent_plus: ^4.0.0
flutter_markdown: ^0.6.14 flutter_markdown: ^0.6.14
archive: ^3.3.7 archive: ^3.3.7