diff --git a/quickstep/res/layout/overview_actions_container.xml b/quickstep/res/layout/overview_actions_container.xml index dd8afc22e0..1c7b5099a8 100644 --- a/quickstep/res/layout/overview_actions_container.xml +++ b/quickstep/res/layout/overview_actions_container.xml @@ -51,7 +51,6 @@ style="@style/OverviewActionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:drawableStart="@drawable/ic_split_screen" android:text="@string/action_split" android:theme="@style/ThemeControlHighlightWorkspaceColor" android:visibility="gone" /> diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 152b25538f..f3c8cf3480 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -15,7 +15,6 @@ */ package com.android.launcher3.taskbar; -import static com.android.launcher3.LauncherState.HOTSEAT_ICONS; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE; import static com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_DURATION; @@ -68,9 +67,6 @@ import java.util.function.Supplier; private int mPrevState; private int mState; - private LauncherState mTargetStateOverride = null; - private LauncherState mTargetStateOverrideForStateTransition = null; - private boolean mIsAnimatingToLauncherViaGesture; private boolean mIsAnimatingToLauncherViaResume; @@ -79,7 +75,6 @@ import java.util.function.Supplier; @Override public void onStateTransitionStart(LauncherState toState) { - mTargetStateOverrideForStateTransition = toState; updateStateForFlag(FLAG_TRANSITION_STATE_START_STASHED, toState.isTaskbarStashed()); applyState(); @@ -134,18 +129,6 @@ import java.util.function.Supplier; updateStateForFlag(FLAG_RECENTS_ANIMATION_RUNNING, true); animatorSet.play(stashController.applyStateWithoutStart(duration)); animatorSet.play(applyState(duration, false)); - animatorSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animator) { - mTargetStateOverride = null; - animator.removeListener(this); - } - - @Override - public void onAnimationStart(Animator animator) { - mTargetStateOverride = toState; - } - }); TaskBarRecentsAnimationListener listener = new TaskBarRecentsAnimationListener(callbacks); callbacks.addListener(listener); @@ -284,7 +267,6 @@ import java.util.function.Supplier; // Reset hotseat alpha to default mLauncher.getHotseat().setIconsAlpha(1); } - mTargetStateOverrideForStateTransition = null; } @Override @@ -296,8 +278,6 @@ import java.util.function.Supplier; animatorSet.play(mIconAlignmentForLauncherState.animateToValue( getCurrentIconAlignmentRatioForLauncherState(), isTransitionStateStashed ? 0 : 1)); - } else { - mTargetStateOverrideForStateTransition = null; } } @@ -318,20 +298,14 @@ import java.util.function.Supplier; } private void onIconAlignmentRatioChangedForStateTransition() { - onIconAlignmentRatioChanged( - mTargetStateOverrideForStateTransition != null - ? mTargetStateOverrideForStateTransition - : mLauncher.getStateManager().getState(), - this::getCurrentIconAlignmentRatioForLauncherState); + onIconAlignmentRatioChanged(this::getCurrentIconAlignmentRatioForLauncherState); } private void onIconAlignmentRatioChanged() { - onIconAlignmentRatioChanged(mTargetStateOverride != null ? mTargetStateOverride - : mLauncher.getStateManager().getState(), this::getCurrentIconAlignmentRatio); + onIconAlignmentRatioChanged(this::getCurrentIconAlignmentRatio); } - private void onIconAlignmentRatioChanged(LauncherState state, - Supplier alignmentSupplier) { + private void onIconAlignmentRatioChanged(Supplier alignmentSupplier) { if (mControllers == null) { return; } @@ -341,7 +315,8 @@ import java.util.function.Supplier; mTaskbarBackgroundAlpha.updateValue(1 - alignment); - setIconAlpha(state, alignment); + // Switch taskbar and hotseat in last frame + setTaskbarViewVisible(alignment < 1); } private float getCurrentIconAlignmentRatio() { @@ -352,15 +327,6 @@ import java.util.function.Supplier; return mIconAlignmentForLauncherState.value; } - private void setIconAlpha(LauncherState state, float progress) { - if ((state.getVisibleElements(mLauncher) & HOTSEAT_ICONS) != 0) { - // If the hotseat icons are visible, then switch taskbar in last frame - setTaskbarViewVisible(progress < 1); - } else { - mIconAlphaForHome.setValue(1 - progress); - } - } - private void setTaskbarViewVisible(boolean isVisible) { mIconAlphaForHome.setValue(isVisible ? 1 : 0); } diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java index dd6392cb9a..b50267633b 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java @@ -23,6 +23,7 @@ import android.util.ArraySet; import android.view.RemoteAnimationTarget; import androidx.annotation.BinderThread; +import androidx.annotation.NonNull; import androidx.annotation.UiThread; import com.android.launcher3.Utilities; @@ -77,7 +78,7 @@ public class RecentsAnimationCallbacks implements public void notifyAnimationCanceled() { mCancelled = true; - onAnimationCanceled(null); + onAnimationCanceled(new HashMap<>()); } // Called only in Q platform @@ -167,16 +168,17 @@ public class RecentsAnimationCallbacks implements * Callback from the system when the recents animation is canceled. {@param thumbnailData} * is passed back for rendering screenshot to replace live tile. */ - default void onRecentsAnimationCanceled(HashMap thumbnailDatas) {} + default void onRecentsAnimationCanceled( + @NonNull HashMap thumbnailDatas) {} /** * Callback made whenever the recents animation is finished. */ - default void onRecentsAnimationFinished(RecentsAnimationController controller) {} + default void onRecentsAnimationFinished(@NonNull RecentsAnimationController controller) {} /** * Callback made when a task started from the recents is ready for an app transition. */ - default void onTasksAppeared(RemoteAnimationTargetCompat[] appearedTaskTarget) {} + default void onTasksAppeared(@NonNull RemoteAnimationTargetCompat[] appearedTaskTarget) {} } } diff --git a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java new file mode 100644 index 0000000000..861ff96b5e --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util; + +import android.annotation.CallSuper; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; + +import java.util.HashMap; +import java.util.Map; + +/** + * Animation that moves launcher icons and widgets from center to the sides (final position) + */ +public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProgressListener { + + private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimation; + + private final Map mOriginalClipToPadding = new HashMap<>(); + private final Map mOriginalClipChildren = new HashMap<>(); + + public BaseUnfoldMoveFromCenterAnimator(WindowManager windowManager) { + mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager, + new LauncherViewsMoveFromCenterTranslationApplier()); + } + + @CallSuper + @Override + public void onTransitionStarted() { + mMoveFromCenterAnimation.updateDisplayProperties(); + onPrepareViewsForAnimation(); + onTransitionProgress(0f); + } + + @CallSuper + @Override + public void onTransitionProgress(float progress) { + mMoveFromCenterAnimation.onTransitionProgress(progress); + } + + @CallSuper + @Override + public void onTransitionFinished() { + mMoveFromCenterAnimation.onTransitionFinished(); + mMoveFromCenterAnimation.clearRegisteredViews(); + + mOriginalClipChildren.clear(); + mOriginalClipToPadding.clear(); + } + + protected void onPrepareViewsForAnimation() { + + } + + protected void registerViewForAnimation(View view) { + mMoveFromCenterAnimation.registerViewForAnimation(view); + } + + protected void disableClipping(ViewGroup view) { + mOriginalClipToPadding.put(view, view.getClipToPadding()); + mOriginalClipChildren.put(view, view.getClipChildren()); + view.setClipToPadding(false); + view.setClipChildren(false); + } + + protected void restoreClipping(ViewGroup view) { + final Boolean originalClipToPadding = mOriginalClipToPadding.get(view); + if (originalClipToPadding != null) { + view.setClipToPadding(originalClipToPadding); + } + final Boolean originalClipChildren = mOriginalClipChildren.get(view); + if (originalClipChildren != null) { + view.setClipChildren(originalClipChildren); + } + } +} diff --git a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java index b39412b982..6b6bd6a8b3 100644 --- a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java +++ b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java @@ -18,14 +18,17 @@ package com.android.quickstep.util; import static com.android.launcher3.Utilities.comp; import android.annotation.Nullable; -import android.view.ViewTreeObserver; import android.view.WindowManager; +import android.view.WindowManagerGlobal; + +import androidx.core.view.OneShotPreDrawListener; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.util.HorizontalInsettableView; import com.android.systemui.unfold.UnfoldTransitionProgressProvider; import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; +import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider; import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; /** @@ -43,6 +46,7 @@ public class LauncherUnfoldAnimationController { private HorizontalInsettableView mQsbInsettable; private final ScopedUnfoldTransitionProgressProvider mProgressProvider; + private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider; public LauncherUnfoldAnimationController( Launcher launcher, @@ -51,10 +55,19 @@ public class LauncherUnfoldAnimationController { mLauncher = launcher; mProgressProvider = new ScopedUnfoldTransitionProgressProvider( unfoldTransitionProgressProvider); + mNaturalOrientationProgressProvider = new NaturalRotationUnfoldProgressProvider(launcher, + WindowManagerGlobal.getWindowManagerService(), mProgressProvider); + mNaturalOrientationProgressProvider.init(); + // Animated in all orientations mProgressProvider.addCallback(new UnfoldMoveFromCenterWorkspaceAnimator(launcher, windowManager)); - mProgressProvider.addCallback(new QsbAnimationListener()); + + // Animated only in natural orientation + mNaturalOrientationProgressProvider + .addCallback(new QsbAnimationListener()); + mNaturalOrientationProgressProvider + .addCallback(new UnfoldMoveFromCenterHotseatAnimator(launcher, windowManager)); } /** @@ -66,17 +79,8 @@ public class LauncherUnfoldAnimationController { mQsbInsettable = (HorizontalInsettableView) hotseat.getQsb(); } - final ViewTreeObserver obs = mLauncher.getWorkspace().getViewTreeObserver(); - obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - if (obs.isAlive()) { - mProgressProvider.setReadyToHandleTransition(true); - obs.removeOnPreDrawListener(this); - } - return true; - } - }); + OneShotPreDrawListener.add(mLauncher.getWorkspace(), + () -> mProgressProvider.setReadyToHandleTransition(true)); } /** @@ -92,6 +96,7 @@ public class LauncherUnfoldAnimationController { */ public void onDestroy() { mProgressProvider.destroy(); + mNaturalOrientationProgressProvider.destroy(); } private class QsbAnimationListener implements TransitionProgressListener { diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java new file mode 100644 index 0000000000..dc97dd6f86 --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util; + +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; + +import com.android.launcher3.Hotseat; +import com.android.launcher3.Launcher; + +/** + * Animation that moves hotseat icons from center to the sides (final position) + */ +public class UnfoldMoveFromCenterHotseatAnimator extends BaseUnfoldMoveFromCenterAnimator { + + private final Launcher mLauncher; + + public UnfoldMoveFromCenterHotseatAnimator(Launcher launcher, WindowManager windowManager) { + super(windowManager); + mLauncher = launcher; + } + + @Override + protected void onPrepareViewsForAnimation() { + Hotseat hotseat = mLauncher.getHotseat(); + + ViewGroup hotseatIcons = hotseat.getShortcutsAndWidgets(); + disableClipping(hotseat); + + for (int i = 0; i < hotseatIcons.getChildCount(); i++) { + View child = hotseatIcons.getChildAt(i); + registerViewForAnimation(child); + } + } + + @Override + public void onTransitionFinished() { + restoreClipping(mLauncher.getHotseat()); + super.onTransitionFinished(); + } +} diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java index 95403b2d0c..3d72398832 100644 --- a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java @@ -16,44 +16,28 @@ package com.android.quickstep.util; import android.view.View; -import android.view.ViewGroup; import android.view.WindowManager; import com.android.launcher3.CellLayout; -import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.ShortcutAndWidgetContainer; import com.android.launcher3.Workspace; -import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; -import com.android.systemui.unfold.UnfoldTransitionProgressProvider; - -import java.util.HashMap; -import java.util.Map; /** * Animation that moves launcher icons and widgets from center to the sides (final position) */ -public class UnfoldMoveFromCenterWorkspaceAnimator - implements UnfoldTransitionProgressProvider.TransitionProgressListener { +public class UnfoldMoveFromCenterWorkspaceAnimator extends BaseUnfoldMoveFromCenterAnimator { private final Launcher mLauncher; - private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimation; - - private final Map mOriginalClipToPadding = new HashMap<>(); - private final Map mOriginalClipChildren = new HashMap<>(); public UnfoldMoveFromCenterWorkspaceAnimator(Launcher launcher, WindowManager windowManager) { + super(windowManager); mLauncher = launcher; - mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager, - new LauncherViewsMoveFromCenterTranslationApplier()); } @Override - public void onTransitionStarted() { - mMoveFromCenterAnimation.updateDisplayProperties(); - + protected void onPrepareViewsForAnimation() { Workspace workspace = mLauncher.getWorkspace(); - Hotseat hotseat = mLauncher.getHotseat(); // App icons and widgets workspace @@ -65,57 +49,17 @@ public class UnfoldMoveFromCenterWorkspaceAnimator for (int i = 0; i < itemsContainer.getChildCount(); i++) { View child = itemsContainer.getChildAt(i); - mMoveFromCenterAnimation.registerViewForAnimation(child); + registerViewForAnimation(child); } }); disableClipping(workspace); - - // Hotseat icons - ViewGroup hotseatIcons = hotseat.getShortcutsAndWidgets(); - disableClipping(hotseat); - - for (int i = 0; i < hotseatIcons.getChildCount(); i++) { - View child = hotseatIcons.getChildAt(i); - mMoveFromCenterAnimation.registerViewForAnimation(child); - } - - onTransitionProgress(0f); - } - - @Override - public void onTransitionProgress(float progress) { - mMoveFromCenterAnimation.onTransitionProgress(progress); } @Override public void onTransitionFinished() { - mMoveFromCenterAnimation.onTransitionFinished(); - mMoveFromCenterAnimation.clearRegisteredViews(); - restoreClipping(mLauncher.getWorkspace()); mLauncher.getWorkspace().forEachVisiblePage(page -> restoreClipping((CellLayout) page)); - restoreClipping(mLauncher.getHotseat()); - - mOriginalClipChildren.clear(); - mOriginalClipToPadding.clear(); - } - - private void disableClipping(ViewGroup view) { - mOriginalClipToPadding.put(view, view.getClipToPadding()); - mOriginalClipChildren.put(view, view.getClipChildren()); - view.setClipToPadding(false); - view.setClipChildren(false); - } - - private void restoreClipping(ViewGroup view) { - final Boolean originalClipToPadding = mOriginalClipToPadding.get(view); - if (originalClipToPadding != null) { - view.setClipToPadding(originalClipToPadding); - } - final Boolean originalClipChildren = mOriginalClipChildren.get(view); - if (originalClipChildren != null) { - view.setClipChildren(originalClipChildren); - } + super.onTransitionFinished(); } } diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java index b6bf59f981..81c07a6a64 100644 --- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java +++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java @@ -22,6 +22,7 @@ import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; +import android.widget.Button; import android.widget.FrameLayout; import androidx.annotation.IntDef; @@ -80,7 +81,7 @@ public class OverviewActionsView extends FrameLayo private static final int INDEX_HIDDEN_FLAGS_ALPHA = 3; private final MultiValueAlpha mMultiValueAlpha; - private View mSplitButton; + private Button mSplitButton; @ActionsHiddenFlags private int mHiddenFlags; @@ -215,6 +216,10 @@ public class OverviewActionsView extends FrameLayo mDp = dp; updateVerticalMargin(SysUINavigationMode.getMode(getContext())); requestLayout(); + + mSplitButton.setCompoundDrawablesWithIntrinsicBounds( + (dp.isLandscape ? R.drawable.ic_split_horizontal : R.drawable.ic_split_vertical), + 0, 0, 0); } public void setSplitButtonVisible(boolean visible) { diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 3020dd905d..2ad586d2f2 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1041,6 +1041,17 @@ public abstract class RecentsView= start && taskEnd <= end; + } + /** * Returns true if the task is in expected scroll position. * @@ -4853,6 +4873,62 @@ public abstract class RecentsView= 0) { + // Find the next page that is not fully visible. + TaskView taskView = getTaskViewAt(targetPage); + while ((taskView == null || isTaskViewFullyVisible(taskView)) && targetPage - 1 >= 0) { + taskView = getTaskViewAt(--targetPage); + } + // Target a scroll where targetPage is on left of screen but still fully visible. + int lastTaskEnd = (mIsRtl + ? mLastComputedGridSize.left + : mLastComputedGridSize.right) + + (mIsRtl ? mPageSpacing : -mPageSpacing); + int normalTaskEnd = mIsRtl + ? mLastComputedGridTaskSize.left + : mLastComputedGridTaskSize.right; + int targetScroll = getScrollForPage(targetPage) + normalTaskEnd - lastTaskEnd; + // Find a page that is close to targetScroll while not over it. + while (targetPage - 1 >= 0 + && (mIsRtl + ? getScrollForPage(targetPage - 1) < targetScroll + : getScrollForPage(targetPage - 1) > targetScroll)) { + targetPage--; + } + snapToPage(targetPage); + return true; + } + + return mAllowOverScroll; + } + + @Override + public boolean scrollRight() { + if (!showAsGrid()) { + return super.scrollRight(); + } + + int targetPage = getNextPage(); + if (targetPage < getChildCount()) { + // Find the next page that is not fully visible. + TaskView taskView = getTaskViewAt(targetPage); + while ((taskView != null && isTaskViewFullyVisible(taskView)) + && targetPage + 1 < getChildCount()) { + taskView = getTaskViewAt(++targetPage); + } + snapToPage(targetPage); + return true; + } + return mAllowOverScroll; + } + @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); diff --git a/res/drawable/ic_split_horizontal.xml b/res/drawable/ic_split_horizontal.xml new file mode 100644 index 0000000000..ee710d0797 --- /dev/null +++ b/res/drawable/ic_split_horizontal.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/ic_split_left.xml b/res/drawable/ic_split_left.xml new file mode 100644 index 0000000000..fc9f699c29 --- /dev/null +++ b/res/drawable/ic_split_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/ic_split_right.xml b/res/drawable/ic_split_right.xml new file mode 100644 index 0000000000..cc156225e8 --- /dev/null +++ b/res/drawable/ic_split_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/ic_split_top.xml b/res/drawable/ic_split_top.xml new file mode 100644 index 0000000000..f8c15bd44d --- /dev/null +++ b/res/drawable/ic_split_top.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/ic_split_vertical.xml b/res/drawable/ic_split_vertical.xml new file mode 100644 index 0000000000..9bc97851ab --- /dev/null +++ b/res/drawable/ic_split_vertical.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index 1ce7ebec4d..2c14f07779 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -1749,20 +1749,23 @@ public abstract class PagedView extends ViewGrou public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); final boolean pagesFlipped = isPageOrderFlipped(); - int offset = (mAllowOverScroll ? 0 : 1); - info.setScrollable(getPageCount() > offset); - if (getCurrentPage() < getPageCount() - offset) { + info.setScrollable(getPageCount() > 0); + int primaryScroll = mOrientationHandler.getPrimaryScroll(this); + if (getCurrentPage() < getPageCount() - getPanelCount() + || (getCurrentPage() == getPageCount() - getPanelCount() + && primaryScroll != getScrollForPage(getPageCount() - getPanelCount()))) { info.addAction(pagesFlipped ? - AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD - : AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD); + AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD + : AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD); info.addAction(mIsRtl ? AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_LEFT : AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_RIGHT); } - if (getCurrentPage() >= offset) { + if (getCurrentPage() > 0 + || (getCurrentPage() == 0 && primaryScroll != getScrollForPage(0))) { info.addAction(pagesFlipped ? - AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD - : AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD); + AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_FORWARD + : AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_BACKWARD); info.addAction(mIsRtl ? AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_RIGHT : AccessibilityNodeInfo.AccessibilityAction.ACTION_PAGE_LEFT); @@ -1807,16 +1810,16 @@ public abstract class PagedView extends ViewGrou } break; case android.R.id.accessibilityActionPageRight: { if (!mIsRtl) { - return scrollRight(); + return scrollRight(); } else { - return scrollLeft(); + return scrollLeft(); } } case android.R.id.accessibilityActionPageLeft: { if (!mIsRtl) { - return scrollLeft(); + return scrollLeft(); } else { - return scrollRight(); + return scrollRight(); } } } diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java index c2552250df..0c390679d9 100644 --- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java @@ -357,7 +357,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler { public List getSplitPositionOptions(DeviceProfile dp) { // Add "left" side of phone which is actually the top return Collections.singletonList(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_left, + R.drawable.ic_split_left, R.string.split_screen_position_left, STAGE_POSITION_TOP_OR_LEFT, STAGE_TYPE_MAIN)); } diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java index e69944abef..b9f1b66a68 100644 --- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java +++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java @@ -370,28 +370,27 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler { public List getSplitPositionOptions(DeviceProfile dp) { List options = new ArrayList<>(1); // Add both left and right options if we're in tablet mode - // TODO: Add in correct icons if (dp.isTablet && dp.isLandscape) { options.add(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_right, + R.drawable.ic_split_right, R.string.split_screen_position_right, STAGE_POSITION_BOTTOM_OR_RIGHT, STAGE_TYPE_MAIN)); options.add(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_left, + R.drawable.ic_split_left, R.string.split_screen_position_left, STAGE_POSITION_TOP_OR_LEFT, STAGE_TYPE_MAIN)); } else { if (dp.isSeascape()) { // Add left/right options options.add(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_right, + R.drawable.ic_split_right, R.string.split_screen_position_right, STAGE_POSITION_BOTTOM_OR_RIGHT, STAGE_TYPE_MAIN)); } else if (dp.isLandscape) { options.add(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_left, + R.drawable.ic_split_left, R.string.split_screen_position_left, STAGE_POSITION_TOP_OR_LEFT, STAGE_TYPE_MAIN)); } else { // Only add top option options.add(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_top, + R.drawable.ic_split_top, R.string.split_screen_position_top, STAGE_POSITION_TOP_OR_LEFT, STAGE_TYPE_MAIN)); } } diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java index 539e3f82c5..ce2e13644d 100644 --- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java +++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java @@ -115,7 +115,7 @@ public class SeascapePagedViewHandler extends LandscapePagedViewHandler { public List getSplitPositionOptions(DeviceProfile dp) { // Add "right" option which is actually the top return Collections.singletonList(new SplitPositionOption( - R.drawable.ic_split_screen, R.string.split_screen_position_right, + R.drawable.ic_split_right, R.string.split_screen_position_right, STAGE_POSITION_TOP_OR_LEFT, STAGE_TYPE_MAIN)); }