From 183fb269883f4c34117db8a8cdc2b490f12115f5 Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 18 Jan 2024 23:46:23 -0500 Subject: [PATCH] Clearer version detection settings --- lib/app_sources/apkcombo.dart | 1 + lib/app_sources/apkmirror.dart | 1 + lib/app_sources/apkpure.dart | 1 + lib/app_sources/aptoide.dart | 1 + lib/app_sources/fdroidrepo.dart | 1 + lib/app_sources/github.dart | 1 + lib/app_sources/gitlab.dart | 1 + lib/app_sources/html.dart | 2 - lib/app_sources/huaweiappgallery.dart | 4 +- lib/app_sources/jenkins.dart | 4 +- lib/app_sources/neutroncode.dart | 1 + lib/app_sources/sourcehut.dart | 1 + lib/app_sources/uptodown.dart | 1 + lib/app_sources/whatsapp.dart | 3 +- lib/components/generated_form.dart | 19 ++++-- lib/main.dart | 5 +- lib/pages/add_app.dart | 6 +- lib/pages/app.dart | 34 ++--------- lib/providers/apps_provider.dart | 8 +-- lib/providers/source_provider.dart | 84 ++++++++++++++++++--------- 20 files changed, 94 insertions(+), 85 deletions(-) diff --git a/lib/app_sources/apkcombo.dart b/lib/app_sources/apkcombo.dart index 1a58847..3a1ae49 100644 --- a/lib/app_sources/apkcombo.dart +++ b/lib/app_sources/apkcombo.dart @@ -6,6 +6,7 @@ import 'package:obtainium/providers/source_provider.dart'; class APKCombo extends AppSource { APKCombo() { hosts = ['apkcombo.com']; + showReleaseDateAsVersionToggle = true; } @override diff --git a/lib/app_sources/apkmirror.dart b/lib/app_sources/apkmirror.dart index 4e3cd1f..236a300 100644 --- a/lib/app_sources/apkmirror.dart +++ b/lib/app_sources/apkmirror.dart @@ -11,6 +11,7 @@ class APKMirror extends AppSource { APKMirror() { hosts = ['apkmirror.com']; enforceTrackOnly = true; + showReleaseDateAsVersionToggle = true; additionalSourceAppSpecificSettingFormItems = [ [ diff --git a/lib/app_sources/apkpure.dart b/lib/app_sources/apkpure.dart index f4c0026..715a8d3 100644 --- a/lib/app_sources/apkpure.dart +++ b/lib/app_sources/apkpure.dart @@ -23,6 +23,7 @@ class APKPure extends AppSource { hosts = ['apkpure.net', 'apkpure.com']; allowSubDomains = true; naiveStandardVersionDetection = true; + showReleaseDateAsVersionToggle = true; } @override diff --git a/lib/app_sources/aptoide.dart b/lib/app_sources/aptoide.dart index a2795d6..9daf57b 100644 --- a/lib/app_sources/aptoide.dart +++ b/lib/app_sources/aptoide.dart @@ -10,6 +10,7 @@ class Aptoide extends AppSource { name = 'Aptoide'; allowSubDomains = true; naiveStandardVersionDetection = true; + showReleaseDateAsVersionToggle = true; } @override diff --git a/lib/app_sources/fdroidrepo.dart b/lib/app_sources/fdroidrepo.dart index a1c571b..7722d9f 100644 --- a/lib/app_sources/fdroidrepo.dart +++ b/lib/app_sources/fdroidrepo.dart @@ -10,6 +10,7 @@ class FDroidRepo extends AppSource { canSearch = true; excludeFromMassSearch = true; neverAutoSelect = true; + showReleaseDateAsVersionToggle = true; additionalSourceAppSpecificSettingFormItems = [ [ diff --git a/lib/app_sources/github.dart b/lib/app_sources/github.dart index c08ae5a..e510014 100644 --- a/lib/app_sources/github.dart +++ b/lib/app_sources/github.dart @@ -16,6 +16,7 @@ class GitHub extends AppSource { GitHub() { hosts = ['github.com']; appIdInferIsOptional = true; + showReleaseDateAsVersionToggle = true; sourceConfigSettingFormItems = [ GeneratedFormTextField('github-creds', diff --git a/lib/app_sources/gitlab.dart b/lib/app_sources/gitlab.dart index 0b7776f..3e1e701 100644 --- a/lib/app_sources/gitlab.dart +++ b/lib/app_sources/gitlab.dart @@ -15,6 +15,7 @@ class GitLab extends AppSource { GitLab() { hosts = ['gitlab.com']; canSearch = true; + showReleaseDateAsVersionToggle = true; sourceConfigSettingFormItems = [ GeneratedFormTextField('gitlab-creds', diff --git a/lib/app_sources/html.dart b/lib/app_sources/html.dart index 7492051..d13653a 100644 --- a/lib/app_sources/html.dart +++ b/lib/app_sources/html.dart @@ -174,8 +174,6 @@ class HTML extends AppSource { ]) ] ]; - overrideVersionDetectionFormDefault('noVersionDetection', - disableStandard: false, disableRelDate: true); } @override diff --git a/lib/app_sources/huaweiappgallery.dart b/lib/app_sources/huaweiappgallery.dart index 54ab2ec..2c4d480 100644 --- a/lib/app_sources/huaweiappgallery.dart +++ b/lib/app_sources/huaweiappgallery.dart @@ -7,8 +7,8 @@ class HuaweiAppGallery extends AppSource { HuaweiAppGallery() { name = 'Huawei AppGallery'; hosts = ['appgallery.huawei.com']; - overrideVersionDetectionFormDefault('releaseDateAsVersion', - disableStandard: true); + versionDetectionDisallowed = true; + showReleaseDateAsVersionToggle = true; } @override diff --git a/lib/app_sources/jenkins.dart b/lib/app_sources/jenkins.dart index 8e817db..39a4f79 100644 --- a/lib/app_sources/jenkins.dart +++ b/lib/app_sources/jenkins.dart @@ -6,9 +6,9 @@ import 'package:obtainium/providers/source_provider.dart'; class Jenkins extends AppSource { Jenkins() { - overrideVersionDetectionFormDefault('releaseDateAsVersion', - disableStandard: true); + versionDetectionDisallowed = true; neverAutoSelect = true; + showReleaseDateAsVersionToggle = true; } String trimJobUrl(String url) { diff --git a/lib/app_sources/neutroncode.dart b/lib/app_sources/neutroncode.dart index b0f2d93..0429718 100644 --- a/lib/app_sources/neutroncode.dart +++ b/lib/app_sources/neutroncode.dart @@ -6,6 +6,7 @@ import 'package:obtainium/providers/source_provider.dart'; class NeutronCode extends AppSource { NeutronCode() { hosts = ['neutroncode.com']; + showReleaseDateAsVersionToggle = true; } @override diff --git a/lib/app_sources/sourcehut.dart b/lib/app_sources/sourcehut.dart index bb19b96..0c691c4 100644 --- a/lib/app_sources/sourcehut.dart +++ b/lib/app_sources/sourcehut.dart @@ -9,6 +9,7 @@ import 'package:easy_localization/easy_localization.dart'; class SourceHut extends AppSource { SourceHut() { hosts = ['git.sr.ht']; + showReleaseDateAsVersionToggle = true; additionalSourceAppSpecificSettingFormItems = [ [ diff --git a/lib/app_sources/uptodown.dart b/lib/app_sources/uptodown.dart index fe3d589..00de36c 100644 --- a/lib/app_sources/uptodown.dart +++ b/lib/app_sources/uptodown.dart @@ -9,6 +9,7 @@ class Uptodown extends AppSource { hosts = ['uptodown.com']; allowSubDomains = true; naiveStandardVersionDetection = true; + showReleaseDateAsVersionToggle = true; } @override diff --git a/lib/app_sources/whatsapp.dart b/lib/app_sources/whatsapp.dart index e9ad7c5..94b26d1 100644 --- a/lib/app_sources/whatsapp.dart +++ b/lib/app_sources/whatsapp.dart @@ -6,8 +6,7 @@ import 'package:obtainium/providers/source_provider.dart'; class WhatsApp extends AppSource { WhatsApp() { hosts = ['whatsapp.com']; - overrideVersionDetectionFormDefault('noVersionDetection', - disableStandard: true, disableRelDate: true); + versionDetectionDisallowed = true; } @override diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index 8c36b3f..0882f45 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -96,11 +96,14 @@ class GeneratedFormDropdown extends GeneratedFormItem { } class GeneratedFormSwitch extends GeneratedFormItem { + bool disabled = false; + GeneratedFormSwitch( super.key, { super.label, super.belowWidgets, bool super.defaultValue = false, + bool disabled = false, List super.additionalValidators = const [], }); @@ -115,6 +118,7 @@ class GeneratedFormSwitch extends GeneratedFormItem { label: label, belowWidgets: belowWidgets, defaultValue: defaultValue, + disabled: false, additionalValidators: List.from(additionalValidators)); } } @@ -368,12 +372,15 @@ class _GeneratedFormState extends State { ), Switch( value: values[fieldKey], - onChanged: (value) { - setState(() { - values[fieldKey] = value; - someValueChanged(); - }); - }) + onChanged: + (widget.items[r][e] as GeneratedFormSwitch).disabled + ? null + : (value) { + setState(() { + values[fieldKey] = value; + someValueChanged(); + }); + }) ], ); } else if (widget.items[r][e] is GeneratedFormTagInput) { diff --git a/lib/main.dart b/lib/main.dart index c965ce2..683db9c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -183,10 +183,7 @@ class _ObtainiumState extends State { value.versionName!, [], 0, - { - 'includePrereleases': true, - 'versionDetection': 'standardVersionDetection' - }, + {'includePrereleases': true, 'versionDetection': true}, null, false) ], onlyIfExists: false); diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index 41deae2..d504901 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -135,8 +135,7 @@ class AddAppPageState extends State { getReleaseDateAsVersionConfirmationIfNeeded( bool userPickedTrackOnly) async { - return (!(additionalSettings['versionDetection'] == - 'releaseDateAsVersion' && + return (!(additionalSettings['releaseDateAsVersion'] == true && // ignore: use_build_context_synchronously await showDialog( context: context, @@ -192,8 +191,7 @@ class AddAppPageState extends State { throw ObtainiumError(tr('appAlreadyAdded')); } if (app.additionalSettings['trackOnly'] == true || - app.additionalSettings['versionDetection'] != - 'standardVersionDetection') { + app.additionalSettings['versionDetection'] != true) { app.installedVersion = app.latestVersion; } app.categories = pickedCategories; diff --git a/lib/pages/app.dart b/lib/pages/app.dart index 18bd1fe..dc60b9f 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form_modal.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/main.dart'; @@ -54,13 +53,11 @@ class _AppPageState extends State { var trackOnly = app?.app.additionalSettings['trackOnly'] == true; bool isVersionDetectionStandard = - app?.app.additionalSettings['versionDetection'] == - 'standardVersionDetection'; + app?.app.additionalSettings['versionDetection'] == true; bool installedVersionIsEstimate = trackOnly || (app?.app.installedVersion != null && - app?.app.additionalSettings['versionDetection'] == - 'noVersionDetection'); + app?.app.additionalSettings['versionDetection'] != true); getInfoColumn() => Column( mainAxisAlignment: MainAxisAlignment.center, @@ -287,25 +284,6 @@ class _AppPageState extends State { return row; }).toList(); - items = items.map((row) { - row = row.map((e) { - if (e.key == 'versionDetection' && e is GeneratedFormDropdown) { - e.disabledOptKeys ??= []; - if (app?.app.installedVersion != null && - app?.app.additionalSettings['versionDetection'] != - 'releaseDateAsVersion' && - !appsProvider.isVersionDetectionPossible(app)) { - e.disabledOptKeys!.add('standardVersionDetection'); - } - if (app?.app.releaseDate == null) { - e.disabledOptKeys!.add('releaseDateAsVersion'); - } - } - return e; - }).toList(); - return row; - }).toList(); - return GeneratedFormModal( title: tr('additionalOptions'), items: items); }); @@ -320,9 +298,8 @@ class _AppPageState extends State { // ignore: use_build_context_synchronously showMessage(tr('appsFromSourceAreTrackOnly'), context); } - if (app.app.additionalSettings['versionDetection'] == - 'releaseDateAsVersion') { - if (originalSettings['versionDetection'] != 'releaseDateAsVersion') { + if (app.app.additionalSettings['releaseDateAsVersion'] == true) { + if (originalSettings['releaseDateAsVersion'] != true) { if (app.app.releaseDate != null) { bool isUpdated = app.app.installedVersion == app.app.latestVersion; @@ -333,8 +310,7 @@ class _AppPageState extends State { } } } - } else if (originalSettings['versionDetection'] == - 'releaseDateAsVersion') { + } else if (originalSettings['releaseDateAsVersion'] == true) { app.app.installedVersion = app.installedInfo?.versionName ?? app.app.installedVersion; } diff --git a/lib/providers/apps_provider.dart b/lib/providers/apps_provider.dart index 31178f2..c3fa50a 100644 --- a/lib/providers/apps_provider.dart +++ b/lib/providers/apps_provider.dart @@ -820,8 +820,7 @@ class AppsProvider with ChangeNotifier { ? app.installedInfo?.versionCode.toString() : app.installedInfo?.versionName; return app.app.additionalSettings['trackOnly'] != true && - app.app.additionalSettings['versionDetection'] != - 'releaseDateAsVersion' && + app.app.additionalSettings['releaseDateAsVersion'] != true && realInstalledVersion != null && app.app.installedVersion != null && (reconcileVersionDifferences( @@ -837,8 +836,7 @@ class AppsProvider with ChangeNotifier { var modded = false; var trackOnly = app.additionalSettings['trackOnly'] == true; var versionDetectionIsStandard = - app.additionalSettings['versionDetection'] == - 'standardVersionDetection'; + app.additionalSettings['versionDetection'] == true; var naiveStandardVersionDetection = app.additionalSettings['naiveStandardVersionDetection'] == true || SourceProvider() @@ -892,7 +890,7 @@ class AppsProvider with ChangeNotifier { versionDetectionIsStandard && !isVersionDetectionPossible( AppInMemory(app, null, installedInfo, null))) { - app.additionalSettings['versionDetection'] = 'noVersionDetection'; + app.additionalSettings['versionDetection'] = false; logs.add('Could not reconcile version formats for: ${app.id}'); modded = true; } diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index c66b1d3..2c55e00 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -103,6 +103,15 @@ appJSONCompatibilityModifiers(Map json) { additionalSettings.remove('releaseDateAsVersion'); } } + // Convert dropdown style version detection options back into bool style + if (additionalSettings['versionDetection'] == 'standardVersionDetection') { + additionalSettings['versionDetection'] = true; + } else if (additionalSettings['versionDetection'] == 'noVersionDetection') { + additionalSettings['versionDetection'] = false; + } else if (additionalSettings['versionDetection'] == 'releaseDateAsVersion') { + additionalSettings['versionDetection'] = false; + additionalSettings['releaseDateAsVersion'] = true; + } // Ensure additionalSettings are correctly typed for (var item in formItems) { if (additionalSettings[item.key] != null) { @@ -380,28 +389,23 @@ abstract class AppSource { bool allowSubDomains = false; bool naiveStandardVersionDetection = false; bool neverAutoSelect = false; + bool showReleaseDateAsVersionToggle = false; + bool versionDetectionDisallowed = false; AppSource() { name = runtimeType.toString(); } - overrideVersionDetectionFormDefault(String vd, - {bool disableStandard = false, bool disableRelDate = false}) { - additionalAppSpecificSourceAgnosticSettingFormItems = - additionalAppSpecificSourceAgnosticSettingFormItems.map((e) { + overrideAdditionalAppSpecificSourceAgnosticSettingSwitch(String key, + {bool disabled = true, bool defaultValue = true}) { + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly = + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly + .map((e) { return e.map((e2) { - if (e2.key == 'versionDetection') { - var item = e2 as GeneratedFormDropdown; - item.defaultValue = vd; - item.disabledOptKeys = []; - if (disableStandard) { - item.disabledOptKeys?.add('standardVersionDetection'); - } - if (disableRelDate) { - item.disabledOptKeys?.add('releaseDateAsVersion'); - } - item.disabledOptKeys = - item.disabledOptKeys?.where((element) => element != vd).toList(); + if (e2.key == key) { + var item = e2 as GeneratedFormSwitch; + item.disabled = disabled; + item.defaultValue = defaultValue; } return e2; }).toList(); @@ -457,7 +461,7 @@ abstract class AppSource { // Some additional data may be needed for Apps regardless of Source List> - additionalAppSpecificSourceAgnosticSettingFormItems = [ + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly = [ [ GeneratedFormSwitch( 'trackOnly', @@ -475,16 +479,8 @@ abstract class AppSource { label: tr('matchGroupToUse'), required: false, hint: '\$0') ], [ - GeneratedFormDropdown( - 'versionDetection', - [ - MapEntry( - 'standardVersionDetection', tr('standardVersionDetection')), - MapEntry('releaseDateAsVersion', tr('releaseDateAsVersion')), - MapEntry('noVersionDetection', tr('noVersionDetection')) - ], - label: tr('versionDetection'), - defaultValue: 'standardVersionDetection') + GeneratedFormSwitch('versionDetection', + label: tr('versionDetection'), defaultValue: true) ], [ GeneratedFormSwitch('useVersionCodeAsOSVersion', @@ -518,9 +514,39 @@ abstract class AppSource { // Previous 2 variables combined into one at runtime for convenient usage List> get combinedAppSpecificSettingFormItems { + if (showReleaseDateAsVersionToggle == true) { + if (additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly + .indexWhere((List e) => + e.indexWhere((GeneratedFormItem i) => + i.key == 'releaseDateAsVersion') >= + 0) < + 0) { + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly.insert( + additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly + .indexWhere((List e) => + e.indexWhere((GeneratedFormItem i) => + i.key == 'versionDetection') >= + 0) + + 1, + [ + GeneratedFormSwitch('releaseDateAsVersion', + label: tr('releaseDateAsVersion'), defaultValue: false) + ]); + } + } + if (versionDetectionDisallowed) { + overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( + 'versionDetection', + disabled: true, + defaultValue: false); + overrideAdditionalAppSpecificSourceAgnosticSettingSwitch( + 'useVersionCodeAsOSVersion', + disabled: true, + defaultValue: false); + } return [ ...additionalSourceAppSpecificSettingFormItems, - ...additionalAppSpecificSourceAgnosticSettingFormItems + ...additionalAppSpecificSourceAgnosticSettingFormItemsNeverUseDirectly ]; } @@ -773,7 +799,7 @@ class SourceProvider { } } - if (additionalSettings['versionDetection'] == 'releaseDateAsVersion' && + if (additionalSettings['releaseDateAsVersion'] == true && apk.releaseDate != null) { apk.version = apk.releaseDate!.microsecondsSinceEpoch.toString(); }