/*
* Copyright (C) 2015 Fastboot Mobile, LLC.
*
* This program 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.
*
* This program 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 this program;
* if not, see <http://www.gnu.org/licenses>.
*/
package com.fastbootmobile.encore.app.tv;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.DeadObjectException;
import android.os.RemoteException;
import android.support.v17.leanback.app.VerticalGridFragment;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ImageCardView;
import android.support.v17.leanback.widget.OnItemViewClickedListener;
import android.support.v17.leanback.widget.OnItemViewSelectedListener;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.support.v17.leanback.widget.VerticalGridPresenter;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.os.AsyncTaskCompat;
import android.util.Log;
import android.view.View;
import com.fastbootmobile.encore.app.R;
import com.fastbootmobile.encore.framework.PluginsLookup;
import com.fastbootmobile.encore.model.Album;
import com.fastbootmobile.encore.model.Artist;
import com.fastbootmobile.encore.providers.IMusicProvider;
import com.fastbootmobile.encore.providers.ProviderAggregator;
import com.fastbootmobile.encore.providers.ProviderConnection;
import java.util.ArrayList;
import java.util.List;
public class TvEntityGridFragment extends VerticalGridFragment {
private static final String TAG = "VerticalGridFragment";
private static final int NUM_COLUMNS = 5;
private ArrayObjectAdapter mAdapter;
private int mMode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMode = getActivity().getIntent().getIntExtra(TvEntityGridActivity.EXTRA_MODE,
TvEntityGridActivity.MODE_ALBUM);
setTitle(getString(mMode == TvEntityGridActivity.MODE_ALBUM ? R.string.tab_albums : R.string.tab_artists));
setSearchAffordanceColor(getResources().getColor(R.color.primary_dark));
setupFragment();
if (mMode == TvEntityGridActivity.MODE_ALBUM) {
AsyncTaskCompat.executeParallel(new GetAlbumsTask());
} else if (mMode == TvEntityGridActivity.MODE_ARTIST) {
AsyncTaskCompat.executeParallel(new GetArtistsTask());
}
}
private void setupFragment() {
VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
gridPresenter.setNumberOfColumns(NUM_COLUMNS);
setGridPresenter(gridPresenter);
mAdapter = new ArrayObjectAdapter(new CardPresenter());
setAdapter(mAdapter);
setOnSearchClickedListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), TvSearchActivity.class);
startActivity(intent);
}
});
setOnItemViewClickedListener(new ItemViewClickedListener());
setOnItemViewSelectedListener(new ItemViewSelectedListener());
}
private final class ItemViewClickedListener implements OnItemViewClickedListener {
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
if (item instanceof Album) {
Album album = (Album) item;
Intent intent = new Intent(getActivity(), TvAlbumDetailsActivity.class);
intent.putExtra(TvAlbumDetailsActivity.EXTRA_ALBUM, album);
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(),
((ImageCardView) itemViewHolder.view).getMainImageView(),
TvAlbumDetailsActivity.SHARED_ELEMENT_NAME).toBundle();
getActivity().startActivity(intent, bundle);
} else if (item instanceof Artist) {
Artist artist = (Artist) item;
Intent intent = new Intent(getActivity(), TvArtistDetailsActivity.class);
intent.putExtra(TvArtistDetailsActivity.EXTRA_ARTIST, artist);
Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(),
((ImageCardView) itemViewHolder.view).getMainImageView(),
TvArtistDetailsActivity.SHARED_ELEMENT_NAME).toBundle();
getActivity().startActivity(intent, bundle);
}
}
}
private final class ItemViewSelectedListener implements OnItemViewSelectedListener {
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
}
}
private class GetAlbumsTask extends AsyncTask<Void, Void, List<Album>> {
@Override
protected List<Album> doInBackground(Void... params) {
List<Album> outputList = new ArrayList<>();
List<Album> cachedAlbums = ProviderAggregator.getDefault().getCache().getAllAlbums();
for (Album album : cachedAlbums) {
outputList.add(ProviderAggregator.getDefault().retrieveAlbum(album.getRef(),
album.getProvider()));
}
return outputList;
}
@Override
protected void onPostExecute(List<Album> albums) {
mAdapter.addAll(0, albums);
mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
}
}
private class GetArtistsTask extends AsyncTask<Void, Void, List<Artist>> {
@Override
protected List<Artist> doInBackground(Void... params) {
List<ProviderConnection> providers = PluginsLookup.getDefault().getAvailableProviders();
final List<Artist> artists = new ArrayList<>();
for (ProviderConnection providerConnection : providers) {
try {
IMusicProvider provider = providerConnection.getBinder();
if (provider != null) {
List<Artist> providerArtists = provider.getArtists();
if (providerArtists != null) {
artists.addAll(providerArtists);
}
}
} catch (DeadObjectException e) {
Log.e(TAG, "Provider died while getting artists");
} catch (RemoteException e) {
Log.w(TAG, "Cannot get artists from a provider", e);
}
}
return artists;
}
@Override
protected void onPostExecute(List<Artist> artists) {
mAdapter.addAll(0, artists);
mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
}
}
}