diff --git a/quickstep/res/layout/task_grouped.xml b/quickstep/res/layout/task_grouped.xml index 069ff86020..cd5bcbdddd 100644 --- a/quickstep/res/layout/task_grouped.xml +++ b/quickstep/res/layout/task_grouped.xml @@ -44,4 +44,11 @@ android:layout_height="@dimen/task_thumbnail_icon_size" android:focusable="false" android:importantForAccessibility="no"/> + + \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java index 16303f3a02..b1b4b54af3 100644 --- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java +++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java @@ -1,18 +1,26 @@ package com.android.quickstep.views; import android.content.Context; +import android.graphics.Rect; import android.util.AttributeSet; +import android.view.MotionEvent; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.SplitConfigurationOptions; +import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; +import com.android.launcher3.util.TransformingTouchDelegate; import com.android.quickstep.RecentsModel; +import com.android.quickstep.TaskIconCache; import com.android.quickstep.TaskThumbnailCache; import com.android.quickstep.util.CancellableTask; import com.android.quickstep.util.RecentsOrientedState; import com.android.systemui.shared.recents.model.Task; +import com.android.systemui.shared.recents.model.ThumbnailData; import java.util.function.Consumer; @@ -30,8 +38,14 @@ public class GroupedTaskView extends TaskView { private Task mSecondaryTask; private TaskThumbnailView mSnapshotView2; - private CancellableTask mThumbnailLoadRequest2; - private SplitConfigurationOptions.StagedSplitBounds mSplitBoundsConfig; + private IconView mIconView2; + private CancellableTask mThumbnailLoadRequest2; + private CancellableTask mIconLoadRequest2; + private final float[] mIcon2CenterCoords = new float[2]; + private TransformingTouchDelegate mIcon2TouchDelegate; + @Nullable private StagedSplitBounds mSplitBoundsConfig; + private final Rect mPrimaryTempRect = new Rect(); + private final Rect mSecondaryTempRect = new Rect(); public GroupedTaskView(Context context) { super(context); @@ -49,10 +63,12 @@ public class GroupedTaskView extends TaskView { protected void onFinishInflate() { super.onFinishInflate(); mSnapshotView2 = findViewById(R.id.bottomright_snapshot); + mIconView2 = findViewById(R.id.bottomRight_icon); + mIcon2TouchDelegate = new TransformingTouchDelegate(mIconView2); } public void bind(Task primary, Task secondary, RecentsOrientedState orientedState, - SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig) { + StagedSplitBounds splitBoundsConfig) { super.bind(primary, orientedState); mSecondaryTask = secondary; mTaskIdContainer[1] = secondary.key.id; @@ -67,6 +83,7 @@ public class GroupedTaskView extends TaskView { if (visible) { RecentsModel model = RecentsModel.INSTANCE.get(getContext()); TaskThumbnailCache thumbnailCache = model.getThumbnailCache(); + TaskIconCache iconCache = model.getIconCache(); if (needsUpdate(changes, FLAG_UPDATE_THUMBNAIL)) { mThumbnailLoadRequest2 = thumbnailCache.updateThumbnailInBackground(mSecondaryTask, @@ -76,7 +93,11 @@ public class GroupedTaskView extends TaskView { } if (needsUpdate(changes, FLAG_UPDATE_ICON)) { - // TODO What's the Icon for this going to look like? :o + mIconLoadRequest2 = iconCache.updateIconInBackground(mSecondaryTask, + (task) -> { + setIcon(mIconView2, task.icon); + // TODO(199936292) Digital Wellbeing for individual tasks? + }); } } else { if (needsUpdate(changes, FLAG_UPDATE_THUMBNAIL)) { @@ -86,11 +107,26 @@ public class GroupedTaskView extends TaskView { mSecondaryTask.thumbnail = null; } if (needsUpdate(changes, FLAG_UPDATE_ICON)) { - // TODO + setIcon(mIconView2, null); } } } + public void updateSplitBoundsConfig(StagedSplitBounds stagedSplitBounds) { + mSplitBoundsConfig = stagedSplitBounds; + invalidate(); + } + + @Override + public boolean offerTouchToChildren(MotionEvent event) { + computeAndSetIconTouchDelegate(mIconView2, mIcon2CenterCoords, mIcon2TouchDelegate); + if (mIcon2TouchDelegate.onTouchEvent(event)) { + return true; + } + + return super.offerTouchToChildren(event); + } + @Override protected void cancelPendingLoadTasks() { super.cancelPendingLoadTasks(); @@ -98,6 +134,10 @@ public class GroupedTaskView extends TaskView { mThumbnailLoadRequest2.cancel(); mThumbnailLoadRequest2 = null; } + if (mIconLoadRequest2 != null) { + mIconLoadRequest2.cancel(); + mIconLoadRequest2 = null; + } } @Override @@ -137,6 +177,7 @@ public class GroupedTaskView extends TaskView { getPagedOrientationHandler().measureGroupedTaskViewThumbnailBounds(mSnapshotView, mSnapshotView2, widthSize, heightSize, mSplitBoundsConfig, mActivity.getDeviceProfile()); + updateIconPlacement(); } @Override @@ -144,4 +185,32 @@ public class GroupedTaskView extends TaskView { super.setOverlayEnabled(overlayEnabled); mSnapshotView2.setOverlayEnabled(overlayEnabled); } + + @Override + public void setOrientationState(RecentsOrientedState orientationState) { + super.setOrientationState(orientationState); + DeviceProfile deviceProfile = mActivity.getDeviceProfile(); + boolean isGridTask = deviceProfile.overviewShowAsGrid && !isFocusedTask(); + int iconDrawableSize = isGridTask ? deviceProfile.overviewTaskIconDrawableSizeGridPx + : deviceProfile.overviewTaskIconDrawableSizePx; + mIconView2.setDrawableSize(iconDrawableSize, iconDrawableSize); + mIconView2.setRotation(getPagedOrientationHandler().getDegreesRotated()); + updateIconPlacement(); + } + + private void updateIconPlacement() { + if (mSplitBoundsConfig == null) { + return; + } + + DeviceProfile deviceProfile = mActivity.getDeviceProfile(); + int taskIconHeight = deviceProfile.overviewTaskIconSizePx; + boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; + + mSnapshotView.getBoundsOnScreen(mPrimaryTempRect); + mSnapshotView2.getBoundsOnScreen(mSecondaryTempRect); + getPagedOrientationHandler().setSplitIconParams(mIconView, mIconView2, + taskIconHeight, mPrimaryTempRect, mSecondaryTempRect, + isRtl, deviceProfile, mSplitBoundsConfig); + } } diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java index ac779b1eaf..da3fa2ad91 100644 --- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java +++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java @@ -54,7 +54,8 @@ public class OverviewActionsView extends FrameLayo HIDDEN_NON_ZERO_ROTATION, HIDDEN_NO_TASKS, HIDDEN_NO_RECENTS, - HIDDEN_FOCUSED_SCROLL}) + HIDDEN_FOCUSED_SCROLL, + HIDDEN_SPLIT_SCREEN}) @Retention(RetentionPolicy.SOURCE) public @interface ActionsHiddenFlags { } @@ -62,6 +63,7 @@ public class OverviewActionsView extends FrameLayo public static final int HIDDEN_NO_TASKS = 1 << 1; public static final int HIDDEN_NO_RECENTS = 1 << 2; public static final int HIDDEN_FOCUSED_SCROLL = 1 << 3; + public static final int HIDDEN_SPLIT_SCREEN = 1 << 4; @IntDef(flag = true, value = { DISABLED_SCROLLING, diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 5fa95f49fd..e25a8bc5f1 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -53,6 +53,7 @@ import static com.android.quickstep.views.ClearAllButton.DISMISS_ALPHA; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_RECENTS; import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_TASKS; +import static com.android.quickstep.views.OverviewActionsView.HIDDEN_SPLIT_SCREEN; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -1109,6 +1110,7 @@ public abstract class RecentsView 1; RunningTaskInfo taskInfo = runningTaskInfo[0]; @@ -3134,7 +3136,7 @@ public abstract class RecentsView 1 - ); + private void updateCurrentTaskActionsVisibility() { + boolean isCurrentSplit = getCurrentPageTaskView() instanceof GroupedTaskView; + mActionsView.updateHiddenFlags(HIDDEN_SPLIT_SCREEN, isCurrentSplit); + if (isCurrentSplit) { + return; + } + mActionsView.setSplitButtonVisible( + mActivity.getDeviceProfile().isTablet && getTaskViewCount() > 1); } /** @@ -4174,7 +4179,7 @@ public abstract class RecentsView { - setIcon(task.icon); + setIcon(mIconView, task.icon); mDigitalWellBeingToast.initialize(mTask); }); } @@ -804,7 +805,7 @@ public class TaskView extends FrameLayout implements Reusable { mTask.thumbnail = null; } if (needsUpdate(changes, FLAG_UPDATE_ICON)) { - setIcon(null); + setIcon(mIconView, null); } } } @@ -840,10 +841,10 @@ public class TaskView extends FrameLayout implements Reusable { } } - private void setIcon(Drawable icon) { + protected void setIcon(IconView iconView, Drawable icon) { if (icon != null) { - mIconView.setDrawable(icon); - mIconView.setOnClickListener(v -> { + iconView.setDrawable(icon); + iconView.setOnClickListener(v -> { if (ENABLE_QUICKSTEP_LIVE_TILE.get() && isRunningTask()) { RecentsView recentsView = getRecentsView(); recentsView.switchToScreenshot( @@ -854,14 +855,14 @@ public class TaskView extends FrameLayout implements Reusable { showTaskMenu(); } }); - mIconView.setOnLongClickListener(v -> { + iconView.setOnLongClickListener(v -> { requestDisallowInterceptTouchEvent(true); return showTaskMenu(); }); } else { - mIconView.setDrawable(null); - mIconView.setOnClickListener(null); - mIconView.setOnLongClickListener(null); + iconView.setDrawable(null); + iconView.setOnClickListener(null); + iconView.setOnLongClickListener(null); } } @@ -877,32 +878,8 @@ public class TaskView extends FrameLayout implements Reusable { : deviceProfile.overviewTaskMarginPx; int taskIconMargin = snapshotParams.topMargin - taskIconHeight - taskMargin; LayoutParams iconParams = (LayoutParams) mIconView.getLayoutParams(); - switch (orientationHandler.getRotation()) { - case ROTATION_90: - iconParams.gravity = (isRtl ? START : END) | CENTER_VERTICAL; - iconParams.rightMargin = -taskIconHeight - taskIconMargin / 2; - iconParams.leftMargin = 0; - iconParams.topMargin = snapshotParams.topMargin / 2; - break; - case ROTATION_180: - iconParams.gravity = BOTTOM | CENTER_HORIZONTAL; - iconParams.bottomMargin = -snapshotParams.topMargin; - iconParams.leftMargin = iconParams.rightMargin = 0; - iconParams.topMargin = taskIconMargin; - break; - case ROTATION_270: - iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL; - iconParams.leftMargin = -taskIconHeight - taskIconMargin / 2; - iconParams.rightMargin = 0; - iconParams.topMargin = snapshotParams.topMargin / 2; - break; - case Surface.ROTATION_0: - default: - iconParams.gravity = TOP | CENTER_HORIZONTAL; - iconParams.leftMargin = iconParams.rightMargin = 0; - iconParams.topMargin = taskIconMargin; - break; - } + orientationHandler.setIconAndSnapshotParams(mIconView, taskIconMargin, taskIconHeight, + snapshotParams, isRtl); mSnapshotView.setLayoutParams(snapshotParams); iconParams.width = iconParams.height = taskIconHeight; mIconView.setLayoutParams(iconParams); diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index 2ac6cea636..0c3ad1d045 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -16,6 +16,10 @@ package com.android.launcher3.touch; +import static android.view.Gravity.CENTER_VERTICAL; +import static android.view.Gravity.END; +import static android.view.Gravity.START; +import static android.view.Gravity.TOP; import static android.widget.ListPopupWindow.WRAP_CONTENT; import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; @@ -36,8 +40,8 @@ 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.FrameLayout; import android.widget.LinearLayout; import com.android.launcher3.DeviceProfile; @@ -46,6 +50,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.util.SplitConfigurationOptions; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; import com.android.launcher3.util.SplitConfigurationOptions.StagePosition; +import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; import com.android.launcher3.views.BaseDragLayer; import java.util.Collections; @@ -222,11 +227,6 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { return view.getTop(); } - @Override - public float getChildStartWithTranslation(View view) { - return view.getTop() + view.getTranslationY(); - } - @Override public int getCenterForPage(View view, Rect insets) { return (view.getPaddingLeft() + view.getMeasuredWidth() + insets.left @@ -243,11 +243,6 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { return view.getHeight() - view.getPaddingBottom() - insets.bottom; } - @Override - public int getPrimaryTranslationDirectionFactor() { - return -1; - } - public int getSecondaryTranslationDirectionFactor() { return 1; } @@ -261,11 +256,6 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { } } - @Override - public int getSplitAnimationTranslation(int translationOffset, DeviceProfile dp) { - return translationOffset; - } - @Override public float getTaskMenuX(float x, View thumbnailView, int overScroll) { return thumbnailView.getMeasuredWidth() + x; @@ -386,7 +376,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { @Override public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, - SplitConfigurationOptions.StagedSplitBounds splitInfo, int desiredStagePosition) { + StagedSplitBounds splitInfo, int desiredStagePosition) { float diff; float horizontalDividerDiff = splitInfo.visualDividerBounds.width() / 2f; if (desiredStagePosition == SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT) { @@ -400,7 +390,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { @Override public void setLeashSplitOffset(Point splitOffset, DeviceProfile dp, - SplitConfigurationOptions.StagedSplitBounds splitInfo, int desiredStagePosition) { + StagedSplitBounds splitInfo, int desiredStagePosition) { if (desiredStagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT) { // The preview set is for the bottom/right, inset by top/left task splitOffset.x = splitInfo.leftTopBounds.width() + splitInfo.visualDividerBounds.width(); @@ -419,8 +409,10 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { int secondarySnapshotHeight; int secondarySnapshotWidth; + float taskPercent = splitBoundsConfig.appsStackedVertically ? + splitBoundsConfig.topTaskPercent : splitBoundsConfig.leftTaskPercent; primarySnapshotWidth = parentWidth; - primarySnapshotHeight = (int) (totalThumbnailHeight * splitBoundsConfig.leftTaskPercent); + primarySnapshotHeight = (int) (totalThumbnailHeight * taskPercent); secondarySnapshotWidth = parentWidth; secondarySnapshotHeight = totalThumbnailHeight - primarySnapshotHeight - dividerBar; @@ -434,6 +426,38 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { View.MeasureSpec.EXACTLY)); } + @Override + public void setIconAndSnapshotParams(View iconView, int taskIconMargin, int taskIconHeight, + FrameLayout.LayoutParams snapshotParams, boolean isRtl) { + FrameLayout.LayoutParams iconParams = + (FrameLayout.LayoutParams) iconView.getLayoutParams(); + iconParams.gravity = (isRtl ? START : END) | CENTER_VERTICAL; + iconParams.rightMargin = -taskIconHeight - taskIconMargin / 2; + iconParams.leftMargin = 0; + iconParams.topMargin = snapshotParams.topMargin / 2; + } + + @Override + public void setSplitIconParams(View primaryIconView, View secondaryIconView, + int taskIconHeight, Rect primarySnapshotBounds, Rect secondarySnapshotBounds, + boolean isRtl, DeviceProfile deviceProfile, StagedSplitBounds splitConfig) { + FrameLayout.LayoutParams primaryIconParams = + (FrameLayout.LayoutParams) primaryIconView.getLayoutParams(); + FrameLayout.LayoutParams secondaryIconParams = + new FrameLayout.LayoutParams(primaryIconParams); + + int primaryHeight = primarySnapshotBounds.height(); + int secondaryHeight = secondarySnapshotBounds.height(); + primaryIconParams.gravity = (isRtl ? START : END) | TOP; + primaryIconView.setTranslationY((primaryHeight + taskIconHeight) / 2f ); + + secondaryIconParams.gravity = (isRtl ? START : END) | TOP; + secondaryIconView.setTranslationY(primaryHeight + + ((secondaryHeight + taskIconHeight) / 2f)); + primaryIconView.setLayoutParams(primaryIconParams); + secondaryIconView.setLayoutParams(secondaryIconParams); + } + @Override public int getDefaultSplitPosition(DeviceProfile deviceProfile) { throw new IllegalStateException("Default position not available in fake landscape"); diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java index b119e2c0a9..494fe22c73 100644 --- a/src/com/android/launcher3/touch/PagedOrientationHandler.java +++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java @@ -29,12 +29,14 @@ import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.accessibility.AccessibilityEvent; +import android.widget.FrameLayout; import android.widget.LinearLayout; import com.android.launcher3.DeviceProfile; import com.android.launcher3.util.SplitConfigurationOptions; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; import com.android.launcher3.util.SplitConfigurationOptions.StagePosition; +import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; import java.util.List; @@ -88,14 +90,11 @@ public interface PagedOrientationHandler { int getPrimaryScroll(View view); float getPrimaryScale(View view); int getChildStart(View view); - float getChildStartWithTranslation(View view); int getCenterForPage(View view, Rect insets); int getScrollOffsetStart(View view, Rect insets); int getScrollOffsetEnd(View view, Rect insets); - int getPrimaryTranslationDirectionFactor(); int getSecondaryTranslationDirectionFactor(); int getSplitTranslationDirectionFactor(@StagePosition int stagePosition); - int getSplitAnimationTranslation(int translationOffset, DeviceProfile dp); ChildBounds getChildBounds(View child, int childStart, int pageCenter, boolean layoutChild); void setMaxScroll(AccessibilityEvent event, int maxScroll); boolean getRecentsRtlSetting(Resources resources); @@ -144,12 +143,12 @@ public interface PagedOrientationHandler { * outRect for */ void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, - SplitConfigurationOptions.StagedSplitBounds splitInfo, + StagedSplitBounds splitInfo, @SplitConfigurationOptions.StagePosition int desiredStagePosition); /** * It's important to note that {@link #setSplitTaskSwipeRect(DeviceProfile, Rect, - * SplitConfigurationOptions.StagedSplitBounds, int)} above operates on the outRect based on + * StagedSplitBounds, int)} above operates on the outRect based on * launcher's coordinate system, meaning it will treat the outRect as portrait if home rotation * is not allowed. * @@ -159,7 +158,7 @@ public interface PagedOrientationHandler { * usual Y */ void setLeashSplitOffset(Point splitOffset, DeviceProfile dp, - SplitConfigurationOptions.StagedSplitBounds splitInfo, + StagedSplitBounds splitInfo, @SplitConfigurationOptions.StagePosition int desiredStagePosition); void measureGroupedTaskViewThumbnailBounds(View primarySnapshot, View secondarySnapshot, @@ -167,6 +166,11 @@ public interface PagedOrientationHandler { SplitConfigurationOptions.StagedSplitBounds splitBoundsConfig, DeviceProfile dp); // Overview TaskMenuView methods + void setIconAndSnapshotParams(View iconView, int taskIconMargin, int taskIconHeight, + FrameLayout.LayoutParams snapshotParams, boolean isRtl); + void setSplitIconParams(View primaryIconView, View secondaryIconView, + int taskIconHeight, Rect primarySnapshotBounds, Rect secondarySnapshotBounds, + boolean isRtl, DeviceProfile deviceProfile, StagedSplitBounds splitConfig); float getTaskMenuX(float x, View thumbnailView, int overScroll); float getTaskMenuY(float y, View thumbnailView, int overScroll); int getTaskMenuWidth(View view); diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index 99ad050b01..a453cae436 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -16,6 +16,11 @@ package com.android.launcher3.touch; +import static android.view.Gravity.BOTTOM; +import static android.view.Gravity.CENTER_HORIZONTAL; +import static android.view.Gravity.START; +import static android.view.Gravity.TOP; + import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y; import static com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL; @@ -36,6 +41,7 @@ import android.view.Surface; import android.view.VelocityTracker; import android.view.View; import android.view.accessibility.AccessibilityEvent; +import android.widget.FrameLayout; import android.widget.LinearLayout; import com.android.launcher3.DeviceProfile; @@ -44,6 +50,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.util.SplitConfigurationOptions; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; import com.android.launcher3.util.SplitConfigurationOptions.StagePosition; +import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitBounds; import com.android.launcher3.views.BaseDragLayer; import java.util.ArrayList; @@ -227,11 +234,6 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { return view.getLeft(); } - @Override - public float getChildStartWithTranslation(View view) { - return view.getLeft() + view.getTranslationX(); - } - @Override public int getCenterForPage(View view, Rect insets) { return (view.getPaddingTop() + view.getMeasuredHeight() + insets.top @@ -248,11 +250,6 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { return view.getWidth() - view.getPaddingRight() - insets.right; } - @Override - public int getPrimaryTranslationDirectionFactor() { - return 1; - } - public int getSecondaryTranslationDirectionFactor() { return -1; } @@ -266,14 +263,6 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { } } - @Override - public int getSplitAnimationTranslation(int translationOffset, DeviceProfile dp) { - if (dp.isLandscape) { - return translationOffset; - } - return 0; - } - @Override public float getTaskMenuX(float x, View thumbnailView, int overScroll) { return x + overScroll; @@ -471,7 +460,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { @Override public void setSplitTaskSwipeRect(DeviceProfile dp, Rect outRect, - SplitConfigurationOptions.StagedSplitBounds splitInfo, int desiredStagePosition) { + StagedSplitBounds splitInfo, int desiredStagePosition) { boolean isLandscape = dp.isLandscape; float verticalDividerDiff = splitInfo.visualDividerBounds.height() / 2f; float horizontalDividerDiff = splitInfo.visualDividerBounds.width() / 2f; @@ -497,7 +486,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { @Override public void setLeashSplitOffset(Point splitOffset, DeviceProfile dp, - SplitConfigurationOptions.StagedSplitBounds splitInfo, int desiredStagePosition) { + StagedSplitBounds splitInfo, int desiredStagePosition) { if (desiredStagePosition == STAGE_POSITION_BOTTOM_OR_RIGHT) { if (dp.isLandscape) { splitOffset.x = splitInfo.leftTopBounds.width() + @@ -554,6 +543,46 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { View.MeasureSpec.EXACTLY)); } + @Override + public void setIconAndSnapshotParams(View iconView, int taskIconMargin, int taskIconHeight, + FrameLayout.LayoutParams snapshotParams, boolean isRtl) { + FrameLayout.LayoutParams iconParams = + (FrameLayout.LayoutParams) iconView.getLayoutParams(); + iconParams.gravity = TOP | CENTER_HORIZONTAL; + iconParams.leftMargin = iconParams.rightMargin = 0; + iconParams.topMargin = taskIconMargin; + } + + @Override + public void setSplitIconParams(View primaryIconView, View secondaryIconView, + int taskIconHeight, Rect primarySnapshotBounds, Rect secondarySnapshotBounds, + boolean isRtl, DeviceProfile deviceProfile, StagedSplitBounds splitConfig) { + FrameLayout.LayoutParams primaryIconParams = + (FrameLayout.LayoutParams) primaryIconView.getLayoutParams(); + FrameLayout.LayoutParams secondaryIconParams = + new FrameLayout.LayoutParams(primaryIconParams); + + if (deviceProfile.isLandscape) { + int primaryWidth = primarySnapshotBounds.width(); + int secondaryWidth = secondarySnapshotBounds.width(); + primaryIconParams.gravity = TOP | START; + primaryIconView.setTranslationX((primaryWidth - taskIconHeight) / 2f ); + + secondaryIconParams.gravity = TOP | START; + secondaryIconView.setTranslationX(primaryWidth + + ((secondaryWidth - taskIconHeight) / 2f)); + } else { + primaryIconView.setTranslationX(0); + secondaryIconView.setTranslationX(0); + primaryIconView.setTranslationY(0); + secondaryIconView.setTranslationY(0); + secondaryIconParams.gravity = BOTTOM | CENTER_HORIZONTAL; + secondaryIconParams.bottomMargin = -(secondaryIconParams.topMargin + taskIconHeight); + } + primaryIconView.setLayoutParams(primaryIconParams); + secondaryIconView.setLayoutParams(secondaryIconParams); + } + @Override public int getDefaultSplitPosition(DeviceProfile deviceProfile) { if (!deviceProfile.isTablet) { diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java index 91d44bd29c..4f33ff04bc 100644 --- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java @@ -16,6 +16,10 @@ package com.android.launcher3.touch; +import static android.view.Gravity.CENTER_VERTICAL; +import static android.view.Gravity.END; +import static android.view.Gravity.START; + import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL; import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT; import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT; @@ -26,6 +30,7 @@ import android.graphics.PointF; import android.graphics.Rect; import android.view.Surface; import android.view.View; +import android.widget.FrameLayout; import android.widget.LinearLayout; import com.android.launcher3.DeviceProfile; @@ -53,11 +58,6 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { } } - @Override - public int getSplitAnimationTranslation(int translationOffset, DeviceProfile dp) { - return translationOffset; - } - @Override public boolean getRecentsRtlSetting(Resources resources) { return Utilities.isRtl(resources); @@ -114,6 +114,17 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { STAGE_POSITION_TOP_OR_LEFT, STAGE_TYPE_MAIN)); } + @Override + public void setIconAndSnapshotParams(View mIconView, int taskIconMargin, int taskIconHeight, + FrameLayout.LayoutParams snapshotParams, boolean isRtl) { + FrameLayout.LayoutParams iconParams = + (FrameLayout.LayoutParams) mIconView.getLayoutParams(); + iconParams.gravity = (isRtl ? END : START) | CENTER_VERTICAL; + iconParams.leftMargin = -taskIconHeight - taskIconMargin / 2; + iconParams.rightMargin = 0; + iconParams.topMargin = snapshotParams.topMargin / 2; + } + /* ---------- The following are only used by TaskViewTouchHandler. ---------- */ @Override