BrowseFragment.java revision c578ad430b51de0151ca9b3299d84f73bb71286b
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.app.Fragment;
17import android.content.Intent;
18import android.os.Bundle;
19import android.os.Handler;
20import android.support.v17.leanback.app.GuidedStepFragment;
21import android.support.v17.leanback.app.RowsFragment;
22import android.support.v17.leanback.app.RowsFragmentAdapter;
23import android.support.v17.leanback.widget.ArrayObjectAdapter;
24import android.support.v17.leanback.widget.HeaderItem;
25import android.support.v17.leanback.widget.ImageCardView;
26import android.support.v17.leanback.widget.ListRow;
27import android.support.v17.leanback.widget.ListRowPresenter;
28import android.support.v17.leanback.widget.ObjectAdapter;
29import android.support.v17.leanback.widget.OnItemViewClickedListener;
30import android.support.v17.leanback.widget.OnItemViewSelectedListener;
31import android.support.v17.leanback.widget.PageRow;
32import android.support.v17.leanback.widget.PageRowPresenter;
33import android.support.v17.leanback.widget.Presenter;
34import android.support.v17.leanback.widget.PresenterSelector;
35import android.support.v17.leanback.widget.Row;
36import android.support.v17.leanback.widget.RowPresenter;
37import android.support.v4.app.ActivityOptionsCompat;
38import android.util.Log;
39import android.view.LayoutInflater;
40import android.view.View;
41import android.view.ViewGroup;
42
43public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment {
44    private static final String TAG = "leanback.BrowseFragment";
45
46    private static final boolean TEST_ENTRANCE_TRANSITION = true;
47    private static final int NUM_ROWS = 4;
48
49    private ArrayObjectAdapter mRowsAdapter;
50    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
51
52    // For good performance, it's important to use a single instance of
53    // a card presenter for all rows using that presenter.
54    final CardPresenter mCardPresenter = new CardPresenter();
55    final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
56
57    public BrowseFragment() {
58        setMainFragmentAdapterFactory(new MainFragmentFactorAdapterImpl());
59    }
60
61    @Override
62    public void onCreate(Bundle savedInstanceState) {
63        Log.i(TAG, "onCreate");
64        super.onCreate(savedInstanceState);
65
66        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
67        setTitle("Leanback Sample App");
68        setHeadersState(HEADERS_ENABLED);
69
70        setOnSearchClickedListener(new View.OnClickListener() {
71            @Override
72            public void onClick(View view) {
73                Intent intent = new Intent(getActivity(), SearchActivity.class);
74                startActivity(intent);
75            }
76        });
77
78        setupRows();
79        setOnItemViewClickedListener(new ItemViewClickedListener());
80        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
81            @Override
82            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
83                    RowPresenter.ViewHolder rowViewHolder, Row row) {
84                Log.i(TAG, "onItemSelected: " + item + " row " + row);
85
86                if (isShowingHeaders()) {
87                    mBackgroundHelper.setBackground(getActivity(), null);
88                } else if (item instanceof PhotoItem) {
89                    mBackgroundHelper.setBackground(
90                            getActivity(), ((PhotoItem) item).getImageResourceId());
91                }
92            }
93        });
94        if (TEST_ENTRANCE_TRANSITION) {
95            // don't run entrance transition if fragment is restored.
96            if (savedInstanceState == null) {
97                prepareEntranceTransition();
98            }
99        }
100        // simulates in a real world use case  data being loaded two seconds later
101        new Handler().postDelayed(new Runnable() {
102            public void run() {
103                loadData();
104                startEntranceTransition();
105            }
106        }, 2000);
107    }
108
109    @Override
110    public View onCreateView(
111            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
112        return super.onCreateView(inflater, container, savedInstanceState);
113    }
114
115    private void setupRows() {
116        mRowsAdapter = new ArrayObjectAdapter(new MyPresenterSelector());
117        setAdapter(mRowsAdapter);
118    }
119
120    private void loadData() {
121        int i = 0;
122        for (; i < NUM_ROWS; ++i) {
123            HeaderItem header = new HeaderItem(i, "Row " + i);
124            mRowsAdapter.add(new ListRow(header, createListRowAdapter(i)));
125        }
126
127        HeaderItem header = new HeaderItem(NUM_ROWS, "Page Row " + 0);
128        mRowsAdapter.add(new PageRow(header));
129
130        header = new HeaderItem(NUM_ROWS, "Page Row " + 1);
131        mRowsAdapter.add(new PageRow(header));
132    }
133
134    private ArrayObjectAdapter createListRowAdapter(int i) {
135        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
136                mCardPresenter : mCardPresenter2);
137        listRowAdapter.add(new PhotoItem(
138                "Hello world",
139                R.drawable.gallery_photo_1));
140        listRowAdapter.add(new PhotoItem(
141                "This is a test",
142                "Only a test",
143                R.drawable.gallery_photo_2));
144        listRowAdapter.add(new PhotoItem(
145                "Android TV",
146                "by Google",
147                R.drawable.gallery_photo_3));
148        listRowAdapter.add(new PhotoItem(
149                "Leanback",
150                R.drawable.gallery_photo_4));
151        listRowAdapter.add(new PhotoItem(
152                "GuidedStep (Slide left/right)",
153                R.drawable.gallery_photo_5));
154        listRowAdapter.add(new PhotoItem(
155                "GuidedStep (Slide bottom up)",
156                "Open GuidedStepFragment",
157                R.drawable.gallery_photo_6));
158        listRowAdapter.add(new PhotoItem(
159                "Android TV",
160                "open RowsActivity",
161                R.drawable.gallery_photo_7));
162        listRowAdapter.add(new PhotoItem(
163                "Leanback",
164                "open BrowseActivity",
165                R.drawable.gallery_photo_8));
166        return listRowAdapter;
167    }
168
169    private final class ItemViewClickedListener implements OnItemViewClickedListener {
170        @Override
171        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
172                RowPresenter.ViewHolder rowViewHolder, Row row) {
173
174            Intent intent;
175            Bundle bundle;
176            if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
177                GuidedStepFragment.add(getFragmentManager(),
178                        new GuidedStepHalfScreenActivity.FirstStepFragment(),
179                        R.id.lb_guidedstep_host);
180                return;
181            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
182                GuidedStepFragment.add(getFragmentManager(),
183                        new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
184                return;
185            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
186                intent = new Intent(getActivity(), BrowseActivity.class);
187                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
188                        .toBundle();
189            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
190                intent = new Intent(getActivity(), RowsActivity.class);
191                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
192                        .toBundle();
193            } else {
194                intent = new Intent(getActivity(), DetailsActivity.class);
195                intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
196                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
197                        getActivity(),
198                        ((ImageCardView) itemViewHolder.view).getMainImageView(),
199                        DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
200            }
201            getActivity().startActivity(intent, bundle);
202        }
203    }
204
205    private static class MainFragmentFactorAdapterImpl extends MainFragmentAdapterFactory {
206        private AbstractMainFragmentAdapter pageFragmentAdapter1 = new PageFragmentAdapterImpl();
207        private RowsFragmentAdapter gridPageFragmentAdapter;
208
209        @Override
210        public AbstractMainFragmentAdapter getPageFragmentAdapter(
211                ObjectAdapter adapter, int position) {
212            if (position == 4) {
213                return pageFragmentAdapter1;
214            } else {
215                if (gridPageFragmentAdapter == null) {
216                    gridPageFragmentAdapter = new GridPageFragmentAdapterImpl();
217                }
218                return gridPageFragmentAdapter;
219            }
220        }
221    }
222
223    private static class PageFragmentAdapterImpl extends AbstractMainFragmentAdapter {
224        private Fragment mFragment;
225
226        PageFragmentAdapterImpl() {
227            setScalingEnabled(true);
228        }
229
230        @Override
231        public Fragment getFragment() {
232            if (mFragment == null) {
233                mFragment = new SampleFragment();
234            }
235            return mFragment;
236        }
237    }
238
239    private static class GridPageFragmentAdapterImpl extends RowsFragmentAdapter {
240        final CardPresenter mCardPresenter = new CardPresenter();
241        final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
242        private RowsFragment mFragment;
243
244        GridPageFragmentAdapterImpl() {
245            setScalingEnabled(true);
246        }
247
248        protected Fragment createFragment() {
249            if (mFragment == null) {
250                mFragment = new RowsFragment();
251                ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
252                for (int i = 0; i < 4; i++) {
253                    ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
254                    adapter.add(row);
255                }
256                mFragment.setAdapter(adapter);
257            }
258            return mFragment;
259        }
260
261        private ArrayObjectAdapter createListRowAdapter(int i) {
262            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
263                    mCardPresenter : mCardPresenter2);
264            listRowAdapter.add(new PhotoItem(
265                    "Hello world",
266                    R.drawable.gallery_photo_1));
267            listRowAdapter.add(new PhotoItem(
268                    "This is a test",
269                    "Only a test",
270                    R.drawable.gallery_photo_2));
271            listRowAdapter.add(new PhotoItem(
272                    "Android TV",
273                    "by Google",
274                    R.drawable.gallery_photo_3));
275            listRowAdapter.add(new PhotoItem(
276                    "Leanback",
277                    R.drawable.gallery_photo_4));
278            listRowAdapter.add(new PhotoItem(
279                    "GuidedStep (Slide left/right)",
280                    R.drawable.gallery_photo_5));
281            listRowAdapter.add(new PhotoItem(
282                    "GuidedStep (Slide bottom up)",
283                    "Open GuidedStepFragment",
284                    R.drawable.gallery_photo_6));
285            listRowAdapter.add(new PhotoItem(
286                    "Android TV",
287                    "open RowsActivity",
288                    R.drawable.gallery_photo_7));
289            listRowAdapter.add(new PhotoItem(
290                    "Leanback",
291                    "open BrowseActivity",
292                    R.drawable.gallery_photo_8));
293            return listRowAdapter;
294        }
295    }
296
297    private static class SampleFragment extends Fragment {
298
299        @Override
300        public View onCreateView(
301                LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
302            return inflater.inflate(R.layout.page_fragment, container, false);
303        }
304    }
305
306    private static class MyPresenterSelector extends PresenterSelector {
307        private Presenter[] presenters = {
308                new ListRowPresenter(),
309                new PageRowPresenter()
310        };
311
312        @Override
313        public Presenter getPresenter(Object item) {
314            if (item instanceof PageRow) {
315                return presenters[1];
316            }
317            return presenters[0];
318        }
319
320        @Override
321        public Presenter[] getPresenters() {
322            return presenters;
323        }
324    }
325}
326