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