Broke GeneratedFormItem into sub-types

Prep for "chips" input type
This commit is contained in:
Imran Remtulla
2022-12-21 18:23:25 -05:00
parent 3cbaac2f5d
commit 9072862862
21 changed files with 238 additions and 188 deletions

View File

@@ -313,7 +313,7 @@ class AppsProvider with ChangeNotifier {
throw ObtainiumError(tr('appNotFound'));
}
String? apkUrl;
var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == 'true';
var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true;
if (!trackOnly) {
apkUrl = await confirmApkUrl(apps[id]!.app, context);
}
@@ -452,9 +452,9 @@ class AppsProvider with ChangeNotifier {
// Don't save changes, just return the object if changes were made (else null)
App? getCorrectedInstallStatusAppIfPossible(App app, AppInfo? installedInfo) {
var modded = false;
var trackOnly = app.additionalSettings['trackOnly'] == 'true';
var trackOnly = app.additionalSettings['trackOnly'] == true;
var noVersionDetection =
app.additionalSettings['noVersionDetection'] == 'true';
app.additionalSettings['noVersionDetection'] == true;
if (installedInfo == null && app.installedVersion != null && !trackOnly) {
app.installedVersion = null;
modded = true;

View File

@@ -155,12 +155,12 @@ class SettingsProvider with ChangeNotifier {
prefs?.setString('categories', jsonEncode(cats));
}
getCategoryFormItem({String initCategory = ''}) =>
GeneratedFormItem('category',
label: tr('category'),
opts: [
MapEntry('', tr('noCategory')),
...categories.entries.map((e) => MapEntry(e.key, e.key)).toList()
],
defaultValue: initCategory);
getCategoryFormItem({String initCategory = ''}) => GeneratedFormDropdown(
'category',
label: tr('category'),
[
MapEntry('', tr('noCategory')),
...categories.entries.map((e) => MapEntry(e.key, e.key)).toList()
],
defaultValue: initCategory);
}

View File

@@ -45,7 +45,7 @@ class App {
late String latestVersion;
List<String> apkUrls = [];
late int preferredApkIndex;
late Map<String, String> additionalSettings;
late Map<String, dynamic> additionalSettings;
late DateTime? lastUpdateCheck;
bool pinned = false;
String? category;
@@ -72,24 +72,36 @@ class App {
var source = SourceProvider().getSource(json['url']);
var formItems = source.combinedAppSpecificSettingFormItems
.reduce((value, element) => [...value, ...element]);
Map<String, String> additionalSettings =
Map<String, dynamic> additionalSettings =
getDefaultValuesFromFormItems([formItems]);
if (json['additionalSettings'] != null) {
additionalSettings.addEntries(
Map<String, String>.from(jsonDecode(json['additionalSettings']))
Map<String, dynamic>.from(jsonDecode(json['additionalSettings']))
.entries);
}
// If needed, migrate old-style additionalData to new-style additionalSettings
// If needed, migrate old-style additionalData to newer-style additionalSettings (V1)
if (json['additionalData'] != null) {
List<String> temp = List<String>.from(jsonDecode(json['additionalData']));
temp.asMap().forEach((i, value) {
if (i < formItems.length) {
additionalSettings[formItems[i].key] = value;
if (formItems[i] is GeneratedFormSwitch) {
additionalSettings[formItems[i].key] = value == 'true';
} else {
additionalSettings[formItems[i].key] = value;
}
}
});
additionalSettings['trackOnly'] = (json['trackOnly'] ?? false).toString();
additionalSettings['trackOnly'] =
json['trackOnly'] == 'true' || json['trackOnly'] == true;
additionalSettings['noVersionDetection'] =
(json['noVersionDetection'] ?? false).toString();
json['noVersionDetection'] == 'true' || json['trackOnly'] == true;
}
// Ensure additionalSettings are correctly typed
for (var item in formItems) {
if (additionalSettings[item.key] != null) {
additionalSettings[item.key] =
item.ensureType(additionalSettings[item.key]);
}
}
return App(
json['id'] as String,
@@ -160,7 +172,7 @@ List<String> getLinksFromParsedHTML(
.map((e) => '$prependToLinks${e.attributes['href']!}')
.toList();
Map<String, String> getDefaultValuesFromFormItems(
Map<String, dynamic> getDefaultValuesFromFormItems(
List<List<GeneratedFormItem>> items) {
return Map.fromEntries(items
.map((row) => row.map((el) => MapEntry(el.key, el.defaultValue ?? '')))
@@ -181,7 +193,7 @@ class AppSource {
}
Future<APKDetails> getLatestAPKDetails(
String standardUrl, Map<String, String> additionalSettings) {
String standardUrl, Map<String, dynamic> additionalSettings) {
throw NotImplementedError();
}
@@ -193,16 +205,12 @@ class AppSource {
final List<List<GeneratedFormItem>>
additionalAppSpecificSourceAgnosticSettingFormItems = [
[
GeneratedFormItem(
GeneratedFormSwitch(
'trackOnly',
label: tr('trackOnly'),
type: FormItemType.bool,
)
],
[
GeneratedFormItem('noVersionDetection',
label: tr('noVersionDetection'), type: FormItemType.bool)
]
[GeneratedFormSwitch('noVersionDetection', label: tr('noVersionDetection'))]
];
// Previous 2 variables combined into one at runtime for convenient usage
@@ -230,7 +238,7 @@ class AppSource {
}
String? tryInferringAppId(String standardUrl,
{Map<String, String> additionalSettings = const {}}) {
{Map<String, dynamic> additionalSettings = const {}}) {
return null;
}
}
@@ -293,7 +301,7 @@ class SourceProvider {
bool ifRequiredAppSpecificSettingsExist(AppSource source) {
for (var row in source.combinedAppSpecificSettingFormItems) {
for (var element in row) {
if (element.required && element.opts == null) {
if (element is GeneratedFormTextField && element.required) {
return true;
}
}
@@ -319,17 +327,17 @@ class SourceProvider {
}
Future<App> getApp(
AppSource source, String url, Map<String, String> additionalSettings,
AppSource source, String url, Map<String, dynamic> additionalSettings,
{App? currentApp,
bool trackOnlyOverride = false,
noVersionDetectionOverride = false}) async {
if (trackOnlyOverride) {
additionalSettings['trackOnly'] = 'true';
additionalSettings['trackOnly'] = true;
}
if (noVersionDetectionOverride) {
additionalSettings['noVersionDetection'] = 'true';
additionalSettings['noVersionDetection'] = true;
}
var trackOnly = currentApp?.additionalSettings['trackOnly'] == 'true';
var trackOnly = currentApp?.additionalSettings['trackOnly'] == true;
String standardUrl = source.standardizeURL(preStandardizeUrl(url));
APKDetails apk =
await source.getLatestAPKDetails(standardUrl, additionalSettings);