1// CHECKSTYLE:OFF Generated code
2/* This file is auto-generated from NewDetailsFragment.java.  DO NOT MODIFY. */
3
4/*
5 * Copyright (C) 2014 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
15 * the License.
16 */
17package com.example.android.leanback;
18
19import android.content.Context;
20import android.content.Intent;
21import android.graphics.Bitmap;
22import android.graphics.drawable.Drawable;
23import android.net.Uri;
24import android.os.Bundle;
25import android.os.Handler;
26import android.util.Log;
27import android.view.LayoutInflater;
28import android.view.View;
29import android.view.ViewGroup;
30
31import androidx.core.app.ActivityOptionsCompat;
32import androidx.core.content.res.ResourcesCompat;
33import androidx.leanback.app.DetailsSupportFragmentBackgroundController;
34import androidx.leanback.media.MediaPlayerAdapter;
35import androidx.leanback.media.MediaPlayerGlue;
36import androidx.leanback.media.PlaybackGlue;
37import androidx.leanback.media.PlaybackTransportControlGlue;
38import androidx.leanback.widget.Action;
39import androidx.leanback.widget.ArrayObjectAdapter;
40import androidx.leanback.widget.ClassPresenterSelector;
41import androidx.leanback.widget.DetailsOverviewRow;
42import androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter;
43import androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
44import androidx.leanback.widget.HeaderItem;
45import androidx.leanback.widget.ImageCardView;
46import androidx.leanback.widget.ListRow;
47import androidx.leanback.widget.ListRowPresenter;
48import androidx.leanback.widget.OnActionClickedListener;
49import androidx.leanback.widget.OnItemViewClickedListener;
50import androidx.leanback.widget.OnItemViewSelectedListener;
51import androidx.leanback.widget.Presenter;
52import androidx.leanback.widget.Row;
53import androidx.leanback.widget.RowPresenter;
54import androidx.leanback.widget.SparseArrayObjectAdapter;
55
56public class NewDetailsSupportFragment extends androidx.leanback.app.DetailsSupportFragment {
57
58    private static final String TAG = "leanback.DetailsSupportFragment";
59    private static final String ITEM = "item";
60
61    private static final int NUM_ROWS = 3;
62    private ArrayObjectAdapter mRowsAdapter;
63    private PhotoItem mPhotoItem;
64    final CardPresenter cardPresenter = new CardPresenter();
65
66    private static final int ACTION_PLAY = 1;
67    private static final int ACTION_RENT = 2;
68    private static final int ACTION_BUY = 3;
69
70    private boolean TEST_SHARED_ELEMENT_TRANSITION = true;
71    private boolean TEST_BACKGROUND_PLAYER;
72
73    private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
74    private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
75
76    private Action mActionPlay;
77    private Action mActionRent;
78    private Action mActionBuy;
79
80    private FullWidthDetailsOverviewSharedElementHelper mHelper;
81    private BackgroundHelper mBackgroundHelper; // used to download bitmap async.
82    private final DetailsSupportFragmentBackgroundController mDetailsBackground =
83            new DetailsSupportFragmentBackgroundController(this);
84
85    void setupTrailerVideo() {
86        MediaPlayerGlue mediaPlayerGlue = new MediaPlayerGlue(getActivity());
87        mDetailsBackground.setupVideoPlayback(mediaPlayerGlue);
88        mediaPlayerGlue.setMode(MediaPlayerGlue.REPEAT_ONE);
89        mediaPlayerGlue.setArtist("A Googler");
90        mediaPlayerGlue.setTitle("Diving with Sharks Trailer");
91        mediaPlayerGlue.setMediaSource(Uri.parse("android.resource://com.example.android.leanback/"
92                + "raw/browse"));
93    }
94
95    void setupMainVideo() {
96        Context context = getActivity();
97        MediaPlayerAdapter adapter = new MediaPlayerAdapter(context);
98        PlaybackTransportControlGlue<MediaPlayerAdapter> mediaPlayerGlue =
99                new PlaybackTransportControlGlue(context, adapter);
100        mDetailsBackground.setupVideoPlayback(mediaPlayerGlue);
101        mediaPlayerGlue.setSubtitle("A Googler");
102        mediaPlayerGlue.setTitle("Diving with Sharks");
103        mediaPlayerGlue.getPlayerAdapter().setDataSource(Uri.parse(
104                "https://storage.googleapis.com/android-tv/Sample videos/April Fool's "
105                        + "2013/Explore Treasure Mode with Google Maps.mp4"));
106        mediaPlayerGlue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
107            @Override
108            public void onPreparedStateChanged(PlaybackGlue glue) {
109                super.onPreparedStateChanged(glue);
110                PlaybackTransportControlGlue controlGlue = (PlaybackTransportControlGlue) glue;
111                controlGlue.setSeekProvider(new PlaybackSeekDiskDataProvider(
112                        controlGlue.getDuration(), 1000,
113                        "/sdcard/seek/frame_%04d.jpg"));
114            }
115        });
116    }
117
118    @Override
119    public void onCreate(Bundle savedInstanceState) {
120        Log.i(TAG, "onCreate");
121        super.onCreate(savedInstanceState);
122
123        mBackgroundHelper = new BackgroundHelper(getActivity());
124        mDetailsBackground.enableParallax();
125        if (TEST_BACKGROUND_PLAYER) {
126            if (MovieData.sStatus == MovieData.STATUS_INIT) {
127                // not own/rented, play trailer
128                setupTrailerVideo();
129            } else {
130                // bought or rented, play the main content
131                setupMainVideo();
132                // hide details main ui
133                mDetailsBackground.switchToVideo();
134            }
135        }
136
137        final Context context = getActivity();
138        setBadgeDrawable(ResourcesCompat.getDrawable(context.getResources(), R.drawable.ic_title,
139                context.getTheme()));
140        setTitle("Leanback Sample App");
141        if (!TEST_BACKGROUND_PLAYER) {
142            setOnSearchClickedListener(new View.OnClickListener() {
143                @Override
144                public void onClick(View view) {
145                    Intent intent = new Intent(getActivity(), SearchSupportActivity.class);
146                    startActivity(intent);
147                }
148            });
149        }
150
151        mActionPlay = new Action(ACTION_PLAY, "Play");
152        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99", ResourcesCompat.getDrawable(
153                context.getResources(), R.drawable.ic_action_a, context.getTheme()));
154        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
155
156        ClassPresenterSelector ps = new ClassPresenterSelector();
157        FullWidthDetailsOverviewRowPresenter dorPresenter =
158                new FullWidthDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
159        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
160            @Override
161            public void onActionClicked(Action action) {
162                final Context context = getActivity();
163                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);
164                if (action.getId() == ACTION_BUY) {
165                    // on the UI thread, we can modify actions adapter directly
166                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
167                            dor.getActionsAdapter();
168                    actions.set(ACTION_PLAY, mActionPlay);
169                    actions.clear(ACTION_RENT);
170                    actions.clear(ACTION_BUY);
171                    boolean previousRented = MovieData.sStatus == MovieData.STATUS_RENTED;
172                    MovieData.sStatus = MovieData.STATUS_OWN;
173                    dor.setItem(getDisplayTitle(mPhotoItem.getTitle()));
174                    dor.setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),
175                            R.drawable.details_img_16x9, context.getTheme()));
176                    if (TEST_BACKGROUND_PLAYER) {
177                        if (!previousRented) {
178                            setupMainVideo();
179                            mDetailsBackground.switchToVideo();
180                        }
181                    } else {
182                        Intent intent = new Intent(context, PlaybackActivity.class);
183                        getActivity().startActivity(intent);
184                    }
185                } else if (action.getId() == ACTION_RENT) {
186                    // on the UI thread, we can modify actions adapter directly
187                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
188                            dor.getActionsAdapter();
189                    actions.set(ACTION_PLAY, mActionPlay);
190                    actions.clear(ACTION_RENT);
191                    MovieData.sStatus = MovieData.STATUS_RENTED;
192                    dor.setItem(getDisplayTitle(mPhotoItem.getTitle()));
193                    if (TEST_BACKGROUND_PLAYER) {
194                        setupMainVideo();
195                        mDetailsBackground.switchToVideo();
196                    } else {
197                        Intent intent = new Intent(context, PlaybackActivity.class);
198                        getActivity().startActivity(intent);
199                    }
200                } else if (action.getId() == ACTION_PLAY) {
201                    if (TEST_BACKGROUND_PLAYER) {
202                        mDetailsBackground.switchToVideo();
203                    } else {
204                        Intent intent = new Intent(context, PlaybackActivity.class);
205                        getActivity().startActivity(intent);
206                    }
207                }
208            }
209        });
210
211        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
212        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
213
214        mRowsAdapter = new ArrayObjectAdapter(ps);
215        updateAdapter();
216
217        setOnItemViewClickedListener(new OnItemViewClickedListener() {
218            @Override
219            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
220                    RowPresenter.ViewHolder rowViewHolder, Row row) {
221                Log.i(TAG, "onItemClicked: " + item + " row " + row);
222                if (item instanceof PhotoItem) {
223                    Intent intent = new Intent(getActivity(), DetailsSupportActivity.class);
224                    intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
225
226                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
227                            getActivity(),
228                            ((ImageCardView) itemViewHolder.view).getMainImageView(),
229                            DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
230                    getActivity().startActivity(intent, bundle);
231                }
232            }
233        });
234        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
235            @Override
236            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
237                    RowPresenter.ViewHolder rowViewHolder, Row row) {
238                Log.i(TAG, "onItemSelected: " + item + " row " + row);
239            }
240        });
241
242        if (TEST_SHARED_ELEMENT_TRANSITION) {
243            mHelper = new FullWidthDetailsOverviewSharedElementHelper();
244            mHelper.setSharedElementEnterTransition(getActivity(),
245                    DetailsSupportActivity.SHARED_ELEMENT_NAME);
246            dorPresenter.setListener(mHelper);
247            dorPresenter.setParticipatingEntranceTransition(false);
248        } else {
249            dorPresenter.setParticipatingEntranceTransition(true);
250        }
251    }
252
253    @Override
254    public View onCreateView(LayoutInflater inflater, ViewGroup container,
255            Bundle savedInstanceState) {
256        View view = super.onCreateView(inflater, container, savedInstanceState);
257        return view;
258    }
259
260    public void setBackgroundVideo(boolean backgroundVideo) {
261        TEST_BACKGROUND_PLAYER = backgroundVideo;
262    }
263
264    public void setItem(PhotoItem photoItem) {
265        mPhotoItem = photoItem;
266        updateAdapter();
267    }
268
269    static String getDisplayTitle(String title) {
270        switch (MovieData.sStatus) {
271            case MovieData.STATUS_OWN:
272                title = title + "(Owned)";
273                break;
274            case MovieData.STATUS_RENTED:
275                title = title + "(Rented)";
276                break;
277            case MovieData.STATUS_INIT:
278            default:
279        }
280        return title;
281    }
282
283    void updateAdapter() {
284        if (mRowsAdapter == null) {
285            return;
286        }
287        mRowsAdapter.clear();
288        new Handler().postDelayed(new Runnable() {
289            @Override
290            public void run() {
291                final Context context = getActivity();
292                if (context == null) {
293                    return;
294                }
295
296                DetailsOverviewRow dor = new DetailsOverviewRow(
297                        getDisplayTitle(mPhotoItem.getTitle()));
298                dor.setImageDrawable(ResourcesCompat.getDrawable(context.getResources(),
299                        mPhotoItem.getImageResourceId(), context.getTheme()));
300                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
301                switch (MovieData.sStatus) {
302                    case MovieData.STATUS_INIT:
303                        adapter.set(ACTION_RENT, mActionRent);
304                        adapter.set(ACTION_BUY, mActionBuy);
305                        break;
306                    case MovieData.STATUS_OWN:
307                        adapter.set(ACTION_PLAY, mActionPlay);
308                        break;
309                    case MovieData.STATUS_RENTED:
310                        adapter.set(ACTION_PLAY, mActionPlay);
311                        adapter.set(ACTION_BUY, mActionBuy);
312                        break;
313                }
314                // one line text with icon
315                Drawable d = ResourcesCompat.getDrawable(context.getResources(),
316                        R.drawable.ic_action_a, context.getTheme());
317                adapter.set(202, new Action(202, "Top", null, d));
318                dor.setActionsAdapter(adapter);
319                mRowsAdapter.add(0, dor);
320                setSelectedPosition(0, true);
321                if (TEST_SHARED_ELEMENT_TRANSITION) {
322                    if (mHelper != null && !mHelper.getAutoStartSharedElementTransition()) {
323                        mHelper.startPostponedEnterTransition();
324                    }
325                }
326            }
327        }, TIME_TO_LOAD_OVERVIEW_ROW_MS);
328
329        new Handler().postDelayed(new Runnable() {
330            @Override
331            public void run() {
332                if (getActivity() == null) {
333                    return;
334                }
335                for (int i = 0; i < NUM_ROWS; ++i) {
336                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
337                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
338                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
339                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
340                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
341                    HeaderItem header = new HeaderItem(i, "Row " + i);
342                    mRowsAdapter.add(new ListRow(header, listRowAdapter));
343                }
344            }
345        }, TIME_TO_LOAD_RELATED_ROWS_MS);
346        setAdapter(mRowsAdapter);
347    }
348
349    @Override
350    public void onStart() {
351        super.onStart();
352
353        // Restore background drawable in onStart():
354        mBackgroundHelper.loadBitmap(R.drawable.spiderman,
355                new BackgroundHelper.BitmapLoadCallback() {
356                    @Override
357                    public void onBitmapLoaded(Bitmap bitmap) {
358                        mDetailsBackground.setCoverBitmap(bitmap);
359                    }
360                });
361    }
362
363    @Override
364    public void onStop() {
365        mDetailsBackground.setCoverBitmap(null);
366        super.onStop();
367    }
368}
369