diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java index 85627191c0..16303f3a02 100644 --- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java +++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java @@ -31,6 +31,7 @@ public class GroupedTaskView extends TaskView { private Task mSecondaryTask; private TaskThumbnailView mSnapshotView2; private CancellableTask mThumbnailLoadRequest2; + private SplitConfigurationOptions.StagedSplitBounds mSplitBoundsConfig; public GroupedTaskView(Context context) { super(context); @@ -57,7 +58,7 @@ public class GroupedTaskView extends TaskView { mTaskIdContainer[1] = secondary.key.id; mTaskIdAttributeContainer[1] = new TaskIdAttributeContainer(secondary, mSnapshotView2); mSnapshotView2.bind(secondary); - adjustThumbnailBoundsForSplit(splitBoundsConfig, orientedState); + mSplitBoundsConfig = splitBoundsConfig; } @Override @@ -121,6 +122,21 @@ public class GroupedTaskView extends TaskView { public void onRecycle() { super.onRecycle(); mSnapshotView2.setThumbnail(mSecondaryTask, null); + mSplitBoundsConfig = null; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(widthSize, heightSize); + if (mSplitBoundsConfig == null || mSnapshotView == null || mSnapshotView2 == null) { + return; + } + getPagedOrientationHandler().measureGroupedTaskViewThumbnailBounds(mSnapshotView, + mSnapshotView2, widthSize, heightSize, mSplitBoundsConfig, + mActivity.getDeviceProfile()); } @Override @@ -128,16 +144,4 @@ public class GroupedTaskView extends TaskView { super.setOverlayEnabled(overlayEnabled); mSnapshotView2.setOverlayEnabled(overlayEnabled); } - - private void adjustThumbnailBoundsForSplit( - SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, - RecentsOrientedState orientedState) { - if (splitBoundsConfig == null) { - return; - } - - orientedState.getOrientationHandler().setGroupedTaskViewThumbnailBounds( - mSnapshotView, mSnapshotView2, this, splitBoundsConfig, - mActivity.getDeviceProfile()); - } } diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index 895ca08510..2ac6cea636 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -408,22 +408,30 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { } @Override - public void setGroupedTaskViewThumbnailBounds(View mSnapshotView, View mSnapshotView2, - View taskParent, SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, - DeviceProfile dp) { + public void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, + int parentWidth, int parentHeight, + SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp) { int spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx; - int totalThumbnailHeight = taskParent.getHeight() - spaceAboveSnapshot; - int totalThumbnailWidth = taskParent.getWidth(); + int totalThumbnailHeight = parentHeight - spaceAboveSnapshot; int dividerBar = splitBoundsConfig.visualDividerBounds.width(); - ViewGroup.LayoutParams primaryLp = mSnapshotView.getLayoutParams(); - ViewGroup.LayoutParams secondaryLp = mSnapshotView2.getLayoutParams(); + int primarySnapshotHeight; + int primarySnapshotWidth; + int secondarySnapshotHeight; + int secondarySnapshotWidth; - primaryLp.width = totalThumbnailWidth; - primaryLp.height = (int) (totalThumbnailHeight * splitBoundsConfig.leftTaskPercent); + primarySnapshotWidth = parentWidth; + primarySnapshotHeight = (int) (totalThumbnailHeight * splitBoundsConfig.leftTaskPercent); - secondaryLp.width = totalThumbnailWidth; - secondaryLp.height = totalThumbnailHeight - primaryLp.height - dividerBar; - mSnapshotView2.setTranslationY(primaryLp.height + spaceAboveSnapshot + dividerBar); + secondarySnapshotWidth = parentWidth; + secondarySnapshotHeight = totalThumbnailHeight - primarySnapshotHeight - dividerBar; + secondarySnapshot.setTranslationY(primarySnapshotHeight + spaceAboveSnapshot + dividerBar); + primarySnapshot.measure( + View.MeasureSpec.makeMeasureSpec(primarySnapshotWidth, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(primarySnapshotHeight, View.MeasureSpec.EXACTLY)); + secondarySnapshot.measure( + View.MeasureSpec.makeMeasureSpec(secondarySnapshotWidth, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(secondarySnapshotHeight, + View.MeasureSpec.EXACTLY)); } @Override diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java index b34a81eaa0..b119e2c0a9 100644 --- a/src/com/android/launcher3/touch/PagedOrientationHandler.java +++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java @@ -162,7 +162,8 @@ public interface PagedOrientationHandler { SplitConfigurationOptions.StagedSplitBounds splitInfo, @SplitConfigurationOptions.StagePosition int desiredStagePosition); - void setGroupedTaskViewThumbnailBounds(View mSnapshot1, View mSnapshot2, View taskParent, + void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, + int parentWidth, int parentHeight, SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp); // Overview TaskMenuView methods diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index f1fd439a06..99ad050b01 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -35,7 +35,6 @@ import android.view.MotionEvent; import android.view.Surface; import android.view.VelocityTracker; import android.view.View; -import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.widget.LinearLayout; @@ -513,35 +512,46 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { } @Override - public void setGroupedTaskViewThumbnailBounds(View mSnapshotView, View mSnapshotView2, - View taskParent, SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, - DeviceProfile dp) { + public void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, + int parentWidth, int parentHeight, + SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp) { int spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx; - int totalThumbnailHeight = taskParent.getHeight() - spaceAboveSnapshot; - int totalThumbnailWidth = taskParent.getWidth(); - int dividerBar = (dp.isLandscape ? - splitBoundsConfig.visualDividerBounds.width() : - splitBoundsConfig.visualDividerBounds.height()); - ViewGroup.LayoutParams primaryLp = mSnapshotView.getLayoutParams(); - ViewGroup.LayoutParams secondaryLp = mSnapshotView2.getLayoutParams(); - + int totalThumbnailHeight = parentHeight - spaceAboveSnapshot; + int dividerBar = (splitBoundsConfig.appsStackedVertically ? + splitBoundsConfig.visualDividerBounds.height() : + splitBoundsConfig.visualDividerBounds.width()); + int primarySnapshotHeight; + int primarySnapshotWidth; + int secondarySnapshotHeight; + int secondarySnapshotWidth; + float taskPercent = splitBoundsConfig.appsStackedVertically ? + splitBoundsConfig.topTaskPercent : splitBoundsConfig.leftTaskPercent; if (dp.isLandscape) { - primaryLp.height = totalThumbnailHeight; - primaryLp.width = (int) (totalThumbnailWidth * splitBoundsConfig.leftTaskPercent); + primarySnapshotHeight = totalThumbnailHeight; + primarySnapshotWidth = (int) (parentWidth * taskPercent); - secondaryLp.height = totalThumbnailHeight; - secondaryLp.width = totalThumbnailWidth - primaryLp.width - dividerBar; - mSnapshotView2.setTranslationX(primaryLp.width + dividerBar); - mSnapshotView2.setTranslationY(spaceAboveSnapshot); + secondarySnapshotHeight = totalThumbnailHeight; + secondarySnapshotWidth = parentWidth - primarySnapshotWidth - dividerBar; + int translationX = primarySnapshotWidth + dividerBar; + secondarySnapshot.setTranslationX(translationX); + secondarySnapshot.setTranslationY(spaceAboveSnapshot); } else { - primaryLp.width = totalThumbnailWidth; - primaryLp.height = (int) (totalThumbnailHeight * splitBoundsConfig.topTaskPercent); + primarySnapshotWidth = parentWidth; + primarySnapshotHeight = (int) (totalThumbnailHeight * taskPercent); - secondaryLp.width = totalThumbnailWidth; - secondaryLp.height = totalThumbnailHeight - primaryLp.height - dividerBar; - mSnapshotView2.setTranslationY(primaryLp.height + spaceAboveSnapshot + dividerBar); - mSnapshotView2.setTranslationX(0); + secondarySnapshotWidth = parentWidth; + secondarySnapshotHeight = totalThumbnailHeight - primarySnapshotHeight - dividerBar; + int translationY = primarySnapshotHeight + spaceAboveSnapshot + dividerBar; + secondarySnapshot.setTranslationY(translationY); + secondarySnapshot.setTranslationX(0); } + primarySnapshot.measure( + View.MeasureSpec.makeMeasureSpec(primarySnapshotWidth, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(primarySnapshotHeight, View.MeasureSpec.EXACTLY)); + secondarySnapshot.measure( + View.MeasureSpec.makeMeasureSpec(secondarySnapshotWidth, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(secondarySnapshotHeight, + View.MeasureSpec.EXACTLY)); } @Override diff --git a/src/com/android/launcher3/util/SplitConfigurationOptions.java b/src/com/android/launcher3/util/SplitConfigurationOptions.java index 5093d85535..0b083e3af4 100644 --- a/src/com/android/launcher3/util/SplitConfigurationOptions.java +++ b/src/com/android/launcher3/util/SplitConfigurationOptions.java @@ -93,7 +93,13 @@ public final class SplitConfigurationOptions { // This class is orientation-agnostic, so we compute both for later use public final float topTaskPercent; public final float leftTaskPercent; - + /** + * If {@code true}, that means at the time of creation of this object, the + * split-screened apps were vertically stacked. This is useful in scenarios like + * rotation where the bounds won't change, but this variable can indicate what orientation + * the bounds were originally in + */ + public final boolean appsStackedVertically; public StagedSplitBounds(Rect leftTopBounds, Rect rightBottomBounds) { this.leftTopBounds = leftTopBounds; @@ -103,10 +109,12 @@ public final class SplitConfigurationOptions { // vertical apps, horizontal divider this.visualDividerBounds = new Rect(leftTopBounds.left, leftTopBounds.bottom, leftTopBounds.right, rightBottomBounds.top); + appsStackedVertically = true; } else { // horizontal apps, vertical divider this.visualDividerBounds = new Rect(leftTopBounds.right, leftTopBounds.top, rightBottomBounds.left, leftTopBounds.bottom); + appsStackedVertically = false; } leftTaskPercent = this.leftTopBounds.width() / (float) rightBottomBounds.right;