diff options
author | Dake Gu <dake@google.com> | 2014-05-21 17:35:00 -0700 |
---|---|---|
committer | Dake Gu <dake@google.com> | 2014-07-23 14:37:16 -0700 |
commit | d54e6b19e4639412fbbb19bf478034634c2907c5 (patch) | |
tree | 464ecc29803bc716094466baa45a291ab786948b /samples/SupportLeanbackDemos | |
parent | 3815535c4a97fa25fb138d681ae69e7bc1f99bdf (diff) | |
download | android_development-d54e6b19e4639412fbbb19bf478034634c2907c5.tar.gz android_development-d54e6b19e4639412fbbb19bf478034634c2907c5.tar.bz2 android_development-d54e6b19e4639412fbbb19bf478034634c2907c5.zip |
SupportLeanbackDemo: activity transition
b/15024618
Change-Id: Ib23746360984f3bbe255e8f75df30c7422b553f2
Diffstat (limited to 'samples/SupportLeanbackDemos')
15 files changed, 193 insertions, 24 deletions
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/AndroidManifest.xml index 3bf462b36..c2b191abf 100644 --- a/samples/SupportLeanbackDemos/AndroidManifest.xml +++ b/samples/SupportLeanbackDemos/AndroidManifest.xml @@ -12,7 +12,7 @@ android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:banner="@drawable/ic_launcher" - android:theme="@style/Theme.Leanback"> + android:theme="@style/Theme.Example.Leanback"> <activity android:name="MainActivity" android:label="@string/app_name"> diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg Binary files differnew file mode 100644 index 000000000..a2581fe61 --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg Binary files differnew file mode 100644 index 000000000..82ba3a859 --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg Binary files differnew file mode 100644 index 000000000..2a8302174 --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg Binary files differnew file mode 100644 index 000000000..70a1c557a --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg Binary files differnew file mode 100644 index 000000000..dc3f67714 --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg Binary files differnew file mode 100644 index 000000000..2e113a035 --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg Binary files differnew file mode 100644 index 000000000..bc302974e --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg Binary files differnew file mode 100644 index 000000000..dc3aa8583 --- /dev/null +++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg diff --git a/samples/SupportLeanbackDemos/res/values/themes.xml b/samples/SupportLeanbackDemos/res/values/themes.xml new file mode 100644 index 000000000..121e25cca --- /dev/null +++ b/samples/SupportLeanbackDemos/res/values/themes.xml @@ -0,0 +1,13 @@ +<resources> + <style name="Theme.Example.Leanback" parent="Theme.Leanback"> +<!-- uncomment to override default transition settings: + <item name="android:windowEnterTransition">@android:transition/fade</item> + <item name="android:windowExitTransition">@android:transition/fade</item> + <item name="android:windowSharedElementExitTransition">@android:transition/move</item> + <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> + <item name="android:windowAllowExitTransitionOverlap">true</item> + <item name="android:windowAllowEnterTransitionOverlap">false</item> + <item name="android:windowContentTransitions">true</item> + --> + </style> +</resources> diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java index f5b259a38..87c75062c 100644 --- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java @@ -15,14 +15,19 @@ package com.example.android.leanback; import android.content.Intent; import android.os.Bundle; +import android.support.v4.app.ActivityOptionsCompat; import android.support.v17.leanback.widget.ArrayObjectAdapter; import android.support.v17.leanback.widget.HeaderItem; +import android.support.v17.leanback.widget.ImageCardView; import android.support.v17.leanback.widget.ListRow; import android.support.v17.leanback.widget.ListRowPresenter; -import android.support.v17.leanback.widget.OnItemClickedListener; +import android.support.v17.leanback.widget.OnItemViewClickedListener; +import android.support.v17.leanback.widget.Presenter; import android.support.v17.leanback.widget.Row; +import android.support.v17.leanback.widget.RowPresenter; import android.util.Log; import android.view.View; +import android.view.ViewGroup; public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment { private static final String TAG = "leanback.BrowseFragment"; @@ -48,16 +53,13 @@ public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragm }); setupRows(); - setOnItemClickedListener(new ItemClickedListener()); + setOnItemViewClickedListener(new ItemViewClickedListener()); } private void setupRows() { ListRowPresenter lrp = new ListRowPresenter(); - float density = getActivity().getResources().getDisplayMetrics().density; - float height = 160 * density + 0.5f; - float expandedHeight = height + 52 * density + 0.5f; - lrp.setRowHeight((int)height); - lrp.setExpandedRowHeight((int)expandedHeight); + lrp.setRowHeight(CardPresenter.getRowHeight(getActivity())); + lrp.setExpandedRowHeight(CardPresenter.getExpandedRowHeight(getActivity())); mRowsAdapter = new ArrayObjectAdapter(lrp); @@ -67,8 +69,14 @@ public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragm for (int i = 0; i < NUM_ROWS; ++i) { ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter); - listRowAdapter.add("Hello world"); - listRowAdapter.add("This is a test"); + listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1)); + listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2)); + listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3)); + listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4)); + listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_5)); + listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_6)); + listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_7)); + listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_8)); HeaderItem header = new HeaderItem(i, "Row " + i, null); mRowsAdapter.add(new ListRow(header, listRowAdapter)); } @@ -76,12 +84,18 @@ public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragm setAdapter(mRowsAdapter); } - private final class ItemClickedListener implements OnItemClickedListener { - public void onItemClicked(Object item, Row row) { - // TODO: use a fragment transaction instead of launching a new - // activity + private final class ItemViewClickedListener implements OnItemViewClickedListener { + @Override + public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, + RowPresenter.ViewHolder rowViewHolder, Row row) { Intent intent = new Intent(getActivity(), DetailsActivity.class); - startActivity(intent); + intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item); + + Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation( + getActivity(), + ((ImageCardView)itemViewHolder.view).getMainImageView(), + DetailsActivity.SHARED_ELEMENT_NAME).toBundle(); + getActivity().startActivity(intent, bundle); } } } diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java index 502c77aea..4c5334288 100644 --- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java @@ -13,30 +13,71 @@ */ package com.example.android.leanback; +import android.content.Context; +import android.graphics.drawable.Drawable; import android.support.v17.leanback.widget.ImageCardView; import android.support.v17.leanback.widget.Presenter; import android.util.Log; import android.view.ViewGroup; +import android.view.View.MeasureSpec; +import android.view.ViewGroup.LayoutParams; import android.widget.TextView; public class CardPresenter extends Presenter { private static final String TAG = "CardPresenter"; + private static final int IMAGE_HEIGHT_DP = 120; + + private static int sRowHeight = 0; + private static int sExpandedRowHeight = 0; + + private static void setupRowHeights(Context context) { + if (sRowHeight == 0) { + float density = context.getResources().getDisplayMetrics().density; + int height = (int) (IMAGE_HEIGHT_DP * density + 0.5f); + + ImageCardView v = new ImageCardView(context); + v.setMainImageDimensions(LayoutParams.WRAP_CONTENT, height); + v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + sRowHeight = v.getMeasuredHeight(); + v.setActivated(true); + v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + sExpandedRowHeight = v.getMeasuredHeight(); + } + } + + public static int getRowHeight(Context context) { + setupRowHeights(context); + return sRowHeight; + } + + public static int getExpandedRowHeight(Context context) { + setupRowHeights(context); + return sExpandedRowHeight; + } + + @Override public ViewHolder onCreateViewHolder(ViewGroup parent) { Log.d(TAG, "onCreateViewHolder"); ImageCardView v = new ImageCardView(parent.getContext()); v.setFocusable(true); v.setFocusableInTouchMode(true); - v.setMainImage( - parent.getContext().getResources().getDrawable(R.drawable.text_bg)); + v.setMainImageAdjustViewBounds(true); + v.setMainImageDimensions(LayoutParams.WRAP_CONTENT, getRowHeight(parent.getContext())); return new ViewHolder(v); } + @Override public void onBindViewHolder(ViewHolder viewHolder, Object item) { Log.d(TAG, "onBindViewHolder for " + item.toString()); - ((ImageCardView) viewHolder.view).setTitleText(item.toString()); + PhotoItem photoItem = (PhotoItem) item; + Drawable drawable = viewHolder.view.getContext().getResources() + .getDrawable(photoItem.getImageResourceId()); + ((ImageCardView) viewHolder.view).setMainImage(drawable); + ((ImageCardView) viewHolder.view).setTitleText(photoItem.getTitle()); } + @Override public void onUnbindViewHolder(ViewHolder viewHolder) { Log.d(TAG, "onUnbindViewHolder"); } diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java index 082b134f5..d74a50a7d 100644 --- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java @@ -18,11 +18,17 @@ import android.os.Bundle; public class DetailsActivity extends Activity { + public static final String EXTRA_ITEM = "item"; + public static final String SHARED_ELEMENT_NAME = "hero"; + /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.details); + ((DetailsFragment)getFragmentManager().findFragmentById(R.id.details_fragment)) + .setItem((PhotoItem) getIntent().getParcelableExtra(EXTRA_ITEM)); } + } diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java index c9a85f39f..eb0450225 100644 --- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java @@ -15,6 +15,8 @@ package com.example.android.leanback; import android.content.res.Resources; import android.os.Bundle; +import android.support.v4.app.ActivityCompat; +import android.support.v4.view.ViewCompat; import android.support.v17.leanback.widget.Action; import android.support.v17.leanback.widget.ArrayObjectAdapter; import android.support.v17.leanback.widget.ClassPresenterSelector; @@ -24,27 +26,31 @@ 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.OnActionClickedListener; +import android.support.v17.leanback.widget.RowPresenter; import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.widget.Toast; +import java.util.ArrayList; + public class DetailsFragment extends android.support.v17.leanback.app.DetailsFragment { private static final String TAG = "leanback.BrowseFragment"; + private static final String ITEM = "item"; private static final int NUM_ROWS = 3; private ArrayObjectAdapter mRowsAdapter; + private PhotoItem mPhotoItem; @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); - setupRows(); - } - - private void setupRows() { ClassPresenterSelector ps = new ClassPresenterSelector(); DetailsOverviewRowPresenter dorPresenter = - new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter()); + new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter()); dorPresenter.setOnActionClickedListener(new OnActionClickedListener() { public void onActionClicked(Action action) { Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show(); @@ -54,11 +60,30 @@ public class DetailsFragment extends android.support.v17.leanback.app.DetailsFra ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter); ps.addClassPresenter(ListRow.class, new ListRowPresenter()); + mRowsAdapter = new ArrayObjectAdapter(ps); + PhotoItem item = (PhotoItem) (savedInstanceState != null ? + savedInstanceState.getParcelable(ITEM) : null); + if (item != null) { + setItem(item); + } + dorPresenter.setSharedElementEnterTransition(getActivity(), + DetailsActivity.SHARED_ELEMENT_NAME); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(ITEM, mPhotoItem); + } + + public void setItem(PhotoItem photoItem) { + mPhotoItem = photoItem; + Resources res = getActivity().getResources(); DetailsOverviewRow dor = new DetailsOverviewRow("Details Overview"); - dor.setImageDrawable(res.getDrawable(R.drawable.details_img)); + dor.setImageDrawable(res.getDrawable(photoItem.getImageResourceId())); dor.addAction(new Action(1, "Buy $9.99")); dor.addAction(new Action(2, "Rent", "$3.99", res.getDrawable(R.drawable.ic_action_a))); mRowsAdapter.add(dor); diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java new file mode 100644 index 000000000..be3c8a6b1 --- /dev/null +++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014 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 com.example.android.leanback; + +import android.os.Parcel; +import android.os.Parcelable; + +public class PhotoItem implements Parcelable { + + private String mTitle; + private int mImageResourceId; + + public PhotoItem(String title, int imageResourceId) { + mTitle = title; + mImageResourceId = imageResourceId; + } + + public int getImageResourceId() { + return mImageResourceId; + } + + public String getTitle() { + return mTitle; + } + + @Override + public String toString() { + return mTitle; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mTitle); + dest.writeInt(mImageResourceId); + } + + public static final Parcelable.Creator<PhotoItem> CREATOR + = new Parcelable.Creator<PhotoItem>() { + @Override + public PhotoItem createFromParcel(Parcel in) { + return new PhotoItem(in); + } + + @Override + public PhotoItem[] newArray(int size) { + return new PhotoItem[size]; + } + }; + + private PhotoItem(Parcel in) { + mTitle = in.readString(); + mImageResourceId = in.readInt(); + } +} |