diff --git a/lib/pages/apps.dart b/lib/pages/apps.dart index a0bdc3b..7ccacfd 100644 --- a/lib/pages/apps.dart +++ b/lib/pages/apps.dart @@ -16,7 +16,23 @@ class _AppsPageState extends State { @override Widget build(BuildContext context) { var appsProvider = context.watch(); + var settingsProvider = context.watch(); var existingUpdateAppIds = appsProvider.getExistingUpdates(); + var sortedApps = appsProvider.apps.values.toList(); + sortedApps.sort((a, b) { + int result = 0; + if (settingsProvider.sortColumn == SortColumnSettings.authorName) { + result = + (a.app.author + a.app.name).compareTo(b.app.author + b.app.name); + } else if (settingsProvider.sortColumn == SortColumnSettings.nameAuthor) { + result = + (a.app.name + a.app.author).compareTo(b.app.name + b.app.author); + } + return result; + }); + if (settingsProvider.sortOrder == SortOrderSettings.ascending) { + sortedApps = sortedApps.reversed.toList(); + } return Scaffold( floatingActionButton: existingUpdateAppIds.isEmpty @@ -26,10 +42,7 @@ class _AppsPageState extends State { ? null : () { HapticFeedback.heavyImpact(); - context - .read() - .getInstallPermission() - .then((_) { + settingsProvider.getInstallPermission().then((_) { appsProvider.downloadAndInstallLatestApp( existingUpdateAppIds, context); }); @@ -50,7 +63,7 @@ class _AppsPageState extends State { return appsProvider.checkUpdates(); }, child: ListView( - children: appsProvider.apps.values + children: sortedApps .map( (e) => ListTile( title: Text('${e.app.author}/${e.app.name}'), diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 6087945..6322c60 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -112,6 +112,54 @@ class _SettingsPageState extends State { const SizedBox( height: 16, ), + DropdownButtonFormField( + decoration: + const InputDecoration(labelText: 'App Sort By'), + value: settingsProvider.sortColumn, + items: const [ + DropdownMenuItem( + value: SortColumnSettings.authorName, + child: Text('Author/Name'), + ), + DropdownMenuItem( + value: SortColumnSettings.nameAuthor, + child: Text('Name/Author'), + ), + DropdownMenuItem( + value: SortColumnSettings.added, + child: Text('As Added'), + ) + ], + onChanged: (value) { + if (value != null) { + settingsProvider.sortColumn = value; + } + }), + const SizedBox( + height: 16, + ), + DropdownButtonFormField( + decoration: + const InputDecoration(labelText: 'App Sort Order'), + value: settingsProvider.sortOrder, + items: const [ + DropdownMenuItem( + value: SortOrderSettings.ascending, + child: Text('Ascending'), + ), + DropdownMenuItem( + value: SortOrderSettings.descending, + child: Text('Descending'), + ), + ], + onChanged: (value) { + if (value != null) { + settingsProvider.sortOrder = value; + } + }), + const SizedBox( + height: 16, + ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 5613af9..c9538a0 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -9,6 +9,10 @@ enum ThemeSettings { system, light, dark } enum ColourSettings { basic, materialYou } +enum SortColumnSettings { added, nameAuthor, authorName } + +enum SortOrderSettings { ascending, descending } + class SettingsProvider with ChangeNotifier { SharedPreferences? prefs; @@ -49,6 +53,26 @@ class SettingsProvider with ChangeNotifier { notifyListeners(); } + SortColumnSettings get sortColumn { + return SortColumnSettings + .values[prefs?.getInt('sortColumn') ?? SortColumnSettings.added.index]; + } + + set sortColumn(SortColumnSettings s) { + prefs?.setInt('sortColumn', s.index); + notifyListeners(); + } + + SortOrderSettings get sortOrder { + return SortOrderSettings.values[ + prefs?.getInt('sortOrder') ?? SortOrderSettings.descending.index]; + } + + set sortOrder(SortOrderSettings s) { + prefs?.setInt('sortOrder', s.index); + notifyListeners(); + } + bool checkAndFlipFirstRun() { bool result = prefs?.getBool('firstRun') ?? true; if (result) {