diff --git a/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml b/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml index 71f1b7d28..c15f13513 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml @@ -39,6 +39,9 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/CardExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/CardExampleFragment.java index b47caf172..4ece60db1 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/CardExampleFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/CardExampleFragment.java @@ -70,7 +70,7 @@ public class CardExampleFragment extends BrowseFragment { private void createRows() { String json = Utils - .inputStreamToString(getResources().openRawResource(R.raw.cards_card_example)); + .inputStreamToString(getResources().openRawResource(R.raw.cards_example)); CardRow[] rows = new Gson().fromJson(json, CardRow[].class); for (CardRow row : rows) { mRowsAdapter.add(createCardRow(row)); diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleActivity.java new file mode 100644 index 000000000..e301f58f5 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleActivity.java @@ -0,0 +1,54 @@ +/* + * 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.app.Activity; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; +import android.support.v17.leanback.app.DetailsFragment; +import android.support.v17.leanback.app.GuidedStepFragment; +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; + +/** + * Contains a {@link DetailsFragment} in order to display more details for a given card. + */ +public class DetailViewExampleActivity extends Activity { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail_example); + } +} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleFragment.java index 10ceceb38..543358707 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailViewExampleFragment.java @@ -38,39 +38,46 @@ import android.widget.Toast; import com.google.gson.Gson; /** - * Displays a card with more details. + * Displays a card with more details using a {@link DetailsFragment}. */ public class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener, OnItemViewSelectedListener { - private static final String TAG = "DetailViewExampleFragment"; private ArrayObjectAdapter mRowsAdapter; - @Override public void onActivityCreated(Bundle savedInstanceState) { + @Override + public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(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) { + + @Override + protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) { + // Customize Actionbar and Content by using custom colors. 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 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( - getActivity().getResources().getColor(R.color.detail_view_background)); + getResources().getColor(R.color.detail_view_background, null)); return viewHolder; } }; @@ -112,26 +119,30 @@ public class DetailViewExampleFragment extends DetailsFragment implements OnItem } 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) { + @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) + } 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) { + @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)); + int backgroundColor = getResources().getColor(R.color.detail_view_related_background, + null); + getView().setBackgroundColor(backgroundColor); } else { getView().setBackgroundResource(R.drawable.background_canyon); } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailsDescriptionPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailsDescriptionPresenter.java index 678b3d578..ebb5c53e6 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailsDescriptionPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/DetailsDescriptionPresenter.java @@ -36,7 +36,7 @@ public class DetailsDescriptionPresenter extends Presenter { } @Override public ViewHolder onCreateViewHolder(ViewGroup parent) { - View view = LayoutInflater.from(mContext).inflate(R.layout.detail_view, null); + View view = LayoutInflater.from(mContext).inflate(R.layout.detail_view_content, null); return new ViewHolder(view); } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/MainFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/MainFragment.java index 3522d0b45..6486a10b6 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/MainFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/MainFragment.java @@ -178,12 +178,9 @@ public class MainFragment extends BrowseFragment { break; } case 3: { - updateBackgroundImage( - getResources().getDrawable(R.drawable.background_canyon, null)); - Fragment fragment = new DetailViewExampleFragment(); - getFragmentManager().beginTransaction() - .replace(R.id.fragmentContainer, fragment) - .addToBackStack(null).commit(); + Intent intent = new Intent(getActivity().getBaseContext(), + DetailViewExampleActivity.class); + startActivity(intent); break; } case 4: { diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/Movie.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/Movie.java index 3fc9d6955..4d590aebd 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/Movie.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/Movie.java @@ -1,3 +1,17 @@ +/* + * 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 com.google.gson.annotations.SerializedName; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/ResourceCache.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/ResourceCache.java index bee5cbbec..c7c858939 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/ResourceCache.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/ResourceCache.java @@ -1,3 +1,17 @@ +/* + * 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.util.SparseArray; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/SettingsExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/SettingsExampleFragment.java index fef91b108..44930f2b4 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/SettingsExampleFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/SettingsExampleFragment.java @@ -1,3 +1,17 @@ +/* + * 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.app.Fragment; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/VideoConsumptionExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/VideoConsumptionExampleFragment.java index 058f759fa..29e82a875 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/VideoConsumptionExampleFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/VideoConsumptionExampleFragment.java @@ -34,13 +34,11 @@ public class VideoConsumptionExampleFragment extends PlaybackOverlayFragment imp OnItemViewClickedListener, MediaPlayerGlue.OnMediaFileFinishedPlayingListener { private static final String URL = "http://techslides.com/demos/sample-videos/small.mp4"; - private static final String TAG = "VideoConsumptionExampleFragment"; private ArrayObjectAdapter mRowsAdapter; private MediaPlayerGlue mGlue; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (Constants.LOCAL_LOGD) Log.d(TAG, "onCreate"); mGlue = new VideoMediaPlayerGlue(getActivity(), this) { @@ -61,7 +59,6 @@ public class VideoConsumptionExampleFragment extends PlaybackOverlayFragment imp SurfaceView surface = (SurfaceView) videoSurfaceFragment.getView(); surface.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { - Log.d(TAG, "surfaceCreated(SurfaceHolder)"); mGlue.setDisplay(holder); } @@ -71,7 +68,6 @@ public class VideoConsumptionExampleFragment extends PlaybackOverlayFragment imp } @Override public void surfaceDestroyed(SurfaceHolder holder) { - Log.d(TAG, "surfaceDestroyed(SurfaceHolder)"); } }); diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample2ndStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample2ndStepFragment.java index 4d54a6a7e..ea532880b 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample2ndStepFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample2ndStepFragment.java @@ -1,3 +1,17 @@ +/* + * 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.graphics.Color; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample3rdStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample3rdStepFragment.java index 4838301fb..fccf7c9ee 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample3rdStepFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample3rdStepFragment.java @@ -1,7 +1,19 @@ +/* + * 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.graphics.Color; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; @@ -9,11 +21,8 @@ import android.support.v17.leanback.app.GuidedStepFragment; import android.support.v17.leanback.widget.GuidanceStylist; import android.support.v17.leanback.widget.GuidedAction; import android.support.v17.leanback.widget.GuidedActionsStylist; -import android.util.Log; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; /** * TODO: JavaDoc diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample4thStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample4thStepFragment.java index 623de26ca..82a8a3d65 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample4thStepFragment.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/WizardExample4thStepFragment.java @@ -1,3 +1,17 @@ +/* + * 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; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/CharacterCardView.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/CharacterCardView.java new file mode 100644 index 000000000..311f88518 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/CharacterCardView.java @@ -0,0 +1,70 @@ +/* + * 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.cards; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.support.v17.leanback.supportleanbackshowcase.R; +import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; +import android.support.v17.leanback.widget.BaseCardView; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +public class CharacterCardView extends BaseCardView { + + public CharacterCardView(Context context) { + super(context); + LayoutInflater.from(getContext()).inflate(R.layout.character_card, this); + setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + ImageView mainImage = (ImageView) findViewById(R.id.main_image); + View container = findViewById(R.id.container); + if (hasFocus) { + container.setBackgroundResource(R.drawable.character_focused); + mainImage.setBackgroundResource(R.drawable.character_focused); + } else { + container.setBackgroundResource(R.drawable.character_not_focused_padding); + mainImage.setBackgroundResource(R.drawable.character_not_focused); + } + } + }); + setFocusable(true); + } + + public void updateUi(Card card) { + TextView primaryText = (TextView) findViewById(R.id.primary_text); + final ImageView imageView = (ImageView) findViewById(R.id.main_image); + + primaryText.setText(card.getTitle()); + if (card.getLocalImageResourceName() != null) { + int resourceId = card.getLocalImageResourceId(getContext()); + Bitmap bitmap = BitmapFactory + .decodeResource(getContext().getResources(), resourceId); + RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getContext().getResources(), bitmap); + drawable.setAntiAlias(true); + drawable.setCornerRadius(Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f); + imageView.setImageDrawable(drawable); + } + } + + +} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/TextCardView.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/TextCardView.java new file mode 100644 index 000000000..4f661e098 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/TextCardView.java @@ -0,0 +1,57 @@ +/* + * 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.cards; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.support.v17.leanback.supportleanbackshowcase.R; +import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; +import android.support.v17.leanback.widget.BaseCardView; +import android.support.v4.graphics.drawable.RoundedBitmapDrawable; +import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; +import android.view.LayoutInflater; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +public class TextCardView extends BaseCardView { + + public TextCardView(Context context) { + super(context); + LayoutInflater.from(getContext()).inflate(R.layout.text_icon_card, this); + setFocusable(true); + } + + public void updateUi(Card card) { + TextView extraText = (TextView) findViewById(R.id.extra_text); + TextView primaryText = (TextView) findViewById(R.id.primary_text); + final ImageView imageView = (ImageView) findViewById(R.id.main_image); + + extraText.setText(card.getExtraText()); + primaryText.setText(card.getTitle()); + + // Create a rounded drawable. + int resourceId = card.getLocalImageResourceId(getContext()); + Bitmap bitmap = BitmapFactory + .decodeResource(getContext().getResources(), resourceId); + RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getContext().getResources(), bitmap); + drawable.setAntiAlias(true); + drawable.setCornerRadius( + Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f); + imageView.setImageDrawable(drawable); + } + +} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/models/Card.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/models/Card.java index c0b79c7e0..79f951938 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/models/Card.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/models/Card.java @@ -109,12 +109,13 @@ public class Card { public enum Type { - THIN, - THIN_RATING, + MOVIE_COMPLETE, + MOVIE, + MOVIE_BASE, ICON, SQUARE_BIG, - SQUARE, - WIDE_SHORT, + SINGLE_LINE, + GAME, SQUARE_SMALL, DEFAULT, SIDE_INFO, diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java index 574968c07..b81f119ed 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java @@ -15,7 +15,6 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.BaseCardViewEx; import android.support.v17.leanback.widget.BaseCardView; import android.support.v17.leanback.widget.Presenter; import android.view.ViewGroup; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractFooterCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractFooterCardPresenter.java deleted file mode 100644 index adfda2407..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractFooterCardPresenter.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.cards.presenters; - -import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.Utils; -import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.FooterLayoutCardView; -import android.support.v17.leanback.widget.Presenter; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.squareup.picasso.Picasso; - -/** - * A custom and abstract card {@link Presenter} which allows to create a card consisting of an image - * and a custom footer. The footer is passed as a layout and will be inflated automatically. - */ -public abstract class AbstractFooterCardPresenter extends - AbstractCardPresenter { - - private static final String TAG = "AbstractFooterCardPresenter"; - private final Drawable mLoadingErrorDrawable; - private final int mFooterLayoutd; - private final int mImageWidth; - private final int mImageHeight; - - /** - * @param context Used to retrieve default values such as error drawables. - * @param footerLayoutId The layout which represents the footer. - * @param imageWidth The width of the card's main image. This width defines the card's width - * too. - * @param imageHeight The height of the card's main image. The card's height will be - * imageHeight + footerHeight - */ - public AbstractFooterCardPresenter(Context context, int footerLayoutId, int imageWidth, - int imageHeight) { - super(context); - mFooterLayoutd = footerLayoutId; - mImageWidth = imageWidth; - mImageHeight = imageHeight; - - // In case the image could not be fetched from the server we want to make sure something is show. In this case, a solid color. - int color = context.getResources().getColor(R.color.loading_error_card_background); - mLoadingErrorDrawable = new ColorDrawable(color); - } - - @Override public final FooterLayoutCardView onCreateView() { - FooterLayoutCardView cardView = new FooterLayoutCardView(getContext(), mFooterLayoutd, - mImageWidth, mImageHeight); - onViewCreated(cardView); - return cardView; - } - - @Override public void onBindViewHolder(Card card, FooterLayoutCardView cardView) { - // Load the card's image. This can be either an image on a remote server or a local one stored in the resources. - ImageView imageView = cardView.getImageView(); - if (card.getImageURI() != null) { - Utils.loadImageFromUri(getContext(), card.getImageURI(), imageView, mImageWidth, - mImageHeight, true, mLoadingErrorDrawable); - } else if (card.getLocalImageResourceName() != null) { - int resourceId = getContext().getResources() - .getIdentifier(card.getLocalImageResourceName(), - "drawable", getContext().getPackageName()); - Picasso.with(getContext()).load(resourceId).resize(mImageWidth, mImageHeight) - .centerCrop().into(imageView); - } - } - - /** - * Override this method to react to creations of new card views. - * - * @param cardView The view which has been created. - * @see Presenter#onCreateViewHolder(ViewGroup) - */ - public void onViewCreated(FooterLayoutCardView cardView) { - // Nothing to clean up. Override if necessary. - } - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java index 491fb2f72..53d462069 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java @@ -25,9 +25,6 @@ import java.util.HashMap; /** * This PresenterSelector will decide what Presenter to use depending on a given card's type. - *

- * TODO: leanbackteam@ Discuss whether leanback's PresenterSelector should be renamed to - * AbstractPresenterSelector. */ public class CardPresenterSelector extends PresenterSelector { @@ -38,68 +35,55 @@ public class CardPresenterSelector extends PresenterSelector { mContext = context; } - @Override public Presenter getPresenter(Object item) { + @Override + public Presenter getPresenter(Object item) { if (!(item instanceof Card)) throw new RuntimeException( String.format("The PresenterSelector only supports data items of type '%s'", - Card.class.getName())); + Card.class.getName())); Card card = (Card) item; Presenter presenter = presenters.get(card.getType()); - if (presenter == null) switch (card.getType()) { - case SQUARE: - presenter = new SingleLineCardPresenter(mContext); - break; - case THIN_RATING: - presenter = new MovieRatingCardPresenter(mContext); - break; - case SIDE_INFO: - presenter = new SideInfoCardPresenter(mContext); - break; - case SIDE_INFO_TEST_1: - presenter = new LauncherCardPresenter(mContext); - break; - case TEXT: - presenter = new TextCardPresenter(mContext); - break; - case ICON: - presenter = new IconCardPresenter(mContext); - break; - case CHARACTER: - presenter = new CharacterCardPresenter(mContext); - break; - case THIN: { - int width = (int) mContext.getResources() - .getDimension(R.dimen.thin_image_card_width); - int height = (int) mContext.getResources() - .getDimension(R.dimen.thin_image_card_height); - presenter = new ImageCardViewPresenter1(mContext, width, height); + if (presenter == null) { + switch (card.getType()) { + case SINGLE_LINE: + presenter = new SingleLineCardPresenter(mContext); + break; + case MOVIE: + case MOVIE_BASE: + case MOVIE_COMPLETE: + case SQUARE_BIG: + case GRID_SQUARE: + case GAME: { + int style = R.style.MovieCardSimpleStyle; + if (card.getType() == Card.Type.MOVIE_BASE) { + style = R.style.MovieCardBasicStyle; + } else if (card.getType() == Card.Type.MOVIE_COMPLETE) { + style = R.style.MovieCardCompleteStyle; + } else if (card.getType() == Card.Type.SQUARE_BIG) { + style = R.style.SquareBigCard; + } else if (card.getType() == Card.Type.GRID_SQUARE) { + style = R.style.GridCardStyle; + } else if (card.getType() == Card.Type.GAME) { + style = R.style.GameCardStyle; + } + presenter = new ImageCardViewPresenter(mContext, style); + break; + } + case SIDE_INFO: + presenter = new SideInfoCardPresenter(mContext); + break; + case TEXT: + presenter = new TextCardPresenter(mContext); + break; + case ICON: + presenter = new IconCardPresenter(mContext); + break; + case CHARACTER: + presenter = new CharacterCardPresenter(mContext); + break; + default: + presenter = new ImageCardViewPresenter(mContext); + break; } - break; - case SQUARE_BIG: { - int width = (int) mContext.getResources() - .getDimension(R.dimen.big_square_image_card_width); - int height = (int) mContext.getResources() - .getDimension(R.dimen.big_square_image_card_height); - presenter = new ImageCardViewPresenter(mContext, width, height); - } - break; - case GRID_SQUARE: { - int width = (int) mContext.getResources().getDimension(R.dimen.grid_card_width); - int height = (int) mContext.getResources().getDimension(R.dimen.grid_card_height); - presenter = new ImageCardViewPresenter(mContext, width, height); - } - break; - case WIDE_SHORT: { - presenter = new GameBannerCardPresenter(mContext); - } - break; - default: { - int width = (int) mContext.getResources() - .getDimension(R.dimen.default_image_card_width); - int height = (int) mContext.getResources() - .getDimension(R.dimen.default_image_card_height); - presenter = new ImageCardViewPresenter(mContext, width, height); - } - break; } presenters.put(card.getType(), presenter); return presenter; diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java index 5514674cb..60fa5b2aa 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java @@ -15,73 +15,26 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.support.v17.leanback.supportleanbackshowcase.Constants; -import android.support.v17.leanback.supportleanbackshowcase.R; +import android.support.v17.leanback.supportleanbackshowcase.cards.CharacterCardView; import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.BaseCardViewEx; -import android.support.v4.graphics.drawable.RoundedBitmapDrawable; -import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; -import android.util.Log; -import android.util.SparseArray; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; /** * This Presenter is used to display the characters card row in the DetailView examples. */ -public class CharacterCardPresenter extends AbstractCardPresenter { - - private static final String TAG = "CharacterCardPresenter"; - private final SparseArray mImageCache = new SparseArray(); +public class CharacterCardPresenter extends AbstractCardPresenter { public CharacterCardPresenter(Context context) { super(context); } - @Override protected BaseCardViewEx onCreateView() { - final BaseCardViewEx cardView = new BaseCardViewEx(getContext()); - LayoutInflater.from(getContext()).inflate(R.layout.character_card, cardView); - cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override public void onFocusChange(View v, boolean hasFocus) { - if (Constants.LOCAL_LOGD) Log.d(TAG, "onFocusChanged(" + hasFocus + ")"); - ImageView mainImage = cardView.getViewById(R.id.main_image); - View container = cardView.getViewById(R.id.container); - if (hasFocus) { - container.setBackgroundResource(R.drawable.character_focused); - mainImage.setBackgroundResource(R.drawable.character_focused); - } else { - container.setBackgroundResource(R.drawable.character_not_focused_padding); - mainImage.setBackgroundResource(R.drawable.character_not_focused); - } - } - }); - return cardView; + @Override + protected CharacterCardView onCreateView() { + return new CharacterCardView(getContext()); } - @Override public void onBindViewHolder(Card card, BaseCardViewEx cardView) { - if (Constants.LOCAL_LOGD) Log.d(TAG, "onBindViewHolder"); - TextView primaryText = cardView.getViewById(R.id.primary_text); - final ImageView imageView = cardView.getViewById(R.id.main_image); - - primaryText.setText(card.getTitle()); - if (card.getLocalImageResourceName() != null) { - int resourceId = card.getLocalImageResourceId(getContext()); - RoundedBitmapDrawable drawable = mImageCache.get(resourceId, null); - if (drawable == null) { - Bitmap bitmap = BitmapFactory - .decodeResource(getContext().getResources(), resourceId); - drawable = RoundedBitmapDrawableFactory.create(getContext().getResources(), bitmap); - drawable.setAntiAlias(true); - drawable.setCornerRadius(Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f); - mImageCache.put(resourceId, drawable); - } - imageView.setImageDrawable(drawable); - if (Constants.LOCAL_LOGD) Log.d(TAG, "Round image created and set."); - } + @Override + public void onBindViewHolder(Card card, CharacterCardView cardView) { + cardView.updateUi(card); } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/GameBannerCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/GameBannerCardPresenter.java deleted file mode 100644 index d6e3d0e26..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/GameBannerCardPresenter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.cards.presenters; - -import android.content.Context; -import android.graphics.Color; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement; -import android.widget.TextView; - -/** - * This presenter will display the cards representing a gamer banners. It inherits from {@link - * ImageCardViewPresenter} and will set a footer icon as well as a secondary text color. - */ -public class GameBannerCardPresenter extends ImageCardViewPresenter { - - private static final String TAG = "GameBannerCardPresenter"; - - public GameBannerCardPresenter(Context context) { - super(context, - (int) context.getResources().getDimension(R.dimen.wide_short_image_card_width), - (int) context.getResources().getDimension(R.dimen.wide_short_image_card_height)); - } - - @Override protected ImageCardViewReplacement onCreateView() { - ImageCardViewReplacement cardView = super.onCreateView(); - TextView secondaryText = cardView.getSecondaryTextView(); - secondaryText.setTextColor(Color.parseColor("#80c349")); - return cardView; - } - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java index 0154743db..bf5be70f4 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java @@ -16,51 +16,36 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.BaseCardViewEx; -import android.view.LayoutInflater; +import android.support.v17.leanback.widget.ImageCardView; import android.view.View; import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; /** * This Presenter will display cards which consists of a single icon which will be highlighted by a * surrounding circle when the card is focused. AndroidTV uses these cards for entering settings * menu. */ -public class IconCardPresenter extends AbstractCardPresenter { - - private static final String TAG = "IconCardPresenter"; +public class IconCardPresenter extends ImageCardViewPresenter { public IconCardPresenter(Context context) { - super(context); + super(context, R.style.IconCardStyle); } - @Override protected BaseCardViewEx onCreateView() { - final BaseCardViewEx cardView = new BaseCardViewEx(getContext()); - LayoutInflater.from(getContext()).inflate(R.layout.icon_card, cardView); - LayoutInflater.from(getContext()).inflate(R.layout.icon_card_footer, cardView); - cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus) cardView.getViewById(R.id.container) - .setBackgroundResource(R.drawable.icon_focused); - else cardView.getViewById(R.id.container).setBackground(null); + @Override + protected ImageCardView onCreateView() { + final ImageCardView imageCardView = super.onCreateView(); + final ImageView image = imageCardView.getMainImageView(); + 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); + } } }); - return cardView; - } - - @Override public void onBindViewHolder(Card card, BaseCardViewEx cardView) { - TextView primaryText = cardView.getViewById(R.id.primary_text); - ImageView imageView = cardView.getViewById(R.id.main_image); - - primaryText.setText(card.getTitle()); - if (card.getLocalImageResourceName() != null) { - int resourceId = card.getLocalImageResourceId(getContext()); - Picasso.with(getContext()).load(resourceId).into(imageView); - } + return imageCardView; } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java index f467dad70..bf03753e8 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java @@ -15,127 +15,45 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.support.v17.leanback.supportleanbackshowcase.Constants; import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.Utils; import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement; -import android.util.Log; -import android.view.View; - -import com.squareup.picasso.Picasso; - -import java.util.HashMap; +import android.support.v17.leanback.widget.ImageCardView; /** - * A ImageCardViewPresenter is used to generate Views and bind Objects to them on demand. It - * contains an {@link ImageCardViewReplacement}. + * A very basic {@link ImageCardView} {@link android.support.v17.leanback.widget.Presenter}.You can + * pass a custom style for the ImageCardView in the constructor. Use the default constructor to + * create a Presenter with a default ImageCardView style. */ -public class ImageCardViewPresenter extends AbstractCardPresenter { +public class ImageCardViewPresenter extends AbstractCardPresenter { - private static final String TAG = "ImageCardViewPresenter"; - private final int mImageWidthInDp; - private final int mImageHeightDp; - private final Drawable mLoadingErrorDrawable; - private final HashMap mSelectedColors = new HashMap(); - private int mDefaultFooterColor; + private final int mCardStyleResId; - public ImageCardViewPresenter(Context context, int imageWidthInDp, int imageHeightInDp) { + public ImageCardViewPresenter(Context context, int cardStyleResId) { super(context); - int color = context.getResources().getColor(R.color.loading_error_card_background); - mLoadingErrorDrawable = new ColorDrawable(color); - - mDefaultFooterColor = context.getResources() - .getColor(R.color.default_card_footer_background_color); - mImageWidthInDp = imageWidthInDp; - mImageHeightDp = imageHeightInDp; + mCardStyleResId = cardStyleResId; } - @Override protected ImageCardViewReplacement onCreateView() { - if (Constants.LOCAL_LOGD) Log.d(TAG, "onCreateView()"); - final ImageCardViewReplacement cardView = new ImageCardViewReplacement(getContext(), - mImageWidthInDp, - mImageHeightDp); - cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override public void onFocusChange(View v, boolean hasFocus) { - udateCardUi(cardView); - } - }); - return cardView; + public ImageCardViewPresenter(Context context) { + super(context); + mCardStyleResId = R.style.DefaultCardStyle; } - @Override public void onBindViewHolder(Card card, ImageCardViewReplacement cardView) { - if (Constants.LOCAL_LOGD) Log.d(TAG, "onBindViewHolder(Card,ImageCardViewReplacement)"); + @Override + protected ImageCardView onCreateView() { + return new ImageCardView(getContext(), mCardStyleResId); + } + + @Override + public void onBindViewHolder(Card card, final ImageCardView cardView) { cardView.setTag(card); - - // Display description iff there is one. - if (card.getDescription() == null || card.getDescription().length() == 0) { - cardView.getSecondaryTextView().setVisibility(View.GONE); - cardView.getPrimaryTextView().setLines(2); - cardView.getPrimaryTextView().setMaxLines(2); - } else { - cardView.getPrimaryTextView().setLines(1); - cardView.getPrimaryTextView().setMaxLines(1); - cardView.getSecondaryTextView().setText(card.getDescription()); - cardView.getSecondaryTextView().setVisibility(View.VISIBLE); - } - - // Display title iff there is one. - if (card.getTitle() == null || card.getTitle().length() == 0) { - cardView.getPrimaryTextView().setVisibility(View.GONE); - cardView.getSecondaryTextView().setLines(2); - cardView.getSecondaryTextView().setMaxLines(2); - } else { - cardView.getSecondaryTextView().setLines(1); - cardView.getSecondaryTextView().setMaxLines(1); - cardView.getPrimaryTextView().setText(card.getTitle()); - cardView.getPrimaryTextView().setVisibility(View.VISIBLE); - } - // Load main image from an URI or a local resource. - if (card.getImageURI() != null) { - Utils.loadImageFromUri(getContext(), card.getImageURI(), cardView.getImageView(), - mImageWidthInDp, mImageHeightDp, true, mLoadingErrorDrawable); - } else if (card.getLocalImageResourceName() != null) { + cardView.setTitleText(card.getTitle()); + cardView.setContentText(card.getDescription()); + if (card.getLocalImageResourceName() != null) { int resourceId = getContext().getResources() - .getIdentifier(card.getLocalImageResourceName(), - "drawable", getContext().getPackageName()); - Picasso.with(getContext()).load(resourceId).resize(mImageWidthInDp, mImageHeightDp) - .centerCrop().into(cardView.getImageView()); + .getIdentifier(card.getLocalImageResourceName(), + "drawable", getContext().getPackageName()); + cardView.getMainImageView().setImageResource(resourceId); } - - // Load footer icon from a local resource or hide it. - cardView.getViewById(R.id.container).setVisibility(View.VISIBLE); - if (card.getFooterLocalImageResourceName() != null) { - int resourceId = getContext().getResources() - .getIdentifier(card.getFooterLocalImageResourceName(), - "drawable", getContext().getPackageName()); - Picasso.with(getContext()).load(resourceId).into(cardView.getIconView()); - cardView.getIconView().setVisibility(View.VISIBLE); - } else { - if (card.getDescription() == null || card.getDescription().isEmpty()) { - cardView.getViewById(R.id.container).setVisibility(View.GONE); - } - cardView.getIconView().setVisibility(View.GONE); - } - - // Update background color depending on the card's focused state. - udateCardUi(cardView); } - private void udateCardUi(ImageCardViewReplacement view) { - int color = mDefaultFooterColor; - - if (view.getTag() != null) { - Card card = (Card) view.getTag(); - if (card.getSelectedColor() != -1 && view.isSelected()) { - color = card.getSelectedColor(); - } - if (card.getFooterColor() != -1) { - color = card.getFooterColor(); - } - } - view.getInfoBoxView().setBackgroundColor(color); - } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter1.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter1.java deleted file mode 100644 index bd5712c69..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter1.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.cards.presenters; - -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.Constants; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement; -import android.support.v17.leanback.widget.ImageCardView; -import android.util.Log; - -/** - * A ImageCardViewPresenter is used to generate Views and bind Objects to them on demand. It - * contains an {@link ImageCardViewReplacement}. - */ -public class ImageCardViewPresenter1 extends AbstractCardPresenter { - - private static final String TAG = "ImageCardViewPresenter"; - private final int mImageWidthInDp; - private final int mImageHeightDp; - - public ImageCardViewPresenter1(Context context, int imageWidthInDp, int imageHeightInDp) { - super(context); - mImageWidthInDp = imageWidthInDp; - mImageHeightDp = imageHeightInDp; - } - - @Override protected ImageCardView onCreateView() { - if (Constants.LOCAL_LOGD) Log.d(TAG, "onCreateView()"); - - final ImageCardView cardView = new ImageCardView(getContext(), R.style.ImageCardViewColoredTextStyle); - cardView.setMainImageDimensions(mImageWidthInDp, mImageHeightDp); - cardView.setFocusable(true); - return cardView; - } - - @Override public void onBindViewHolder(Card card, final ImageCardView cardView) { - if (Constants.LOCAL_LOGD) Log.d(TAG, "onBindViewHolder(Card,ImageCardViewReplacement)"); - cardView.setTag(card); - cardView.setTitleText(card.getTitle()); - //cardView.setContentText("Hello"); - if (card.getLocalImageResourceName() != null) { - int resourceId = getContext().getResources() - .getIdentifier(card.getLocalImageResourceName(), - "drawable", getContext().getPackageName()); - cardView.getMainImageView().setImageResource(resourceId); - } - - } - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/LauncherCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/LauncherCardPresenter.java deleted file mode 100644 index 894232125..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/LauncherCardPresenter.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.cards.presenters; - -import android.animation.ValueAnimator; -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.Utils; -import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.widget.ImageView; - -import com.squareup.picasso.Picasso; - -/** - * THis Presenter displays an expandable card which is used e.g. in the AndroidTV launcher. Once - * such a card gets focused it expands and will show more details of the image. - */ -public class LauncherCardPresenter extends ImageCardViewPresenter { - - private static final String TAG = "LauncherCardPresenter"; - - public LauncherCardPresenter(Context context) { - super(context, 1 /* val > 0 required by Picasso */, - (int) context.getResources().getDimension(R.dimen.default_image_card_height)); - } - - @Override protected ImageCardViewReplacement onCreateView() { - ImageCardViewReplacement cardView = super.onCreateView(); - final ImageView imageView = cardView.getImageView(); - imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); - cardView.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override public void onFocusChange(View v, final boolean hasFocus) { - int expandedWidth = (int) getContext().getResources().getDimension( - R.dimen.default_image_card_width); - int collapsedWidth = (int) getContext().getResources().getDimension( - R.dimen.default_image_card_height); - - expandedWidth = collapsedWidth; - - ValueAnimator animator = new ValueAnimator(); - animator.setInterpolator(new AccelerateDecelerateInterpolator()); - animator.setIntValues(hasFocus ? collapsedWidth : expandedWidth, - hasFocus ? expandedWidth : collapsedWidth); - animator.setDuration(500); - animator.setStartDelay(0); - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - @Override public void onAnimationUpdate(ValueAnimator animation) { - ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams(); - layoutParams.width = (Integer) animation.getAnimatedValue(); - imageView.setLayoutParams(layoutParams); - } - }); - animator.start(); - } - }); - return cardView; - } - - @Override public void onBindViewHolder(Card card, ImageCardViewReplacement cardView) { - super.onBindViewHolder(card, cardView); - - ImageView imageView = cardView.getImageView(); - cardView.setTag(card); - int width = (int) getContext().getResources() - .getDimension(R.dimen.default_image_card_height); - ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams(); - layoutParams.width = Utils.convertDpToPixel(getContext(), width); - imageView.setLayoutParams(layoutParams); - - - if (card.getLocalImageResourceName() != null) { - int height = (int) getContext().getResources() - .getDimension(R.dimen.sidetext_image_card_height); - int resourceId = getContext().getResources() - .getIdentifier(card.getLocalImageResourceName(), - "drawable", getContext().getPackageName()); - Picasso.with(getContext()).load(resourceId).into(imageView); - } - } - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/MovieRatingCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/MovieRatingCardPresenter.java deleted file mode 100644 index e3b2c7e3a..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/MovieRatingCardPresenter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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.cards.presenters; - -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.ImageCardViewReplacement; -import android.view.Gravity; - -/** - * This Presenter inherits from ImageCardViewPresenter and will set the secondary text alignment as - * well as a footer icon to display the movie's rating. - */ -public class MovieRatingCardPresenter extends ImageCardViewPresenter { - - private static final String TAG = "MovieRatingCardPresenter"; - - public MovieRatingCardPresenter(Context context) { - super(context, (int) context.getResources().getDimension(R.dimen.thin_image_card_width), - (int) context.getResources().getDimension(R.dimen.thin_image_card_height)); - } - - @Override public void onBindViewHolder(Card card, ImageCardViewReplacement cardView) { - super.onBindViewHolder(card, cardView); - cardView.getPrimaryTextView().setLines(2); - cardView.getPrimaryTextView().setMaxLines(2); - cardView.getSecondaryTextView().setGravity(Gravity.RIGHT); - } -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java index e1e4dc614..dfe34e22a 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java @@ -17,8 +17,6 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; import android.support.v17.leanback.supportleanbackshowcase.R; import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.BaseCardViewEx; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.OnActivateStateChangeHandler; import android.support.v17.leanback.widget.BaseCardView; import android.view.LayoutInflater; import android.view.View; @@ -33,49 +31,55 @@ import com.squareup.picasso.Picasso; * box, thus it will be hidden if the parent row is inactive. This behavior is unique to this card * and requires a special focus handler. */ -public class SideInfoCardPresenter extends AbstractCardPresenter implements - OnActivateStateChangeHandler { - - private static final String TAG = "SideInfoCardPresenter"; +public class SideInfoCardPresenter extends AbstractCardPresenter { public SideInfoCardPresenter(Context context) { super(context); } - @Override protected BaseCardViewEx onCreateView() { - BaseCardViewEx cardView = new BaseCardViewEx(getContext()); + @Override + protected BaseCardView onCreateView() { + final BaseCardView cardView = new BaseCardView(getContext()) { + + @Override + public void setActivated(boolean activated) { + super.setActivated(activated); + onActivateStateChanged(this, activated); + } + }; + cardView.setFocusable(true); cardView.setCardType(BaseCardView.CARD_TYPE_MAIN_ONLY); cardView.addView(LayoutInflater.from(getContext()).inflate(R.layout.side_info_card, null)); - cardView.setOnActivateStateChangeHandler(this); onActivateStateChanged(cardView, cardView.isActivated()); return cardView; } - @Override public void onBindViewHolder(Card card, BaseCardViewEx cardView) { - ImageView imageView = cardView.getViewById(R.id.main_image); + @Override + public void onBindViewHolder(Card card, BaseCardView cardView) { + ImageView imageView = (ImageView) cardView.findViewById(R.id.main_image); if (card.getLocalImageResourceName() != null) { int width = (int) getContext().getResources() - .getDimension(R.dimen.sidetext_image_card_width); + .getDimension(R.dimen.sidetext_image_card_width); int height = (int) getContext().getResources() - .getDimension(R.dimen.sidetext_image_card_height); + .getDimension(R.dimen.sidetext_image_card_height); int resourceId = getContext().getResources() - .getIdentifier(card.getLocalImageResourceName(), - "drawable", getContext().getPackageName()); + .getIdentifier(card.getLocalImageResourceName(), + "drawable", getContext().getPackageName()); Picasso.with(getContext()).load(resourceId).resize(width, height).centerCrop() - .into(imageView); + .into(imageView); } - TextView primaryText = cardView.getViewById(R.id.primary_text); + TextView primaryText = (TextView) cardView.findViewById(R.id.primary_text); primaryText.setText(card.getTitle()); - TextView secondaryText = cardView.getViewById(R.id.secondary_text); + TextView secondaryText = (TextView) cardView.findViewById(R.id.secondary_text); secondaryText.setText(card.getDescription()); - TextView extraText = cardView.getViewById(R.id.extra_text); + TextView extraText = (TextView) cardView.findViewById(R.id.extra_text); extraText.setText(card.getExtraText()); } - @Override public void onActivateStateChanged(final BaseCardViewEx cardView, boolean activated) { - cardView.getViewById(R.id.info).setVisibility(activated ? View.VISIBLE : View.GONE); + public void onActivateStateChanged(final BaseCardView cardView, boolean activated) { + cardView.findViewById(R.id.info).setVisibility(activated ? View.VISIBLE : View.GONE); } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java index add3dfae7..f48a3cab1 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java @@ -17,44 +17,22 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; import android.support.v17.leanback.supportleanbackshowcase.R; import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.BaseCardViewEx; -import android.support.v17.leanback.widget.BaseCardView; -import android.view.LayoutInflater; -import android.widget.ImageView; -import android.widget.TextView; +import android.support.v17.leanback.widget.ImageCardView; /** * This Presenter will display a card which consists of a big image followed by a colored footer. * Not only the colored footer is unique to this card, but also it's footer (info) will be visible * even when its parent row is inactive. */ -public class SingleLineCardPresenter extends AbstractCardPresenter { - - private static final String TAG = "SingleLineCardPresenter"; +public class SingleLineCardPresenter extends ImageCardViewPresenter { public SingleLineCardPresenter(Context context) { - super(context); + super(context, R.style.SingleLineCardStyle); } - @Override protected BaseCardViewEx onCreateView() { - BaseCardViewEx cardView = new BaseCardViewEx(getContext()); - cardView.setCardType(BaseCardView.CARD_TYPE_MAIN_ONLY); - cardView.addView( - LayoutInflater.from(getContext()).inflate(R.layout.single_line_card_footer, null)); - return cardView; - } - - @Override public void onBindViewHolder(Card card, BaseCardViewEx cardView) { - TextView primaryText = cardView.getViewById(R.id.primary_text); - primaryText.setText(card.getTitle()); - - int resourceId = getContext().getResources() - .getIdentifier(card.getLocalImageResourceName(), "drawable", - getContext().getPackageName()); - ImageView mainImage = cardView.getViewById(R.id.main_image); - mainImage.setImageResource(resourceId); - - cardView.getViewById(R.id.container).setBackgroundColor(card.getFooterColor()); + @Override public void onBindViewHolder(Card card, ImageCardView cardView) { + super.onBindViewHolder(card, cardView); + cardView.setInfoAreaBackgroundColor(card.getFooterColor()); } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/StringPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/StringPresenter.java deleted file mode 100644 index 93d42e0e1..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/StringPresenter.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.cards.presenters; - -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.widget.Presenter; -import android.util.Log; -import android.view.ViewGroup; -import android.widget.TextView; - -public class StringPresenter extends Presenter { - - private static final String TAG = "StringPresenter"; - - public ViewHolder onCreateViewHolder(ViewGroup parent) { - Log.d(TAG, "onCreateViewHolder"); - TextView tv = new TextView(parent.getContext()); - tv.setFocusable(true); - tv.setFocusableInTouchMode(true); - tv.setBackground(parent.getContext().getResources().getDrawable(R.drawable.icon_focused)); - return new ViewHolder(tv); - } - - public void onBindViewHolder(ViewHolder viewHolder, Object item) { - Log.d(TAG, "onBindViewHolder for " + item.toString()); - ((TextView) viewHolder.view).setText(item.toString()); - } - - public void onUnbindViewHolder(ViewHolder viewHolder) { - Log.d(TAG, "onUnbindViewHolder"); - } -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java index ad13be5f8..a688f444c 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java @@ -15,74 +15,27 @@ package android.support.v17.leanback.supportleanbackshowcase.cards.presenters; import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.drawable.Drawable; -import android.support.v17.leanback.supportleanbackshowcase.R; +import android.support.v17.leanback.supportleanbackshowcase.cards.TextCardView; import android.support.v17.leanback.supportleanbackshowcase.cards.models.Card; -import android.support.v17.leanback.supportleanbackshowcase.cards.views.BaseCardViewEx; -import android.support.v4.graphics.drawable.RoundedBitmapDrawable; -import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory; -import android.view.LayoutInflater; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; -import com.squareup.picasso.Target; /** * The Presenter displays a card consisting of text as a replacement for a big image. The footer is * also quite unique since it does contain two images rather than one or non. */ -public class TextCardPresenter extends AbstractCardPresenter { - - private static final String TAG = "AbstractFooterCardPresenter"; +public class TextCardPresenter extends AbstractCardPresenter { public TextCardPresenter(Context context) { super(context); } - @Override protected BaseCardViewEx onCreateView() { - BaseCardViewEx cardView = new BaseCardViewEx(getContext()); - LayoutInflater.from(getContext()).inflate(R.layout.text_icon_card, cardView); - LayoutInflater.from(getContext()).inflate(R.layout.text_icon_card_footer, cardView); - return cardView; + @Override + protected TextCardView onCreateView() { + return new TextCardView(getContext()); } - @Override public void onBindViewHolder(Card card, BaseCardViewEx cardView) { - TextView extraText = cardView.getViewById(R.id.extra_text); - TextView primaryText = cardView.getViewById(R.id.primary_text); - ImageView footerIcon = cardView.getViewById(R.id.footer_icon); - final ImageView imageView = cardView.getViewById(R.id.main_image); - - extraText.setText(card.getExtraText()); - primaryText.setText(card.getTitle()); - if (card.getLocalImageResourceName() != null) { - int width = (int) getContext().getResources() - .getDimension(R.dimen.sidetext_image_card_width); - int height = (int) getContext().getResources() - .getDimension(R.dimen.sidetext_image_card_height); - int resourceId = card.getLocalImageResourceId(getContext()); - // TODO: hahnr@ load the image without Picasso - Picasso.with(getContext()).load(resourceId).resize(width, height).centerCrop() - .into(new Target() { - - @Override - public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { - RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory - .create(getContext().getResources(), bitmap); - drawable.setCornerRadius( - Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f); - imageView.setImageDrawable(drawable); - } - - @Override public void onBitmapFailed(Drawable errorDrawable) { - } - - @Override public void onPrepareLoad(Drawable placeHolderDrawable) { - } - }); - } - footerIcon.setImageResource(R.drawable.stars_white); + @Override + public void onBindViewHolder(Card card, TextCardView cardView) { + cardView.updateUi(card); } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/BaseCardViewEx.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/BaseCardViewEx.java deleted file mode 100644 index d11f4e8cf..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/BaseCardViewEx.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.cards.views; - -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.ResourceCache; -import android.support.v17.leanback.widget.BaseCardView; -import android.view.View; - -/** - * This class is an extension for the BaseCardView which is focusable by default. This behavior has - * to be merged into the original BaseCardView at some point in the development. After merging those - * two classes, this one, the BaseCardViewEx, can be removed. - */ -public class BaseCardViewEx extends BaseCardView { - - protected Context mContext; - private ResourceCache mResourceCache = new ResourceCache(); - private OnActivateStateChangeHandler mActivationCallback; - - - public BaseCardViewEx(Context context) { - super(context); - mContext = context; - setCardType(BaseCardView.CARD_TYPE_INFO_UNDER); - - // TODO: @hahnr BaseCardView should be focusable by default. Merge! - setFocusable(true); - setFocusableInTouchMode(true); - } - - @Override public void setActivated(boolean activated) { - super.setActivated(activated); - if (mActivationCallback != null) - mActivationCallback.onActivateStateChanged(this, activated); - } - - public void setOnActivateStateChangeHandler(OnActivateStateChangeHandler handler) { - mActivationCallback = handler; - } - - public ViewType getViewById(int resId) { - return mResourceCache.getViewById(this, resId); - } - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/FooterLayoutCardView.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/FooterLayoutCardView.java deleted file mode 100644 index 9e8af546d..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/FooterLayoutCardView.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.cards.views; - -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.view.LayoutInflater; -import android.widget.ImageView; - -/** - * The FooterLayoutCardView creates a card view consisting of a big image followed by a footer - * passed as a layout resource. - */ -public class FooterLayoutCardView extends BaseCardViewEx { - - private final ImageView mImageView; - - /** - * The footer passed as a layout resource id will be inflated and added automatically to this - * view. - *

- * Note: If you want your footer to expand/collapse when its parent row is - * activated/deactivated, you have to add the layout_viewType="info" property to - * your footers root view. - *

- * Example footer layout: - *

{@code 
-     * 
-     *     
-     * }
- * - * @param context The current context. - * @param layoutId The footers layout resource id. - * @param imageWidthInDp The width of the ImageView used in this card. The card's width always - * equals the image's width. - * @param imageHeightInDp The height of the ImageView used in this card. - * @see android.support.v17.leanback.widget.BaseCardView.LayoutParams - */ - public FooterLayoutCardView(Context context, int layoutId, int imageWidthInDp, - int imageHeightInDp) { - super(context); - setCardType(CARD_TYPE_INFO_UNDER); - setBackgroundColor(context.getResources().getColor(R.color.default_card_background_color)); - - LayoutInflater.from(context).inflate(R.layout.image_card, this); - mImageView = getViewById(R.id.image_card_view_main_image); - LayoutInflater.from(context).inflate(layoutId, this); - } - - public ImageView getImageView() { - return mImageView; - } - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/ImageCardViewReplacement.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/ImageCardViewReplacement.java deleted file mode 100644 index c2a55fdee..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/ImageCardViewReplacement.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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.cards.views; - -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.R; -import android.support.v17.leanback.widget.ImageCardView; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -/** - * Leanback's {@link ImageCardView} will need some layout changes to fit all design requirements - * from the specs. This class is a temporary implementation of the "new" {@link ImageCardView} and - * will replace the existing one at some point in the development process. The original - * implementation also requires some refactoring to be more flexible in order to be used for various - * card types. - *

- * Besides from the refactoring of the ImageCardView I suggest to change not only the BaseCardView - * but also to add at least one additional CardView, the "FooterLayoutCardView". More about this - * topic can be discussed later in the development process. - */ -public class ImageCardViewReplacement extends FooterLayoutCardView { - - public static final int PRIMARY_TEXTVIEW_ID = R.id.primary_text; - public static final int SECONDARY_TEXTVIEW_ID = R.id.secondary_text; - public static final int FOOTER_ICON_ID = R.id.footer_icon; - public static final int INFO_BOX_ID = R.id.info_field; - - public ImageCardViewReplacement(Context context, int widthInDp, int heightInDp) { - super(context, R.layout.image_card_footer, widthInDp, heightInDp); - setBackgroundColor(context.getResources().getColor(R.color.default_card_background_color)); - } - - public TextView getPrimaryTextView() { - return getViewById(PRIMARY_TEXTVIEW_ID); - } - - public TextView getSecondaryTextView() { - return getViewById(SECONDARY_TEXTVIEW_ID); - } - - public ImageView getIconView() { - return getViewById(FOOTER_ICON_ID); - } - - public View getInfoBoxView() { - return getViewById(INFO_BOX_ID); - } -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/OnActivateStateChangeHandler.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/OnActivateStateChangeHandler.java deleted file mode 100644 index e444ef266..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/views/OnActivateStateChangeHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * 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.cards.views; - -public interface OnActivateStateChangeHandler { - - void onActivateStateChanged(BaseCardViewEx cardView, boolean activated); - -} diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml index eb126831c..5c2570d53 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml @@ -1,7 +1,26 @@ + - + \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml index c2f724c53..db4cf9c7d 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml @@ -1,4 +1,19 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml index 1140e80be..8da381217 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml @@ -1,4 +1,19 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml index 07b058990..d9fa80b2c 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml @@ -1,9 +1,23 @@ + + android:angle="-270" + android:endColor="@color/background_gradient_end" + android:startColor="@color/background_gradient_start"/> \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml index 4eb4fa823..bab1cc6f9 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml @@ -1,7 +1,21 @@ - + + - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_not_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_not_focused.xml deleted file mode 100644 index 940efe702..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_not_focused.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml index 880f9f0b1..9fccc2454 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml @@ -1,4 +1,19 @@ + \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml index 7be6ec48b..0329874e6 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml @@ -1,6 +1,21 @@ + - + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml index 2dd9d9fc3..152e7e6f8 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml @@ -1,4 +1,19 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml index dca2934de..bea8d6689 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml @@ -1,5 +1,20 @@ + - - + + \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml index 4893247fa..b4fd39ec4 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml @@ -1,4 +1,19 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml index 4652b0b3e..d6a1023c3 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml @@ -1,4 +1,19 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml index 43cbeacb2..74cccd0f5 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml @@ -1,4 +1,19 @@ + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_detail_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_detail_example.xml new file mode 100644 index 000000000..90c69b611 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_detail_example.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml index b6cf93f7a..9d2eda6c7 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml @@ -1,4 +1,19 @@ + + - + + - - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/icon_card_footer.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/icon_card_footer.xml deleted file mode 100644 index b1cc798e1..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/icon_card_footer.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/image_card.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/image_card.xml deleted file mode 100644 index 31c56360f..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/image_card.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/image_card_footer.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/image_card_footer.xml deleted file mode 100644 index d8f86e783..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/image_card_footer.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml index aadc10525..b8d660d50 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml @@ -1,4 +1,19 @@ + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/single_line_card_footer.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/single_line_card_footer.xml deleted file mode 100644 index 84ca560b3..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/single_line_card_footer.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml index a11ac68ab..339549a07 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml @@ -1,29 +1,79 @@ - + + + + + android:fontFamily="sans-serif-condensed" + android:lines="7" + android:maxLines="7" + android:paddingBottom="14dp" + android:paddingLeft="15dp" + android:paddingRight="15dp" + android:paddingTop="12dp" + lb:layout_viewType="main"/> + + + + + android:maxLines="1" + /> - - \ No newline at end of file + + + + \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card_footer.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card_footer.xml deleted file mode 100644 index 717c63aaa..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card_footer.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml index 8a1286997..ff5be6929 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml @@ -1,6 +1,20 @@ + - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_card_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_example.json similarity index 87% rename from samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_card_example.json rename to samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_example.json index 84184a2da..8b52b02ab 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_card_example.json +++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_example.json @@ -3,55 +3,55 @@ "title": "Standard", "cards": [ { - "type": "THIN", - "title": "The Amazing Spuder-Man", + "type": "MOVIE", + "title": "The Amazing Spider-Man", "description": "$3.99", "localImageResource": "card_image_movie_01" }, { - "type": "THIN", + "type": "MOVIE", "title": "American Psycho", "description": "$3.99", "localImageResource": "card_image_movie_02" }, { - "type": "THIN", + "type": "MOVIE", "title": "Big Hero 6", "description": "$3.99", "localImageResource": "card_image_movie_03" }, { - "type": "THIN", + "type": "MOVIE", "title": "Edge of Tomorrow", "description": "$3.99", "localImageResource": "card_image_movie_04" }, { - "type": "THIN", + "type": "MOVIE", "title": "The Hobbit: The Desolation of Smaug", "description": "$3.99", "localImageResource": "card_image_movie_05" }, { - "type": "THIN", + "type": "MOVIE", "title": "Interstellar", "description": "$3.99", "localImageResource": "card_image_movie_06" }, { - "type": "THIN", + "type": "MOVIE", "title": "Jurassic Park", "description": "$3.99", "localImageResource": "card_image_movie_07" }, { - "type": "THIN", + "type": "MOVIE", "title": "The Hunger Games: Mockingjay Part I", "description": "$3.99", "localImageResource": "card_image_movie_08" }, { - "type": "THIN", + "type": "MOVIE", "title": "Planes", "description": "$3.99", "localImageResource": "card_image_movie_09" @@ -62,47 +62,47 @@ "title": "Two Line Title", "cards": [ { - "type": "THIN_RATING", - "title": "The Amazing Spuder-Man", + "type": "MOVIE_BASE", + "title": "The Amazing Spider-Man", "localImageResource": "card_image_movie_01" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "American Psycho", "localImageResource": "card_image_movie_02" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "Big Hero 6", "localImageResource": "card_image_movie_03" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "Edge of Tomorrow", "localImageResource": "card_image_movie_04" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "The Hobbit: The Desolation of Smaug", "localImageResource": "card_image_movie_05" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "Interstellar", "localImageResource": "card_image_movie_06" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "Jurassic Park", "localImageResource": "card_image_movie_07" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "The Hunger Games: Mockingjay Part I", "localImageResource": "card_image_movie_08" }, { - "type": "THIN_RATING", + "type": "MOVIE_BASE", "title": "Planes", "localImageResource": "card_image_movie_09" } @@ -112,63 +112,63 @@ "title": "Two Line Title + Icon", "cards": [ { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "description": "$3.99", "title": "The Amazing Spider-Man", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_01" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "American Psycho", "description": "$3.99", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_02" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "Big Hero 6", "description": "$3.99", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_03" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "Edge of Tomorrow", "description": "$3.99", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_04" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "The Hobbit: The Desolation of Smaug", "description": "$3.99", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_05" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "Interstellar", "description": "$3.99", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_06" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "Jurassic Park", "description": "$3.99", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_07" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "description": "$3.99", "title": "The Hunger Games: Mockingjay Part I", "footerIconLocalImageResource": "stars_red", "localImageResource": "card_image_movie_08" }, { - "type": "THIN_RATING", + "type": "MOVIE_COMPLETE", "title": "Planes", "description": "$3.99", "footerIconLocalImageResource": "stars_red", @@ -288,35 +288,35 @@ "title": "Wide (Games)", "cards": [ { - "type": "WIDE_SHORT", + "type": "GAME", "title": "Angry Birds", "description": "Purchased", "localImageResource": "game_angry_bird_w", "footerIconLocalImageResource": "ic_installed" }, { - "type": "WIDE_SHORT", + "type": "GAME", "title": "Badland", "description": "Purchased", "localImageResource": "game_badland_w", "footerIconLocalImageResource": "ic_installed" }, { - "type": "WIDE_SHORT", + "type": "GAME", "title": "Leo's Fortune", "description": "Purchased", "localImageResource": "game_leos_fortune_w", "footerIconLocalImageResource": "ic_installed" }, { - "type": "WIDE_SHORT", + "type": "GAME", "title": "Minion Rush", "description": "Purchased", "localImageResource": "game_minion_rush_w", "footerIconLocalImageResource": "ic_installed" }, { - "type": "WIDE_SHORT", + "type": "GAME", "title": "Monument Valley", "description": "Purchased", "localImageResource": "game_monument_valley_w", @@ -430,100 +430,47 @@ } ] }, - { - "title": "Launcher", - "cards": [ - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_01" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_02" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_03" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_04" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_05" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_06" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_07" - }, - { - "type": "SIDE_INFO_TEST_1", - "title": "Harry Potter", - "description": "$3.99", - "localImageResource": "coffee_and_tea_08" - } - ] - }, { "title": "Single Line", "cards": [ { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Action & Adventure", "footerColor": "#dd004e", "localImageResource": "category_action" }, { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Animation", "footerColor": "#c51162", "localImageResource": "category_animation" }, { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Classics", "footerColor": "#9c27b0", "localImageResource": "category_classics" }, { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Comedy", "footerColor": "#cf4900", "localImageResource": "category_comedy" }, { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Crime", "footerColor": "#3f51b5", "localImageResource": "category_crime" }, { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Documentary", "footerColor": "#02639b", "localImageResource": "category_documentary" }, { - "type": "SQUARE", + "type": "SINGLE_LINE", "title": "Drama", "footerColor": "#2a56c6", "localImageResource": "category_drama" diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json index b01a2d45e..b6d06e26a 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json +++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json @@ -49,55 +49,55 @@ ], "recommended": [ { - "type": "THIN", + "type": "MOVIE", "title": "The Amazing Spuder-Man", "description": "$3.99", "localImageResource": "card_image_movie_01" }, { - "type": "THIN", + "type": "MOVIE", "title": "American Psycho", "description": "$3.99", "localImageResource": "card_image_movie_02" }, { - "type": "THIN", + "type": "MOVIE", "title": "Big Hero 6", "description": "$3.99", "localImageResource": "card_image_movie_03" }, { - "type": "THIN", + "type": "MOVIE", "title": "Edge of Tomorrow", "description": "$3.99", "localImageResource": "card_image_movie_04" }, { - "type": "THIN", + "type": "MOVIE", "title": "The Hobbit: The Desolation of Smaug", "description": "$3.99", "localImageResource": "card_image_movie_05" }, { - "type": "THIN", + "type": "MOVIE", "title": "Interstellar", "description": "$3.99", "localImageResource": "card_image_movie_06" }, { - "type": "THIN", + "type": "MOVIE", "title": "Jurassic Park", "description": "$3.99", "localImageResource": "card_image_movie_07" }, { - "type": "THIN", + "type": "MOVIE", "title": "The Hunger Games: Mockingjay Part I", "description": "$3.99", "localImageResource": "card_image_movie_08" }, { - "type": "THIN", + "type": "MOVIE", "title": "Planes", "description": "$3.99", "localImageResource": "card_image_movie_09" diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml index 7984d7e6c..6305c4119 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml @@ -1,3 +1,18 @@ + + #FFFFFF #DDDDDD diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml index d12d7900b..07c802733 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml @@ -1,10 +1,24 @@ + 224dp 126dp - 120dp - 172dp + 120dp + 172dp 224dp 109dp diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml index fab46b074..4c2c673ac 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml @@ -1,3 +1,18 @@ + + ShowcaseApp diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml index 1ac8724f5..490f442d1 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml @@ -1,31 +1,23 @@ + - - - - - @@ -34,8 +26,137 @@ #263238 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml index 38244aac3..8d5551592 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml @@ -1,3 +1,18 @@ + + + +