Merge "Adding differnet PageFragment samples to ShowcaseApp." into nyc-dev
@@ -1,30 +1,40 @@
|
||||
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.app.VerticalGridFragment;
|
||||
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.cards.presenters.IconCardPresenter;
|
||||
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.OnItemViewSelectedListener;
|
||||
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;
|
||||
|
||||
@@ -38,12 +48,14 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
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 = "Another page fragment";
|
||||
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;
|
||||
|
||||
public PageAndListRowFragment() {
|
||||
getMainFragmentRegistry().registerFragment(PageRow.class,
|
||||
new PageRowFragmentFactory());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -51,6 +63,10 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
super.onCreate(savedInstanceState);
|
||||
setupUi();
|
||||
loadData();
|
||||
mBackgroundManager = BackgroundManager.getInstance(getActivity());
|
||||
mBackgroundManager.attach(getActivity().getWindow());
|
||||
getMainFragmentRegistry().registerFragment(PageRow.class,
|
||||
new PageRowFragmentFactory(mBackgroundManager));
|
||||
}
|
||||
|
||||
private void setupUi() {
|
||||
@@ -98,19 +114,34 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
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;
|
||||
if (row.getHeaderItem().getId() == HEADER_ID_1
|
||||
|| row.getHeaderItem().getId() == HEADER_ID_3) {
|
||||
return new SampleFragmentA();
|
||||
} else {
|
||||
mBackgroundManager.setDrawable(null);
|
||||
if (row.getHeaderItem().getId() == HEADER_ID_1) {
|
||||
return new SampleFragmentA(mBackgroundManager);
|
||||
} 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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,47 +149,89 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
|
||||
public PageFragmentAdapterImpl(SampleFragmentA fragment) {
|
||||
super(fragment);
|
||||
setScalingEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntranceTransitionState(boolean state) {
|
||||
getFragment().setEntranceTransitionState(state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple page fragment implementation.
|
||||
*/
|
||||
public static class SampleFragmentA extends Fragment implements MainFragmentAdapterProvider {
|
||||
public static class SampleFragmentA extends VerticalGridFragment
|
||||
implements MainFragmentAdapterProvider {
|
||||
|
||||
private static final int COLUMNS = 4;
|
||||
private final MainFragmentAdapter mMainFragmentAdapter =
|
||||
new PageAndListRowFragment.PageFragmentAdapterImpl(this);
|
||||
private boolean mEntranceTransitionState = true;
|
||||
private final int ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_SMALL;
|
||||
private final BackgroundManager mBackgroundManager;
|
||||
private ArrayObjectAdapter mAdapter;
|
||||
|
||||
@Override
|
||||
public View onCreateView(
|
||||
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return inflater.inflate(R.layout.page_fragment, container, false);
|
||||
public SampleFragmentA(BackgroundManager backgroundManager) {
|
||||
this.mBackgroundManager = backgroundManager;
|
||||
}
|
||||
|
||||
public void setEntranceTransitionState(boolean state) {
|
||||
mEntranceTransitionState = state;
|
||||
View view = getView();
|
||||
if (view == null) {
|
||||
return;
|
||||
}
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setupAdapter();
|
||||
}
|
||||
|
||||
int visibility = state ? View.VISIBLE : View.INVISIBLE;
|
||||
view.findViewById(R.id.tv1).setVisibility(visibility);
|
||||
view.findViewById(R.id.tv2).setVisibility(visibility);
|
||||
view.findViewById(R.id.tv3).setVisibility(visibility);
|
||||
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);
|
||||
|
||||
setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(
|
||||
Presenter.ViewHolder itemViewHolder,
|
||||
Object item,
|
||||
RowPresenter.ViewHolder rowViewHolder,
|
||||
Row row) {
|
||||
|
||||
Card card = (Card)item;
|
||||
if(card.getLocalImageResourceName() != null) {
|
||||
int resourceId = getActivity().getResources().getIdentifier(
|
||||
card.getLocalImageResourceName(),
|
||||
"drawable",
|
||||
getActivity().getPackageName());
|
||||
|
||||
mBackgroundManager.setDrawable(getResources().getDrawable(resourceId));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
prepareEntranceTransition();
|
||||
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
loadData();
|
||||
startEntranceTransition();
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
setEntranceTransitionState(mEntranceTransitionState);
|
||||
mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
|
||||
getMainFragmentAdapter().getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(
|
||||
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
return super.onCreateView(inflater, container, savedInstanceState);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -176,13 +249,6 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
public SampleFragmentB() {
|
||||
mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector());
|
||||
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
createRows();
|
||||
}
|
||||
}, 200);
|
||||
|
||||
setAdapter(mRowsAdapter);
|
||||
setOnItemViewClickedListener(new OnItemViewClickedListener() {
|
||||
@Override
|
||||
@@ -197,6 +263,18 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
createRows();
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
|
||||
private void createRows() {
|
||||
if (isAdded()) {
|
||||
String json = Utils.inputStreamToString(getResources().openRawResource(
|
||||
@@ -219,4 +297,77 @@ public class PageAndListRowFragment extends BrowseFragment {
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package android.support.v17.leanback.supportleanbackshowcase.app.page;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v17.leanback.supportleanbackshowcase.R;
|
||||
import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.ImageCardViewPresenter;
|
||||
import android.support.v17.leanback.widget.ImageCardView;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
|
||||
/**
|
||||
* Simple presenter implementation to represent settings icon as cards.
|
||||
*/
|
||||
public class SettingsIconPresenter extends ImageCardViewPresenter {
|
||||
|
||||
public SettingsIconPresenter(Context context) {
|
||||
super(context, R.style.IconCardTheme);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ImageCardView onCreateView() {
|
||||
final ImageCardView imageCardView = super.onCreateView();
|
||||
imageCardView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
||||
@Override
|
||||
public void onFocusChange(View v, boolean hasFocus) {
|
||||
if (hasFocus) {
|
||||
setImageBackground(imageCardView, R.color.settings_card_background_focussed);
|
||||
} else {
|
||||
setImageBackground(imageCardView, R.color.settings_card_background);
|
||||
}
|
||||
}
|
||||
});
|
||||
setImageBackground(imageCardView, R.color.settings_card_background);
|
||||
return imageCardView;
|
||||
}
|
||||
|
||||
private void setImageBackground(ImageCardView imageCardView, int colorId) {
|
||||
imageCardView.setBackgroundColor(getContext().getResources().getColor(colorId));
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,9 @@
|
||||
|
||||
package android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
|
||||
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.v17.leanback.supportleanbackshowcase.R;
|
||||
import android.support.v17.leanback.widget.ImageCardView;
|
||||
import android.view.View;
|
||||
@@ -26,6 +28,7 @@ import android.widget.ImageView;
|
||||
* menu.
|
||||
*/
|
||||
public class IconCardPresenter extends ImageCardViewPresenter {
|
||||
private static final int ANIMATION_DURATION = 200;
|
||||
|
||||
public IconCardPresenter(Context context) {
|
||||
super(context, R.style.IconCardTheme);
|
||||
@@ -35,17 +38,22 @@ public class IconCardPresenter extends ImageCardViewPresenter {
|
||||
protected ImageCardView onCreateView() {
|
||||
final ImageCardView imageCardView = super.onCreateView();
|
||||
final ImageView image = imageCardView.getMainImageView();
|
||||
image.setBackgroundResource(R.drawable.icon_focused);
|
||||
image.getBackground().setAlpha(0);
|
||||
imageCardView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
||||
@Override
|
||||
public void onFocusChange(View v, boolean hasFocus) {
|
||||
if (hasFocus) {
|
||||
image.setBackgroundResource(R.drawable.icon_focused);
|
||||
} else {
|
||||
image.setBackground(null);
|
||||
}
|
||||
animateIconBackground(image.getBackground(), hasFocus);
|
||||
}
|
||||
});
|
||||
return imageCardView;
|
||||
}
|
||||
|
||||
private void animateIconBackground(Drawable drawable, boolean hasFocus) {
|
||||
if (hasFocus) {
|
||||
ObjectAnimator.ofInt(drawable, "alpha", 0, 255).setDuration(ANIMATION_DURATION).start();
|
||||
} else {
|
||||
ObjectAnimator.ofInt(drawable, "alpha", 255, 0).setDuration(ANIMATION_DURATION).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ import android.support.v17.leanback.supportleanbackshowcase.models.Card;
|
||||
import android.support.v17.leanback.widget.ImageCardView;
|
||||
import android.view.ContextThemeWrapper;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.Toast;
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
/**
|
||||
@@ -39,7 +41,14 @@ public class ImageCardViewPresenter extends AbstractCardPresenter<ImageCardView>
|
||||
|
||||
@Override
|
||||
protected ImageCardView onCreateView() {
|
||||
return new ImageCardView(getContext());
|
||||
ImageCardView imageCardView = new ImageCardView(getContext());
|
||||
imageCardView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Toast.makeText(getContext(), "Clicked on ImageCardView", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
return imageCardView;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
|
After Width: | Height: | Size: 758 B |
|
After Width: | Height: | Size: 672 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"title": "Icon",
|
||||
"cards": [
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Settings",
|
||||
"localImageResource": "ic_settings_settings"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "WiFi",
|
||||
"localImageResource": "ic_settings_wifi_3_bar"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Parental Control",
|
||||
"localImageResource": "ic_settings_parental_control"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Time",
|
||||
"localImageResource": "ic_settings_time"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Input connection",
|
||||
"localImageResource": "icon_01"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Hdmi",
|
||||
"localImageResource": "icon_02"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Overscan",
|
||||
"localImageResource": "icon_03"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Remote",
|
||||
"localImageResource": "icon_04"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Ethernet",
|
||||
"localImageResource": "icon_05"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Voice",
|
||||
"localImageResource": "icon_06"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Brightness",
|
||||
"localImageResource": "icon_07"
|
||||
},
|
||||
{
|
||||
"type": "ICON",
|
||||
"title": "Antenna",
|
||||
"localImageResource": "icon_08"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -45,4 +45,6 @@
|
||||
<color name="app_guidedstep_actions_background">#C03800</color>
|
||||
<color name="app_guidedstep_subactions_background">#C03800</color>
|
||||
<color name="app_guidedstep_dialog_actions_background">#263238</color>
|
||||
<color name="settings_card_background">#0277BD</color>
|
||||
<color name="settings_card_background_focussed">#01579B</color>
|
||||
</resources>
|
||||
|
||||