• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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