/* * 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.page; import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.os.Handler; import android.support.v17.leanback.app.BackgroundManager; import android.support.v17.leanback.app.BrowseFragment; import android.support.v17.leanback.app.RowsFragment; import android.support.v17.leanback.supportleanbackshowcase.R; import android.support.v17.leanback.supportleanbackshowcase.app.details.ShadowRowPresenterSelector; import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector; import android.support.v17.leanback.supportleanbackshowcase.models.Card; import android.support.v17.leanback.supportleanbackshowcase.models.CardRow; import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow; import android.support.v17.leanback.supportleanbackshowcase.utils.Utils; import android.support.v17.leanback.widget.ArrayObjectAdapter; import android.support.v17.leanback.widget.FocusHighlight; 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.PageRow; import android.support.v17.leanback.widget.Presenter; import android.support.v17.leanback.widget.PresenterSelector; import android.support.v17.leanback.widget.Row; import android.support.v17.leanback.widget.RowPresenter; import android.support.v17.leanback.widget.VerticalGridPresenter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.Toast; import com.google.gson.Gson; /** * Sample {@link BrowseFragment} implementation showcasing the use of {@link PageRow} and * {@link ListRow}. */ public class PageAndListRowFragment extends BrowseFragment { private static final long HEADER_ID_1 = 1; private static final String HEADER_NAME_1 = "Page Fragment"; private static final long HEADER_ID_2 = 2; private static final String HEADER_NAME_2 = "Rows Fragment"; private static final long HEADER_ID_3 = 3; private static final String HEADER_NAME_3 = "Settings Fragment"; private static final long HEADER_ID_4 = 4; private static final String HEADER_NAME_4 = "User agreement Fragment"; private BackgroundManager mBackgroundManager; private ArrayObjectAdapter mRowsAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupUi(); loadData(); mBackgroundManager = BackgroundManager.getInstance(getActivity()); mBackgroundManager.attach(getActivity().getWindow()); getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory(mBackgroundManager)); } private void setupUi() { setHeadersState(HEADERS_ENABLED); setHeadersTransitionOnBackEnabled(true); setBrandColor(getResources().getColor(R.color.fastlane_background)); setTitle("Title goes here"); setOnSearchClickedListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText( getActivity(), getString(R.string.implement_search), Toast.LENGTH_SHORT) .show(); } }); prepareEntranceTransition(); } private void loadData() { mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); setAdapter(mRowsAdapter); new Handler().postDelayed(new Runnable() { @Override public void run() { createRows(); startEntranceTransition(); } }, 2000); } private void createRows() { HeaderItem headerItem1 = new HeaderItem(HEADER_ID_1, HEADER_NAME_1); PageRow pageRow1 = new PageRow(headerItem1); mRowsAdapter.add(pageRow1); HeaderItem headerItem2 = new HeaderItem(HEADER_ID_2, HEADER_NAME_2); PageRow pageRow2 = new PageRow(headerItem2); mRowsAdapter.add(pageRow2); HeaderItem headerItem3 = new HeaderItem(HEADER_ID_3, HEADER_NAME_3); PageRow pageRow3 = new PageRow(headerItem3); mRowsAdapter.add(pageRow3); HeaderItem headerItem4 = new HeaderItem(HEADER_ID_4, HEADER_NAME_4); PageRow pageRow4 = new PageRow(headerItem4); mRowsAdapter.add(pageRow4); } private static class PageRowFragmentFactory extends BrowseFragment.FragmentFactory { private final BackgroundManager mBackgroundManager; PageRowFragmentFactory(BackgroundManager backgroundManager) { this.mBackgroundManager = backgroundManager; } @Override public Fragment createFragment(Object rowObj) { Row row = (Row)rowObj; mBackgroundManager.setDrawable(null); if (row.getHeaderItem().getId() == HEADER_ID_1) { return new SampleFragmentA(); } else if (row.getHeaderItem().getId() == HEADER_ID_2) { return new SampleFragmentB(); } else if (row.getHeaderItem().getId() == HEADER_ID_3) { return new SettingsFragment(); } else if (row.getHeaderItem().getId() == HEADER_ID_4) { return new WebViewFragment(); } throw new IllegalArgumentException(String.format("Invalid row %s", rowObj)); } } public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragmentA> { public PageFragmentAdapterImpl(SampleFragmentA fragment) { super(fragment); } } /** * Simple page fragment implementation. */ public static class SampleFragmentA extends GridFragment { private static final int COLUMNS = 4; private final int ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_SMALL; private ArrayObjectAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupAdapter(); loadData(); getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter()); } private void setupAdapter() { VerticalGridPresenter presenter = new VerticalGridPresenter(ZOOM_FACTOR); presenter.setNumberOfColumns(COLUMNS); setGridPresenter(presenter); CardPresenterSelector cardPresenter = new CardPresenterSelector(getActivity()); mAdapter = new ArrayObjectAdapter(cardPresenter); setAdapter(mAdapter); setOnItemViewClickedListener(new OnItemViewClickedListener() { @Override public void onItemClicked( Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) { Card card = (Card)item; Toast.makeText(getActivity(), "Clicked on "+card.getTitle(), Toast.LENGTH_SHORT).show(); } }); } private void loadData() { String json = Utils.inputStreamToString(getResources().openRawResource( R.raw.grid_example)); CardRow cardRow = new Gson().fromJson(json, CardRow.class); mAdapter.addAll(0, cardRow.getCards()); } } /** * Page fragment embeds a rows fragment. */ public static class SampleFragmentB extends RowsFragment { private final ArrayObjectAdapter mRowsAdapter; public SampleFragmentB() { mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector()); setAdapter(mRowsAdapter); setOnItemViewClickedListener(new OnItemViewClickedListener() { @Override public void onItemClicked( Presenter.ViewHolder itemViewHolder, Object item, RowPresenter.ViewHolder rowViewHolder, Row row) { Toast.makeText(getActivity(), "Implement click handler", Toast.LENGTH_SHORT) .show(); } }); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); createRows(); getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter()); } private void createRows() { String json = Utils.inputStreamToString(getResources().openRawResource( R.raw.page_row_example)); CardRow[] rows = new Gson().fromJson(json, CardRow[].class); for (CardRow row : rows) { if (row.getType() == CardRow.TYPE_DEFAULT) { mRowsAdapter.add(createCardRow(row)); } } } private Row createCardRow(CardRow cardRow) { PresenterSelector presenterSelector = new CardPresenterSelector(getActivity()); ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector); for (Card card : cardRow.getCards()) { adapter.add(card); } HeaderItem headerItem = new HeaderItem(cardRow.getTitle()); return new CardListRow(headerItem, adapter, cardRow); } } public static class SettingsFragment extends RowsFragment { private final ArrayObjectAdapter mRowsAdapter; public SettingsFragment() { ListRowPresenter selector = new ListRowPresenter(); selector.setNumRows(2); mRowsAdapter = new ArrayObjectAdapter(selector); setAdapter(mRowsAdapter); } @Override public void onAttach(Activity activity) { super.onAttach(activity); new Handler().postDelayed(new Runnable() { @Override public void run() { loadData(); } }, 200); } private void loadData() { if (isAdded()) { String json = Utils.inputStreamToString(getResources().openRawResource( R.raw.icon_example)); CardRow cardRow = new Gson().fromJson(json, CardRow.class); mRowsAdapter.add(createCardRow(cardRow)); getMainFragmentAdapter().getFragmentHost().notifyDataReady( getMainFragmentAdapter()); } } private ListRow createCardRow(CardRow cardRow) { SettingsIconPresenter iconCardPresenter = new SettingsIconPresenter(getActivity()); ArrayObjectAdapter adapter = new ArrayObjectAdapter(iconCardPresenter); for(Card card : cardRow.getCards()) { adapter.add(card); } HeaderItem headerItem = new HeaderItem(cardRow.getTitle()); return new CardListRow(headerItem, adapter, cardRow); } } public static class WebViewFragment extends Fragment implements MainFragmentAdapterProvider { private MainFragmentAdapter mMainFragmentAdapter = new MainFragmentAdapter(this); private WebView mWebview; @Override public MainFragmentAdapter getMainFragmentAdapter() { return mMainFragmentAdapter; } @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FrameLayout root = new FrameLayout(getActivity()); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); lp.setMarginStart(32); mWebview = new WebView(getActivity()); mWebview.setWebViewClient(new WebViewClient()); mWebview.getSettings().setJavaScriptEnabled(true); root.addView(mWebview, lp); return root; } @Override public void onResume() { super.onResume(); mWebview.loadUrl("https://www.google.com/policies/terms"); getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter()); } } }