blob: 10ceceb3814f466388683012b22974529b4f05ff [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;
import android.os.Bundle;
import android.support.v17.leanback.app.DetailsFragment;
import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card;
import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
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.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.
*/
public class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener,
OnItemViewSelectedListener {
private static final String TAG = "DetailViewExampleFragment";
private ArrayObjectAdapter mRowsAdapter;
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setupUi();
setupEventListeners();
}
private void setupUi() {
String json = Utils
.inputStreamToString(getResources().openRawResource(R.raw.detail_example));
DetailedCard data = new Gson().fromJson(json, DetailedCard.class);
setTitle(getString(R.string.detail_view_title));
FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter(
new DetailsDescriptionPresenter(getActivity())) {
@Override protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent);
// TODO: hahnr@ replace with API calls (they don't exist yet)
View actionsView = viewHolder.view.findViewById(R.id.details_overview_actions);
actionsView.setBackgroundColor(getActivity().getResources().getColor(
R.color.detail_view_actionbar_background));
View detailsView = viewHolder.view.findViewById(R.id.details_frame);
detailsView.setBackgroundColor(
getActivity().getResources().getColor(R.color.detail_view_background));
return viewHolder;
}
};
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());
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);
}
private void setupEventListeners() {
// FIXME: leanbackteam@ The item & itemViewHolder parameters in onItemSelected are null in the DetailsOverviewRow as long as the user navigates top or down. After navigating left or right it will be the actual item rather than null.
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) {
getView().setBackgroundColor(
getResources().getColor(R.color.detail_view_related_background));
} else {
getView().setBackgroundResource(R.drawable.background_canyon);
}
}
}