From bda1b17d45267c7e6efd9b03a5ec2b5356aa5eb7 Mon Sep 17 00:00:00 2001 From: Sid Soundararajan Date: Mon, 11 Apr 2016 16:41:03 -0700 Subject: [PATCH] Add a fall back for when the thumbnail is not generated for a task Re-add scrim and shadows to cards. This can happen on TV when an App is mid launch and the HOME button is pressed. The Banner of the App is used as a fallback, with the icon of the app as a final fallback. The icon should not be used normally, since an App would fail review for not providing a banner. BUG: 27349208 BUG: 27857124 BUG: 27953609 Change-Id: I50f6ee714eeddee1ea2b5ae31f23ea68d230bc59 --- .../recents_tv_background_gradient.xml | 4 +- .../recents_on_tv.xml | 3 +- .../recents_tv_card_dismiss.xml | 43 ++++++++ .../recents_tv_card_info_field.xml | 47 +++++++++ .../recents_tv_task_card_view.xml | 46 +++++++++ .../res/layout/recents_tv_task_card_view.xml | 97 ------------------- packages/SystemUI/res/values/colors_tv.xml | 3 +- packages/SystemUI/res/values/dimens_tv.xml | 8 +- .../animations/DismissAnimationsHolder.java | 40 ++++++-- .../HomeRecentsEnterExitAnimationHolder.java | 3 +- .../tv/animations/ViewFocusAnimator.java | 6 +- .../tv/views/RecentsTvTransitionHelper.java | 1 - .../recents/tv/views/RecentsTvView.java | 2 - .../recents/tv/views/TaskCardView.java | 76 ++++++++++++++- .../tv/views/TaskStackHorizontalGridView.java | 3 - .../views/TaskStackHorizontalViewAdapter.java | 18 ++-- 16 files changed, 268 insertions(+), 132 deletions(-) rename packages/SystemUI/res/{layout => layout-television}/recents_on_tv.xml (94%) create mode 100644 packages/SystemUI/res/layout-television/recents_tv_card_dismiss.xml create mode 100644 packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml create mode 100644 packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml delete mode 100644 packages/SystemUI/res/layout/recents_tv_task_card_view.xml diff --git a/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml b/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml index e98d43f595ae0..1e52a91b8944c 100644 --- a/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml +++ b/packages/SystemUI/res/drawable/recents_tv_background_gradient.xml @@ -16,7 +16,7 @@ \ No newline at end of file diff --git a/packages/SystemUI/res/layout/recents_on_tv.xml b/packages/SystemUI/res/layout-television/recents_on_tv.xml similarity index 94% rename from packages/SystemUI/res/layout/recents_on_tv.xml rename to packages/SystemUI/res/layout-television/recents_on_tv.xml index 28ea66d8345d1..280fd204bda64 100644 --- a/packages/SystemUI/res/layout/recents_on_tv.xml +++ b/packages/SystemUI/res/layout-television/recents_on_tv.xml @@ -19,7 +19,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" - android:clipToPadding="false"> + android:clipToPadding="false" + android:background="@drawable/recents_tv_background_gradient"> + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml b/packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml new file mode 100644 index 0000000000000..20397c353d03c --- /dev/null +++ b/packages/SystemUI/res/layout-television/recents_tv_card_info_field.xml @@ -0,0 +1,47 @@ + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml b/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml new file mode 100644 index 0000000000000..9b89aa0a90f15 --- /dev/null +++ b/packages/SystemUI/res/layout-television/recents_tv_task_card_view.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/packages/SystemUI/res/layout/recents_tv_task_card_view.xml b/packages/SystemUI/res/layout/recents_tv_task_card_view.xml deleted file mode 100644 index 766ef602293a8..0000000000000 --- a/packages/SystemUI/res/layout/recents_tv_task_card_view.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/SystemUI/res/values/colors_tv.xml b/packages/SystemUI/res/values/colors_tv.xml index 4126d3cdad684..3817da0174263 100644 --- a/packages/SystemUI/res/values/colors_tv.xml +++ b/packages/SystemUI/res/values/colors_tv.xml @@ -17,7 +17,8 @@ */ --> - #FF37474F + #FF263238 #CCEEEEEE #7FEEEEEE + #7F000000 \ No newline at end of file diff --git a/packages/SystemUI/res/values/dimens_tv.xml b/packages/SystemUI/res/values/dimens_tv.xml index f536f86a40a07..16d27f2207756 100644 --- a/packages/SystemUI/res/values/dimens_tv.xml +++ b/packages/SystemUI/res/values/dimens_tv.xml @@ -21,11 +21,13 @@ 240dip 135dip 20dip - 114dip - 64dip + 130dip + 72dip + 40dip + 40dip 16dip 8dip - 12dip + 12dip 12dip diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java index 3e668afbb47e6..ae8d800cea3b6 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java @@ -18,6 +18,7 @@ package com.android.systemui.recents.tv.animations; import android.animation.Animator; import android.content.res.Resources; +import android.view.View; import android.widget.LinearLayout; import com.android.systemui.Interpolators; import com.android.systemui.recents.tv.views.TaskCardView; @@ -26,15 +27,16 @@ import com.android.systemui.R; public class DismissAnimationsHolder { private LinearLayout mDismissArea; - private LinearLayout mRecentsTvCard; + private LinearLayout mInfoField; + private View mThumbnailView; private int mCardYDelta; private long mShortDuration; private long mLongDuration; public DismissAnimationsHolder(TaskCardView taskCardView) { - mRecentsTvCard = (LinearLayout) taskCardView.findViewById(R.id.recents_tv_card); + mInfoField = (LinearLayout) taskCardView.findViewById(R.id.card_info_field); mDismissArea = (LinearLayout) taskCardView.findViewById(R.id.card_dismiss); - + mThumbnailView = taskCardView.findViewById(R.id.card_view_thumbnail); Resources res = taskCardView.getResources(); mCardYDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_shift_down); mShortDuration = res.getInteger(R.integer.dismiss_short_duration); @@ -47,7 +49,13 @@ public class DismissAnimationsHolder { .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .alpha(1.0f); - mRecentsTvCard.animate() + mInfoField.animate() + .setDuration(mShortDuration) + .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) + .translationYBy(mCardYDelta) + .alpha(0.5f); + + mThumbnailView.animate() .setDuration(mShortDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .translationYBy(mCardYDelta) @@ -60,7 +68,13 @@ public class DismissAnimationsHolder { .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .alpha(0.0f); - mRecentsTvCard.animate() + mInfoField.animate() + .setDuration(mShortDuration) + .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) + .translationYBy(-mCardYDelta) + .alpha(1.0f); + + mThumbnailView.animate() .setDuration(mShortDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .translationYBy(-mCardYDelta) @@ -73,17 +87,25 @@ public class DismissAnimationsHolder { .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .alpha(0.0f); - mRecentsTvCard.animate() + mInfoField.animate() .setDuration(mLongDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) .translationYBy(mCardYDelta) .alpha(0.0f) .setListener(listener); + + mThumbnailView.animate() + .setDuration(mLongDuration) + .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) + .translationYBy(mCardYDelta) + .alpha(0.0f); } public void reset() { - mRecentsTvCard.setAlpha(1.0f); - mRecentsTvCard.setTranslationY(0); - mRecentsTvCard.animate().setListener(null); + mInfoField.setAlpha(1.0f); + mInfoField.setTranslationY(0); + mInfoField.animate().setListener(null); + mThumbnailView.setAlpha(1.0f); + mThumbnailView.setTranslationY(0); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java index 278de870e5a5b..497a0a3d3ab8a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java @@ -46,7 +46,6 @@ public class HomeRecentsEnterExitAnimationHolder { for(int i = 0; i < mGridView.getChildCount(); i++) { TaskCardView view = (TaskCardView) mGridView.getChildAt(i); view.setTranslationX(-mTranslationX); - view.setAlpha(0.0f); view.animate() .alpha(1.0f) .translationX(0) @@ -76,7 +75,7 @@ public class HomeRecentsEnterExitAnimationHolder { public void setEnterFromHomeStartingAnimationValues() { for(int i = 0; i < mGridView.getChildCount(); i++) { TaskCardView view = (TaskCardView) mGridView.getChildAt(i); - view.setTranslationX(-mTranslationX); + view.setTranslationX(0); view.setAlpha(0.0f); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java index 888561c2172b9..9edd5af487cc1 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/ViewFocusAnimator.java @@ -26,6 +26,7 @@ import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Interpolator; import com.android.systemui.R; +import com.android.systemui.recents.tv.views.TaskCardView; public class ViewFocusAnimator implements View.OnFocusChangeListener { private final float mUnselectedScale; @@ -94,10 +95,13 @@ public class ViewFocusAnimator implements View.OnFocusChangeListener { mTargetView.setScaleX(scale); mTargetView.setScaleY(scale); - mTargetView.setZ(z); mTargetView.setPadding((int) spacing, mTargetView.getPaddingTop(), (int) spacing, mTargetView.getPaddingBottom()); + + if (mTargetView instanceof TaskCardView) { + ((TaskCardView) mTargetView).getThumbnailView().setZ(z); + } } public float getFocusProgress() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java index fb1127ed18597..5b94ebe4e2395 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvTransitionHelper.java @@ -16,7 +16,6 @@ package com.android.systemui.recents.tv.views; import android.annotation.Nullable; -import android.app.Activity; import android.app.ActivityOptions; import android.content.Context; import android.graphics.Bitmap; diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java index b876fc7013722..594f6bc14dd8f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java @@ -18,7 +18,6 @@ package com.android.systemui.recents.tv.views; import android.content.Context; import android.graphics.Rect; import android.os.Handler; -import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.util.Log; @@ -35,7 +34,6 @@ import com.android.systemui.recents.RecentsConfiguration; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent; import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted; -import com.android.systemui.recents.events.activity.ExitRecentsWindowFirstAnimationFrameEvent; import com.android.systemui.recents.events.activity.LaunchTvTaskEvent; import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; import com.android.systemui.recents.misc.SystemServicesProxy; diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java index d3bc4b6ea888a..a72a7e611ae73 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskCardView.java @@ -17,10 +17,15 @@ package com.android.systemui.recents.tv.views; import android.animation.Animator; import android.content.Context; +import android.content.pm.PackageManager; +import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.util.Log; import android.util.TypedValue; import android.view.Display; import android.view.KeyEvent; @@ -38,7 +43,8 @@ import com.android.systemui.recents.model.Task; public class TaskCardView extends LinearLayout { - private ImageView mThumbnailView; + private static final String TAG = "TaskCardView"; + private View mThumbnailView; private TextView mTitleTextView; private ImageView mBadgeView; private Task mTask; @@ -58,26 +64,28 @@ public class TaskCardView extends LinearLayout { public TaskCardView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - mViewFocusAnimator = new ViewFocusAnimator(this); mDismissState = false; + Configuration config = getResources().getConfiguration(); + setLayoutDirection(config.getLayoutDirection()); } @Override protected void onFinishInflate() { super.onFinishInflate(); - mThumbnailView = (ImageView) findViewById(R.id.card_view_thumbnail); + mThumbnailView = findViewById(R.id.card_view_thumbnail); mTitleTextView = (TextView) findViewById(R.id.card_title_text); mBadgeView = (ImageView) findViewById(R.id.card_extra_badge); mDismissAnimationsHolder = new DismissAnimationsHolder(this); View title = findViewById(R.id.card_info_field); mRecentsRowFocusAnimationHolder = new RecentsRowFocusAnimationHolder(this, title); + mViewFocusAnimator = new ViewFocusAnimator(this); } public void init(Task task) { mTask = task; - mThumbnailView.setImageBitmap(task.thumbnail); mTitleTextView.setText(task.title); mBadgeView.setImageDrawable(task.icon); + setThumbnailView(); } public Task getTask() { @@ -238,4 +246,64 @@ public class TaskCardView extends LinearLayout { mRecentsRowFocusAnimationHolder.reset(); mDismissAnimationsHolder.reset(); } + + private void setThumbnailView() { + ImageView screenshotView = (ImageView) findViewById(R.id.card_view_banner_icon); + PackageManager pm = getContext().getPackageManager(); + if (mTask.thumbnail != null) { + setAsScreenShotView(mTask.thumbnail, screenshotView); + } else { + try { + Drawable banner = null; + if (mTask.key != null) { + banner = pm.getActivityBanner(mTask.key.baseIntent); + } + if (banner != null) { + setAsBannerView(banner, screenshotView); + } else { + setAsIconView(mTask.icon, screenshotView); + } + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Package not found : " + e); + setAsIconView(mTask.icon, screenshotView); + } + } + } + + private void setAsScreenShotView(Bitmap screenshot, ImageView screenshotView) { + LayoutParams lp = (LayoutParams) screenshotView.getLayoutParams(); + lp.width = getResources() + .getDimensionPixelSize(R.dimen.recents_tv_card_width); + lp.height = getResources() + .getDimensionPixelSize(R.dimen.recents_tv_screenshot_height); + + screenshotView.setLayoutParams(lp); + screenshotView.setImageBitmap(screenshot); + } + + private void setAsBannerView(Drawable banner, ImageView bannerView) { + LayoutParams lp = (LayoutParams) bannerView.getLayoutParams(); + lp.width = getResources() + .getDimensionPixelSize(R.dimen.recents_tv_banner_width); + lp.height = getResources() + .getDimensionPixelSize(R.dimen.recents_tv_banner_height); + + bannerView.setLayoutParams(lp); + bannerView.setImageDrawable(banner); + } + + private void setAsIconView(Drawable icon, ImageView iconView) { + LayoutParams lp = (LayoutParams) iconView.getLayoutParams(); + lp.width = getResources() + .getDimensionPixelSize(R.dimen.recents_tv_fallback_icon_width); + lp.height = getResources() + .getDimensionPixelSize(R.dimen.recents_tv_fallback_icon_height); + + iconView.setLayoutParams(lp); + iconView.setImageDrawable(icon); + } + + public View getThumbnailView() { + return mThumbnailView; + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java index 77ab8c1c1f8c7..9f52abdad287f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalGridView.java @@ -33,9 +33,6 @@ import com.android.systemui.recents.model.TaskStack; import com.android.systemui.recents.model.TaskStack.TaskStackCallbacks; import com.android.systemui.recents.views.AnimationProps; -import java.util.ArrayList; -import java.util.List; - /** * Horizontal Grid View Implementation to show the Task Stack for TV. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java index eff184507740d..eb3b02d155ebc 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/TaskStackHorizontalViewAdapter.java @@ -27,7 +27,6 @@ import com.android.systemui.R; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.LaunchTvTaskEvent; import com.android.systemui.recents.events.ui.DeleteTaskDataEvent; -import com.android.systemui.recents.events.ui.TaskViewDismissedEvent; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.views.AnimationProps; @@ -47,6 +46,7 @@ public class TaskStackHorizontalViewAdapter extends public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ private TaskCardView mTaskCardView; private Task mTask; + private boolean mShouldReset; public ViewHolder(View v) { super(v); if(v instanceof TaskCardView) { @@ -69,7 +69,6 @@ public class TaskStackHorizontalViewAdapter extends } else { EventBus.getDefault().send(new LaunchTvTaskEvent(mTaskCardView, mTask, null, INVALID_STACK_ID)); - ((Activity) (v.getContext())).finish(); } } catch (Exception e) { Log.e(TAG, v.getContext() @@ -89,6 +88,7 @@ public class TaskStackHorizontalViewAdapter extends public void onAnimationEnd(Animator animation) { removeAt(position); EventBus.getDefault().send(new DeleteTaskDataEvent(task)); + mShouldReset = true; } @Override @@ -114,9 +114,9 @@ public class TaskStackHorizontalViewAdapter extends @Override public TaskStackHorizontalViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.recents_tv_task_card_view, parent, false); - ViewHolder viewHolder = new ViewHolder(view); + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + ViewHolder viewHolder = new ViewHolder( + inflater.inflate(R.layout.recents_tv_task_card_view, parent, false)); return viewHolder; } @@ -127,7 +127,12 @@ public class TaskStackHorizontalViewAdapter extends @Override public void onViewDetachedFromWindow(ViewHolder holder) { - holder.mTaskCardView.reset(); + // We only want to reset on view detach if this is the last task being dismissed. + // This is so that we do not reset when shifting to apps etc, as it is not needed. + if (holder.mShouldReset) { + holder.mTaskCardView.reset(); + holder.mShouldReset = false; + } } @Override @@ -157,6 +162,7 @@ public class TaskStackHorizontalViewAdapter extends return (position >= 0) ? position : 0; } + public void setTaskStackHorizontalGridView(TaskStackHorizontalGridView gridView) { mGridView = gridView; }