Skip to content

Commit

Permalink
Views may be refreshed from menu. Automatic refresh of track list and…
Browse files Browse the repository at this point in the history
… status when application is resumed on Android.
  • Loading branch information
Kern, Thomas committed Jan 11, 2024
1 parent b1106f9 commit 06e5c1e
Show file tree
Hide file tree
Showing 13 changed files with 131 additions and 69 deletions.
6 changes: 3 additions & 3 deletions lib/components/busy_wrapper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class _BusyWrapperState extends State<BusyWrapper> with TickerProviderStateMixin

set busy(bool b) {
setState(() {
b ? _controller.forward() : _controller.reset();
b ? _controller.forward(from: 0) : _controller.reset();
_busy = b;
});
}
Expand All @@ -45,7 +45,7 @@ class _BusyWrapperState extends State<BusyWrapper> with TickerProviderStateMixin
initState() {
super.initState();
_busy = widget.busy;
_controller.forward();
_controller.forward(from: 0);
}

@override
Expand All @@ -57,7 +57,7 @@ class _BusyWrapperState extends State<BusyWrapper> with TickerProviderStateMixin
@override
void didUpdateWidget(covariant BusyWrapper oldWidget) {
_controller.reset();
_controller.forward();
_controller.forward(from: 0);
super.didUpdateWidget(oldWidget);
}

Expand Down
1 change: 1 addition & 0 deletions lib/generated/intl/messages_de.dart
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Neue Playlist"),
"menuNewStream": MessageLookupByLibrary.simpleMessage("Neuer Stream"),
"menuPlayNow": MessageLookupByLibrary.simpleMessage("Abspielen"),
"menuRefresh": MessageLookupByLibrary.simpleMessage("Aktualisieren"),
"menuRemove": MessageLookupByLibrary.simpleMessage("Entfernen"),
"menuRemoveSelected":
MessageLookupByLibrary.simpleMessage("Selektierte entfernen"),
Expand Down
1 change: 1 addition & 0 deletions lib/generated/intl/messages_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Create Playlist"),
"menuNewStream": MessageLookupByLibrary.simpleMessage("New Stream"),
"menuPlayNow": MessageLookupByLibrary.simpleMessage("Play now"),
"menuRefresh": MessageLookupByLibrary.simpleMessage("Refresh"),
"menuRemove": MessageLookupByLibrary.simpleMessage("Remove"),
"menuRemoveSelected":
MessageLookupByLibrary.simpleMessage("Remove selected"),
Expand Down
10 changes: 10 additions & 0 deletions lib/generated/l10n.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions lib/l10n/intl_de.arb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"menuPlayNow": "Abspielen",
"menuSelection": "Auswahl",
"menuSelectAll": "Alles auswählen",
"menuRefresh": "Aktualisieren",
"menuRemoveSelected": "Selektierte entfernen",
"menuRemove": "Entfernen",
"menuDelete": "Löschen",
Expand Down
1 change: 1 addition & 0 deletions lib/l10n/intl_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"menuPlayNow": "Play now",
"menuSelection": "Selection",
"menuSelectAll": "Select all",
"menuRefresh": "Refresh",
"menuRemoveSelected": "Remove selected",
"menuRemove": "Remove",
"menuDelete": "Delete",
Expand Down
5 changes: 5 additions & 0 deletions lib/pages/browse/library_appbar_menu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ class LibraryBrowserAppBarMenu extends StatelessWidget {
: menuBuilder.addMenuItem(S.of(context).menuRenamePlaylist, Icons.drive_file_rename_outline, _renamePlayList);

return menuBuilder
.addMenuItem(S.of(context).menuRefresh, Icons.refresh, _refresh)
.addDivider()
.addSettingsMenuItem(S.of(context).menuSettings)
.addHelpMenuItem(S.of(context).menuAbout)
Expand Down Expand Up @@ -92,4 +93,8 @@ class LibraryBrowserAppBarMenu extends StatelessWidget {
}
}
}

void _refresh(BuildContext context, _, __) {
controller.triggerRefresh();
}
}
38 changes: 26 additions & 12 deletions lib/pages/browse/library_browser_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
*/
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:rxdart/rxdart.dart';
import 'package:mopicon/components/error_snackbar.dart';
import 'package:mopicon/services/mopidy_service.dart';
import 'package:mopicon/components/menu_builder.dart';
Expand All @@ -32,6 +33,9 @@ import 'package:mopicon/generated/l10n.dart';
import 'package:mopicon/components/selected_item_positions.dart';

abstract class LibraryBrowserController with TracklistMethods, PlaylistMethods {
/// Notification to trigger refresh.
Stream<void> get refresh$;

SelectionModeChangedNotifier get selectionModeChanged;

SelectionChangedNotifier get selectionChanged;
Expand All @@ -47,9 +51,14 @@ abstract class LibraryBrowserController with TracklistMethods, PlaylistMethods {
Future<void> renamePlayList(BuildContext context, Ref pl, String name);

void unselect();

void triggerRefresh();
}

class LibraryBrowserControllerImpl extends LibraryBrowserController {
/// Notification for refresh
final _refresh$ = PublishSubject<void>();

final _mopidyService = GetIt.instance<MopidyService>();

@override
Expand All @@ -58,6 +67,9 @@ class LibraryBrowserControllerImpl extends LibraryBrowserController {
@override
final selectionChanged = SelectionChangedNotifier(SelectedItemPositions());

@override
Stream<void> get refresh$ => _refresh$.stream;

@override
MenuBuilder<Ref> popupMenu(BuildContext? context, Ref? item, int? index) {
assert(context != null);
Expand Down Expand Up @@ -101,6 +113,7 @@ class LibraryBrowserControllerImpl extends LibraryBrowserController {
}

void deletePlaylist(BuildContext context, Ref? item, int? index) async {
var deletePlaylistError = S.of(context).deletePlaylistError;
if (item != null && item.type == Ref.typePlaylist) {
try {
var ret = await showQuestionDialog(S.of(context).deletePlaylistDialogTitle,
Expand All @@ -111,15 +124,14 @@ class LibraryBrowserControllerImpl extends LibraryBrowserController {
}
} catch (e) {
Globals.logger.e(e);
if (context.mounted) {
showError(S.of(context).deletePlaylistError, null);
}
showError(deletePlaylistError, null);
}
}
}

@override
void deleteSelectedPlaylists(BuildContext context) async {
var deletePlaylistError = S.of(context).deletePlaylistError;
List<Ref> selected = await getSelectedItems(null);
if (!context.mounted) return;
for (var item in selected) {
Expand All @@ -132,32 +144,28 @@ class LibraryBrowserControllerImpl extends LibraryBrowserController {
}
} catch (e) {
Globals.logger.e(e);
if (context.mounted) {
showError(S.of(context).deletePlaylistError, null);
}
showError(deletePlaylistError, null);
}
}
unselect();
}

@override
Future<void> renamePlayList(BuildContext context, Ref pl, String name) async {
var playlistAlreadyExistsError = S.of(context).playlistAlreadyExistsError;
var renamePlaylistCreateError = S.of(context).renamePlaylistCreateError;
try {
var playlists = await _mopidyService.getPlaylists();
if (name.isNotEmpty) {
if (playlists.indexWhere((e) => e.name == name) != -1) {
if (context.mounted) {
showError(S.of(context).playlistAlreadyExistsError, null);
}
showError(playlistAlreadyExistsError, null);
} else {
await _mopidyService.renamePlaylist(pl, name);
}
}
} catch (e, s) {
Globals.logger.e(e, stackTrace: s);
if (context.mounted) {
showError(S.of(context).renamePlaylistCreateError, null);
}
showError(renamePlaylistCreateError, null);
}
}

Expand Down Expand Up @@ -189,4 +197,10 @@ class LibraryBrowserControllerImpl extends LibraryBrowserController {
selectionModeChanged.value = SelectionMode.off;
selectionChanged.value.isNotEmpty ? selectionChanged.value = SelectedItemPositions() : null;
}

@override
triggerRefresh() {
unselect();
_refresh$.add(null);
}
}
24 changes: 14 additions & 10 deletions lib/pages/browse/library_browser_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,15 @@ class _LibraryBrowserPageState extends State<LibraryBrowserPage> {
final mopidyService = GetIt.instance<MopidyService>();
final preferences = GetIt.instance<Preferences>();

var extendedCategoriesNames = ['Performers', 'Release Years', "Last Week's Updates", "Last Month's Updates"];
StreamSubscription? refreshSubscription;

_LibraryBrowserPageState() {
mopidyService.playlistsChangedNotifier.addListener(() {
updateItems();
});
}
var extendedCategoriesNames = ['Performers', 'Release Years', "Last Week's Updates", "Last Month's Updates"];

Future updateItems() async {
try {
showBusy = true;
setState(() {
showBusy = true;
});
if (widget.parent != null) {
parent = Ref.fromMap(Parameter.fromBase64(widget.parent!));
}
Expand All @@ -96,8 +94,9 @@ class _LibraryBrowserPageState extends State<LibraryBrowserPage> {
Globals.logger.e(e, stackTrace: s);
} finally {
if (mounted) {
showBusy = false;
setState(() {});
setState(() {
showBusy = false;
});
}
}
}
Expand All @@ -113,6 +112,11 @@ class _LibraryBrowserPageState extends State<LibraryBrowserPage> {
@override
void initState() {
super.initState();
refreshSubscription = libraryController.refresh$.listen((_) async {
await updateItems();
});

mopidyService.playlistsChangedNotifier.addListener(updateItems);
libraryController.selectionModeChanged.addListener(updateSelection);
libraryController.selectionChanged.addListener(updateSelection);
updateSelection();
Expand All @@ -121,7 +125,7 @@ class _LibraryBrowserPageState extends State<LibraryBrowserPage> {

@override
void dispose() {
mopidyService.playlistsChangedNotifier.removeListener(updateItems);
refreshSubscription?.cancel();
libraryController.selectionModeChanged.removeListener(updateSelection);
libraryController.selectionChanged.removeListener(updateSelection);
super.dispose();
Expand Down
7 changes: 7 additions & 0 deletions lib/pages/playlist/playlist_appbar_menu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,19 @@ class PlaylistAppBarMenu extends StatelessWidget {
}
}

void _refresh(BuildContext context, _, __) async {
controller.unselect();
List<Track> tracks = await controller.getPlaylistItems(playlist);
controller.playlistChangedNotifier.value = Playlist(playlist.uri, playlist.name, tracks, 0);
}

@override
Widget build(BuildContext context) {
return MenuBuilder()
.addMenuItem(S.of(context).menuSelectAll, Icons.select_all, _selectAll)
.addMenuItem(S.of(context).menuNewStream, Icons.cell_tower, _newStream)
.addMenuItem(S.of(context).menuClearList, Icons.delete, _deleteAll)
.addMenuItem(S.of(context).menuRefresh, Icons.refresh, _refresh)
.addDivider()
.addSettingsMenuItem(S.of(context).menuSettings)
.addHelpMenuItem(S.of(context).menuAbout)
Expand Down
9 changes: 3 additions & 6 deletions lib/pages/settings/preferences_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,7 @@ class _PreferencesState extends State<PreferencesPage> {

void postRetryError(_) {
if (_connectingController.retriesExceeded) {
if (context.mounted) {
showError(S.of(context).preferencesPageConnectErrorTitle, S.of(context).preferencesPageConnectErrorDetails);
}
showError(S.of(context).preferencesPageConnectErrorTitle, S.of(context).preferencesPageConnectErrorDetails);
}
}

Expand Down Expand Up @@ -126,6 +124,7 @@ class _PreferencesState extends State<PreferencesPage> {
TextButton(
onPressed: () async {
if (preferencesFormKey.currentState?.validate() ?? false) {
var preferencesPageSaveError = S.of(context).preferencesPageSaveError;
try {
preferences.appLocale = newLocale ?? preferences.appLocale;
await save();
Expand All @@ -138,9 +137,7 @@ class _PreferencesState extends State<PreferencesPage> {
}
Globals.applicationRoutes.gotoHome();
} catch (e) {
if (context.mounted) {
showError(S.of(context).preferencesPageSaveError, null);
}
showError(preferencesPageSaveError, null);
}
}
},
Expand Down
9 changes: 9 additions & 0 deletions lib/pages/tracklist/tracklist_appbar_menu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,21 @@ class TracklistAppBarMenu extends StatelessWidget {
}
}

void _refresh(BuildContext context, _, __) async {
controller.unselect();
final mopidyService = GetIt.instance<MopidyService>();
mopidyService.tracklistChangedNotifier.value = await mopidyService.getTracklistTlTracks();
String? newState = await mopidyService.getPlaybackState();
mopidyService.playbackStateNotifier.value = PlaybackState('', newState!);
}

@override
Widget build(BuildContext context) {
return MenuBuilder()
.addMenuItem(S.of(context).menuSelectAll, Icons.select_all, _selectAll)
.addMenuItem(S.of(context).menuNewStream, Icons.cell_tower, _newStream)
.addMenuItem(S.of(context).menuClearList, Icons.delete, _deleteAll)
.addMenuItem(S.of(context).menuRefresh, Icons.refresh, _refresh)
.addDivider()
.addSettingsMenuItem(S.of(context).menuSettings)
.addHelpMenuItem(S.of(context).menuAbout)
Expand Down
Loading

0 comments on commit 06e5c1e

Please sign in to comment.