1/* 2 * Copyright (C) 2015 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 */ 14 15package android.support.v17.leanback.supportleanbackshowcase.app.cards; 16 17import android.content.Intent; 18import android.os.Bundle; 19import android.os.Handler; 20import android.support.v17.leanback.app.BrowseFragment; 21import android.support.v17.leanback.supportleanbackshowcase.R; 22import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity; 23import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleFragment; 24import android.support.v17.leanback.supportleanbackshowcase.app.details.ShadowRowPresenterSelector; 25import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector; 26import android.support.v17.leanback.supportleanbackshowcase.models.Card; 27import android.support.v17.leanback.supportleanbackshowcase.models.CardRow; 28import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow; 29import android.support.v17.leanback.supportleanbackshowcase.utils.Utils; 30import android.support.v17.leanback.widget.ArrayObjectAdapter; 31import android.support.v17.leanback.widget.HeaderItem; 32import android.support.v17.leanback.widget.ImageCardView; 33import android.support.v17.leanback.widget.DividerRow; 34import android.support.v17.leanback.widget.SectionRow; 35import android.support.v17.leanback.widget.ListRow; 36import android.support.v17.leanback.widget.OnItemViewClickedListener; 37import android.support.v17.leanback.widget.Presenter; 38import android.support.v17.leanback.widget.PresenterSelector; 39import android.support.v17.leanback.widget.Row; 40import android.support.v17.leanback.widget.RowPresenter; 41import android.support.v17.leanback.widget.SearchOrbView; 42import android.support.v4.app.ActivityOptionsCompat; 43import android.view.View; 44import android.widget.ImageView; 45import android.widget.Toast; 46 47import com.google.gson.Gson; 48 49/** 50 * This fragment will be shown when the "Card Examples" card is selected at the home menu. It will 51 * display multiple card types. 52 */ 53public class CardExampleFragment extends BrowseFragment { 54 55 private ArrayObjectAdapter mRowsAdapter; 56 57 @Override public void onActivityCreated(Bundle savedInstanceState) { 58 super.onActivityCreated(savedInstanceState); 59 setupUi(); 60 setupRowAdapter(); 61 } 62 63 private void setupUi() { 64 setHeadersState(HEADERS_ENABLED); 65 setHeadersTransitionOnBackEnabled(true); 66 setTitle(getString(R.string.card_examples_title)); 67 setOnSearchClickedListener(new View.OnClickListener() { 68 @Override 69 public void onClick(View v) { 70 Toast.makeText(getActivity(), getString(R.string.implement_search), 71 Toast.LENGTH_LONG).show(); 72 } 73 }); 74 setOnItemViewClickedListener(new OnItemViewClickedListener() { 75 76 @Override 77 public void onItemClicked(Presenter.ViewHolder viewHolder, Object item, RowPresenter.ViewHolder viewHolder1, Row row) { 78 if (!(item instanceof Card)) return; 79 if (!(viewHolder.view instanceof ImageCardView)) return; 80 81 ImageView imageView = ((ImageCardView) viewHolder.view).getMainImageView(); 82 Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), 83 imageView, DetailViewExampleFragment.TRANSITION_NAME).toBundle(); 84 Intent intent = new Intent(getActivity().getBaseContext(), 85 DetailViewExampleActivity.class); 86 Card card = (Card) item; 87 int imageResId = card.getLocalImageResourceId(getContext()); 88 intent.putExtra(DetailViewExampleFragment.EXTRA_CARD, imageResId); 89 startActivity(intent, bundle); 90 } 91 92 }); 93 94 prepareEntranceTransition(); 95 } 96 97 private void setupRowAdapter() { 98 mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector()); 99 setAdapter(mRowsAdapter); 100 new Handler().postDelayed(new Runnable() { 101 @Override 102 public void run() { 103 createRows(); 104 startEntranceTransition(); 105 } 106 }, 500); 107 } 108 109 private void createRows() { 110 String json = Utils 111 .inputStreamToString(getResources().openRawResource(R.raw.cards_example)); 112 CardRow[] rows = new Gson().fromJson(json, CardRow[].class); 113 for (CardRow row : rows) { 114 mRowsAdapter.add(createCardRow(row)); 115 } 116 } 117 118 private Row createCardRow(final CardRow cardRow) { 119 switch (cardRow.getType()) { 120 case CardRow.TYPE_SECTION_HEADER: 121 return new SectionRow(new HeaderItem(cardRow.getTitle())); 122 case CardRow.TYPE_DIVIDER: 123 return new DividerRow(); 124 case CardRow.TYPE_DEFAULT: 125 default: 126 // Build main row using the ImageCardViewPresenter. 127 PresenterSelector presenterSelector = new CardPresenterSelector(getActivity()); 128 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector); 129 for (Card card : cardRow.getCards()) { 130 listRowAdapter.add(card); 131 } 132 return new CardListRow(new HeaderItem(cardRow.getTitle()), listRowAdapter, cardRow); 133 } 134 } 135 136} 137