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 e938d09161273..367dd1dfe7d31 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; }