1f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu/*
2f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * Copyright (C) 2014 The Android Open Source Project
3f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu *
4f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * in compliance with the License. You may obtain a copy of the License at
6f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu *
7f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * http://www.apache.org/licenses/LICENSE-2.0
8f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu *
9f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License
10f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * or implied. See the License for the specific language governing permissions and limitations under
12f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu * the License.
13f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu */
14f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gupackage com.example.android.leanback;
15f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
16f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.content.Intent;
17f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.os.Bundle;
18f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.ArrayObjectAdapter;
19f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.HeaderItem;
20f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.ImageCardView;
21f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.ListRow;
22f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.ListRowPresenter;
23f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.OnItemViewClickedListener;
24f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.OnItemViewSelectedListener;
25f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.Presenter;
26f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.Row;
27f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.support.v17.leanback.widget.RowPresenter;
28c632bd20d83c175e76ee109e50d844cefce2a2ccAlan Viveretteimport android.support.v17.leanback.widget.TitleHelper;
29c632bd20d83c175e76ee109e50d844cefce2a2ccAlan Viveretteimport android.support.v4.app.ActivityOptionsCompat;
30f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Guimport android.util.Log;
31f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
32f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gupublic class RowsFragment extends android.support.v17.leanback.app.RowsFragment {
33f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
34f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    private static final String TAG = "leanback.RowsFragment";
35f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
36f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    private static final int NUM_ROWS = 10;
37005084f6f0860a69c80492d3549a687ffb283c40Craig Stout    // Row heights default to wrap content
38005084f6f0860a69c80492d3549a687ffb283c40Craig Stout    private static final boolean USE_FIXED_ROW_HEIGHT = false;
39005084f6f0860a69c80492d3549a687ffb283c40Craig Stout
408cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout    private TitleHelper mTitleHelper;
418cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout
428cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout    public void setTitleHelper(TitleHelper titleHelper) {
438cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout        mTitleHelper = titleHelper;
448cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout    }
45f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
46f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    @Override
47f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    public void onCreate(Bundle savedInstanceState) {
48f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        Log.i(TAG, "onCreate");
49f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        super.onCreate(savedInstanceState);
50f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
51f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        setupRows();
52f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        setOnItemViewClickedListener(new ItemViewClickedListener());
53f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
54f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            @Override
55f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
56f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                    RowPresenter.ViewHolder rowViewHolder, Row row) {
57f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                Log.i(TAG, "onItemSelected: " + item + " row " + row);
588cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout                if (mTitleHelper != null) {
598cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout                    mTitleHelper.showTitle(getAdapter() == null || getAdapter().size() == 0 ||
608cef5c8d58f50d5baca1da44a7c19f623cbf98ecCraig Stout                            getAdapter().get(0) == row);
61f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                }
62f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            }
63f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        });
64f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    }
65f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
66f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    private void setupRows() {
67f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        ListRowPresenter lrp = new ListRowPresenter();
68005084f6f0860a69c80492d3549a687ffb283c40Craig Stout
6987b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu        // For good performance, it's important to use a single instance of
7087b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu        // a card presenter for all rows using that presenter.
7187b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu        final CardPresenter cardPresenter = new CardPresenter();
7287b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu
73005084f6f0860a69c80492d3549a687ffb283c40Craig Stout        if (USE_FIXED_ROW_HEIGHT) {
7487b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu            lrp.setRowHeight(cardPresenter.getRowHeight(getActivity()));
7587b904ffa106f12f2fecfe8b9a46084863678f29Dake Gu            lrp.setExpandedRowHeight(cardPresenter.getExpandedRowHeight(getActivity()));
76005084f6f0860a69c80492d3549a687ffb283c40Craig Stout        }
77f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
78b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(lrp);
79f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
80f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        for (int i = 0; i < NUM_ROWS; ++i) {
81f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
82f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
83f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
84f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
85f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
86f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_5));
87f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_6));
88f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_7));
89f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_8));
90f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            HeaderItem header = new HeaderItem(i, "Row " + i);
91b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            rowsAdapter.add(new ListRow(header, listRowAdapter));
92f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        }
93f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
94b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        setAdapter(rowsAdapter);
95f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    }
96f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
97f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    private final class ItemViewClickedListener implements OnItemViewClickedListener {
98f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        @Override
99f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
100f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                RowPresenter.ViewHolder rowViewHolder, Row row) {
101f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            Intent intent = new Intent(getActivity(), DetailsActivity.class);
102f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
103f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu
104f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
105f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                    getActivity(),
106f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                    ((ImageCardView)itemViewHolder.view).getMainImageView(),
107f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu                    DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
108f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu            getActivity().startActivity(intent, bundle);
109f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu        }
110f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu    }
111f4b2f81cf278d3f08d60feefee139b532db3ce01Dake Gu}
112