From 8ac1a576f237923b57d62a84c761945f000b81ff Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Tue, 27 Apr 2021 15:11:55 +0100 Subject: [PATCH] Apply TaskView's (non)fullscreenTranslation correctly in emulated landscape PS4: Change approach to return a FloatProperty instead, as getPagedOrientationHandler() can throw NPE when called without a parent, as applyTranslationX/Y is called in onRecycle Fixes: 186432016 Test: In small screen without home screen rotation, TaskView stay in position when rotating and icon is in displayed correct position after rotation. In quick switch, Task window also fill the screen. Test: In large screen when dragging up from last task in quick switch, TaskView stays on screen when being dragged up Change-Id: I54247e81066913e5cc072cf72543d780ff55ccaf --- .../android/quickstep/views/RecentsView.java | 15 ++- .../com/android/quickstep/views/TaskView.java | 102 ++++++++++++++++-- 2 files changed, 102 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 2a3b86eb77..51090dfbce 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1277,23 +1277,20 @@ public abstract class RecentsView FULLSCREEN_TRANSLATION_X = + new FloatProperty("fullscreenTranslationX") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setFullscreenTranslationX(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mFullscreenTranslationX; + } + }; + + private static final FloatProperty FULLSCREEN_TRANSLATION_Y = + new FloatProperty("fullscreenTranslationY") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setFullscreenTranslationY(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mFullscreenTranslationY; + } + }; + + private static final FloatProperty NON_FULLSCREEN_TRANSLATION_X = + new FloatProperty("nonFullscreenTranslationX") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setNonFullscreenTranslationX(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mNonFullscreenTranslationX; + } + }; + + private static final FloatProperty NON_FULLSCREEN_TRANSLATION_Y = + new FloatProperty("nonFullscreenTranslationY") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setNonFullscreenTranslationY(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mNonFullscreenTranslationY; + } + }; + private static final FloatProperty COLOR_TINT = new FloatProperty("colorTint") { @Override @@ -284,9 +336,11 @@ public class TaskView extends FrameLayout implements Reusable { private float mTaskResistanceTranslationY; // The following translation variables should only be used in the same orientation as Launcher. private float mFullscreenTranslationX; + private float mFullscreenTranslationY; // Applied as a complement to fullscreenTranslation, for adjusting the carousel overview, or the // in transition carousel before forming the grid on tablets. private float mNonFullscreenTranslationX; + private float mNonFullscreenTranslationY; private float mBoxTranslationY; // The following grid translations scales with mGridProgress. private float mGridTranslationX; @@ -786,8 +840,9 @@ public class TaskView extends FrameLayout implements Reusable { @Override public void onRecycle() { - mFullscreenTranslationX = mNonFullscreenTranslationX = - mGridTranslationX = mGridTranslationY = mBoxTranslationY = 0f; + mFullscreenTranslationX = mFullscreenTranslationY = mNonFullscreenTranslationX = + mNonFullscreenTranslationY = mGridTranslationX = mGridTranslationY = + mBoxTranslationY = 0f; resetViewTransforms(); // Clear any references to the thumbnail (it will be re-read either from the cache or the // system on next bind) @@ -929,16 +984,26 @@ public class TaskView extends FrameLayout implements Reusable { applyTranslationY(); } - public void setFullscreenTranslationX(float fullscreenTranslationX) { + private void setFullscreenTranslationX(float fullscreenTranslationX) { mFullscreenTranslationX = fullscreenTranslationX; applyTranslationX(); } - public void setNonFullscreenTranslationX(float nonFullscreenTranslationX) { + private void setFullscreenTranslationY(float fullscreenTranslationY) { + mFullscreenTranslationY = fullscreenTranslationY; + applyTranslationY(); + } + + private void setNonFullscreenTranslationX(float nonFullscreenTranslationX) { mNonFullscreenTranslationX = nonFullscreenTranslationX; applyTranslationX(); } + private void setNonFullscreenTranslationY(float nonFullscreenTranslationY) { + mNonFullscreenTranslationY = nonFullscreenTranslationY; + applyTranslationY(); + } + public void setGridTranslationX(float gridTranslationX) { mGridTranslationX = gridTranslationX; applyTranslationX(); @@ -960,9 +1025,9 @@ public class TaskView extends FrameLayout implements Reusable { public float getScrollAdjustment(boolean fullscreenEnabled, boolean gridEnabled) { float scrollAdjustment = 0; if (fullscreenEnabled) { - scrollAdjustment += mFullscreenTranslationX; + scrollAdjustment += getPrimaryFullscreenTranslationProperty().get(this); } else { - scrollAdjustment += mNonFullscreenTranslationX; + scrollAdjustment += getPrimaryNonFullscreenTranslationProperty().get(this); } if (gridEnabled) { scrollAdjustment += mGridTranslationX; @@ -1012,7 +1077,10 @@ public class TaskView extends FrameLayout implements Reusable { * change according to a temporary state (e.g. task offset). */ public float getPersistentTranslationY() { - return getGridTrans(mGridTranslationY) + mBoxTranslationY; + return mBoxTranslationY + + getFullscreenTrans(mFullscreenTranslationY) + + getNonFullscreenTrans(mNonFullscreenTranslationY) + + getGridTrans(mGridTranslationY); } public FloatProperty getPrimaryDismissTranslationProperty() { @@ -1035,6 +1103,26 @@ public class TaskView extends FrameLayout implements Reusable { TASK_RESISTANCE_TRANSLATION_X, TASK_RESISTANCE_TRANSLATION_Y); } + public FloatProperty getPrimaryFullscreenTranslationProperty() { + return getPagedOrientationHandler().getPrimaryValue( + FULLSCREEN_TRANSLATION_X, FULLSCREEN_TRANSLATION_Y); + } + + public FloatProperty getSecondaryFullscreenTranslationProperty() { + return getPagedOrientationHandler().getSecondaryValue( + FULLSCREEN_TRANSLATION_X, FULLSCREEN_TRANSLATION_Y); + } + + public FloatProperty getPrimaryNonFullscreenTranslationProperty() { + return getPagedOrientationHandler().getPrimaryValue( + NON_FULLSCREEN_TRANSLATION_X, NON_FULLSCREEN_TRANSLATION_Y); + } + + public FloatProperty getSecondaryNonFullscreenTranslationProperty() { + return getPagedOrientationHandler().getSecondaryValue( + NON_FULLSCREEN_TRANSLATION_X, NON_FULLSCREEN_TRANSLATION_Y); + } + @Override public boolean hasOverlappingRendering() { // TODO: Clip-out the icon region from the thumbnail, since they are overlapping.