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