diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index bdeb203c..851c0b71 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -538,6 +538,38 @@ class AddAppPageState extends State { }); } }), + if (pickedSource != null && pickedSource!.enforceTrackOnly) + GeneratedForm( + key: Key( + '${pickedSource.runtimeType.toString()}-${pickedSource?.hostChanged.toString()}-${pickedSource?.hostIdenticalDespiteAnyChange.toString()}-appId'), + items: [ + [ + GeneratedFormTextField('appId', + label: tr('appId'), + required: false, + additionalValidators: [ + (value) { + if (value == null || value.isEmpty) { + return null; + } + final isValid = RegExp( + r'^([A-Za-z]{1}[A-Za-z\d_]*\.)+[A-Za-z][A-Za-z\d_]*$') + .hasMatch(value); + if (!isValid) { + return tr('invalidInput'); + } + return null; + } + ]), + ] + ], + onValueChanges: (values, valid, isBuilding) { + if (!isBuilding) { + setState(() { + additionalSettings['appId'] = values['appId']; + }); + } + }), ], ); diff --git a/lib/providers/source_provider.dart b/lib/providers/source_provider.dart index 8e77f544..29dff111 100644 --- a/lib/providers/source_provider.dart +++ b/lib/providers/source_provider.dart @@ -571,7 +571,7 @@ abstract class AppSource { GeneratedFormSwitch('skipUpdateNotifications', label: tr('skipUpdateNotifications')) ], - [GeneratedFormTextField('about', label: tr('about'), required: false)] + [GeneratedFormTextField('about', label: tr('about'), required: false)], ]; // Previous 2 variables combined into one at runtime for convenient usage @@ -922,6 +922,9 @@ class SourceProvider { name = name.isNotEmpty ? name : apk.names.name; App finalApp = App( currentApp?.id ?? + ((additionalSettings['appId'] != null) + ? additionalSettings['appId'] + : null) ?? (!trackOnly && (!source.appIdInferIsOptional || (source.appIdInferIsOptional && inferAppIdIfOptional))