VideoDetailsFragment.java (7362B)
1 package de.nordgedanken.rpicms; 2 3 import java.io.IOException; 4 import java.net.URI; 5 import java.util.Collections; 6 import java.util.List; 7 8 import android.content.Context; 9 import android.content.Intent; 10 import android.graphics.Bitmap; 11 import android.graphics.drawable.Drawable; 12 import android.os.AsyncTask; 13 import android.os.Bundle; 14 import android.support.v17.leanback.app.BackgroundManager; 15 import android.support.v17.leanback.app.DetailsFragment; 16 import android.support.v17.leanback.widget.Action; 17 import android.support.v17.leanback.widget.ArrayObjectAdapter; 18 import android.support.v17.leanback.widget.ClassPresenterSelector; 19 import android.support.v17.leanback.widget.DetailsOverviewRow; 20 import android.support.v17.leanback.widget.DetailsOverviewRowPresenter; 21 import android.support.v17.leanback.widget.HeaderItem; 22 import android.support.v17.leanback.widget.ListRow; 23 import android.support.v17.leanback.widget.ListRowPresenter; 24 import android.support.v17.leanback.widget.OnActionClickedListener; 25 import android.support.v17.leanback.widget.OnItemClickedListener; 26 import android.support.v17.leanback.widget.Row; 27 import android.util.DisplayMetrics; 28 import android.util.Log; 29 import android.widget.Toast; 30 31 import com.squareup.picasso.Picasso; 32 import com.squareup.picasso.Target; 33 34 public class VideoDetailsFragment extends DetailsFragment { 35 private static final String TAG = "VideoDetailsFragment"; 36 37 private static final int ACTION_WATCH_TRAILER = 1; 38 private static final int ACTION_RENT = 2; 39 private static final int ACTION_BUY = 3; 40 41 private static final int DETAIL_THUMB_WIDTH = 274; 42 private static final int DETAIL_THUMB_HEIGHT = 274; 43 44 private static final int NUM_COLS = 10; 45 46 private static final String MOVIE = "Movie"; 47 48 private Movie selectedMovie; 49 50 private Drawable mDefaultBackground; 51 private Target mBackgroundTarget; 52 private DisplayMetrics mMetrics; 53 54 @Override 55 public void onCreate(Bundle savedInstanceState) { 56 Log.i(TAG, "onCreate DetailsFragment"); 57 super.onCreate(savedInstanceState); 58 59 BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity()); 60 backgroundManager.attach(getActivity().getWindow()); 61 mBackgroundTarget = new PicassoBackgroundManagerTarget(backgroundManager); 62 63 mDefaultBackground = getResources().getDrawable(R.drawable.default_background); 64 65 mMetrics = new DisplayMetrics(); 66 getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 67 68 selectedMovie = (Movie) getActivity().getIntent().getSerializableExtra(MOVIE); 69 new DetailRowBuilderTask().execute(selectedMovie); 70 71 setOnItemClickedListener(getDefaultItemClickedListener()); 72 updateBackground(selectedMovie.getBackgroundImageURI()); 73 74 } 75 76 private class DetailRowBuilderTask extends AsyncTask<Movie, Integer, DetailsOverviewRow> { 77 @Override 78 protected DetailsOverviewRow doInBackground(Movie... movies) { 79 selectedMovie = movies[0]; 80 81 DetailsOverviewRow row = new DetailsOverviewRow(selectedMovie); 82 try { 83 Bitmap poster = Picasso.with(getActivity()) 84 .load(selectedMovie.getCardImageUrl()) 85 .resize(dpToPx(DETAIL_THUMB_WIDTH, getActivity().getApplicationContext()), 86 dpToPx(DETAIL_THUMB_HEIGHT, getActivity().getApplicationContext())) 87 .centerCrop() 88 .get(); 89 row.setImageBitmap(getActivity(), poster); 90 } catch (IOException e) { 91 } 92 93 row.addAction(new Action(ACTION_WATCH_TRAILER, getResources().getString( 94 R.string.watch_trailer_1), getResources().getString(R.string.watch_trailer_2))); 95 row.addAction(new Action(ACTION_RENT, getResources().getString(R.string.rent_1), 96 getResources().getString(R.string.rent_2))); 97 row.addAction(new Action(ACTION_BUY, getResources().getString(R.string.buy_1), 98 getResources().getString(R.string.buy_2))); 99 return row; 100 } 101 102 @Override 103 protected void onPostExecute(DetailsOverviewRow detailRow) { 104 ClassPresenterSelector ps = new ClassPresenterSelector(); 105 DetailsOverviewRowPresenter dorPresenter = 106 new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter()); 107 // set detail background and style 108 dorPresenter.setBackgroundColor(getResources().getColor(R.color.detail_background)); 109 dorPresenter.setStyleLarge(true); 110 dorPresenter.setOnActionClickedListener(new OnActionClickedListener() { 111 @Override 112 public void onActionClicked(Action action) { 113 if (action.getId() == ACTION_WATCH_TRAILER) { 114 Intent intent = new Intent(getActivity(), PlayerActivity.class); 115 intent.putExtra(getResources().getString(R.string.movie), selectedMovie); 116 intent.putExtra(getResources().getString(R.string.should_start), true); 117 startActivity(intent); 118 } 119 else { 120 Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show(); 121 } 122 } 123 }); 124 125 ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter); 126 ps.addClassPresenter(ListRow.class, 127 new ListRowPresenter()); 128 129 ArrayObjectAdapter adapter = new ArrayObjectAdapter(ps); 130 adapter.add(detailRow); 131 132 String subcategories[] = { 133 getString(R.string.related_movies) 134 }; 135 List<Movie> list = MovieList.list; 136 Collections.shuffle(list); 137 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter()); 138 for (int j = 0; j < NUM_COLS; j++) { 139 listRowAdapter.add(list.get(j % 5)); 140 } 141 142 HeaderItem header = new HeaderItem(0, subcategories[0], null); 143 adapter.add(new ListRow(header, listRowAdapter)); 144 145 setAdapter(adapter); 146 } 147 148 } 149 150 protected OnItemClickedListener getDefaultItemClickedListener() { 151 return new OnItemClickedListener() { 152 @Override 153 public void onItemClicked(Object item, Row row) { 154 if (item instanceof Movie) { 155 Movie movie = (Movie) item; 156 Intent intent = new Intent(getActivity(), DetailsActivity.class); 157 intent.putExtra(MOVIE, movie); 158 startActivity(intent); 159 } 160 } 161 }; 162 } 163 164 protected void updateBackground(URI uri) { 165 Log.d(TAG, "uri" + uri); 166 Log.d(TAG, "metrics" + mMetrics.toString()); 167 Picasso.with(getActivity()) 168 .load(uri.toString()) 169 .resize(mMetrics.widthPixels, mMetrics.heightPixels) 170 .error(mDefaultBackground) 171 .into(mBackgroundTarget); 172 } 173 174 public static int dpToPx(int dp, Context ctx) { 175 float density = ctx.getResources().getDisplayMetrics().density; 176 return Math.round((float) dp * density); 177 } 178 }