/* == This file is part of Tomahawk Player - <http://tomahawk-player.org> === * * Copyright 2016, Enno Gottschalk <mrmaffen@googlemail.com> * * Tomahawk 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 * (at your option) any later version. * * Tomahawk 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 Tomahawk. If not, see <http://www.gnu.org/licenses/>. */ package org.tomahawk.tomahawk_android.fragments; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.jdeferred.DoneCallback; import org.jdeferred.Promise; import org.jdeferred.android.AndroidDeferredManager; import org.jdeferred.multiple.MultipleResults; import org.tomahawk.libtomahawk.collection.Album; import org.tomahawk.libtomahawk.collection.Artist; import org.tomahawk.libtomahawk.collection.Playlist; import org.tomahawk.libtomahawk.infosystem.charts.ScriptChartsManager; import org.tomahawk.libtomahawk.infosystem.charts.ScriptChartsProvider; import org.tomahawk.libtomahawk.infosystem.charts.ScriptChartsResult; import org.tomahawk.libtomahawk.resolver.PipeLine; import org.tomahawk.libtomahawk.resolver.Query; import org.tomahawk.tomahawk_android.utils.FragmentInfo; import android.os.Bundle; import android.support.v4.util.Pair; import android.view.View; import java.util.ArrayList; import java.util.List; public class ChartsPagerFragment extends PagerFragment { public static final String CHARTSPROVIDER_ID = "chartsprovider_id"; public static final String CHARTSPROVIDER_COUNTRYCODE = "chartsprovider_countrycode"; private static final String CHARTS_PLAYLIST_SUFFX = "_charts_"; private ScriptChartsProvider mChartsProvider; /** * Called, when this {@link ChartsPagerFragment}'s {@link View} has been created */ @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); final String countryCode; if (getArguments().containsKey(CHARTSPROVIDER_ID)) { String chartsProviderId = getArguments().getString(CHARTSPROVIDER_ID); mChartsProvider = ScriptChartsManager.get().getScriptChartsProvider(chartsProviderId); if (mChartsProvider == null) { getActivity().getSupportFragmentManager().popBackStack(); return; } } else { throw new RuntimeException("No CHARTSPROVIDER_ID provided to ChartsPagerFragment"); } if (getArguments().containsKey(CHARTSPROVIDER_COUNTRYCODE)) { countryCode = getArguments().getString(CHARTSPROVIDER_COUNTRYCODE); if (countryCode == null) { getActivity().getSupportFragmentManager().popBackStack(); return; } } else { throw new RuntimeException( "No CHARTSPROVIDER_COUNTRYCODE provided to ChartsPagerFragment"); } showContentHeader(mChartsProvider.getScriptAccount().getIconBackgroundPath()); mChartsProvider.getTypes().done(new DoneCallback<List<Pair<String, String>>>() { @Override public void onDone(List<Pair<String, String>> types) { List<Promise> promises = new ArrayList<>(); for (Pair<String, String> type : types) { promises.add(mChartsProvider.getCharts(countryCode, type.second)); } showCharts(types, promises); } }); } private void showCharts(final List<Pair<String, String>> types, List<Promise> promises) { AndroidDeferredManager deferredManager = new AndroidDeferredManager(); deferredManager.when(promises.toArray(new Promise[promises.size()])).done( new DoneCallback<MultipleResults>() { @Override public void onDone(MultipleResults multipleResults) { List<FragmentInfoList> fragmentInfoLists = new ArrayList<>(); for (int i = 0; i < multipleResults.size(); i++) { Object object = multipleResults.get(i).getResult(); if (object instanceof ScriptChartsResult) { ScriptChartsResult chartsResult = (ScriptChartsResult) object; FragmentInfoList fragmentInfoList = new FragmentInfoList(); FragmentInfo fragmentInfo = new FragmentInfo(); fragmentInfo.mBundle = getChildFragmentBundle(); fragmentInfo.mTitle = types.get(i).first; if (chartsResult.contentType == PipeLine.URL_TYPE_ARTIST) { fragmentInfo.mClass = ArtistsFragment.class; ArrayList<String> artistKeys = parseArtistCharts(chartsResult); fragmentInfo.mBundle.putStringArrayList( TomahawkFragment.ARTISTARRAY, artistKeys); } else if (chartsResult.contentType == PipeLine.URL_TYPE_ALBUM) { fragmentInfo.mClass = AlbumsFragment.class; ArrayList<String> albumKeys = parseAlbumCharts(chartsResult); fragmentInfo.mBundle.putStringArrayList( TomahawkFragment.ALBUMARRAY, albumKeys); } else if (chartsResult.contentType == PipeLine.URL_TYPE_TRACK) { fragmentInfo.mClass = PlaylistEntriesFragment.class; Playlist pl = parseTrackCharts(chartsResult, types.get(i).second); fragmentInfo.mBundle.putString( TomahawkFragment.PLAYLIST, pl.getCacheKey()); } fragmentInfoList.addFragmentInfo(fragmentInfo); fragmentInfoLists.add(fragmentInfoList); } } setupPager(fragmentInfoLists, 0, null, 2); } }); } private Playlist parseTrackCharts(ScriptChartsResult chartsResult, String type) { List<Query> queries = new ArrayList<>(); for (JsonObject rawTrack : chartsResult.results) { JsonElement artist = rawTrack.get("artist"); JsonElement album = rawTrack.get("album"); JsonElement track = rawTrack.get("track"); if (artist != null && album != null && track != null) { String artistName = artist.getAsString(); String albumName = album.getAsString(); String trackName = track.getAsString(); queries.add(Query.get(trackName, albumName, artistName, false)); } } String id = mChartsProvider.getScriptAccount().getName() + CHARTS_PLAYLIST_SUFFX + type; String name = mChartsProvider.getScriptAccount().getName() + "_" + type; Playlist pl = Playlist.fromQueryList(id, name, null, queries); pl.setFilled(true); return pl; } private ArrayList<String> parseArtistCharts(ScriptChartsResult chartsResult) { ArrayList<String> artistKeys = new ArrayList<>(); for (JsonObject rawArtist : chartsResult.results) { JsonElement artist = rawArtist.get("artist"); if (artist != null) { String artistName = artist.getAsString(); artistKeys.add(Artist.get(artistName).getCacheKey()); } } return artistKeys; } private ArrayList<String> parseAlbumCharts(ScriptChartsResult chartsResult) { ArrayList<String> albumKeys = new ArrayList<>(); for (JsonObject rawAlbum : chartsResult.results) { JsonElement artist = rawAlbum.get("artist"); JsonElement album = rawAlbum.get("album"); if (artist != null && album != null) { String artistName = artist.getAsString(); Artist a = Artist.get(artistName); String albumName = album.getAsString(); albumKeys.add(Album.get(albumName, a).getCacheKey()); } } return albumKeys; } }