NewDetailsFragment.java revision 0908efd712e79f77e0cf9307bd5c32753c855561
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 */
14package com.example.android.leanback;
15
16import android.content.Context;
17import android.content.Intent;
18import android.graphics.Bitmap;
19import android.os.Bundle;
20import android.os.Handler;
21import android.support.v17.leanback.app.DetailsBackgroundParallaxHelper;
22import android.support.v17.leanback.app.DetailsFragmentVideoHelper;
23import android.support.v17.leanback.app.MediaPlayerGlue;
24import android.support.v17.leanback.app.VideoFragment;
25import android.support.v17.leanback.widget.Action;
26import android.support.v17.leanback.widget.ArrayObjectAdapter;
27import android.support.v17.leanback.widget.ClassPresenterSelector;
28import android.support.v17.leanback.widget.DetailsOverviewRow;
29import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
30import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
31import android.support.v17.leanback.widget.HeaderItem;
32import android.support.v17.leanback.widget.ImageCardView;
33import android.support.v17.leanback.widget.ListRow;
34import android.support.v17.leanback.widget.ListRowPresenter;
35import android.support.v17.leanback.widget.OnActionClickedListener;
36import android.support.v17.leanback.widget.OnItemViewClickedListener;
37import android.support.v17.leanback.widget.OnItemViewSelectedListener;
38import android.support.v17.leanback.widget.Presenter;
39import android.support.v17.leanback.widget.Row;
40import android.support.v17.leanback.widget.RowPresenter;
41import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
42import android.support.v4.app.ActivityOptionsCompat;
43import android.support.v4.content.res.ResourcesCompat;
44import android.util.Log;
45import android.view.LayoutInflater;
46import android.view.View;
47import android.view.ViewGroup;
48import android.widget.Toast;
49
50public class NewDetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
51    private static final String TAG = "leanback.DetailsFragment";
52    private static final String ITEM = "item";
53
54    private static final int NUM_ROWS = 3;
55    private ArrayObjectAdapter mRowsAdapter;
56    private PhotoItem mPhotoItem;
57    final CardPresenter cardPresenter = new CardPresenter();
58
59    private static final int ACTION_PLAY = 1;
60    private static final int ACTION_RENT = 2;
61    private static final int ACTION_BUY = 3;
62
63    private boolean TEST_OVERVIEW_ROW_ON_SECOND;
64    private boolean TEST_SHARED_ELEMENT_TRANSITION;
65    private boolean TEST_ENTRANCE_TRANSITION;
66
67    private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
68    private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
69
70    private Action mActionPlay;
71    private Action mActionRent;
72    private Action mActionBuy;
73
74    private FullWidthDetailsOverviewSharedElementHelper mHelper;
75    private DetailsBackgroundParallaxHelper mParallaxHelper;
76    private DetailsFragmentVideoHelper mVideoHelper;
77    private BackgroundHelper mBackgroundHelper;
78    private int mBitmapMinVerticalOffset = -100;
79    private MediaPlayerGlue mMediaPlayerGlue;
80    private VideoFragment mVideoFragment;
81
82    private void initializeTest() {
83        TEST_SHARED_ELEMENT_TRANSITION = null != getActivity().getWindow()
84                .getSharedElementEnterTransition();
85        TEST_OVERVIEW_ROW_ON_SECOND = !TEST_SHARED_ELEMENT_TRANSITION;
86        TEST_ENTRANCE_TRANSITION = true;
87    }
88
89    @Override
90    public void onCreate(Bundle savedInstanceState) {
91        Log.i(TAG, "onCreate");
92        super.onCreate(savedInstanceState);
93        initializeTest();
94
95        mBackgroundHelper = new BackgroundHelper(getActivity());
96        mParallaxHelper = new DetailsBackgroundParallaxHelper.ParallaxBuilder(
97                getActivity(), getParallaxManager())
98                .setCoverImageMinVerticalOffset(mBitmapMinVerticalOffset)
99                .build();
100        mMediaPlayerGlue = new MediaPlayerGlue(getActivity(), null);
101        mMediaPlayerGlue.setHost(createPlaybackGlueHost());
102        mVideoHelper = new DetailsFragmentVideoHelper(mMediaPlayerGlue, getParallaxManager());
103        mVideoHelper.setBackgroundDrawable(mParallaxHelper.getCoverImageDrawable());
104
105        mMediaPlayerGlue.setMode(MediaPlayerGlue.REPEAT_ALL);
106        mMediaPlayerGlue.setArtist("A Googleer");
107        mMediaPlayerGlue.setTitle("Diving with Sharks");
108        mMediaPlayerGlue.setVideoUrl("http://techslides.com/demos/sample-videos/small.mp4");
109
110        final Context context = getActivity();
111        setBadgeDrawable(ResourcesCompat.getDrawable(context.getResources(), R.drawable.ic_title,
112                context.getTheme()));
113        setTitle("Leanback Sample App");
114        setOnSearchClickedListener(new View.OnClickListener() {
115            @Override
116            public void onClick(View view) {
117                Intent intent = new Intent(getActivity(), SearchActivity.class);
118                startActivity(intent);
119            }
120        });
121
122        mActionPlay = new Action(ACTION_PLAY, "Play");
123        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99", ResourcesCompat.getDrawable(
124                context.getResources(), R.drawable.ic_action_a, context.getTheme()));
125        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
126
127        ClassPresenterSelector ps = new ClassPresenterSelector();
128        FullWidthDetailsOverviewRowPresenter dorPresenter =
129                new FullWidthDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
130        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
131            @Override
132            public void onActionClicked(Action action) {
133                final Context context = getActivity();
134                Toast.makeText(context, action.toString(), Toast.LENGTH_SHORT).show();
135                int indexOfOverviewRow = TEST_OVERVIEW_ROW_ON_SECOND ? 1 : 0;
136                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(indexOfOverviewRow);
137                if (action.getId() == ACTION_BUY) {
138                    // on the UI thread, we can modify actions adapter directly
139                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
140                            dor.getActionsAdapter();
141                    actions.set(ACTION_PLAY, mActionPlay);
142                    actions.clear(ACTION_RENT);
143                    actions.clear(ACTION_BUY);
144                    dor.setItem(mPhotoItem.getTitle() + "(Owned)");
145                    dor.setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),
146                            R.drawable.details_img_16x9, context.getTheme()));
147                } else if (action.getId() == ACTION_RENT) {
148                    // on the UI thread, we can modify actions adapter directly
149                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
150                            dor.getActionsAdapter();
151                    actions.set(ACTION_PLAY, mActionPlay);
152                    actions.clear(ACTION_RENT);
153                    dor.setItem(mPhotoItem.getTitle() + "(Rented)");
154                } else if (action.getId() == ACTION_PLAY) {
155                    Intent intent = new Intent(context, PlaybackOverlayActivity.class);
156                    getActivity().startActivity(intent);
157                }
158            }
159        });
160        if (TEST_OVERVIEW_ROW_ON_SECOND) {
161            dorPresenter.setInitialState(FullWidthDetailsOverviewRowPresenter.STATE_SMALL);
162        }
163
164        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
165        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
166
167        mRowsAdapter = new ArrayObjectAdapter(ps);
168
169        PhotoItem item = (PhotoItem) (savedInstanceState != null ?
170                savedInstanceState.getParcelable(ITEM) : null);
171        if (item != null) {
172            setItem(item);
173        }
174
175        setOnItemViewClickedListener(new OnItemViewClickedListener() {
176            @Override
177            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
178                                      RowPresenter.ViewHolder rowViewHolder, Row row) {
179                Log.i(TAG, "onItemClicked: " + item + " row " + row);
180                if (item instanceof PhotoItem) {
181                    Intent intent = new Intent(getActivity(), DetailsActivity.class);
182                    intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
183
184                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
185                            getActivity(),
186                            ((ImageCardView) itemViewHolder.view).getMainImageView(),
187                            DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
188                    getActivity().startActivity(intent, bundle);
189                }
190            }
191        });
192        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
193            @Override
194            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
195                                       RowPresenter.ViewHolder rowViewHolder, Row row) {
196                Log.i(TAG, "onItemSelected: " + item + " row " + row);
197            }
198        });
199
200        if (TEST_SHARED_ELEMENT_TRANSITION) {
201            mHelper = new FullWidthDetailsOverviewSharedElementHelper();
202            mHelper.setSharedElementEnterTransition(getActivity(),
203                    DetailsActivity.SHARED_ELEMENT_NAME);
204            dorPresenter.setListener(mHelper);
205            dorPresenter.setParticipatingEntranceTransition(false);
206        } else {
207            dorPresenter.setParticipatingEntranceTransition(true);
208        }
209        if (TEST_ENTRANCE_TRANSITION) {
210            // don't run entrance transition if Activity is restored.
211            if (savedInstanceState == null) {
212                prepareEntranceTransition();
213            }
214        }
215
216    }
217
218    @Override
219    public View onCreateView(LayoutInflater inflater, ViewGroup container,
220                             Bundle savedInstanceState) {
221        View view = super.onCreateView(inflater, container, savedInstanceState);
222        mBackgroundHelper.attachToView(getBackgroundView());
223        return view;
224    }
225
226    public void setItem(PhotoItem photoItem) {
227        mPhotoItem = photoItem;
228
229        mRowsAdapter.clear();
230        new Handler().postDelayed(new Runnable() {
231            public void run() {
232                if (TEST_OVERVIEW_ROW_ON_SECOND) {
233                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
234                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
235                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
236                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
237                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
238                    HeaderItem header = new HeaderItem(0, "Search Result");
239                    mRowsAdapter.add(0, new ListRow(header, listRowAdapter));
240                }
241
242                final Context context = getActivity();
243                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());
244                dor.setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),
245                        mPhotoItem.getImageResourceId(), context.getTheme()));
246                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
247                adapter.set(ACTION_RENT, mActionRent);
248                adapter.set(ACTION_BUY, mActionBuy);
249                dor.setActionsAdapter(adapter);
250                int indexOfOverviewRow = TEST_OVERVIEW_ROW_ON_SECOND ? 1 : 0;
251                mRowsAdapter.add(indexOfOverviewRow, dor);
252                setSelectedPosition(0, true);
253                if (TEST_SHARED_ELEMENT_TRANSITION) {
254                    if (mHelper != null && !mHelper.getAutoStartSharedElementTransition()) {
255                        mHelper.startPostponedEnterTransition();
256                    }
257                }
258            }
259        }, TIME_TO_LOAD_OVERVIEW_ROW_MS);
260
261        new Handler().postDelayed(new Runnable() {
262            public void run() {
263                for (int i = 0; i < NUM_ROWS; ++i) {
264                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
265                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
266                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
267                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
268                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
269                    HeaderItem header = new HeaderItem(i, "Row " + i);
270                    mRowsAdapter.add(new ListRow(header, listRowAdapter));
271                }
272                if (TEST_ENTRANCE_TRANSITION) {
273                    startEntranceTransition();
274                }
275            }
276        }, TIME_TO_LOAD_RELATED_ROWS_MS);
277        setAdapter(mRowsAdapter);
278    }
279
280    @Override
281    public void onStart() {
282        super.onStart();
283
284        // Restore background drawable in onStart():
285        mBackgroundHelper.setDrawable(mParallaxHelper.getDrawable());
286        mBackgroundHelper.loadBitmap(R.drawable.spiderman,
287                new BackgroundHelper.BitmapLoadCallback() {
288                @Override
289                public void onBitmapLoaded(Bitmap bitmap) {
290                    mParallaxHelper.setCoverImageBitmap(bitmap);
291                }
292            });
293    }
294
295    @Override
296    public void onStop() {
297        super.onStop();
298        mMediaPlayerGlue.pause();
299    }
300}
301