From eda5fec37c7c0be576b8ccde1e884fb04ce86e6a Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 14 May 2023 13:57:01 -0400 Subject: [PATCH 1/2] Added App ID Filter --- assets/translations/de.json | 1 + assets/translations/en.json | 1 + assets/translations/es.json | 1 + assets/translations/fa.json | 1 + assets/translations/fr.json | 1 + assets/translations/hu.json | 1 + assets/translations/it.json | 1 + assets/translations/ja.json | 1 + assets/translations/zh.json | 1 + lib/pages/apps.dart | 16 ++++++++++++++++ 10 files changed, 25 insertions(+) diff --git a/assets/translations/de.json b/assets/translations/de.json index 040f4cd..7499014 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "Ja, als aktualisiert markieren", "fdroid": "F-Droid Official", "appIdOrName": "App ID oder Name", + "appId": "App ID", "appWithIdOrNameNotFound": "Es wurde keine App mit dieser ID oder diesem Namen gefunden", "reposHaveMultipleApps": "Repos können mehrere Apps enthalten", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo", diff --git a/assets/translations/en.json b/assets/translations/en.json index eb59399..1f543ac 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "Yes, Mark as Updated", "fdroid": "F-Droid Official", "appIdOrName": "App ID or Name", + "appId": "App ID", "appWithIdOrNameNotFound": "No App was found with that ID or Name", "reposHaveMultipleApps": "Repos may contain multiple Apps", "fdroidThirdPartyRepo": "F-Droid Third-Party Repo", diff --git a/assets/translations/es.json b/assets/translations/es.json index c013d01..d3b6500 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "Sí, Marcar como Actualizada", "fdroid": "Repositorio oficial de F-Droid", "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", "reposHaveMultipleApps": "Los repositorios pueden contener varias aplicaciones", "fdroidThirdPartyRepo": "Rpositorios de terceros de F-Droid", diff --git a/assets/translations/fa.json b/assets/translations/fa.json index 5685c1e..d7eb778 100644 --- a/assets/translations/fa.json +++ b/assets/translations/fa.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "بله، علامت گذاری به عنوان به روز شده", "fdroid": "F-Droid Official", "appIdOrName": "شناسه یا نام برنامه", + "appId": "App ID", "appWithIdOrNameNotFound": "هیچ برنامه ای با آن شناسه یا نام یافت نشد", "reposHaveMultipleApps": "مخازن ممکن است شامل چندین برنامه باشد", "fdroidThirdPartyRepo": "مخازن شخص ثالث F-Droid", diff --git a/assets/translations/fr.json b/assets/translations/fr.json index 90c060f..dfc8876 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "Oui, marquer comme mis à jour", "fdroid": "F-Droid Official", "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", "reposHaveMultipleApps": "Les dépôts peuvent contenir plusieurs applications", "fdroidThirdPartyRepo": "Dépôt tiers F-Droid", diff --git a/assets/translations/hu.json b/assets/translations/hu.json index c73ef70..a003fbc 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "Igen, megjelölés frissítettként", "fdroid": "F-Droid Official", "appIdOrName": "App ID vagy név", + "appId": "App ID", "appWithIdOrNameNotFound": "Nem található app ezzel az azonosítóval vagy névvel", "reposHaveMultipleApps": "A repók több alkalmazást is tartalmazhatnak", "fdroidThirdPartyRepo": "F-Droid Harmadik-fél Repo", diff --git a/assets/translations/it.json b/assets/translations/it.json index 0cff11d..53b20c6 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "Sì, contrassegna come aggiornato", "fdroid": "F-Droid Official", "appIdOrName": "ID o nome dell'App", + "appId": "ID dell'App", "appWithIdOrNameNotFound": "Non è stata trovata alcuna App con quell'ID o nome", "reposHaveMultipleApps": "I repository possono contenere più App", "fdroidThirdPartyRepo": "Repository F-Droid di terze parti", diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 47200fa..135a8ab 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "はい、アップデート済みとしてマークします", "fdroid": "F-Droid Official", "appIdOrName": "アプリのIDまたは名前", + "appId": "App ID", "appWithIdOrNameNotFound": "そのIDや名前を持つアプリは見つかりませんでした", "reposHaveMultipleApps": "リポジトリには複数のアプリが含まれることがあります", "fdroidThirdPartyRepo": "F-Droid サードパーティリポジトリ", diff --git a/assets/translations/zh.json b/assets/translations/zh.json index f00d46b..83c08b2 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -180,6 +180,7 @@ "yesMarkUpdated": "是,标记为已更新", "fdroid": "F-Droid 官方存储库", "appIdOrName": "应用 ID 或名称", + "appId": "App ID", "appWithIdOrNameNotFound": "未找到符合此 ID 或名称的应用", "reposHaveMultipleApps": "存储库中可能包含多个应用", "fdroidThirdPartyRepo": "F-Droid 第三方存储库", diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index c06e3fe..18fc509 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -129,6 +129,11 @@ class AppsPageState extends State { } } } + if (filter.idFilter.isNotEmpty) { + if (!app.app.id.contains(filter.idFilter)) { + return false; + } + } if (filter.categoryFilter.isNotEmpty && filter.categoryFilter .intersection(app.app.categories.toSet()) @@ -941,6 +946,12 @@ class AppsPageState extends State { required: false, defaultValue: vals['author']) ], + [ + GeneratedFormTextField('appId', + label: tr('appId'), + required: false, + defaultValue: vals['appId']) + ], [ GeneratedFormSwitch('upToDateApps', label: tr('upToDateApps'), @@ -1072,6 +1083,7 @@ class AppsPageState extends State { class AppsFilter { late String nameFilter; late String authorFilter; + late String idFilter; late bool includeUptodate; late bool includeNonInstalled; late Set categoryFilter; @@ -1080,6 +1092,7 @@ class AppsFilter { AppsFilter( {this.nameFilter = '', this.authorFilter = '', + this.idFilter = '', this.includeUptodate = true, this.includeNonInstalled = true, this.categoryFilter = const {}, @@ -1089,6 +1102,7 @@ class AppsFilter { return { 'appName': nameFilter, 'author': authorFilter, + 'appId': idFilter, 'upToDateApps': includeUptodate, 'nonInstalledApps': includeNonInstalled, 'sourceFilter': sourceFilter @@ -1098,6 +1112,7 @@ class AppsFilter { setFormValuesFromMap(Map values) { nameFilter = values['appName']!; authorFilter = values['author']!; + idFilter = values['appId']!; includeUptodate = values['upToDateApps']; includeNonInstalled = values['nonInstalledApps']; sourceFilter = values['sourceFilter']; @@ -1106,6 +1121,7 @@ class AppsFilter { bool isIdenticalTo(AppsFilter other, SettingsProvider settingsProvider) => authorFilter.trim() == other.authorFilter.trim() && nameFilter.trim() == other.nameFilter.trim() && + idFilter.trim() == other.idFilter.trim() && includeUptodate == other.includeUptodate && includeNonInstalled == other.includeNonInstalled && settingsProvider.setEqual(categoryFilter, other.categoryFilter) && From 03c2ce9a019cc1e457682f1702ed682b1dab11df Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sun, 14 May 2023 14:18:31 -0400 Subject: [PATCH 2/2] Changes to bottom buttons UI on Apps page --- lib/pages/apps.dart | 134 ++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 78 deletions(-) diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index 18fc509..9966f9c 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -61,8 +61,6 @@ class AppsPageState extends State { var settingsProvider = context.watch(); var sourceProvider = SourceProvider(); var listedApps = appsProvider.getAppValues().toList(); - var currentFilterIsUpdatesOnly = - filter.isIdenticalTo(updatesOnlyFilter, settingsProvider); refresh() { HapticFeedback.lightImpact(); @@ -887,44 +885,41 @@ class AppsPageState extends State { }); } - getMainBottomButtonsRow() { - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - IconButton( + getMainBottomButtons() { + return [ + IconButton( visualDensity: VisualDensity.compact, - onPressed: selectedAppIds.isEmpty - ? null - : () { - appsProvider.removeAppsWithModal( - context, selectedApps.toList()); - }, - tooltip: tr('removeSelectedApps'), - icon: const Icon(Icons.delete_outline_outlined), - ), - IconButton( - visualDensity: VisualDensity.compact, - onPressed: getMassObtainFunction(), - tooltip: selectedAppIds.isEmpty - ? tr('installUpdateApps') - : tr('installUpdateSelectedApps'), - icon: const Icon( - Icons.file_download_outlined, - )), - IconButton( - visualDensity: VisualDensity.compact, - onPressed: selectedAppIds.isEmpty ? null : launchCategorizeDialog(), - tooltip: tr('categorize'), - icon: const Icon(Icons.category_outlined), - ), - IconButton( - visualDensity: VisualDensity.compact, - onPressed: selectedAppIds.isEmpty ? null : showMoreOptionsDialog, - tooltip: tr('more'), - icon: const Icon(Icons.more_horiz), - ), - ], - ); + onPressed: getMassObtainFunction(), + tooltip: selectedAppIds.isEmpty + ? tr('installUpdateApps') + : tr('installUpdateSelectedApps'), + icon: const Icon( + Icons.file_download_outlined, + )), + IconButton( + visualDensity: VisualDensity.compact, + onPressed: selectedAppIds.isEmpty + ? null + : () { + appsProvider.removeAppsWithModal( + context, selectedApps.toList()); + }, + tooltip: tr('removeSelectedApps'), + icon: const Icon(Icons.delete_outline_outlined), + ), + IconButton( + visualDensity: VisualDensity.compact, + onPressed: selectedAppIds.isEmpty ? null : launchCategorizeDialog(), + tooltip: tr('categorize'), + icon: const Icon(Icons.category_outlined), + ), + IconButton( + visualDensity: VisualDensity.compact, + onPressed: selectedAppIds.isEmpty ? null : showMoreOptionsDialog, + tooltip: tr('more'), + icon: const Icon(Icons.more_horiz), + ), + ]; } showFilterDialog() async { @@ -997,50 +992,33 @@ class AppsPageState extends State { } getFilterButtonsRow() { + var isFilterOff = filter.isIdenticalTo(neutralFilter, settingsProvider); return Row( children: [ 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(), Expanded( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: getMainBottomButtonsRow())), - 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)) + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: getMainBottomButtons(), + )), ], ); }