package com.ptrprograms.androidtvmediaplayer.Fragment;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v17.leanback.app.BackgroundManager;
import android.support.v17.leanback.app.DetailsFragment;
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.support.v17.leanback.widget.DetailsOverviewRow;
import android.support.v17.leanback.widget.DetailsOverviewRowPresenter;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.OnActionClickedListener;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.ptrprograms.androidtvmediaplayer.Activity.PlayerActivity;
import com.ptrprograms.androidtvmediaplayer.Model.Movie;
import com.ptrprograms.androidtvmediaplayer.Presenter.CardPresenter;
import com.ptrprograms.androidtvmediaplayer.Presenter.DetailsDescriptionPresenter;
import com.ptrprograms.androidtvmediaplayer.R;
import com.ptrprograms.androidtvmediaplayer.Util.PicassoBackgroundManagerTarget;
import com.ptrprograms.androidtvmediaplayer.Util.Utils;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import java.io.IOException;
import java.lang.reflect.Type;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
public class VideoDetailsFragment extends DetailsFragment {
public static final String EXTRA_MOVIE = "extra_movie";
public static final String EXTRA_SHOULD_AUTO_START = "extra_should_auto_start";
private static final int ACTION_WATCH = 1;
private Movie mSelectedMovie;
private Target mBackgroundTarget;
private DisplayMetrics mMetrics;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSelectedMovie = (Movie) getActivity().getIntent().getSerializableExtra( EXTRA_MOVIE );
initBackground();
new DetailRowBuilderTask().execute( mSelectedMovie );
}
private void initBackground() {
BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity());
backgroundManager.attach(getActivity().getWindow());
mBackgroundTarget = new PicassoBackgroundManagerTarget( backgroundManager );
mMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
if( mSelectedMovie != null && !TextUtils.isEmpty( mSelectedMovie.getBackgroundImageUrl() ) ) {
try {
updateBackground(new URI(mSelectedMovie.getBackgroundImageUrl()));
} catch (URISyntaxException e) { }
}
}
protected void updateBackground(URI uri) {
if( uri.toString() == null ) {
try {
uri = new URI("");
} catch( URISyntaxException e ) {}
}
Picasso.with(getActivity())
.load( uri.toString() )
.error( getResources().getDrawable( R.drawable.default_background ) )
.resize( mMetrics.widthPixels, mMetrics.heightPixels )
.into( mBackgroundTarget );
}
private class DetailRowBuilderTask extends AsyncTask<Movie, Integer, DetailsOverviewRow> {
@Override
protected DetailsOverviewRow doInBackground( Movie... movies ) {
mSelectedMovie = movies[0];
DetailsOverviewRow row = null;
try {
row = new DetailsOverviewRow( mSelectedMovie );
Bitmap poster = Picasso.with( getActivity() )
.load( mSelectedMovie.getCardImageUrl() )
.resize(Utils.dpToPx( getActivity().getResources().getInteger( R.integer.detail_thumbnail_square_size ), getActivity().getApplicationContext() ),
Utils.dpToPx( getActivity().getResources().getInteger( R.integer.detail_thumbnail_square_size ), getActivity().getApplicationContext() ) )
.centerCrop()
.get();
row.setImageBitmap( getActivity(), poster );
} catch ( IOException e ) {
getActivity().finish();
return null;
} catch( NullPointerException e ) {
getActivity().finish();
return null;
}
row.addAction( new Action( ACTION_WATCH, getResources().getString(
R.string.watch ), getResources().getString( R.string.watch_subtext) ) );
return row;
}
@Override
protected void onPostExecute( DetailsOverviewRow detailRow ) {
if( detailRow == null )
return;
ClassPresenterSelector ps = new ClassPresenterSelector();
DetailsOverviewRowPresenter dorPresenter =
new DetailsOverviewRowPresenter( new DetailsDescriptionPresenter() );
// set detail background and style
dorPresenter.setBackgroundColor( getResources().getColor( R.color.detail_background ) );
dorPresenter.setStyleLarge( true );
dorPresenter.setOnActionClickedListener( new OnActionClickedListener() {
@Override
public void onActionClicked( Action action ) {
if (action.getId() == ACTION_WATCH ) {
Intent intent = new Intent( getActivity(), PlayerActivity.class );
intent.putExtra( EXTRA_MOVIE, mSelectedMovie );
intent.putExtra( EXTRA_SHOULD_AUTO_START, true );
startActivity( intent );
}
}
});
ps.addClassPresenter( DetailsOverviewRow.class, dorPresenter );
ps.addClassPresenter( ListRow.class,
new ListRowPresenter() );
ArrayObjectAdapter adapter = new ArrayObjectAdapter( ps );
adapter.add( detailRow );
loadRelatedMedia( adapter );
setAdapter( adapter );
}
private void loadRelatedMedia( ArrayObjectAdapter adapter ) {
String json = Utils.loadJSONFromResource( getActivity(), R.raw.movies );
Gson gson = new Gson();
Type collection = new TypeToken<ArrayList<Movie>>(){}.getType();
List<Movie> movies = gson.fromJson( json, collection );
List<Movie> related = new ArrayList<Movie>();
for( Movie movie : movies ) {
if( movie.getCategory().equals( mSelectedMovie.getCategory() ) ) {
related.add( movie );
}
}
if( related.isEmpty() )
return;
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( new CardPresenter() );
for( Movie movie : related ) {
listRowAdapter.add( movie );
}
HeaderItem header = new HeaderItem( 0, "Related", null );
adapter.add( new ListRow( header, listRowAdapter ) );
}
}
}