blob: eed800ffdd23a7a8dc470a02e9305d1ccf70d7b7 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package android.support.v17.leanback.supportleanbackshowcase.app.details;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.support.v17.leanback.app.DetailsFragment;
import android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard;
import android.support.v17.leanback.supportleanbackshowcase.R;
import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
import android.support.v17.leanback.supportleanbackshowcase.models.Card;
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.support.v17.leanback.widget.DetailsOverviewRow;
import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.OnItemViewClickedListener;
import android.support.v17.leanback.widget.OnItemViewSelectedListener;
import android.support.v17.leanback.widget.Presenter;
import android.support.v17.leanback.widget.Row;
import android.support.v17.leanback.widget.RowPresenter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.google.gson.Gson;
/**
* Displays a card with more details using a {@link DetailsFragment}.
*/
public class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener,
OnItemViewSelectedListener {
public static final String TRANSITION_NAME = "t_for_transition";
public static final String EXTRA_CARD = "card";
private ArrayObjectAdapter mRowsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupUi();
setupEventListeners();
}
private void setupUi() {
// Load the card we want to display from a JSON resource. This JSON data could come from
// anywhere in a real world app, e.g. a server.
String json = Utils
.inputStreamToString(getResources().openRawResource(R.raw.detail_example));
DetailedCard data = new Gson().fromJson(json, DetailedCard.class);
// Setup fragment
setTitle(getString(R.string.detail_view_title));
FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter(
new DetailsDescriptionPresenter(getActivity())) {
@Override
protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
// Customize Actionbar and Content by using custom colors.
RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent);
View actionsView = viewHolder.view.
findViewById(R.id.details_overview_actions_background);
actionsView.setBackgroundColor(getActivity().getResources().
getColor(R.color.detail_view_actionbar_background, null));
View detailsView = viewHolder.view.findViewById(R.id.details_frame);
detailsView.setBackgroundColor(
getResources().getColor(R.color.detail_view_background, null));
return viewHolder;
}
};
FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper();
mHelper.setSharedElementEnterTransition(getActivity(), TRANSITION_NAME);
rowPresenter.setListener(mHelper);
rowPresenter.setParticipatingEntranceTransition(false);
prepareEntranceTransition();
ListRowPresenter shadowDisabledRowPresenter = new ListRowPresenter();
shadowDisabledRowPresenter.setShadowEnabled(false);
// Setup PresenterSelector to distinguish between the different rows.
ClassPresenterSelector rowPresenterSelector = new ClassPresenterSelector();
rowPresenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
rowPresenterSelector.addClassPresenter(CardListRow.class, shadowDisabledRowPresenter);
rowPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
mRowsAdapter = new ArrayObjectAdapter(rowPresenterSelector);
// Setup action and detail row.
DetailsOverviewRow detailsOverview = new DetailsOverviewRow(data);
int imageResId = data.getLocalImageResourceId(getActivity());
Bundle extras = getActivity().getIntent().getExtras();
if (extras != null && extras.containsKey(EXTRA_CARD)) {
imageResId = extras.getInt(EXTRA_CARD, imageResId);
}
detailsOverview.setImageDrawable(getResources().getDrawable(imageResId, null));
ArrayObjectAdapter actionAdapter = new ArrayObjectAdapter();
actionAdapter.add(new Action(1, getString(R.string.action_buy) + data.getPrice()));
actionAdapter.add(new Action(2, getString(R.string.action_wishlist)));
actionAdapter.add(new Action(3, getString(R.string.action_related)));
detailsOverview.setActionsAdapter(actionAdapter);
mRowsAdapter.add(detailsOverview);
// Setup related row.
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
new CardPresenterSelector(getActivity()));
for (Card characterCard : data.getCharacters()) listRowAdapter.add(characterCard);
HeaderItem header = new HeaderItem(0, getString(R.string.header_related));
mRowsAdapter.add(new CardListRow(header, listRowAdapter, null));
// Setup recommended row.
listRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity()));
for (Card card : data.getRecommended()) listRowAdapter.add(card);
header = new HeaderItem(1, getString(R.string.header_recommended));
mRowsAdapter.add(new ListRow(header, listRowAdapter));
setAdapter(mRowsAdapter);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startEntranceTransition();
}
}, 500);
}
private void setupEventListeners() {
setOnItemViewSelectedListener(this);
setOnItemViewClickedListener(this);
}
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
if (!(item instanceof Action)) return;
Action action = (Action) item;
if (action.getId() == 3) {
setSelectedPosition(1);
} else {
Toast.makeText(getActivity(), getString(R.string.action_cicked), Toast.LENGTH_LONG)
.show();
}
}
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row) {
if (mRowsAdapter.indexOf(row) > 0) {
int backgroundColor = getResources().getColor(R.color.detail_view_related_background,
null);
getView().setBackgroundColor(backgroundColor);
} else {
getView().setBackground(null);
}
}
}