1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the License 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11 * or implied. See the License for the specific language governing permissions and limitations under 12 * the License. 13 */ 14 15 package com.example.android.leanback; 16 17 import android.content.Intent; 18 import android.graphics.Bitmap; 19 import android.graphics.drawable.Drawable; 20 import android.os.AsyncTask; 21 import android.os.Bundle; 22 import android.support.v17.leanback.app.BackgroundManager; 23 import android.support.v17.leanback.app.DetailsFragment; 24 import android.support.v17.leanback.widget.Action; 25 import android.support.v17.leanback.widget.ArrayObjectAdapter; 26 import android.support.v17.leanback.widget.ClassPresenterSelector; 27 import android.support.v17.leanback.widget.DetailsOverviewRow; 28 import android.support.v17.leanback.widget.DetailsOverviewRowPresenter; 29 import android.support.v17.leanback.widget.HeaderItem; 30 import android.support.v17.leanback.widget.ListRow; 31 import android.support.v17.leanback.widget.ListRowPresenter; 32 import android.support.v17.leanback.widget.OnActionClickedListener; 33 import android.support.v17.leanback.widget.OnItemClickedListener; 34 import android.support.v17.leanback.widget.Row; 35 import android.util.DisplayMetrics; 36 import android.util.Log; 37 import android.widget.Toast; 38 39 import com.squareup.picasso.Picasso; 40 import com.squareup.picasso.Target; 41 42 import java.io.IOException; 43 import java.net.URI; 44 import java.util.HashMap; 45 import java.util.List; 46 import java.util.Map; 47 48 /* 49 * LeanbackDetailsFragment extends DetailsFragment, a Wrapper fragment for leanback details screens. 50 * It shows a detailed view of video and its meta plus related videos. 51 */ 52 public class LeanbackDetailsFragment extends DetailsFragment { 53 private static final String TAG = "DetailsFragment"; 54 55 private static final int ACTION_WATCH_TRAILER = 1; 56 private static final int ACTION_RENT = 2; 57 private static final int ACTION_BUY = 3; 58 59 private static final int DETAIL_THUMB_WIDTH = 274; 60 private static final int DETAIL_THUMB_HEIGHT = 274; 61 62 private Movie selectedMovie; 63 64 private Drawable mDefaultBackground; 65 private Target mBackgroundTarget; 66 private DisplayMetrics mMetrics; 67 68 @Override onCreate(Bundle savedInstanceState)69 public void onCreate(Bundle savedInstanceState) { 70 Log.i(TAG, "onCreate DetailsFragment"); 71 super.onCreate(savedInstanceState); 72 73 BackgroundManager backgroundManager = BackgroundManager.getInstance(getActivity()); 74 backgroundManager.attach(getActivity().getWindow()); 75 mBackgroundTarget = new PicassoBackgroundManagerTarget(backgroundManager); 76 77 mDefaultBackground = getResources().getDrawable(R.drawable.default_background); 78 79 mMetrics = new DisplayMetrics(); 80 getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 81 82 selectedMovie = (Movie) getActivity().getIntent().getSerializableExtra("Movie"); 83 Log.d(TAG, "DetailsActivity movie: " + selectedMovie.toString()); 84 new DetailRowBuilderTask().execute(selectedMovie); 85 86 setOnItemClickedListener(getDefaultItemClickedListener()); 87 updateBackground(selectedMovie.getBackgroundImageURI()); 88 } 89 90 private class DetailRowBuilderTask extends AsyncTask<Movie, Integer, DetailsOverviewRow> { 91 @Override doInBackground(Movie... movies)92 protected DetailsOverviewRow doInBackground(Movie... movies) { 93 selectedMovie = movies[0]; 94 95 Log.d(TAG, "doInBackground: " + selectedMovie.toString()); 96 DetailsOverviewRow row = new DetailsOverviewRow(selectedMovie); 97 try { 98 Bitmap poster = Picasso.with(getActivity()) 99 .load(selectedMovie.getCardImageUrl()) 100 .resize(Utils.dpToPx(DETAIL_THUMB_WIDTH, getActivity() 101 .getApplicationContext()), 102 Utils.dpToPx(DETAIL_THUMB_HEIGHT, getActivity() 103 .getApplicationContext())) 104 .centerCrop() 105 .get(); 106 row.setImageBitmap(getActivity(), poster); 107 } catch (IOException e) { 108 } 109 110 row.addAction(new Action(ACTION_WATCH_TRAILER, getResources().getString( 111 R.string.watch_trailer_1), getResources().getString(R.string.watch_trailer_2))); 112 row.addAction(new Action(ACTION_RENT, getResources().getString(R.string.rent_1), 113 getResources().getString(R.string.rent_2))); 114 row.addAction(new Action(ACTION_BUY, getResources().getString(R.string.buy_1), 115 getResources().getString(R.string.buy_2))); 116 return row; 117 } 118 119 @Override onPostExecute(DetailsOverviewRow detailRow)120 protected void onPostExecute(DetailsOverviewRow detailRow) { 121 ClassPresenterSelector ps = new ClassPresenterSelector(); 122 DetailsOverviewRowPresenter dorPresenter = 123 new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter()); 124 // set detail background and style 125 dorPresenter.setBackgroundColor(getResources().getColor(R.color.detail_background)); 126 dorPresenter.setStyleLarge(true); 127 dorPresenter.setOnActionClickedListener(new OnActionClickedListener() { 128 @Override 129 public void onActionClicked(Action action) { 130 if (action.getId() == ACTION_WATCH_TRAILER) { 131 Intent intent = new Intent(getActivity(), PlayerActivity.class); 132 intent.putExtra(getResources().getString(R.string.movie), selectedMovie); 133 intent.putExtra(getResources().getString(R.string.should_start), true); 134 startActivity(intent); 135 } 136 else { 137 Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show(); 138 } 139 } 140 }); 141 142 ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter); 143 ps.addClassPresenter(ListRow.class, 144 new ListRowPresenter()); 145 146 ArrayObjectAdapter adapter = new ArrayObjectAdapter(ps); 147 adapter.add(detailRow); 148 149 String subcategories[] = { 150 getString(R.string.related_movies) 151 }; 152 HashMap<String, List<Movie>> movies = VideoProvider.getMovieList(); 153 154 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter()); 155 for (Map.Entry<String, List<Movie>> entry : movies.entrySet()) 156 { 157 if (selectedMovie.getCategory().indexOf(entry.getKey()) >= 0) { 158 List<Movie> list = entry.getValue(); 159 for (int j = 0; j < list.size(); j++) { 160 listRowAdapter.add(list.get(j)); 161 } 162 } 163 } 164 HeaderItem header = new HeaderItem(0, subcategories[0], null); 165 adapter.add(new ListRow(header, listRowAdapter)); 166 167 setAdapter(adapter); 168 } 169 170 } 171 getDefaultItemClickedListener()172 protected OnItemClickedListener getDefaultItemClickedListener() { 173 return new OnItemClickedListener() { 174 @Override 175 public void onItemClicked(Object item, Row row) { 176 if (item instanceof Movie) { 177 Movie movie = (Movie) item; 178 Intent intent = new Intent(getActivity(), DetailsActivity.class); 179 intent.putExtra(getResources().getString(R.string.movie), movie); 180 startActivity(intent); 181 } 182 } 183 }; 184 } 185 186 protected void updateBackground(URI uri) { 187 Picasso.with(getActivity()) 188 .load(uri.toString()) 189 .resize(mMetrics.widthPixels, mMetrics.heightPixels) 190 .error(mDefaultBackground) 191 .into(mBackgroundTarget); 192 } 193 } 194