/* * Copyright 2008-2013, ETH Zürich, Samuel Welten, Michael Kuhn, Tobias Langner, * Sandro Affentranger, Lukas Bossard, Michael Grob, Rahul Jain, * Dominic Langenegger, Sonia Mayor Alonso, Roger Odermatt, Tobias Schlueter, * Yannick Stucki, Sebastian Wendland, Samuel Zehnder, Samuel Zihlmann, * Samuel Zweifel * * This file is part of Jukefox. * * Jukefox is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or any later version. Jukefox is * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * Jukefox. If not, see <http://www.gnu.org/licenses/>. */ package ch.ethz.dcg.pancho3.tablet; import java.util.List; import android.app.Fragment; import android.view.LayoutInflater; import android.view.ViewConfiguration; import ch.ethz.dcg.jukefox.commons.Constants; import ch.ethz.dcg.jukefox.controller.player.AndroidPlayerController; import ch.ethz.dcg.jukefox.manager.AndroidSettingsManager; import ch.ethz.dcg.jukefox.model.AndroidCollectionModelManager; import ch.ethz.dcg.jukefox.model.collection.BaseAlbum; import ch.ethz.dcg.jukefox.model.collection.BaseArtist; import ch.ethz.dcg.jukefox.model.collection.BaseSong; import ch.ethz.dcg.jukefox.model.collection.ListAlbum; import ch.ethz.dcg.jukefox.model.collection.PlaylistSong; import ch.ethz.dcg.jukefox.model.player.PlayModeType; import ch.ethz.dcg.jukefox.playmode.IPlayMode; import ch.ethz.dcg.jukefox.playmode.MagicPlayMode; import ch.ethz.dcg.pancho3.commons.settings.ISettingsReader; import ch.ethz.dcg.pancho3.controller.eventhandlers.TabletActivityEventListener; import ch.ethz.dcg.pancho3.controller.eventhandlers.TabletMapEventListener; import ch.ethz.dcg.pancho3.model.JukefoxApplication; import ch.ethz.dcg.pancho3.tablet.model.DataFetcher; import ch.ethz.dcg.pancho3.tablet.model.SelectionViewManager; import ch.ethz.dcg.pancho3.tablet.presenter.HistoryManager; import ch.ethz.dcg.pancho3.tablet.presenter.TabletPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.exploration.ArtistChooserPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.exploration.ExplorationPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.exploration.ValueSelector; import ch.ethz.dcg.pancho3.tablet.presenter.exploration.ArtistChooserPresenter.IArtistChooserView; import ch.ethz.dcg.pancho3.tablet.presenter.exploration.ExplorationPresenter.IExplorationView; import ch.ethz.dcg.pancho3.tablet.presenter.map.MapPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.AbstractOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.AlbumOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.AlbumsOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.AllSongsOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.ArtistOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.SearchOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.overlay.SongsOverlayPresenter; import ch.ethz.dcg.pancho3.tablet.presenter.queue.QueuePresenter; import ch.ethz.dcg.pancho3.tablet.view.DragManager; import ch.ethz.dcg.pancho3.tablet.view.TabletActivity; import ch.ethz.dcg.pancho3.tablet.view.ViewFactory; import ch.ethz.dcg.pancho3.tablet.view.exploration.ArtistChooserFragment; import ch.ethz.dcg.pancho3.tablet.view.lists.ArtistListAdapter; import ch.ethz.dcg.pancho3.tablet.view.lists.CachingImageAlbumListAdapter; import ch.ethz.dcg.pancho3.tablet.view.lists.ImageAlbumListAdapter; import ch.ethz.dcg.pancho3.tablet.view.lists.SongCursorAdapter; import ch.ethz.dcg.pancho3.tablet.view.lists.SongListAdapter; import ch.ethz.dcg.pancho3.tablet.view.overlay.CloudDrawer; import ch.ethz.dcg.pancho3.tablet.view.overlay.OverlayFragment; import ch.ethz.dcg.pancho3.tablet.view.queue.PlaylistAdapter; import ch.ethz.dcg.pancho3.tablet.widget.MagicListAdapter; import ch.ethz.dcg.pancho3.tablet.widget.PinnedHeaderListView; import ch.ethz.dcg.pancho3.tablet.widget.MagicListAdapter.MagicListInnerAdapter; import ch.ethz.dcg.pancho3.tablet.widget.MagicListAdapter.NewItemListener; import ch.ethz.dcg.pancho3.view.tabs.lists.TagCloudCreator; import ch.ethz.dcg.pancho3.view.tabs.opengl.MapRenderer; /** * A factory to create or obtain almost any object specific to the tablet * interface. One can obtain the factory through the the interface * {@link TabletFactoryGetter}. * * Other classes in the tablet package should not use any 'new' keywords to * instantiate classes that they can find in here. */ public class TabletFactory { private final TabletActivity activity; private final JukefoxApplication application; private final LayoutInflater layoutInflater; private final AndroidCollectionModelManager data; private final MagicPlayMode magicPlaylistController; private final ViewFactory viewFactory; private final TabletPresenter tabletPresenter; private final ExplorationPresenter explorationPresenter; private final QueuePresenter queuePresenter; private final MapPresenter mapPresenter; private final DataFetcher dataFetcher; private final ISettingsReader settings; private final DragManager dragManager; private final float screenDensityScale; private final I18nManager i18nManager; // Caches for pseudo singleton classes. private TabletActivityEventListener eventListener; private TabletMapEventListener mapEventListener; private CloudDrawer cloudDrawer; private AndroidPlayerController playerController; // TODO: comment private AbstractOverlayPresenter currentOverlayPresenter; public static interface TabletFactoryGetter { TabletFactory getTabletFactory(); boolean isTabletFactoryReady(); } public TabletFactory(TabletActivity activity, JukefoxApplication application) { this.activity = activity; this.application = application; this.layoutInflater = LayoutInflater.from(activity); this.data = JukefoxApplication.getCollectionModel(); i18nManager = new I18nManager(activity.getResources()); dataFetcher = new DataFetcher(data); screenDensityScale = activity.getResources().getDisplayMetrics().density; playerController = JukefoxApplication.getPlayerController(); IPlayMode playlistController = playerController.getPlayMode(); if (playlistController instanceof MagicPlayMode) { magicPlaylistController = (MagicPlayMode) playlistController; } else { playerController.setPlayMode(PlayModeType.MAGIC, 0, Constants.SAME_SONG_AVOIDANCE_NUM); magicPlaylistController = (MagicPlayMode) playerController.getPlayMode(); } HistoryManager historyManager = new HistoryManager(i18nManager); tabletPresenter = new TabletPresenter(activity, this, magicPlaylistController, historyManager); historyManager.setTabletPresenter(tabletPresenter); queuePresenter = new QueuePresenter(); tabletPresenter.setQueuePresenter(queuePresenter); explorationPresenter = new ExplorationPresenter(tabletPresenter, dataFetcher, new ValueSelector()); tabletPresenter.setExplorationPresenter(explorationPresenter); mapPresenter = new MapPresenter(data); playerController.addOnPlaylistStateChangeListener( mapPresenter); tabletPresenter.setMapPresenter(mapPresenter); settings = AndroidSettingsManager.getAndroidSettingsReader(); dragManager = new DragManager(dataFetcher, tabletPresenter, activity.getResources().getDisplayMetrics().density, ViewConfiguration.get(activity).getScaledPagingTouchSlop()); this.viewFactory = new ViewFactory(layoutInflater, dataFetcher, activity .getMenuInflater(), activity.getResources(), dragManager, screenDensityScale, i18nManager); dragManager.setViewFactory(viewFactory); } public SelectionViewManager createSelectionViewManager() { return new SelectionViewManager(activity); } public ImageAlbumListAdapter createImageAlbumListAdapter() { return new ImageAlbumListAdapter(activity, viewFactory); } public CachingImageAlbumListAdapter createCachingImageAlbumListAdapter() { return new CachingImageAlbumListAdapter(activity, viewFactory); } public ArtistListAdapter createArtistListAdapter(PinnedHeaderListView listView) { return new ArtistListAdapter(activity, viewFactory, listView); } public SongListAdapter createSongListAdapter() { return new SongListAdapter(activity, viewFactory); } public PlaylistAdapter createPlaylistAdapter() { PlaylistAdapter playlistAdapter = new PlaylistAdapter(viewFactory, magicPlaylistController); playlistAdapter.playlistChanged(playerController.getCurrentPlaylist()); return playlistAdapter; } public DragManager getDragManager() { return dragManager; } public ViewFactory getViewFactory() { return viewFactory; } public TabletActivityEventListener getEventListener() { if (eventListener == null) { eventListener = new TabletActivityEventListener(application.getController(), activity, tabletPresenter); } return eventListener; } public TabletPresenter getTabletPresenter() { return tabletPresenter; } public ISettingsReader getSettingsReader() { return settings; } public TabletMapEventListener getTabletMapEventListener(MapRenderer mapRenderer) { if (mapEventListener == null || !mapEventListener.containsSameMapRenderer(mapRenderer)) { mapEventListener = new TabletMapEventListener(application.getController(), activity, mapRenderer, tabletPresenter); } return mapEventListener; } public CloudDrawer getCloudDrawer() { if (cloudDrawer == null) { cloudDrawer = new CloudDrawer(activity.getResources()); } return cloudDrawer; } public MagicListAdapter<PlaylistSong<BaseArtist, BaseAlbum>> createMagicListAdapter( MagicListInnerAdapter<PlaylistSong<BaseArtist, BaseAlbum>> innerAdapter, NewItemListener newItemListener) { return new MagicListAdapter<PlaylistSong<BaseArtist, BaseAlbum>>(application, innerAdapter, newItemListener, dragManager); } public ExplorationPresenter getExplorationPresenter(IExplorationView listener) { explorationPresenter.setExplorationView(listener); return explorationPresenter; } public ExplorationPresenter getExplorationPresenter() { return explorationPresenter; } public QueuePresenter getQueuePresenter() { return queuePresenter; } public MapPresenter getMapPresenter() { return mapPresenter; } private AlbumOverlayPresenter createAlbumOverlayPresenter(OverlayFragment fragment, ListAlbum album, boolean needsMapNavigation, boolean needsExploreNavigation) { return new AlbumOverlayPresenter(tabletPresenter, magicPlaylistController, dataFetcher, fragment, viewFactory, album, createSongListAdapter(), needsMapNavigation, needsExploreNavigation, i18nManager); } private AlbumsOverlayPresenter createAlbumsOverlayPresenter(OverlayFragment fragment, List<? extends ListAlbum> albums) { return new AlbumsOverlayPresenter(tabletPresenter, magicPlaylistController, fragment, viewFactory, dataFetcher, albums, createSongListAdapter(), i18nManager); } private ArtistOverlayPresenter createArtistOverlayPresenter(OverlayFragment fragment, BaseArtist artist) { return new ArtistOverlayPresenter(tabletPresenter, magicPlaylistController, fragment, artist, viewFactory, dataFetcher, createSongListAdapter(), i18nManager); } private SongsOverlayPresenter createSongsOverlayPresenter(OverlayFragment fragment, List<BaseSong<BaseArtist, BaseAlbum>> songs) { return new SongsOverlayPresenter(tabletPresenter, magicPlaylistController, fragment, viewFactory, songs, createSongListAdapter(), i18nManager); } private AllSongsOverlayPresenter createAllSongsOverlayPresenter( OverlayFragment fragment) { return new AllSongsOverlayPresenter(tabletPresenter, magicPlaylistController, fragment, viewFactory, dataFetcher, createSongListAdapter(), i18nManager); } private SearchOverlayPresenter createSearchOverlayPresenter(OverlayFragment fragment) { return new SearchOverlayPresenter(tabletPresenter, magicPlaylistController, fragment, viewFactory, createSongCursorAdapter(), createSongListAdapter(), dataFetcher, i18nManager); } public AbstractOverlayPresenter getCurrentOverlayPresenter() { return currentOverlayPresenter; } public Fragment createOverlayFragment(List<? extends ListAlbum> albums) { OverlayFragment fragment = new OverlayFragment(); currentOverlayPresenter = createAlbumsOverlayPresenter(fragment, albums); return fragment; } public Fragment createOverlayFragment(ListAlbum album, boolean needsMapNavigation, boolean needsExploreNavigation) { OverlayFragment fragment = new OverlayFragment(); currentOverlayPresenter = createAlbumOverlayPresenter(fragment, album, needsMapNavigation, needsExploreNavigation); return fragment; } public Fragment createOverlayFragment(BaseArtist artist) { OverlayFragment fragment = new OverlayFragment(); currentOverlayPresenter = createArtistOverlayPresenter(fragment, artist); return fragment; } public Fragment createSongsOverlayFragment(List<BaseSong<BaseArtist, BaseAlbum>> songs) { OverlayFragment fragment = new OverlayFragment(); currentOverlayPresenter = createSongsOverlayPresenter(fragment, songs); return fragment; } public Fragment createOverlayFragment() { OverlayFragment fragment = new OverlayFragment(); currentOverlayPresenter = createAllSongsOverlayPresenter(fragment); return fragment; } public Fragment createSearchOverlayFragment() { OverlayFragment fragment = new OverlayFragment(); currentOverlayPresenter = createSearchOverlayPresenter(fragment); return fragment; } private SongCursorAdapter createSongCursorAdapter() { return new SongCursorAdapter(activity, viewFactory); } public ArtistChooserFragment createArtistChooserFragment() { return new ArtistChooserFragment(); } public TagCloudCreator createTagCloudCreator(int textSize) { return new TagCloudCreator(activity, textSize); } public ArtistChooserPresenter getArtistChooserPresenter(IArtistChooserView view) { return new ArtistChooserPresenter(view, explorationPresenter, dataFetcher); } public MagicPlayMode getMagicPlaylistController() { return magicPlaylistController; } }