- Add context cancellation to WidgetPool cleanup goroutine - Properly stop ticker when context is canceled - Add BackgroundContext() getter method to App for context access - Pass application context to NewWidgetPool for lifecycle management This fixes a resource leak where the cleanup goroutine would run indefinitely without any way to stop it, preventing proper cleanup on application shutdown.
76 lines
3.2 KiB
Go
76 lines
3.2 KiB
Go
package browsing
|
|
|
|
import (
|
|
"github.com/dweymouth/supersonic/backend"
|
|
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
|
"github.com/dweymouth/supersonic/ui/controller"
|
|
"github.com/dweymouth/supersonic/ui/util"
|
|
)
|
|
|
|
type NavigationHandler interface {
|
|
SetPage(Page)
|
|
CurrentPage() controller.Route
|
|
}
|
|
|
|
type Router struct {
|
|
App *backend.App
|
|
Controller *controller.Controller
|
|
Nav NavigationHandler
|
|
widgetPool *util.WidgetPool
|
|
|
|
OnNavigateTo func(controller.Route)
|
|
}
|
|
|
|
func NewRouter(app *backend.App, controller *controller.Controller, nav NavigationHandler) Router {
|
|
r := Router{
|
|
App: app,
|
|
Controller: controller,
|
|
Nav: nav,
|
|
widgetPool: util.NewWidgetPool(app.BackgroundContext()),
|
|
}
|
|
return r
|
|
}
|
|
|
|
func (r Router) CreatePage(rte controller.Route) Page {
|
|
_, canRate := r.App.ServerManager.Server.(mediaprovider.SupportsRating)
|
|
_, canShare := r.App.ServerManager.Server.(mediaprovider.SupportsSharing)
|
|
switch rte.Page {
|
|
case controller.Album:
|
|
return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller)
|
|
case controller.Albums:
|
|
return NewAlbumsPage(&r.App.Config.AlbumsPage, r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
|
|
case controller.Artist:
|
|
return NewArtistPage(rte.Arg, &r.App.Config.ArtistPage, r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller)
|
|
case controller.Artists:
|
|
return NewArtistsPage(&r.App.Config.ArtistsPage, r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
|
|
case controller.Favorites:
|
|
return NewFavoritesPage(&r.App.Config.FavoritesPage, r.widgetPool, r.Controller, r.App.ServerManager.Server, r.App.PlaybackManager, r.App.ImageManager)
|
|
case controller.Genre:
|
|
return NewGenrePage(rte.Arg, &r.App.Config.AlbumsPage, r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
|
|
case controller.Genres:
|
|
return NewGenresPage(r.Controller, r.App.ServerManager.Server)
|
|
case controller.NowPlaying:
|
|
return NewNowPlayingPage(&r.App.Config.NowPlayingConfig, r.Controller, r.widgetPool, r.App.ServerManager, r.App.LyricsManager, r.App.ImageManager, r.App.PlaybackManager, r.App.ServerManager.Server, canRate, canShare, r.App.Config)
|
|
case controller.Playlist:
|
|
return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager)
|
|
case controller.Playlists:
|
|
return NewPlaylistsPage(r.Controller, r.widgetPool, &r.App.Config.PlaylistsPage, r.App.ServerManager.Server)
|
|
case controller.Tracks:
|
|
return NewTracksPage(r.Controller, &r.App.Config.TracksPage, r.widgetPool, r.App.ServerManager.Server, r.App.ImageManager)
|
|
case controller.Radios:
|
|
var rp mediaprovider.RadioProvider
|
|
rp, _ = r.App.ServerManager.Server.(mediaprovider.RadioProvider)
|
|
return NewRadiosPage(r.Controller, rp, r.App.PlaybackManager)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r *Router) NavigateTo(rte controller.Route) {
|
|
if rte != r.Nav.CurrentPage() {
|
|
r.Nav.SetPage(r.CreatePage(rte))
|
|
}
|
|
if r.OnNavigateTo != nil {
|
|
r.OnNavigateTo(rte)
|
|
}
|
|
}
|