Improve Split portrait gesture animation

* Crop out taskbar from bottom thumbnail for vertical split
* TODO: Need to re-calculate thumbnail sizes if taskbar
 is stashed. There's also a very slight rounding error
 somewhere even in the unstashed case that needs to be
 revisited

Bug: 219411750
Test: Start gesture animation in split in potrait
Change-Id: I35f2415e13af7467e0735ac8865cee0e3e3d27f8
This commit is contained in:
Vinit Nayak
2022-10-31 14:13:44 -07:00
parent cd587212a2
commit 29e71bdd72
4 changed files with 28 additions and 17 deletions
@@ -585,7 +585,6 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
@Override
public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect,
SplitBounds splitInfo, int desiredStagePosition) {
boolean isLandscape = dp.isLandscape;
float topLeftTaskPercent = splitInfo.appsStackedVertically
? splitInfo.topTaskPercent
: splitInfo.leftTaskPercent;
@@ -593,18 +592,24 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
? splitInfo.dividerHeightPercent
: splitInfo.dividerWidthPercent;
int deviceHeightWithoutTaskbar = dp.availableHeightPx - dp.taskbarSize;
float scale = (float) outRect.height() / deviceHeightWithoutTaskbar;
float topTaskHeight = dp.availableHeightPx * topLeftTaskPercent;
float scaledTopTaskHeight = topTaskHeight * scale;
float dividerHeight = dp.availableHeightPx * dividerBarPercent;
float scaledDividerHeight = dividerHeight * scale;
if (desiredStagePosition == SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT) {
if (isLandscape) {
outRect.right = outRect.left + Math.round(outRect.width() * topLeftTaskPercent);
if (splitInfo.appsStackedVertically) {
outRect.bottom = Math.round(outRect.top + scaledTopTaskHeight);
} else {
outRect.bottom = outRect.top + Math.round(outRect.height() * topLeftTaskPercent);
outRect.right = outRect.left + Math.round(outRect.width() * topLeftTaskPercent);
}
} else {
if (isLandscape) {
outRect.left += Math.round(outRect.width()
* (topLeftTaskPercent + dividerBarPercent));
if (splitInfo.appsStackedVertically) {
outRect.top += Math.round(scaledTopTaskHeight + scaledDividerHeight);
} else {
outRect.top += Math.round(outRect.height()
outRect.left += Math.round(outRect.width()
* (topLeftTaskPercent + dividerBarPercent));
}
}
@@ -617,7 +622,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
int spaceAboveSnapshot = dp.overviewTaskThumbnailTopMarginPx;
int totalThumbnailHeight = parentHeight - spaceAboveSnapshot;
int dividerBar = Math.round(splitBoundsConfig.appsStackedVertically
? splitBoundsConfig.dividerHeightPercent * totalThumbnailHeight
? splitBoundsConfig.dividerHeightPercent * dp.availableHeightPx
: splitBoundsConfig.dividerWidthPercent * parentWidth);
int primarySnapshotHeight;
int primarySnapshotWidth;
@@ -641,12 +646,18 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
}
secondarySnapshot.setTranslationY(spaceAboveSnapshot);
} else {
int deviceHeightWithoutTaskbar = dp.availableHeightPx - dp.taskbarSize;
float scale = (float) totalThumbnailHeight / deviceHeightWithoutTaskbar;
float topTaskHeight = dp.availableHeightPx * taskPercent;
float finalDividerHeight = dividerBar * scale;
float scaledTopTaskHeight = topTaskHeight * scale;
primarySnapshotWidth = parentWidth;
primarySnapshotHeight = Math.round(totalThumbnailHeight * taskPercent);
primarySnapshotHeight = Math.round(scaledTopTaskHeight);
secondarySnapshotWidth = parentWidth;
secondarySnapshotHeight = totalThumbnailHeight - primarySnapshotHeight - dividerBar;
int translationY = primarySnapshotHeight + spaceAboveSnapshot + dividerBar;
secondarySnapshotHeight = Math.round(totalThumbnailHeight - primarySnapshotHeight
- finalDividerHeight);
float translationY = primarySnapshotHeight + spaceAboveSnapshot + finalDividerHeight;
secondarySnapshot.setTranslationY(translationY);
FrameLayout.LayoutParams primaryParams =