From 4e15fe0726d62d6e0e63be3afbba5c57b36ce6a3 Mon Sep 17 00:00:00 2001 From: shawnlin Date: Thu, 5 Aug 2021 15:42:56 +0800 Subject: [PATCH 01/13] [DO NOT MERGE] Update QuickStepContract.getWindowCornerRadius API Update from getWindowCornerRadius(Resources) to getWindowCornerRadius(Context) Bug: 131221697 Test: make Change-Id: Ia5f10e9292e205dab7e69d97dfc82d17690816fb --- .../com/android/launcher3/QuickstepTransitionManager.java | 8 ++++---- .../src/com/android/quickstep/RotationTouchHelper.java | 4 +--- .../quickstep/interaction/NavBarGestureHandler.java | 2 +- quickstep/src/com/android/quickstep/views/TaskView.java | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index 433ae3c0e5..94bb913594 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -682,7 +682,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener ? Math.max(crop.width(), crop.height()) / 2f : 0f; final float finalWindowRadius = mDeviceProfile.isMultiWindowMode - ? 0 : getWindowCornerRadius(mLauncher.getResources()); + ? 0 : getWindowCornerRadius(mLauncher); final float finalShadowRadius = appTargetsAreTranslucent ? 0 : mMaxShadowRadius; MultiValueUpdateListener listener = new MultiValueUpdateListener() { @@ -871,7 +871,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener } final float finalWindowRadius = mDeviceProfile.isMultiWindowMode - ? 0 : getWindowCornerRadius(mLauncher.getResources()); + ? 0 : getWindowCornerRadius(mLauncher); final FloatingWidgetView floatingView = FloatingWidgetView.getFloatingWidgetView(mLauncher, v, widgetBackgroundBounds, new Size(windowTargetBounds.width(), windowTargetBounds.height()), @@ -1151,7 +1151,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener ValueAnimator unlockAnimator = ValueAnimator.ofFloat(0, 1); unlockAnimator.setDuration(CLOSING_TRANSITION_DURATION_MS); float cornerRadius = mDeviceProfile.isMultiWindowMode ? 0 : - QuickStepContract.getWindowCornerRadius(mLauncher.getResources()); + QuickStepContract.getWindowCornerRadius(mLauncher); unlockAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { @@ -1193,7 +1193,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); int duration = CLOSING_TRANSITION_DURATION_MS; float windowCornerRadius = mDeviceProfile.isMultiWindowMode - ? 0 : getWindowCornerRadius(mLauncher.getResources()); + ? 0 : getWindowCornerRadius(mLauncher); float startShadowRadius = areAllTargetsTranslucent(appTargets) ? 0 : mMaxShadowRadius; closingAnimator.setDuration(duration); closingAnimator.addUpdateListener(new MultiValueUpdateListener() { diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java index 678b176151..8188b78f1e 100644 --- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java +++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java @@ -25,7 +25,6 @@ import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS; import android.content.Context; import android.content.res.Resources; -import android.util.Log; import android.view.MotionEvent; import android.view.OrientationEventListener; @@ -35,7 +34,6 @@ import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.quickstep.util.RecentsOrientedState; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -149,7 +147,7 @@ public class RotationTouchHelper implements mDisplayId = mDisplayController.getInfo().id; mOrientationTouchTransformer = new OrientationTouchTransformer(resources, mMode, - () -> QuickStepContract.getWindowCornerRadius(resources)); + () -> QuickStepContract.getWindowCornerRadius(mContext)); // Register for navigation mode changes SysUINavigationMode.Mode newMode = mSysUiNavMode.addModeChangeListener(this); diff --git a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java index a9a9e2a104..fc1dd6f893 100644 --- a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java +++ b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java @@ -120,7 +120,7 @@ public class NavBarGestureHandler implements OnTouchListener, mAssistantGestureDetector = new GestureDetector(context, new AssistantGestureListener()); int assistantWidth = resources.getDimensionPixelSize(R.dimen.gestures_assistant_width); final float assistantHeight = Math.max(mBottomGestureHeight, - QuickStepContract.getWindowCornerRadius(resources)); + QuickStepContract.getWindowCornerRadius(context)); mAssistantLeftRegion.bottom = mAssistantRightRegion.bottom = mDisplaySize.y; mAssistantLeftRegion.top = mAssistantRightRegion.top = mDisplaySize.y - assistantHeight; mAssistantLeftRegion.left = 0; diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index a3b9c6f453..b836ab1f21 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -1520,7 +1520,7 @@ public class TaskView extends FrameLayout implements Reusable { public FullscreenDrawParams(Context context) { mCornerRadius = TaskCornerRadius.get(context); - mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context.getResources()); + mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context); mCurrentDrawnCornerRadius = mCornerRadius; } From f3bbd98bf8958f593c08c70539ba9815b97ce908 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Fri, 13 Aug 2021 13:53:14 -0700 Subject: [PATCH 02/13] Allow users to dismiss notifications in popup view. Bug: 193014051 Test: - dismiss notifications (left/right) - open popup, dismiss notification from shade and ensure popup gets updates - open popup, trigger new notification and ensure popup gets updated Change-Id: Iea4d458218cbf5cb22f5f89aa0a4cc1bee18cc73 --- res/layout/notification_content.xml | 12 +- res/layout/popup_container.xml | 7 +- res/values/dimens.xml | 2 + .../notification/NotificationContainer.java | 283 ++++++++++++++++++ .../notification/NotificationItemView.java | 179 ----------- .../notification/NotificationMainView.java | 231 +++++++++++--- .../android/launcher3/popup/ArrowPopup.java | 7 + .../popup/PopupContainerWithArrow.java | 57 ++-- 8 files changed, 513 insertions(+), 265 deletions(-) create mode 100644 src/com/android/launcher3/notification/NotificationContainer.java delete mode 100644 src/com/android/launcher3/notification/NotificationItemView.java diff --git a/res/layout/notification_content.xml b/res/layout/notification_content.xml index 84822a671b..91897e9e75 100644 --- a/res/layout/notification_content.xml +++ b/res/layout/notification_content.xml @@ -14,10 +14,11 @@ limitations under the License. --> - + android:layout_height="wrap_content" + android:orientation="vertical"> - - - \ No newline at end of file + + \ No newline at end of file diff --git a/res/layout/popup_container.xml b/res/layout/popup_container.xml index 18014bb1d0..9327287018 100644 --- a/res/layout/popup_container.xml +++ b/res/layout/popup_container.xml @@ -31,12 +31,9 @@ android:elevation="@dimen/deep_shortcuts_elevation" android:orientation="vertical"/> - + android:visibility="gone"/> \ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml index f434644996..7d8012fb12 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -271,6 +271,8 @@ 8dp + 8dp + 8dp 16dp 18dp 14sp diff --git a/src/com/android/launcher3/notification/NotificationContainer.java b/src/com/android/launcher3/notification/NotificationContainer.java new file mode 100644 index 0000000000..9eb05cd40f --- /dev/null +++ b/src/com/android/launcher3/notification/NotificationContainer.java @@ -0,0 +1,283 @@ +/* + * 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.launcher3.notification; + +import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity; +import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL; + +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.Rect; +import android.util.AttributeSet; +import android.util.FloatProperty; +import android.view.MotionEvent; +import android.view.View; +import android.widget.FrameLayout; + +import com.android.launcher3.R; +import com.android.launcher3.anim.AnimationSuccessListener; +import com.android.launcher3.popup.PopupContainerWithArrow; +import com.android.launcher3.touch.BaseSwipeDetector; +import com.android.launcher3.touch.OverScroll; +import com.android.launcher3.touch.SingleAxisSwipeDetector; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Class to manage the notification UI in a {@link PopupContainerWithArrow}. + * + * - Has two {@link NotificationMainView} that represent the top two notifications + * - Handles dismissing a notification + */ +public class NotificationContainer extends FrameLayout implements SingleAxisSwipeDetector.Listener { + + private static final FloatProperty DRAG_TRANSLATION_X = + new FloatProperty("notificationProgress") { + @Override + public void setValue(NotificationContainer view, float transX) { + view.setDragTranslationX(transX); + } + + @Override + public Float get(NotificationContainer view) { + return view.mDragTranslationX; + } + }; + + private static final Rect sTempRect = new Rect(); + + private final SingleAxisSwipeDetector mSwipeDetector; + private final List mNotificationInfos = new ArrayList<>(); + private boolean mIgnoreTouch = false; + + private final ObjectAnimator mContentTranslateAnimator; + private float mDragTranslationX = 0; + + private final NotificationMainView mPrimaryView; + private final NotificationMainView mSecondaryView; + private PopupContainerWithArrow mPopupContainer; + + public NotificationContainer(Context context) { + this(context, null, 0); + } + + public NotificationContainer(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public NotificationContainer(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mSwipeDetector = new SingleAxisSwipeDetector(getContext(), this, HORIZONTAL); + mSwipeDetector.setDetectableScrollConditions(SingleAxisSwipeDetector.DIRECTION_BOTH, false); + mContentTranslateAnimator = ObjectAnimator.ofFloat(this, DRAG_TRANSLATION_X, 0); + + mPrimaryView = (NotificationMainView) View.inflate(getContext(), + R.layout.notification_content, null); + mSecondaryView = (NotificationMainView) View.inflate(getContext(), + R.layout.notification_content, null); + mSecondaryView.setAlpha(0); + + addView(mSecondaryView); + addView(mPrimaryView); + + } + + public void setPopupView(PopupContainerWithArrow popupView) { + mPopupContainer = popupView; + } + + /** + * Returns true if we should intercept the swipe. + */ + public boolean onInterceptSwipeEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + sTempRect.set(getLeft(), getTop(), getRight(), getBottom()); + mIgnoreTouch = !sTempRect.contains((int) ev.getX(), (int) ev.getY()); + if (!mIgnoreTouch) { + mPopupContainer.getParent().requestDisallowInterceptTouchEvent(true); + } + } + if (mIgnoreTouch) { + return false; + } + if (mPrimaryView.getNotificationInfo() == null) { + // The notification hasn't been populated yet. + return false; + } + + mSwipeDetector.onTouchEvent(ev); + return mSwipeDetector.isDraggingOrSettling(); + } + + /** + * Returns true when we should handle the swipe. + */ + public boolean onSwipeEvent(MotionEvent ev) { + if (mIgnoreTouch) { + return false; + } + if (mPrimaryView.getNotificationInfo() == null) { + // The notification hasn't been populated yet. + return false; + } + return mSwipeDetector.onTouchEvent(ev); + } + + /** + * Applies the list of @param notificationInfos to this container. + */ + public void applyNotificationInfos(final List notificationInfos) { + mNotificationInfos.clear(); + if (notificationInfos.isEmpty()) { + mPrimaryView.applyNotificationInfo(null); + mSecondaryView.applyNotificationInfo(null); + return; + } + mNotificationInfos.addAll(notificationInfos); + + NotificationInfo mainNotification = notificationInfos.get(0); + mPrimaryView.applyNotificationInfo(mainNotification); + mSecondaryView.applyNotificationInfo(notificationInfos.size() > 1 + ? notificationInfos.get(1) + : null); + } + + /** + * Trims the notifications. + * @param notificationKeys List of all valid notification keys. + */ + public void trimNotifications(final List notificationKeys) { + Iterator iterator = mNotificationInfos.iterator(); + while (iterator.hasNext()) { + if (!notificationKeys.contains(iterator.next().notificationKey)) { + iterator.remove(); + } + } + + NotificationInfo primaryInfo = mNotificationInfos.size() > 0 + ? mNotificationInfos.get(0) + : null; + NotificationInfo secondaryInfo = mNotificationInfos.size() > 1 + ? mNotificationInfos.get(1) + : null; + + mPrimaryView.applyNotificationInfo(primaryInfo); + mSecondaryView.applyNotificationInfo(secondaryInfo); + + mPrimaryView.onPrimaryDrag(0); + mSecondaryView.onSecondaryDrag(0); + } + + private void setDragTranslationX(float translationX) { + mDragTranslationX = translationX; + + float progress = translationX / getWidth(); + mPrimaryView.onPrimaryDrag(progress); + if (mSecondaryView.getNotificationInfo() == null) { + mSecondaryView.setAlpha(0f); + } else { + mSecondaryView.onSecondaryDrag(progress); + } + } + + // SingleAxisSwipeDetector.Listener's + @Override + public void onDragStart(boolean start, float startDisplacement) { + mPopupContainer.showArrow(false); + } + + @Override + public boolean onDrag(float displacement) { + if (!mPrimaryView.canChildBeDismissed()) { + displacement = OverScroll.dampedScroll(displacement, getWidth()); + } + + float progress = displacement / getWidth(); + mPrimaryView.onPrimaryDrag(progress); + if (mSecondaryView.getNotificationInfo() == null) { + mSecondaryView.setAlpha(0f); + } else { + mSecondaryView.onSecondaryDrag(progress); + } + mContentTranslateAnimator.cancel(); + return true; + } + + @Override + public void onDragEnd(float velocity) { + final boolean willExit; + final float endTranslation; + final float startTranslation = mPrimaryView.getTranslationX(); + final float width = getWidth(); + + if (!mPrimaryView.canChildBeDismissed()) { + willExit = false; + endTranslation = 0; + } else if (mSwipeDetector.isFling(velocity)) { + willExit = true; + endTranslation = velocity < 0 ? -width : width; + } else if (Math.abs(startTranslation) > width / 2f) { + willExit = true; + endTranslation = (startTranslation < 0 ? -width : width); + } else { + willExit = false; + endTranslation = 0; + } + + long duration = BaseSwipeDetector.calculateDuration(velocity, + (endTranslation - startTranslation) / width); + + mContentTranslateAnimator.removeAllListeners(); + mContentTranslateAnimator.setDuration(duration) + .setInterpolator(scrollInterpolatorForVelocity(velocity)); + mContentTranslateAnimator.setFloatValues(startTranslation, endTranslation); + + NotificationMainView current = mPrimaryView; + mContentTranslateAnimator.addListener(new AnimationSuccessListener() { + @Override + public void onAnimationSuccess(Animator animator) { + mSwipeDetector.finishedScrolling(); + if (willExit) { + current.onChildDismissed(); + } + mPopupContainer.showArrow(true); + } + }); + mContentTranslateAnimator.start(); + } + + /** + * Animates the background color to a new color. + * @param color The color to change to. + * @param animatorSetOut The AnimatorSet where we add the color animator to. + */ + public void updateBackgroundColor(int color, AnimatorSet animatorSetOut) { + mPrimaryView.updateBackgroundColor(color, animatorSetOut); + mSecondaryView.updateBackgroundColor(color, animatorSetOut); + } + + /** + * Updates the header with a new @param notificationCount. + */ + public void updateHeader(int notificationCount) { + mPrimaryView.updateHeader(notificationCount); + mSecondaryView.updateHeader(notificationCount - 1); + } +} diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java deleted file mode 100644 index af943a6933..0000000000 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2017 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.launcher3.notification; - -import android.animation.AnimatorSet; -import android.content.Context; -import android.graphics.Outline; -import android.graphics.Rect; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.MarginLayoutParams; -import android.view.ViewOutlineProvider; -import android.widget.TextView; - -import com.android.launcher3.R; -import com.android.launcher3.popup.PopupContainerWithArrow; -import com.android.launcher3.util.Themes; - -import java.util.ArrayList; -import java.util.List; - -/** - * Utility class to manage notification UI - */ -public class NotificationItemView { - - private static final Rect sTempRect = new Rect(); - - private final Context mContext; - private final PopupContainerWithArrow mPopupContainer; - private final ViewGroup mRootView; - - private final TextView mHeaderCount; - private final NotificationMainView mMainView; - - private final View mHeader; - - private View mGutter; - - private boolean mIgnoreTouch = false; - private List mNotificationInfos = new ArrayList<>(); - - public NotificationItemView(PopupContainerWithArrow container, ViewGroup rootView) { - mPopupContainer = container; - mRootView = rootView; - mContext = container.getContext(); - - mHeaderCount = container.findViewById(R.id.notification_count); - mMainView = container.findViewById(R.id.main_view); - - mHeader = container.findViewById(R.id.header); - - float radius = Themes.getDialogCornerRadius(mContext); - rootView.setClipToOutline(true); - rootView.setOutlineProvider(new ViewOutlineProvider() { - @Override - public void getOutline(View view, Outline outline) { - outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), radius); - } - }); - } - - /** - * Animates the background color to a new color. - * @param color The color to change to. - * @param animatorSetOut The AnimatorSet where we add the color animator to. - */ - public void updateBackgroundColor(int color, AnimatorSet animatorSetOut) { - mMainView.updateBackgroundColor(color, animatorSetOut); - } - - public void addGutter() { - if (mGutter == null) { - mGutter = mPopupContainer.inflateAndAdd(R.layout.notification_gutter, mRootView); - } - } - - public void inverseGutterMargin() { - MarginLayoutParams lp = (MarginLayoutParams) mGutter.getLayoutParams(); - int top = lp.topMargin; - lp.topMargin = lp.bottomMargin; - lp.bottomMargin = top; - } - - public void removeAllViews() { - mRootView.removeView(mMainView); - mRootView.removeView(mHeader); - if (mGutter != null) { - mRootView.removeView(mGutter); - } - } - - /** - * Updates the header text. - * @param notificationCount The number of notifications. - */ - public void updateHeader(int notificationCount) { - final String text; - final int visibility; - if (notificationCount <= 1) { - text = ""; - visibility = View.INVISIBLE; - } else { - text = String.valueOf(notificationCount); - visibility = View.VISIBLE; - - } - mHeaderCount.setText(text); - mHeaderCount.setVisibility(visibility); - } - - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - sTempRect.set(mRootView.getLeft(), mRootView.getTop(), - mRootView.getRight(), mRootView.getBottom()); - mIgnoreTouch = !sTempRect.contains((int) ev.getX(), (int) ev.getY()); - if (!mIgnoreTouch) { - mPopupContainer.getParent().requestDisallowInterceptTouchEvent(true); - } - } - if (mIgnoreTouch) { - return false; - } - if (mMainView.getNotificationInfo() == null) { - // The notification hasn't been populated yet. - return false; - } - - return false; - } - - public void applyNotificationInfos(final List notificationInfos) { - mNotificationInfos.clear(); - if (notificationInfos.isEmpty()) { - return; - } - mNotificationInfos.addAll(notificationInfos); - - NotificationInfo mainNotification = notificationInfos.get(0); - mMainView.applyNotificationInfo(mainNotification, false); - } - - public void trimNotifications(final List notificationKeys) { - NotificationInfo currentMainNotificationInfo = mMainView.getNotificationInfo(); - boolean shouldUpdateMainNotification = !notificationKeys.contains( - currentMainNotificationInfo.notificationKey); - - if (shouldUpdateMainNotification) { - int size = notificationKeys.size(); - NotificationInfo nextNotification = null; - // We get the latest notification by finding the notification after the one that was - // just dismissed. - for (int i = 0; i < size; ++i) { - if (currentMainNotificationInfo == mNotificationInfos.get(i) && i + 1 < size) { - nextNotification = mNotificationInfos.get(i + 1); - break; - } - } - if (nextNotification != null) { - mMainView.applyNotificationInfo(nextNotification, true); - } - } - } -} diff --git a/src/com/android/launcher3/notification/NotificationMainView.java b/src/com/android/launcher3/notification/NotificationMainView.java index b8aa8246fb..f9ff8a6e56 100644 --- a/src/com/android/launcher3/notification/NotificationMainView.java +++ b/src/com/android/launcher3/notification/NotificationMainView.java @@ -16,62 +16,70 @@ package com.android.launcher3.notification; +import static com.android.launcher3.Utilities.mapToRange; +import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DISMISSED; import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; +import android.graphics.Outline; +import android.graphics.Rect; +import android.graphics.drawable.GradientDrawable; import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; -import android.util.FloatProperty; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; +import android.view.ViewOutlineProvider; +import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.Nullable; + import com.android.launcher3.Launcher; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.touch.SingleAxisSwipeDetector; +import com.android.launcher3.util.Themes; /** * A {@link android.widget.FrameLayout} that contains a single notification, * e.g. icon + title + text. */ @TargetApi(Build.VERSION_CODES.N) -public class NotificationMainView extends FrameLayout { - - private static final FloatProperty CONTENT_TRANSLATION = - new FloatProperty("contentTranslation") { - @Override - public void setValue(NotificationMainView view, float v) { - view.setContentTranslation(v); - } - - @Override - public Float get(NotificationMainView view) { - return view.mTextAndBackground.getTranslationX(); - } - }; +public class NotificationMainView extends LinearLayout { // This is used only to track the notification view, so that it can be properly logged. public static final ItemInfo NOTIFICATION_ITEM_INFO = new ItemInfo(); + // Value when the primary notification main view will be gone (zero alpha). + private static final float PRIMARY_GONE_PROGRESS = 0.7f; + private static final float PRIMARY_MIN_PROGRESS = 0.40f; + private static final float PRIMARY_MAX_PROGRESS = 0.60f; + private static final float SECONDARY_MIN_PROGRESS = 0.30f; + private static final float SECONDARY_MAX_PROGRESS = 0.50f; + private static final float SECONDARY_CONTENT_MAX_PROGRESS = 0.6f; + private NotificationInfo mNotificationInfo; - private ViewGroup mTextAndBackground; private int mBackgroundColor; private TextView mTitleView; private TextView mTextView; private View mIconView; - private SingleAxisSwipeDetector mSwipeDetector; + private View mHeader; + private View mMainView; - private final ColorDrawable mColorDrawable; + private TextView mHeaderCount; + private final Rect mOutline = new Rect(); + + // Space between notifications during swipe + private final int mNotificationSpace; + private final int mMaxTransX; + private final int mMaxElevation; + + private final GradientDrawable mBackground; public NotificationMainView(Context context) { this(context, null, 0); @@ -82,28 +90,77 @@ public class NotificationMainView extends FrameLayout { } public NotificationMainView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); + this(context, attrs, defStyle, 0); + } - mColorDrawable = new ColorDrawable(Color.TRANSPARENT); + public NotificationMainView(Context context, AttributeSet attrs, int defStyle, int defStylRes) { + super(context, attrs, defStyle, defStylRes); + + float outlineRadius = Themes.getDialogCornerRadius(context); + + mBackground = new GradientDrawable(); + mBackground.setColor(Themes.getAttrColor(context, R.attr.popupColorPrimary)); + mBackground.setCornerRadius(outlineRadius); + setBackground(mBackground); + + mMaxElevation = getResources().getDimensionPixelSize(R.dimen.deep_shortcuts_elevation); + setElevation(mMaxElevation); + + mMaxTransX = getResources().getDimensionPixelSize(R.dimen.notification_max_trans); + mNotificationSpace = getResources().getDimensionPixelSize(R.dimen.notification_space); + + setClipToOutline(true); + setOutlineProvider(new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + outline.setRoundRect(mOutline, outlineRadius); + } + }); + } + + /** + * Updates the header text. + * @param notificationCount The number of notifications. + */ + public void updateHeader(int notificationCount) { + final String text; + final int visibility; + if (notificationCount <= 1) { + text = ""; + visibility = View.INVISIBLE; + } else { + text = String.valueOf(notificationCount); + visibility = View.VISIBLE; + + } + mHeaderCount.setText(text); + mHeaderCount.setVisibility(visibility); } @Override protected void onFinishInflate() { super.onFinishInflate(); - mTextAndBackground = findViewById(R.id.text_and_background); - mTitleView = mTextAndBackground.findViewById(R.id.title); - mTextView = mTextAndBackground.findViewById(R.id.text); + ViewGroup textAndBackground = findViewById(R.id.text_and_background); + mTitleView = textAndBackground.findViewById(R.id.title); + mTextView = textAndBackground.findViewById(R.id.text); mIconView = findViewById(R.id.popup_item_icon); + mHeaderCount = findViewById(R.id.notification_count); - ColorDrawable colorBackground = (ColorDrawable) mTextAndBackground.getBackground(); - updateBackgroundColor(colorBackground.getColor()); + mHeader = findViewById(R.id.header); + mMainView = findViewById(R.id.main_view); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mOutline.set(0, 0, getWidth(), getHeight()); + invalidateOutline(); } private void updateBackgroundColor(int color) { mBackgroundColor = color; - mColorDrawable.setColor(color); - mTextAndBackground.setBackground(mColorDrawable); + mBackground.setColor(color); if (mNotificationInfo != null) { mIconView.setBackground(mNotificationInfo.getIconForBackground(getContext(), mBackgroundColor)); @@ -128,8 +185,11 @@ public class NotificationMainView extends FrameLayout { /** * Sets the content of this view, animating it after a new icon shifts up if necessary. */ - public void applyNotificationInfo(NotificationInfo mainNotification, boolean animate) { - mNotificationInfo = mainNotification; + public void applyNotificationInfo(NotificationInfo notificationInfo) { + mNotificationInfo = notificationInfo; + if (notificationInfo == null) { + return; + } NotificationListener listener = NotificationListener.getInstanceIfConnected(); if (listener != null) { listener.setNotificationsShown(new String[] {mNotificationInfo.notificationKey}); @@ -149,25 +209,112 @@ public class NotificationMainView extends FrameLayout { if (mNotificationInfo.intent != null) { setOnClickListener(mNotificationInfo); } - setContentTranslation(0); + // Add a stub ItemInfo so that logging populates the correct container and item types // instead of DEFAULT_CONTAINERTYPE and DEFAULT_ITEMTYPE, respectively. setTag(NOTIFICATION_ITEM_INFO); - if (animate) { - ObjectAnimator.ofFloat(mTextAndBackground, ALPHA, 0, 1).setDuration(150).start(); + } + + /** + * Sets the alpha of only the child views. + */ + public void setContentAlpha(float alpha) { + mHeader.setAlpha(alpha); + mMainView.setAlpha(alpha); + } + + /** + * Sets the translation of only the child views. + */ + public void setContentTranslationX(float transX) { + mHeader.setTranslationX(transX); + mMainView.setTranslationX(transX); + } + + /** + * Updates the alpha, content alpha, and elevation of this view. + * + * @param progress Range from [0, 1] or [-1, 0] + * When 0: Full alpha + * When 1/-1: zero alpha + */ + public void onPrimaryDrag(float progress) { + float absProgress = Math.abs(progress); + final int width = getWidth(); + + float min = PRIMARY_MIN_PROGRESS; + float max = PRIMARY_MAX_PROGRESS; + + if (absProgress < min) { + setAlpha(1f); + setContentAlpha(1); + setElevation(mMaxElevation); + } else if (absProgress < max) { + setAlpha(1f); + setContentAlpha(mapToRange(absProgress, min, max, 1f, 0f, LINEAR)); + setElevation(Utilities.mapToRange(absProgress, min, max, mMaxElevation, 0, LINEAR)); + } else { + setAlpha(mapToRange(absProgress, max, PRIMARY_GONE_PROGRESS, 1f, 0f, LINEAR)); + setContentAlpha(0f); + setElevation(0f); } + + setTranslationX(width * progress); } - public void setContentTranslation(float translation) { - mTextAndBackground.setTranslationX(translation); - mIconView.setTranslationX(translation); + /** + * Updates the alpha, content alpha, elevation, and clipping of this view. + * @param progress Range from [0, 1] or [-1, 0] + * When 0: Smallest clipping, zero alpha + * When 1/-1: Full clip, full alpha + */ + public void onSecondaryDrag(float progress) { + final float absProgress = Math.abs(progress); + + float min = SECONDARY_MIN_PROGRESS; + float max = SECONDARY_MAX_PROGRESS; + float contentMax = SECONDARY_CONTENT_MAX_PROGRESS; + + if (absProgress < min) { + setAlpha(0f); + setContentAlpha(0); + setElevation(0f); + } else if (absProgress < max) { + setAlpha(mapToRange(absProgress, min, max, 0, 1f, LINEAR)); + setContentAlpha(0f); + setElevation(0f); + } else { + setAlpha(1f); + setContentAlpha(absProgress > contentMax + ? 1f + : mapToRange(absProgress, max, contentMax, 0, 1f, LINEAR)); + setElevation(Utilities.mapToRange(absProgress, max, 1, 0, mMaxElevation, LINEAR)); + } + + final int width = getWidth(); + int crop = (int) (width * absProgress); + int space = (int) (absProgress > PRIMARY_GONE_PROGRESS + ? mapToRange(absProgress, PRIMARY_GONE_PROGRESS, 1f, mNotificationSpace, 0, LINEAR) + : mNotificationSpace); + if (progress < 0) { + mOutline.left = Math.max(0, getWidth() - crop + space); + mOutline.right = getWidth(); + } else { + mOutline.right = Math.min(getWidth(), crop - space); + mOutline.left = 0; + } + + float contentTransX = mMaxTransX * (1f - absProgress); + setContentTranslationX(progress < 0 + ? contentTransX + : -contentTransX); + invalidateOutline(); } - public NotificationInfo getNotificationInfo() { + public @Nullable NotificationInfo getNotificationInfo() { return mNotificationInfo; } - public boolean canChildBeDismissed() { return mNotificationInfo != null && mNotificationInfo.dismissable; } diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index a534ee3eb4..5d3ba75bc0 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -487,6 +487,13 @@ public abstract class ArrowPopup> return getMeasuredWidth() - mArrowOffsetHorizontal - mArrowWidth; } + /** + * @param show If true, shows arrow (when applicable), otherwise hides arrow. + */ + public void showArrow(boolean show) { + mArrow.setVisibility(show && shouldAddArrow() ? VISIBLE : INVISIBLE); + } + private void addArrow() { getPopupContainer().addView(mArrow); mArrow.setX(getX() + getArrowLeft()); diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 18f263a8ec..bc3419aa81 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -58,8 +58,8 @@ import com.android.launcher3.dragndrop.DraggableView; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.ItemInfoWithIcon; import com.android.launcher3.model.data.WorkspaceItemInfo; +import com.android.launcher3.notification.NotificationContainer; import com.android.launcher3.notification.NotificationInfo; -import com.android.launcher3.notification.NotificationItemView; import com.android.launcher3.notification.NotificationKeyData; import com.android.launcher3.popup.PopupDataProvider.PopupDataChangeListener; import com.android.launcher3.shortcuts.DeepShortcutView; @@ -92,9 +92,8 @@ public class PopupContainerWithArrow> private final int mStartDragThreshold; private BubbleTextView mOriginalIcon; - private NotificationItemView mNotificationItemView; private int mNumNotifications; - private ViewGroup mNotificationContainer; + private NotificationContainer mNotificationContainer; private ViewGroup mWidgetContainer; @@ -128,8 +127,8 @@ public class PopupContainerWithArrow> if (ev.getAction() == MotionEvent.ACTION_DOWN) { mInterceptTouchDown.set(ev.getX(), ev.getY()); } - if (mNotificationItemView != null - && mNotificationItemView.onInterceptTouchEvent(ev)) { + if (mNotificationContainer != null + && mNotificationContainer.onInterceptSwipeEvent(ev)) { return true; } // Stop sending touch events to deep shortcut views if user moved beyond touch slop. @@ -137,6 +136,14 @@ public class PopupContainerWithArrow> > squaredTouchSlop(getContext()); } + @Override + public boolean onTouchEvent(MotionEvent ev) { + if (mNotificationContainer != null) { + return mNotificationContainer.onSwipeEvent(ev) || super.onTouchEvent(ev); + } + return super.onTouchEvent(ev); + } + @Override protected boolean isOfType(int type) { return (type & TYPE_ACTION_POPUP) != 0; @@ -172,8 +179,8 @@ public class PopupContainerWithArrow> @Override protected void setChildColor(View view, int color, AnimatorSet animatorSetOut) { super.setChildColor(view, color, animatorSetOut); - if (view.getId() == R.id.notification_container && mNotificationItemView != null) { - mNotificationItemView.updateBackgroundColor(color, animatorSetOut); + if (view.getId() == R.id.notification_container && mNotificationContainer != null) { + mNotificationContainer.updateBackgroundColor(color, animatorSetOut); } } @@ -232,13 +239,6 @@ public class PopupContainerWithArrow> mNotificationContainer); } - @Override - protected void onInflationComplete(boolean isReversed) { - if (isReversed && mNotificationItemView != null) { - mNotificationItemView.inverseGutterMargin(); - } - } - @TargetApi(Build.VERSION_CODES.P) public void populateAndShow(final BubbleTextView originalIcon, int shortcutCount, final List notificationKeys, List systemShortcuts) { @@ -261,9 +261,10 @@ public class PopupContainerWithArrow> if (mNotificationContainer == null) { mNotificationContainer = findViewById(R.id.notification_container); mNotificationContainer.setVisibility(VISIBLE); + mNotificationContainer.setPopupView(this); + } else { + mNotificationContainer.setVisibility(GONE); } - View.inflate(getContext(), R.layout.notification_content, mNotificationContainer); - mNotificationItemView = new NotificationItemView(this, mNotificationContainer); updateNotificationHeader(); } int viewsToFlip = getChildCount(); @@ -274,10 +275,6 @@ public class PopupContainerWithArrow> if (hasDeepShortcuts) { mDeepShortcutContainer.setVisibility(View.VISIBLE); - if (mNotificationItemView != null) { - mNotificationItemView.addGutter(); - } - for (int i = shortcutCount; i > 0; i--) { DeepShortcutView v = inflateAndAdd(R.layout.deep_shortcut, mDeepShortcutContainer); v.getLayoutParams().width = containerWidth; @@ -309,10 +306,6 @@ public class PopupContainerWithArrow> } else { mDeepShortcutContainer.setVisibility(View.GONE); if (!systemShortcuts.isEmpty()) { - if (mNotificationItemView != null) { - mNotificationItemView.addGutter(); - } - for (SystemShortcut shortcut : systemShortcuts) { initializeSystemShortcut(R.layout.system_shortcut, this, shortcut); } @@ -355,13 +348,13 @@ public class PopupContainerWithArrow> } public void applyNotificationInfos(List notificationInfos) { - if (mNotificationItemView != null) { - mNotificationItemView.applyNotificationInfos(notificationInfos); + if (mNotificationContainer != null) { + mNotificationContainer.applyNotificationInfos(notificationInfos); } } private void updateHiddenShortcuts() { - int allowedCount = mNotificationItemView != null + int allowedCount = mNotificationContainer != null ? MAX_SHORTCUTS_IF_NOTIFICATIONS : MAX_SHORTCUTS; int total = mShortcuts.size(); @@ -447,8 +440,8 @@ public class PopupContainerWithArrow> private void updateNotificationHeader() { ItemInfoWithIcon itemInfo = (ItemInfoWithIcon) mOriginalIcon.getTag(); DotInfo dotInfo = mLauncher.getDotInfoForItem(itemInfo); - if (mNotificationItemView != null && dotInfo != null) { - mNotificationItemView.updateHeader(dotInfo.getNotificationCount()); + if (mNotificationContainer != null && dotInfo != null) { + mNotificationContainer.updateHeader(dotInfo.getNotificationCount()); } } @@ -590,20 +583,18 @@ public class PopupContainerWithArrow> @Override public void trimNotifications(Map updatedDots) { - if (mNotificationItemView == null) { + if (mNotificationContainer == null) { return; } ItemInfo originalInfo = (ItemInfo) mOriginalIcon.getTag(); DotInfo dotInfo = updatedDots.get(PackageUserKey.fromItemInfo(originalInfo)); if (dotInfo == null || dotInfo.getNotificationKeys().size() == 0) { // No more notifications, remove the notification views and expand all shortcuts. - mNotificationItemView.removeAllViews(); - mNotificationItemView = null; mNotificationContainer.setVisibility(GONE); updateHiddenShortcuts(); assignMarginsAndBackgrounds(PopupContainerWithArrow.this); } else { - mNotificationItemView.trimNotifications( + mNotificationContainer.trimNotifications( NotificationKeyData.extractKeysOnly(dotInfo.getNotificationKeys())); } } From 0b73d1014f1667a171d9f696dbfefed3a7a104c2 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Tue, 31 Aug 2021 20:23:36 -0700 Subject: [PATCH 03/13] Hide overview and app icon split option when appropriate Don't show app menu icon split option or overview action split option when current taskView is already in split or there are not at least 2 tasks with which to invoke split Fixes: 197245395 Test: Tested with small and large screen, dismissing tasks in overview, with and without GroupedTaskView as main running task Change-Id: I90cc3c39e4d94662cb87314a210d45d145b6e026 --- .../android/quickstep/TaskOverlayFactory.java | 7 +++++++ .../quickstep/views/OverviewActionsView.java | 1 - .../android/quickstep/views/RecentsView.java | 19 ++++++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java index eb5c43fd37..978fb570ca 100644 --- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java +++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java @@ -107,6 +107,13 @@ public class TaskOverlayFactory implements ResourceBasedOverride { public static void addSplitOptions(List outShortcuts, BaseDraggingActivity activity, TaskView taskView, DeviceProfile deviceProfile) { + int[] taskViewTaskIds = taskView.getTaskIds(); + boolean alreadyHasMultipleTasks = taskViewTaskIds[0] != -1 && + taskViewTaskIds[1] != -1; + if (alreadyHasMultipleTasks) { + return; + } + PagedOrientationHandler orientationHandler = taskView.getRecentsView().getPagedOrientationHandler(); List positions = diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java index 5d1c2022f9..1b28c53cad 100644 --- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java +++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java @@ -223,7 +223,6 @@ public class OverviewActionsView extends FrameLayo mDp = dp; updateVerticalMargin(SysUINavigationMode.getMode(getContext())); requestLayout(); - setSplitButtonVisible(mDp.isTablet); } 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 810eccea8a..6947fc53ab 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1500,7 +1500,7 @@ public abstract class RecentsView mActionsView.setSplitButtonVisible(false)); } /** @@ -2933,6 +2932,7 @@ public abstract class RecentsView 1 + ); + } + /** * Returns all the tasks in the top row, without the focused task */ @@ -3745,7 +3758,6 @@ public abstract class RecentsView Date: Wed, 1 Sep 2021 16:59:20 -0700 Subject: [PATCH 04/13] Remove HotseatEduActivity from AOSP Bug: 191882450 Test: manual Change-Id: Ic60ef6fec6c3d8162cb3d11b0ed3c9f89f6b5704 --- quickstep/AndroidManifest.xml | 20 ------- .../hybridhotseat/HotseatEduActivity.java | 60 ------------------- 2 files changed, 80 deletions(-) delete mode 100644 quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduActivity.java diff --git a/quickstep/AndroidManifest.xml b/quickstep/AndroidManifest.xml index b43d8d1a4b..dc92731e16 100644 --- a/quickstep/AndroidManifest.xml +++ b/quickstep/AndroidManifest.xml @@ -22,11 +22,6 @@ xmlns:tools="http://schemas.android.com/tools" package="com.android.launcher3"> - - @@ -41,7 +36,6 @@ - - - - - - - - diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduActivity.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduActivity.java deleted file mode 100644 index 3a7d821ed6..0000000000 --- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduActivity.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2020 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.launcher3.hybridhotseat; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; - -import com.android.launcher3.BaseActivity; -import com.android.launcher3.Launcher; -import com.android.launcher3.uioverrides.QuickstepLauncher; -import com.android.launcher3.util.ActivityTracker; - -/** - * Proxy activity to return user to home screen and show halfsheet education - */ -public class HotseatEduActivity extends Activity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent homeIntent = new Intent(Intent.ACTION_MAIN) - .addCategory(Intent.CATEGORY_HOME) - .setPackage(getPackageName()) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - Launcher.ACTIVITY_TRACKER.registerCallback(new HotseatActivityTracker()); - startActivity(homeIntent); - finish(); - } - - static class HotseatActivityTracker implements - ActivityTracker.SchedulerCallback { - - @Override - public boolean init(BaseActivity activity, boolean alreadyOnHome) { - QuickstepLauncher launcher = (QuickstepLauncher) activity; - if (launcher != null) { - launcher.getHotseatPredictionController().showEdu(); - } - return false; - } - - } -} From e75e9e650705bb6c57b1524a6ed3f8aceb2d0eda Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 2 Sep 2021 04:36:47 +0000 Subject: [PATCH 05/13] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1c7791015bc0bbfcd512864e9a4fbbbef58999f8 --- quickstep/res/values-af/strings.xml | 16 +++++++--------- quickstep/res/values-am/strings.xml | 16 +++++++--------- quickstep/res/values-ar/strings.xml | 16 +++++++--------- quickstep/res/values-as/strings.xml | 16 +++++++--------- quickstep/res/values-az/strings.xml | 16 +++++++--------- quickstep/res/values-b+sr+Latn/strings.xml | 16 +++++++--------- quickstep/res/values-be/strings.xml | 16 +++++++--------- quickstep/res/values-bg/strings.xml | 16 +++++++--------- quickstep/res/values-bn/strings.xml | 16 +++++++--------- quickstep/res/values-bs/strings.xml | 11 +++++++---- quickstep/res/values-ca/strings.xml | 5 ++++- quickstep/res/values-cs/strings.xml | 16 +++++++--------- quickstep/res/values-da/strings.xml | 16 +++++++--------- quickstep/res/values-de/strings.xml | 16 +++++++--------- quickstep/res/values-el/strings.xml | 16 +++++++--------- quickstep/res/values-en-rAU/strings.xml | 5 ++++- quickstep/res/values-en-rCA/strings.xml | 5 ++++- quickstep/res/values-en-rGB/strings.xml | 5 ++++- quickstep/res/values-en-rIN/strings.xml | 5 ++++- quickstep/res/values-en-rXC/strings.xml | 3 ++- quickstep/res/values-es-rUS/strings.xml | 5 ++++- quickstep/res/values-es/strings.xml | 16 +++++++--------- quickstep/res/values-et/strings.xml | 16 +++++++--------- quickstep/res/values-eu/strings.xml | 16 +++++++--------- quickstep/res/values-fa/strings.xml | 16 +++++++--------- quickstep/res/values-fi/strings.xml | 16 +++++++--------- quickstep/res/values-fr-rCA/strings.xml | 16 +++++++--------- quickstep/res/values-fr/strings.xml | 16 +++++++--------- quickstep/res/values-gl/strings.xml | 16 +++++++--------- quickstep/res/values-gu/strings.xml | 16 +++++++--------- quickstep/res/values-hi/strings.xml | 16 +++++++--------- quickstep/res/values-hr/strings.xml | 5 ++++- quickstep/res/values-hu/strings.xml | 16 +++++++--------- quickstep/res/values-hy/strings.xml | 16 +++++++--------- quickstep/res/values-in/strings.xml | 16 +++++++--------- quickstep/res/values-is/strings.xml | 16 +++++++--------- quickstep/res/values-it/strings.xml | 16 +++++++--------- quickstep/res/values-iw/strings.xml | 16 +++++++--------- quickstep/res/values-ja/strings.xml | 16 +++++++--------- quickstep/res/values-ka/strings.xml | 16 +++++++--------- quickstep/res/values-kk/strings.xml | 16 +++++++--------- quickstep/res/values-km/strings.xml | 16 +++++++--------- quickstep/res/values-kn/strings.xml | 16 +++++++--------- quickstep/res/values-ko/strings.xml | 16 +++++++--------- quickstep/res/values-ky/strings.xml | 16 +++++++--------- quickstep/res/values-lo/strings.xml | 16 +++++++--------- quickstep/res/values-lt/strings.xml | 5 ++++- quickstep/res/values-lv/strings.xml | 16 +++++++--------- quickstep/res/values-mk/strings.xml | 16 +++++++--------- quickstep/res/values-ml/strings.xml | 16 +++++++--------- quickstep/res/values-mn/strings.xml | 16 +++++++--------- quickstep/res/values-mr/strings.xml | 16 +++++++--------- quickstep/res/values-ms/strings.xml | 16 +++++++--------- quickstep/res/values-my/strings.xml | 5 ++++- quickstep/res/values-nb/strings.xml | 16 +++++++--------- quickstep/res/values-ne/strings.xml | 16 +++++++--------- quickstep/res/values-nl/strings.xml | 5 ++++- quickstep/res/values-or/strings.xml | 16 +++++++--------- quickstep/res/values-pa/strings.xml | 16 +++++++--------- quickstep/res/values-pl/strings.xml | 16 +++++++--------- quickstep/res/values-pt-rPT/strings.xml | 5 ++++- quickstep/res/values-pt/strings.xml | 5 ++++- quickstep/res/values-ro/strings.xml | 16 +++++++--------- quickstep/res/values-ru/strings.xml | 16 +++++++--------- quickstep/res/values-si/strings.xml | 16 +++++++--------- quickstep/res/values-sk/strings.xml | 16 +++++++--------- quickstep/res/values-sl/strings.xml | 16 +++++++--------- quickstep/res/values-sq/strings.xml | 5 ++++- quickstep/res/values-sr/strings.xml | 16 +++++++--------- quickstep/res/values-sv/strings.xml | 16 +++++++--------- quickstep/res/values-sw/strings.xml | 5 ++++- quickstep/res/values-ta/strings.xml | 16 +++++++--------- quickstep/res/values-te/strings.xml | 16 +++++++--------- quickstep/res/values-th/strings.xml | 5 ++++- quickstep/res/values-tl/strings.xml | 16 +++++++--------- quickstep/res/values-tr/strings.xml | 5 ++++- quickstep/res/values-uk/strings.xml | 16 +++++++--------- quickstep/res/values-ur/strings.xml | 16 +++++++--------- quickstep/res/values-uz/strings.xml | 16 +++++++--------- quickstep/res/values-vi/strings.xml | 5 ++++- quickstep/res/values-zh-rCN/strings.xml | 16 +++++++--------- quickstep/res/values-zh-rHK/strings.xml | 5 ++++- quickstep/res/values-zh-rTW/strings.xml | 16 +++++++--------- quickstep/res/values-zu/strings.xml | 16 +++++++--------- 84 files changed, 529 insertions(+), 599 deletions(-) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index 57dbaf01dd..0af80f918c 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -79,21 +79,19 @@ "Stelselnavigasie-instellings" "Deel" "Skermkiekie" + + "Jou organisasie laat nie hierdie program toe nie" "Slaan navigasietutoriaal oor?" "Jy kan dit later in die %1$s-program kry" "Kanselleer" "Slaan oor" - - - - - + "Taakbalkopvoeding het verskyn" + "Taakbalkopvoeding is toegemaak" + "Volgende" - - + "Terug" "Maak toe" - - + "Klaar" diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 396075ec50..77861912d6 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -79,21 +79,19 @@ "የስርዓት አሰሳ ቅንብሮች" "አጋራ" "ቅጽበታዊ ገጽ እይታ" + + "ይህ ድርጊት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም" "የአሰሳ አጋዥ ሥልጠናን ይዝለሉ?" "ይህን በኋላ በ%1$s መተግበሪያው ውስጥ ማግኘት ይችላሉ" "ይቅር" "ዝለል" - - - - - + "የተግባር አሞሌ ትምህርት ይታያል" + "የተግባር አሞሌ ትምህርት ተዘግቷል" + "ቀጣይ" - - + "ተመለስ" "ዝጋ" - - + "ተጠናቅቋል" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index 5294d36809..25b66d5924 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -79,21 +79,19 @@ "إعدادات التنقّل داخل النظام" "مشاركة" "لقطة شاشة" + + "لا يسمح التطبيق أو لا تسمح مؤسستك بهذا الإجراء." "هل تريد تخطي الدليل التوجيهي؟" "يمكنك العثور على هذا الدليل التوجيهي لاحقًا في التطبيق \"%1$s\"" "إلغاء" "التخطي" - - - - - + "ظهرت لوحة تعليم استخدام شريط المهام." + "تم إغلاق لوحة تعليم استخدام شريط المهام." + "الشاشة التالية" - - + "رجوع" "إغلاق" - - + "تم" diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index f4efd031b3..53799259eb 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -79,21 +79,19 @@ "ছিষ্টেম নেভিগেশ্বনৰ ছেটিং" "শ্বেয়াৰ কৰক" "স্ক্ৰীনশ্বট" + + "এপ্‌টোৱে অথবা আপোনাৰ প্ৰতিষ্ঠানে এই কাৰ্যটোৰ অনুমতি নিদিয়ে" "নেভিগেশ্বনৰ টিউট’ৰিয়েল এৰিব বিচাৰে নেকি?" "আপুনি এয়া পাছত %1$s এপ্‌টোত বিচাৰিব পাৰিব" "বাতিল কৰক" "এৰি যাওক" - - - - - + "টাস্কবাৰৰ শিক্ষাৰ পেনেলটো প্ৰদর্শিত হৈছে" + "টাস্কবাৰৰ শিক্ষাৰ পেনেলটো বন্ধ হৈছে" + "পৰৱৰ্তী" - - + "উভতি যাওক" "বন্ধ কৰক" - - + "হ’ল" diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 06755f7afe..549881715e 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -79,21 +79,19 @@ "Sistem naviqasiya ayarları" "Paylaşın" "Skrinşot" + + "Bu əməliyyata tətbiq və ya təşkilatınız tərəfindən icazə verilmir" "Naviqasiya dərsliyi ötürülsün?" "Bunu sonra %1$s tətbiqində tapa bilərsiniz" "Ləğv edin" "Ötürün" - - - - - + "Tapşırıq panelindəki təlim bölməsi görünür" + "Tapşırıq panelindəki təlim bölməsi bağlanıb" + "Sonra" - - + "Geri" "Bağlayın" - - + "Hazırdır" diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index b004284644..81d0a0835a 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -79,21 +79,19 @@ "Podešavanja kretanja kroz sistem" "Deli" "Snimak ekrana" + + "Aplikacija ili organizacija ne dozvoljavaju ovu radnju" "Želite da preskočite vodič za kretanje?" "Možete da pronađete ovo kasnije u aplikaciji %1$s" "Otkaži" "Preskoči" - - - - - + "Edukativno okno iz trake zadataka se pojavilo" + "Edukativno okno iz trake zadataka je zatvoreno" + "Dalje" - - + "Nazad" "Zatvori" - - + "Gotovo" diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index e7e7533255..586d78daa0 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -79,21 +79,19 @@ "Налады навігацыі ў сістэме" "Абагуліць" "Здымак экрана" + + "Гэта дзеянне не дазволена праграмай ці вашай арганізацыяй" "Прапусціць дапаможнік па навігацыі?" "Знайсці дапаможнік можна ў праграме \"%1$s\"" "Скасаваць" "Прапусціць" - - - - - + "З\'явілася панэль навучання на панэлі задач" + "Панэль навучання на панэлі задач закрыта" + "Далей" - - + "Назад" "Закрыць" - - + "Гатова" diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index 2a7626234a..389b0859e1 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -79,21 +79,19 @@ "Настройки за навигиране в системата" "Споделяне" "Екранна снимка" + + "Това действие не е разрешено от приложението или организацията ви" "Пропускане на урока за навигиране?" "Урокът е налице в приложението %1$s" "Отказ" "Пропускане" - - - - - + "Показва се урокът за лентата на задачите" + "Урокът за лентата на задачите бе затворен" + "Напред" - - + "Назад" "Затваряне" - - + "Готово" diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 552e20aeec..9d3ac8038f 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -79,21 +79,19 @@ "সিস্টেম নেভিগেশন সেটিংস" "শেয়ার করুন" "স্ক্রিনশট নিন" + + "এই অ্যাপ বা আপনার প্রতিষ্ঠান এই অ্যাকশনটি পারফর্ম করার অনুমতি দেয়নি" "নেভিগেশন টিউটোরিয়াল এড়িয়ে যেতে চান?" "আপনি %1$s অ্যাপে পরে এটি খুঁজে পাবেন" "বাতিল করুন" "এড়িয়ে যান" - - - - - + "টাস্কবার এডুকেশন দেখানো হয়েছে" + "টাস্কবার এডুকেশন বন্ধ করা আছে" + "পরবর্তী" - - + "ফিরুন" "বন্ধ করুন" - - + "হয়ে গেছে" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 9fd036ccff..0b8d34a042 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -79,16 +79,19 @@ "Postavke navigiranja sistemom" "Dijeli" "Snimak ekrana" + + "Ovu radnju ne dozvoljava aplikacija ili vaša organizacija" "Preskočiti vodič za navigiranje?" "To možete pronaći kasnije u aplikaciji %1$s" "Otkaži" "Preskoči" - "Upute za programsku traku su se pojavile" - "Upute za programsku traku su zatvorene" - "Dodirnite i zadržite da biste sakrili programsku traku" + "Edukacija o programskoj traci je prikazana" + "Edukacija o programskoj traci je zatvorena" + + "Naprijed" - "Natrag" + "Nazad" "Zatvori" "Gotovo" diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index e7e00df290..673e25b588 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -79,6 +79,8 @@ "Configuració de navegació del sistema" "Comparteix" "Captura de pantalla" + + "L\'aplicació o la teva organització no permeten aquesta acció" "Vols ometre el tutorial de navegació?" "Pots trobar-lo més tard a l\'aplicació %1$s" @@ -86,7 +88,8 @@ "Omet" "Ha aparegut el tauler educatiu de la barra de tasques" "S\'ha tancat el tauler educatiu de la barra de tasques" - "Mantén premut per amagar la barra de tasques" + + "Següent" "Enrere" "Tanca" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index 887e7013a4..50b60495d2 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -79,21 +79,19 @@ "Nastavení navigace v systému" "Sdílet" "Snímek obrazovky" + + "Aplikace nebo organizace zakazuje tuto akci" "Přeskočit výukový program k navigaci?" "Program později najdete v aplikaci %1$s" "Zrušit" "Přeskočit" - - - - - + "Zobrazila se výuka k hlavnímu panelu" + "Výuka k hlavnímu panelu byla zavřena" + "Další" - - + "Zpět" "Zavřít" - - + "Hotovo" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 62e7f67cec..5e91710f39 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -79,21 +79,19 @@ "Indstillinger for systemnavigation" "Del" "Screenshot" + + "Appen eller din organisation tillader ikke denne handling" "Vil du springe selvstudiet for navigation over?" "Du kan finde dette senere i appen %1$s" "Annuller" "Spring over" - - - - - + "Vejledningen om proceslinjen blev åbnet" + "Vejledningen om proceslinjen blev lukket" + "Næste" - - + "Tilbage" "Luk" - - + "Luk" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index 23ce1d51cf..999a241424 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -79,21 +79,19 @@ "Einstellungen der Systemsteuerung" "Teilen" "Screenshot" + + "Die App oder deine Organisation lässt diese Aktion nicht zu" "Navigationstutorial überspringen?" "Du findest es später auch in der %1$s App" "Abbrechen" "Überspringen" - - - - - + "Anleitung für Taskleiste eingeblendet" + "Anleitung für Taskleiste geschlossen" + "Weiter" - - + "Zurück" "Schließen" - - + "Fertig" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 3973e0a4f4..063d7695ca 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -79,21 +79,19 @@ "Ρυθμίσεις πλοήγησης συστήματος" "Κοινοποίηση" "Στιγμιότυπο οθόνης" + + "Αυτή η ενέργεια δεν επιτρέπεται από την εφαρμογή ή τον οργανισμό σας." "Παράβλεψη οδηγού πλοήγησης;" "Βρείτε τον αργότερα στην εφαρμογή %1$s" "Ακύρωση" "Παράβλεψη" - - - - - + "Η εκπαίδευση για τη γραμμή εργασιών εμφανίστηκε" + "Η εκπαίδευση για τη γραμμή εργασιών έκλεισε" + "Επόμενο" - - + "Πίσω" "Κλείσιμο" - - + "Τέλος" diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index bfea55878b..78d5bcc280 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -79,6 +79,8 @@ "System navigation settings" "Share" "Screenshot" + + "This action isn\'t allowed by the app or your organisation" "Skip navigation tutorial?" "You can find this later in the %1$s app" @@ -86,7 +88,8 @@ "Skip" "Taskbar education appeared" "Taskbar education closed" - "Touch & hold to hide the taskbar at any time" + + "Next" "Back" "Close" diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml index bfea55878b..78d5bcc280 100644 --- a/quickstep/res/values-en-rCA/strings.xml +++ b/quickstep/res/values-en-rCA/strings.xml @@ -79,6 +79,8 @@ "System navigation settings" "Share" "Screenshot" + + "This action isn\'t allowed by the app or your organisation" "Skip navigation tutorial?" "You can find this later in the %1$s app" @@ -86,7 +88,8 @@ "Skip" "Taskbar education appeared" "Taskbar education closed" - "Touch & hold to hide the taskbar at any time" + + "Next" "Back" "Close" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index bfea55878b..78d5bcc280 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -79,6 +79,8 @@ "System navigation settings" "Share" "Screenshot" + + "This action isn\'t allowed by the app or your organisation" "Skip navigation tutorial?" "You can find this later in the %1$s app" @@ -86,7 +88,8 @@ "Skip" "Taskbar education appeared" "Taskbar education closed" - "Touch & hold to hide the taskbar at any time" + + "Next" "Back" "Close" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index bfea55878b..78d5bcc280 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -79,6 +79,8 @@ "System navigation settings" "Share" "Screenshot" + + "This action isn\'t allowed by the app or your organisation" "Skip navigation tutorial?" "You can find this later in the %1$s app" @@ -86,7 +88,8 @@ "Skip" "Taskbar education appeared" "Taskbar education closed" - "Touch & hold to hide the taskbar at any time" + + "Next" "Back" "Close" diff --git a/quickstep/res/values-en-rXC/strings.xml b/quickstep/res/values-en-rXC/strings.xml index 43570ae1ed..c0ce050f79 100644 --- a/quickstep/res/values-en-rXC/strings.xml +++ b/quickstep/res/values-en-rXC/strings.xml @@ -79,6 +79,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‏‎‎‎‎‎‏‎‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‏‏‎‏‏‏‎‏‏‎‎‏‎‎‏‏‎""‎‏‎‎‏‏‏‎System navigation settings‎‏‎‎‏‏‎""‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎‏‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‎‏‏‏‎Share‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎Screenshot‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‎Split‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‎‎‎‎‎‎‏‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎This action isn\'t allowed by the app or your organization‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‎‎‎‎‏‏‏‎‎‏‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‎‎‏‏‏‎‏‎‎Skip navigation tutorial?‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‎‏‎‎‏‏‏‎‎You can find this later in the ‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ app‎‏‎‎‏‎" @@ -86,7 +87,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‎‎‏‏‎‎‏‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‎‏‏‎‎‎‎Skip‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‏‎‏‎‎‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‏‎Taskbar education appeared‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‏‏‏‏‏‎‎Taskbar education closed‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‎Touch & hold to hide the taskbar anytime‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‎‎‎‏‏‎‎‏‏‏‏‏‏‎Touch & hold to hide the taskbar‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‏‎‎‎‎‏‎Next‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‏‎‎‏‏‎‎Back‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‎‏‏‎‎‎‏‎‎‏‏‏‏‎‏‎‏‎‏‏‎‏‎‏‏‎‏‎‏‏‎‏‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎Close‎‏‎‎‏‎" diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 428163491c..08a5f6be10 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -79,6 +79,8 @@ "Configuración de navegación del sistema" "Compartir" "Captura de pantalla" + + "La app o tu organización no permiten realizar esta acción" "¿Omitir el instructivo de navegación?" "Puedes encontrarlo en la app de %1$s" @@ -86,7 +88,8 @@ "Omitir" "Se abrió la barra de herramientas Educación" "Se cerró la barra de herramientas Educación" - "Mantén presionado para ocultar la barra en cualquier momento" + + "Siguiente" "Atrás" "Cerrar" diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index 1946b3c188..3c2a7260f1 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -79,21 +79,19 @@ "Ajustes de navegación del sistema" "Compartir" "Hacer captura" + + "No puedes hacerlo porque la aplicación o tu organización no lo permiten" "¿Saltar tutorial de navegación?" "Puedes consultarlo en otro momento en la aplicación %1$s" "Cancelar" "Saltar" - - - - - + "Ha aparecido una nota sobre la barra de tareas" + "Nota sobre la barra de tareas cerrada" + "Siguiente" - - + "Atrás" "Cerrar" - - + "Hecho" diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 5ff0b70929..53d666025c 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -79,21 +79,19 @@ "Süsteemi navigeerimisseaded" "Jaga" "Ekraanipilt" + + "Rakendus või teie organisatsioon on selle toimingu keelanud" "Kas jätta navigeerimise õpetused vahele?" "Leiate selle hiljem rakendusest %1$s" "Tühista" "Jäta vahele" - - - - - + "Tegumiriba juhised kuvati" + "Tegumiriba juhised on suletud" + "Järgmine" - - + "Tagasi" "Sule" - - + "Valmis" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index eafedb56b1..1627648629 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -79,21 +79,19 @@ "Sisteman nabigatzeko ezarpenak" "Partekatu" "Atera pantaila-argazki bat" + + "Aplikazioak edo erakundeak ez du eman ekintza hori gauzatzeko baimena" "Nabigazio-tutoriala saltatu nahi duzu?" "%1$s aplikazioan dago eskuragarri tutoriala" "Utzi" "Saltatu" - - - - - + "Agertu egin da zereginen barraren tutoriala" + "Itxi egin da zereginen barraren tutoriala" + "Hurrengoa" - - + "Atzera" "Itxi" - - + "Eginda" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index 79a801c7bf..a2be4fe309 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -79,21 +79,19 @@ "تنظیمات پیمایش سیستم" "هم‌رسانی" "نماگرفت" + + "برنامه یا سازمان شما اجازه نمی‌دهد این کنش انجام شود." "آموزش گام‌به‌گام پیمایش رد شود؟" "می‌توانید آن را بعداً در برنامه %1$s پیدا کنید" "لغو" "رد شدن" - - - - - + "پانل آموزشی نوار وظیفه نمایان شد" + "پانل آموزشی نوار وظیفه بسته شد" + "بعدی" - - + "برگشت" "بستن" - - + "تمام" diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index 9611c983d3..a1584278fa 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -79,21 +79,19 @@ "Järjestelmän navigointiasetukset" "Jaa" "Kuvakaappaus" + + "Sovellus tai organisaatio ei salli tätä toimintoa" "Ohitetaanko navigointiohje?" "Löydät tämän myöhemmin sovelluksesta: %1$s" "Peru" "Ohita" - - - - - + "Tehtäväpalkin ohje näkyvissä" + "Tehtäväpalkin ohje suljettu" + "Seuraava" - - + "Takaisin" "Sulje" - - + "Valmis" diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index ec396cd9ec..be1067442f 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -79,21 +79,19 @@ "Paramètres de navigation du système" "Partager" "Capture d\'écran" + + "L\'application ou votre organisation n\'autorise pas cette action" "Ignorer le tutoriel sur la navigation?" "Vous trouverez le tutoriel dans l\'application %1$s" "Annuler" "Ignorer" - - - - - + "La barre des tâches éducatives s\'est affichée" + "La barre des tâches éducatives est fermée" + "Suivant" - - + "Retour" "Fermer" - - + "OK" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 0881c4583a..8a2bdcbe79 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -79,21 +79,19 @@ "Paramètres de navigation système" "Partager" "Capture d\'écran" + + "Cette action n\'est pas autorisée par l\'application ou par votre organisation" "Ignorer le tutoriel de navigation ?" "Vous le retrouverez dans l\'appli %1$s" "Annuler" "Passer" - - - - - + "Infos sur la barre des tâches affichées" + "Infos sur la barre des tâches fermées" + "Suivant" - - + "Retour" "Fermer" - - + "OK" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 342bf14715..87d0967874 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -79,21 +79,19 @@ "Configuración da navegación do sistema" "Compartir" "Facer captura" + + "A aplicación ou a túa organización non permite realizar esta acción" "Queres omitir o titorial de navegación?" "Podes atopar isto máis tarde na aplicación %1$s" "Cancelar" "Omitir" - - - - - + "Panel de información de barra de tarefas aberto" + "Panel de información de barra de tarefas pechado" + "Seguinte" - - + "Atrás" "Pechar" - - + "Feito" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index cb0f9d7b05..8e10f8461f 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -79,21 +79,19 @@ "સિસ્ટમના નૅવિગેશન સેટિંગ" "શેર કરો" "સ્ક્રીનશૉટ" + + "ઍપ કે તમારી સંસ્થા દ્વારા આ ક્રિયા કરવાની મંજૂરી નથી" "નૅવિગેશન ટ્યૂટૉરિઅલ છોડી દઈએ?" "તમે આને પછીથી %1$s ઍપમાં જોઈ શકો છો" "રદ કરો" "છોડો" - - - - - + "ટાસ્કબારનું શિક્ષણ આપતી પૅનલ દેખાય છે" + "ટાસ્કબારનું શિક્ષણ આપતી પૅનલ બંધ થઈ છે" + "આગળ" - - + "પાછળ" "બંધ કરો" - - + "થઈ ગયું" diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 5e4bd3fa2c..b7c2a131b5 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -79,21 +79,19 @@ "सिस्टम नेविगेशन सेटिंग" "शेयर करें" "स्क्रीनशॉट लें" + + "ऐप्लिकेशन या आपका संगठन इस कार्रवाई की अनुमति नहीं देता" "नेविगेशन ट्यूटोरियल छोड़ना चाहते हैं?" "आप बाद में %1$s ऐप्लिकेशन पर इसे देख सकते हैं" "अभी नहीं" "अभी नहीं" - - - - - + "टास्कबार ट्यूटोरियल दिखाया गया" + "टास्कबार ट्यूटोरियल बंद किया गया" + "आगे बढ़ें" - - + "वापस जाएं" "बंद करें" - - + "हो गया" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index 0f4f841bbb..238cb15ed1 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -79,6 +79,8 @@ "Postavke navigacije sustavom" "Podijeli" "Snimka zaslona" + + "Aplikacija ili vaša organizacija ne dopuštaju ovu radnju" "Želite li preskočiti vodič za kretanje?" "Kasnije ga možete pronaći u aplikaciji %1$s" @@ -86,7 +88,8 @@ "Preskoči" "Upute za programsku traku su se pojavile" "Upute za programsku traku su zatvorene" - "Dodirnite i zadržite da biste sakrili programsku traku" + + "Dalje" "Natrag" "Zatvori" diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index 19dcf853e8..cebf4bd042 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -79,21 +79,19 @@ "Rendszer-navigációs beállítások" "Megosztás" "Képernyőkép" + + "Az alkalmazás vagy az Ön szervezete nem engedélyezi ezt a műveletet" "Kihagyja a navigáció bemutatóját?" "Ezt később megtalálhatja a(z) %1$s alkalmazásban" "Mégse" "Kihagyás" - - - - - + "Az eszköztár használatát ismertető panel megjelent" + "Az eszköztár használatát ismertető panel bezárult" + "Tovább" - - + "Vissza" "Bezárás" - - + "Kész" diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index 957aa16813..36ebd65414 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -79,21 +79,19 @@ "Նավիգացիայի համակարգային կարգավորումներ" "Կիսվել" "Սքրինշոթ անել" + + "Այս գործողությունն արգելված է հավելվածի կամ ձեր կազմակերպության կողմից" "Բաց թողնե՞լ նավիգացիայի ուղեցույցը" "Հետագայում սա կարող եք գտնել «%1$s» հավելվածում" "Չեղարկել" "Բաց թողնել" - - - - - + "Խնդրագոտու «Կրթություն» վահանակը բացվեց" + "Խնդրագոտու «Կրթություն» վահանակը փակվեց" + "Առաջ" - - + "Հետ" "Փակել" - - + "Պատրաստ է" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index 9d7e604686..463f686bd3 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -79,21 +79,19 @@ "Setelan navigasi sistem" "Bagikan" "Screenshot" + + "Tindakan ini tidak diizinkan oleh aplikasi atau organisasi Anda" "Lewati tutorial navigasi?" "Anda dapat menemukan tutorial ini di lain waktu di aplikasi %1$s" "Batal" "Lewati" - - - - - + "Edukasi taskbar ditampilkan" + "Edukasi taskbar ditutup" + "Berikutnya" - - + "Kembali" "Tutup" - - + "Selesai" diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index 2970634f11..195fcf085e 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -79,21 +79,19 @@ "Stillingar kerfisstjórnunar" "Deila" "Skjámynd" + + "Forritið eða fyrirtækið leyfir ekki þessa aðgerð" "Sleppa flettileiðsögn?" "Þú getur fundið þetta síðar í forritinu %1$s" "Hætta við" "Sleppa" - - - - - + "Leiðsögn verkefnastiku sýnileg" + "Leiðsögn verkefnastiku lokað" + "Áfram" - - + "Til baka" "Loka" - - + "Lokið" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index f254853752..233f593eaf 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -79,21 +79,19 @@ "Impostazioni Navigazione del sistema" "Condividi" "Screenshot" + + "Questa azione non è consentita dall\'app o dall\'organizzazione" "Saltare il tutorial di navigazione?" "Puoi trovarlo in un secondo momento nell\'app %1$s" "Annulla" "Salta" - - - - - + "Riquadro Formazione barra delle applicazioni visualizzato" + "Riquadro Formazione barra delle applicazioni chiuso" + "Avanti" - - + "Indietro" "Chiudi" - - + "Fine" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index 0dc3b916cf..a29ba7d63f 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -79,21 +79,19 @@ "הגדרות הניווט של המערכת" "שיתוף" "צילום מסך" + + "האפליקציה או הארגון שלך אינם מתירים את הפעולה הזאת" "לדלג על המדריך לניווט?" "ניתן למצוא את המדריך מאוחר יותר באפליקציה %1$s" "ביטול" "דילוג" - - - - - + "חלונית ההסברים על שורת המשימות מופיעה" + "חלונית ההסברים על שורת המשימות נסגרה" + "הבא" - - + "חזרה" "סגירה" - - + "סיום" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index 824a2f72db..e09b729085 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -79,21 +79,19 @@ "システム ナビゲーションの設定" "共有" "スクリーンショット" + + "この操作はアプリまたは組織で許可されていません" "操作チュートリアルをスキップしますか?" "チュートリアルは後から %1$s アプリで確認できます" "キャンセル" "スキップ" - - - - - + "タスクバーの説明を開きました" + "タスクバーの説明を閉じました" + "次へ" - - + "戻る" "閉じる" - - + "完了" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index ae54c02bd1..ac0498c71c 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -79,21 +79,19 @@ "სისტემის ნავიგაციის პარამეტრები" "გაზიარება" "ეკრანის ანაბეჭდი" + + "ეს მოქმედება არ არის დაშვებული აპის ან თქვენი ორგანიზაციის მიერ" "გსურთ, გამოტოვოთ ნავიგაციის სახელმძღვანელო?" "ამის მოგვიანებით პოვნა %1$s აპში შეგიძლიათ" "გაუქმება" "გამოტოვება" - - - - - + "ამოცანების ზოლის სასწავლო არე გამოჩნდა" + "ამოცანების ზოლის სასწავლო არე დაიხურა" + "შემდეგი" - - + "უკან" "დახურვა" - - + "მზადაა" diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index d2f766a30a..11fad68784 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -79,21 +79,19 @@ "Навигацияның жүйелік параметрлері" "Бөлісу" "Скриншот" + + "Бұл әрекетке қолданба не ұйым рұқсат етпейді." "Қимылдар оқулығын өткізіп жіберу керек пе?" "Мұны кейін %1$s қолданбасынан таба аласыз." "Бас тарту" "Өткізіп жіберу" - - - - - + "Тапсырмалар тақтасы бойынша нұсқаулық ашылды." + "Тапсырмалар тақтасы бойынша нұсқаулық жабылды." + "Келесі" - - + "Артқа" "Жабу" - - + "Дайын" diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index 774915fac5..aecce96ec5 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -79,21 +79,19 @@ "ការកំណត់​ការរុករក​ប្រព័ន្ធ" "ចែករំលែក" "រូបថតអេក្រង់" + + "សកម្មភាពនេះ​មិនត្រូវបានអនុញ្ញាតដោយកម្មវិធី​ ឬ​ស្ថាប័ន​របស់អ្នកទេ" "រំលង​មេរៀន​អំពី​ការរុករក​ឬ?" "អ្នកអាចស្វែងរកមេរៀននេះនៅពេលក្រោយក្នុងកម្មវិធី %1$s" "បោះបង់" "រំលង" - - - - - + "ការបង្រៀនអំពីរបារកិច្ចការបានបង្ហាញ" + "ការបង្រៀនអំពីរបារកិច្ចការត្រូវបានបិទ" + "បន្ទាប់" - - + "ថយក្រោយ" "បិទ" - - + "រួចរាល់" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index c51f300f28..f5aa9d365b 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -79,21 +79,19 @@ "ಸಿಸ್ಟಂ ನ್ಯಾವಿಗೇಶನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಹಂಚಿಕೊಳ್ಳಿ" "ಸ್ಕ್ರೀನ್‌ಶಾಟ್" + + "ಆ್ಯಪ್ ಅಥವಾ ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಕ್ರಿಯೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ" "ನ್ಯಾವಿಗೇಷನ್ ಟ್ಯುಟೋರಿಯಲ್ ಸ್ಕಿಪ್ ಮಾಡಿ?" "%1$s ಆ್ಯಪ್‌ನಲ್ಲಿ ಇದನ್ನು ನಂತರ ಕಾಣಬಹುದು" "ರದ್ದುಮಾಡಿ" "ಸ್ಕಿಪ್ ಮಾಡಿ" - - - - - + "ಟಾಸ್ಕ್‌ಬಾರ್ ಶಿಕ್ಷಣ ಕಾಣಿಸಿಕೊಂಡಿದೆ" + "ಟಾಸ್ಕ್‌ಬಾರ್ ಶಿಕ್ಷಣ ಮುಚ್ಚಿದೆ" + "ಮುಂದೆ" - - + "ಹಿಂದೆ" "ಮುಚ್ಚಿರಿ" - - + "ಮುಗಿದಿದೆ" diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index eca9eaa1a5..aa76e8a87f 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -79,21 +79,19 @@ "시스템 탐색 설정" "공유" "스크린샷" + + "이 작업은 앱 또는 조직에서 허용되지 않습니다." "이동 방법 튜토리얼을 건너뛰시겠습니까?" "이 튜토리얼은 %1$s 앱에서 다시 볼 수 있습니다" "취소" "건너뛰기" - - - - - + "작업 표시줄 튜토리얼 패널 표시됨" + "작업 표시줄 튜토리얼 패널 닫힘" + "다음" - - + "뒤로" "닫기" - - + "완료" diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 4bb831520d..540e2556f0 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -79,21 +79,19 @@ "Өтүү аракетинин тутумдук жөндөөлөрү" "Бөлүшүү" "Скриншот" + + "Бул аракетти аткарууга колдонмо же ишканаңыз тыюу салган" "Жаңсоолор үйрөткүчүн өткөрүп жибересизби?" "Аны кийин %1$s колдонмосунан табасыз" "Жокко чыгаруу" "Өткрп жиберүү" - - - - - + "Тапшырмалар тактасынын окутуу панели көрсөтүлдү" + "Тапшырмалар тактасынын окутуу панели жабылды" + "Кийинки" - - + "Артка" "Жабуу" - - + "Бүттү" diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index a99cee52ea..b9d3c4268a 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -79,21 +79,19 @@ "ການຕັ້ງຄ່າການນຳທາງລະບົບ" "ແບ່ງປັນ" "ຮູບໜ້າຈໍ" + + "ແອັບ ຫຼື ອົງການຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ໃຊ້ຄຳສັ່ງນີ້" "ຂ້າມການສອນການນຳໃຊ້ການນຳທາງບໍ?" "ທ່ານສາມາດຊອກສ່ວນນີ້ພາຍຫຼັງໄດ້ໃນແອັບ %1$s" "ຍົກເລີກ" "ຂ້າມ" - - - - - + "ສະແດງການສຶກສາແຖບໜ້າວຽກແລ້ວ" + "ປິດການສຶກສາແຖບໜ້າວຽກແລ້ວ" + "ຕໍ່ໄປ" - - + "ກັບຄືນ" "ປິດ" - - + "ແລ້ວໆ" diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 2bf210fb34..7a4fddc262 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -79,6 +79,8 @@ "Sistemos naršymo nustatymai" "Bendrinti" "Ekrano kopija" + + "Jūsų organizacijoje arba naudojant šią programą neleidžiama atlikti šio veiksmo" "Praleisti naršymo mokymo programą?" "Tai galėsite rasti vėliau programoje „%1$s“" @@ -86,7 +88,8 @@ "Praleisti" "Užduočių juostos patarimai rodomi" "Užduočių juostos patarimai uždaryti" - "Bet kuriuo metu palieskite ir palaik., kad pasl. užd. juostą" + + "Kitas" "Atgal" "Uždaryti" diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 311d69a2d2..ee6009c1f1 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -79,21 +79,19 @@ "Sistēmas navigācijas iestatījumi" "Kopīgot" "Veikt ekrānuzņēmumu" + + "Lietotne vai jūsu organizācija neatļauj veikt šo darbību." "Vai izlaist navigācijas mācības?" "Varēsiet to vēlāk atrast lietotnē %1$s." "Atcelt" "Izlaist" - - - - - + "Tika atvērta uzdevumjoslas apmācība" + "Tika aizvērta uzdevumjoslas apmācība" + "Tālāk" - - + "Atpakaļ" "Aizvērt" - - + "Gatavs" diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index 414b34a3ed..ef03fa5a18 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -79,21 +79,19 @@ "Поставки за системска навигација" "Сподели" "Слика од екранот" + + "Апликацијата или вашата организација не го дозволува дејствово" "Да се прескокне упатството за навигација?" "Ова може да го најдете подоцна во апликацијата %1$s" "Откажи" "Прескокни" - - - - - + "Се појави лентата за задачи за образование" + "Затворена е лентата за задачи за образование" + "Следна" - - + "Назад" "Затвори" - - + "Готово" diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index f23b5a608b..a0484f4727 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -79,21 +79,19 @@ "സിസ്‌റ്റം നാവിഗേഷൻ ക്രമീകരണം" "പങ്കിടുക" "സ്ക്രീൻഷോട്ട്" + + "ഈ നടപടി എടുക്കുന്നത് ആപ്പോ നിങ്ങളുടെ സ്ഥാപനമോ അനുവദിക്കുന്നില്ല" "നാവിഗേഷൻ ട്യൂട്ടോറിയൽ ഒഴിവാക്കണോ?" "%1$s ആപ്പിൽ നിങ്ങൾക്ക് ഇത് പിന്നീട് കാണാനാകും" "റദ്ദാക്കുക" "ഒഴിവാക്കുക" - - - - - + "ടാസ്ക്ക്ബാർ വിവര പാനൽ ദൃശ്യമായി" + "ടാസ്ക്ക്ബാർ വിവര പാനൽ അടച്ചു" + "അടുത്തത്" - - + "മടങ്ങുക" "അടയ്ക്കുക" - - + "പൂർത്തിയായി" diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 6867424062..3500a98494 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -79,21 +79,19 @@ "Системийн навигацын тохиргоо" "Хуваалцах" "Дэлгэцийн агшин дарах" + + "Энэ үйлдлийг апп эсвэл танай байгууллага зөвшөөрдөггүй" "Навигацын практик хичээлийг алгасах уу?" "Та үүнийг дараа нь %1$s аппаас олох боломжтой" "Цуцлах" "Алгасах" - - - - - + "Боловсролын ажлын талбар гарч ирсэн" + "Боловсролын ажлын талбарыг хаасан" + "Дараах" - - + "Буцах" "Хаах" - - + "Дууссан" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index fcac5b9c07..81342a1595 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -79,21 +79,19 @@ "सिस्टम नेव्हिगेशन सेटिंग्ज" "शेअर करा" "स्क्रीनशॉट" + + "अ‍ॅप किंवा तुमच्या संस्थेद्वारे ही क्रिया करण्याची अनुमती नाही" "नेव्हिगेशन ट्युटोरियल वगळायचे आहे का?" "तुम्हाला हे नंतर %1$s ॲपमध्ये मिळेल" "रद्द करा" "वगळा" - - - - - + "टास्कबारशी संबंधित माहिती देणारे पॅनल उघडले आहे" + "टास्कबारशी संबंधित माहिती देणारे पॅनल बंद केले आहे" + "पुढे" - - + "मागे जा" "बंद करा" - - + "पूर्ण झाले" diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index a99f0d65da..154b966525 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -79,21 +79,19 @@ "Tetapan navigasi sistem" "Kongsi" "Tangkapan skrin" + + "Tindakan ini tidak dibenarkan oleh apl atau organisasi anda" "Langkau tutorial navigasi?" "Anda boleh mendapatkan tutorial ini kemudian dalam apl %1$s" "Batal" "Langkau" - - - - - + "Pendidikan bar tugas muncul" + "Pendidikan bar tugas ditutup" + "Seterusnya" - - + "Kembali" "Tutup" - - + "Selesai" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index c570efb700..bf9ab62731 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -79,6 +79,8 @@ "စနစ် လမ်းညွှန် ဆက်တင်များ" "မျှဝေရန်" "ဖန်သားပြင်ဓာတ်ပုံ" + + "ဤလုပ်ဆောင်ချက်ကို အက်ပ် သို့မဟုတ် သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ" "လမ်းညွှန်ခြင်း ရှင်းလင်းပို့ချချက်ကို ကျော်မလား။" "၎င်းကို နောက်မှ %1$s အက်ပ်တွင် ရှာနိုင်သည်" @@ -86,7 +88,8 @@ "ကျော်ရန်" "ပညာရေး လုပ်ဆောင်စရာဘား ပြထားသည်" "ပညာရေး လုပ်ဆောင်စရာဘား ပိတ်ထားသည်" - "လုပ်ဆောင်စရာဘားကို အချိန်မရွေးဖျောက်ရန် ထိပြီးဖိထားနိုင်သည်" + + "ရှေ့သို့" "နောက်သို့" "ပိတ်ရန်" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 98ed01956a..4b1f8d0ea6 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -79,21 +79,19 @@ "Innstillinger for systemnavigasjon" "Del" "Skjermdump" + + "Appen eller organisasjonen din tillater ikke denne handlingen" "Vil du hoppe over navigeringsveiledning?" "Du kan finne dette i %1$s-appen senere" "Avbryt" "Hopp over" - - - - - + "Opplæringen for oppgavelinjen vises" + "Opplæringen for oppgavelinjen er lukket" + "Neste" - - + "Tilbake" "Lukk" - - + "Ferdig" diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index bce829cc54..126e07458f 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -79,21 +79,19 @@ "सिस्टम नेभिगेसनसम्बन्धी सेटिङ" "सेयर गर्नुहोस्" "स्क्रिनसट" + + "यो एप वा तपाईंको सङ्गठनले यो कारबाही गर्ने अनुमति दिँदैन" "नेभिगेसन ट्युटोरियल स्किप गर्ने हो?" "तपाईं पछि %1$s नामक एपमा गई यो ट्युटोरियल भेट्टाउन सक्नुहुन्छ" "रद्द गर्नुहोस्" "स्किप गर्नु…" - - - - - + "टास्कबार एजुकेसन देखिएको छ" + "टास्कबार एजुकेसन बन्द गरिएको छ" + "अर्को" - - + "पछाडि" "बन्द गर्नुहोस्" - - + "सम्पन्न भयो" diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index f41da2a777..cfc0454d73 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -79,6 +79,8 @@ "Navigatie-instellingen van systeem" "Delen" "Screenshot" + + "Deze actie wordt niet toegestaan door de app of je organisatie" "Navigatietutorial overslaan?" "Je vindt dit later terug in de app %1$s" @@ -86,7 +88,8 @@ "Overslaan" "Uitleg van taakbalk geopend" "Uitleg van taakbalk gesloten" - "Tik en houd vast om de taakbalk op elk moment te verbergen" + + "Volgende" "Terug" "Sluiten" diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index c32cd03104..bbf610b6ed 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -79,21 +79,19 @@ "ସିଷ୍ଟମ୍ ନାଭିଗେସନ୍ ସେଟିଂସ୍" "ସେୟାର୍ କରନ୍ତୁ" "ସ୍କ୍ରିନସଟ୍" + + "ଆପ୍ କିମ୍ବା ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ଏହି କାର୍ଯ୍ୟକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ" "ନାଭିଗେସନ୍ ଟ୍ୟୁଟୋରିଆଲକୁ ବାଦ୍ ଦେବେ?" "ଆପଣ ପରେ ଏହାକୁ %1$s ଆପରେ ପାଇପାରିବେ" "ବାତିଲ୍ କରନ୍ତୁ" "ବାଦ୍ ଦିଅନ୍ତୁ" - - - - - + "ଟାସ୍କବାର୍ ଶିକ୍ଷା ଦେଖାଯାଇଛି" + "ଟାସ୍କବାର୍ ଶିକ୍ଷା ବନ୍ଦ ହୋଇଯାଇଛି" + "ପରବର୍ତ୍ତୀ" - - + "ପଛକୁ ଫେରନ୍ତୁ" "ବନ୍ଦ କରନ୍ତୁ" - - + "ହୋଇଗଲା" diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index 70d8bbdd63..d7068dea44 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -79,21 +79,19 @@ "ਸਿਸਟਮ ਨੈਵੀਗੇਸ਼ਨ ਸੈਟਿੰਗਾਂ" "ਸਾਂਝਾ ਕਰੋ" "ਸਕ੍ਰੀਨਸ਼ਾਟ" + + "ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਇਸ ਕਾਰਵਾਈ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ" "ਕੀ ਨੈਵੀਗੇਸ਼ਨ ਟਿਊਟੋਰੀਅਲ ਨੂੰ ਛੱਡਣਾ ਹੈ?" "ਤੁਸੀਂ ਇਸਨੂੰ ਬਾਅਦ ਵਿੱਚ %1$s ਐਪ ਵਿੱਚ ਲੱਭ ਸਕਦੇ ਹੋ" "ਰੱਦ ਕਰੋ" "ਛੱਡੋ" - - - - - + "ਟਾਸਕਵਾਰ ਸਿੱਖਿਆ ਪੈਨਲ ਦਿਖਾਇਆ ਗਿਆ" + "ਟਾਸਕਵਾਰ ਸਿੱਖਿਆ ਪੈਨਲ ਬੰਦ ਕੀਤਾ ਗਿਆ" + "ਅੱਗੇ" - - + "ਪਿੱਛੇ" "ਬੰਦ ਕਰੋ" - - + "ਹੋ ਗਿਆ" diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 675ba4684d..f054a3c765 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -79,21 +79,19 @@ "Ustawienia nawigacji w systemie" "Udostępnij" "Zrzut ekranu" + + "Nie możesz wykonać tego działania, bo nie zezwala na to aplikacja lub Twoja organizacja" "Pominąć samouczek nawigacji?" "Znajdziesz to później w aplikacji %1$s" "Anuluj" "Pomiń" - - - - - + "Wskazówki na temat paska zadań zostały wyświetlone" + "Wskazówki na temat paska zadań zostały zamknięte" + "Dalej" - - + "Wstecz" "Zamknij" - - + "Gotowe" diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index b5475fd39d..269efcb114 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -79,6 +79,8 @@ "Definições de navegação do sistema" "Partilhar" "Fazer captura de ecrã" + + "Esta ação não é permitida pela app ou a sua entidade." "Ignorar o tutorial de navegação?" "Pode encontrar isto mais tarde na app %1$s" @@ -86,7 +88,8 @@ "Ignorar" "Informação da barra de tarefas apresentada" "Informação da barra de tarefas fechada" - "Toque sem soltar para ocultar a barra de tarefas" + + "Seguinte" "Anterior" "Fechar" diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index c724cae034..704eec41f1 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -79,6 +79,8 @@ "Configurações de navegação do sistema" "Compartilhar" "Capturar tela" + + "Essa ação não é permitida pelo app ou pela organização" "Pular o tutorial de navegação?" "Veja o tutorial mais tarde no app %1$s" @@ -86,7 +88,8 @@ "Pular" "As dicas sobre a barra de tarefas foram abertas" "As dicas sobre a barra de tarefas foram fechadas" - "Mantenha a barra de ferramentas pressionada para ocultá-la" + + "Próxima" "Voltar" "Fechar" diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index af4d7cd37f..6dca9e4083 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -79,21 +79,19 @@ "Setările de navigare ale sistemului" "Distribuiți" "Captură de ecran" + + "Această acțiune nu este permisă de aplicație sau de organizația dvs." "Omiteți tutorialul de navigare?" "Îl puteți găsi mai târziu în aplicația %1$s" "Anulați" "Omiteți" - - - - - + "Panoul cu informații despre bara de activități s-a afișat" + "Panoul cu informații despre bara de activități s-a închis" + "Înainte" - - + "Înapoi" "Închideți" - - + "Gata" diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 0fa5203c9f..896339428d 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -79,21 +79,19 @@ "Системные настройки навигации" "Поделиться" "Скриншот" + + "Это действие заблокировано приложением или организацией." "Пропустить руководство по жестам?" "Его можно найти в приложении \"%1$s\"." "Отмена" "Пропустить" - - - - - + "Обучение по работе с панелью задач показано" + "Обучение по работе с панелью задач скрыто" + "Далее" - - + "Назад" "Закрыть" - - + "Готово" diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index c823df2d74..1182153bdb 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -79,21 +79,19 @@ "පද්ධති සංචාලන සැකසීම්" "බෙදා ගන්න" "තිර රුව" + + "මෙම ක්‍රියාව යෙදුම හෝ ඔබේ සංවිධානය මගින් ඉඩ නොදේ" "නිබන්ධනය සංචාලනය මඟ හරින්නද?" "ඔබට මෙය පසුව %1$s යෙදුම තුළ සොයා ගත හැකිය" "අවලංගු කරන්න" "මඟ හරින්න" - - - - - + "කාර්ය තීරු අධ්‍යාපනය දිස් විය" + "කාර්ය තීරු අධ්‍යාපනය වසා ඇත" + "ඊළඟ" - - + "ආපසු" "වසන්න" - - + "නිමයි" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index 37f61fefa5..2cd414b516 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -79,21 +79,19 @@ "Nastavenia navigácie systémom" "Zdieľať" "Snímka obrazovky" + + "Aplikácia alebo vaša organizácia túto akciu nepovoľuje" "Chcete preskočiť návod na navigáciu?" "Tento návod nájdete v aplikácii %1$s" "Zrušiť" "Preskočiť" - - - - - + "Zobrazila sa výuka k hlavnému panelu" + "Výuka k hlavnému panelu bola zatvorená" + "Ďalej" - - + "Späť" "Zavrieť" - - + "Hotovo" diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index c70f6e0b1b..5edc2bb4c8 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -79,21 +79,19 @@ "Nastavitve krmarjenja po sistemu" "Deli" "Posnetek zaslona" + + "Aplikacija ali vaša organizacija ne dovoljuje tega dejanja" "Želite preskočiti vadnico za krmarjenje?" "To lahko pozneje najdete v aplikaciji %1$s." "Prekliči" "Preskoči" - - - - - + "Poučni nasveti o opravilni vrstici so prikazani." + "Poučni nasveti o opravilni vrstici so zaprti." + "Naprej" - - + "Nazaj" "Zapri" - - + "Končano" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 806a8108c6..2b36b5cc54 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -79,6 +79,8 @@ "Cilësimet e navigimit të sistemit" "Ndaj" "Pamja e ekranit" + + "Ky veprim nuk lejohet nga aplikacioni ose organizata jote" "Të kapërcehet udhëzuesi i navigimit?" "Këtë mund ta gjesh më vonë tek aplikacioni %1$s" @@ -86,7 +88,8 @@ "Kapërce" "Edukimi i shiritit të detyrave u shfaq" "Edukimi nga shiriti i detyrave u mbyll" - "Preke dhe mbaje prekur për ta fshehur shiritin e detyrave në çdo kohë" + + "Para" "Pas" "Mbyll" diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index 92fbc155db..32890110ee 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -79,21 +79,19 @@ "Подешавања кретања кроз систем" "Дели" "Снимак екрана" + + "Апликација или организација не дозвољавају ову радњу" "Желите да прескочите водич за кретање?" "Можете да пронађете ово касније у апликацији %1$s" "Откажи" "Прескочи" - - - - - + "Едукативно окно из траке задатака се појавило" + "Едукативно окно из траке задатака је затворено" + "Даље" - - + "Назад" "Затвори" - - + "Готово" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index c1beeae187..4e3e7ac23b 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -79,21 +79,19 @@ "Systemnavigeringsinställningar" "Dela" "Skärmbild" + + "Appen eller organisationen tillåter inte den här åtgärden" "Vill du hoppa över självstudierna?" "Du hittar det här igen i %1$s-appen" "Avbryt" "Hoppa över" - - - - - + "Information om aktivitetsfältet visades" + "Information om aktivitetsfältet stängdes" + "Nästa" - - + "Tillbaka" "Stäng" - - + "Klar" diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index c5f9d89afb..e9337553a9 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -79,6 +79,8 @@ "Mipangilio ya usogezaji kwenye mfumo" "Shiriki" "Picha ya skrini" + + "Kitendo hiki hakiruhusiwi na programu au shirika lako" "Ungependa kuruka mafunzo ya usogezaji?" "Utapata mafunzo haya baadaye katika programu ya %1$s" @@ -86,7 +88,8 @@ "Ruka" "Paneli ya elimu kwenye upau wa shughuli inaonyeshwa" "Paneli ya elimu kwenye upau wa shughuli imefungwa" - "Gusa na ushikilie ili ufiche upau wa shughuli wakati wowote" + + "Endelea" "Nyuma" "Funga" diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 65538e0fa2..4551e2b940 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -79,21 +79,19 @@ "சிஸ்டம் வழிசெலுத்தல் அமைப்புகள்" "பகிர்" "ஸ்கிரீன்ஷாட்" + + "ஆப்ஸோ உங்கள் நிறுவனமோ இந்த செயலை அனுமதிப்பதில்லை" "வழிகாட்டுதல் பயிற்சியைத் தவிர்க்கவா?" "%1$s ஆப்ஸில் பிறகு இதைக் கண்டறியலாம்" "ரத்துசெய்" "தவிர்" - - - - - + "பணிப்பட்டியை எவ்வாறு பயன்படுத்துவது என்பது பற்றிய பலகம் காட்டப்படுகிறது" + "பணிப்பட்டியை எவ்வாறு பயன்படுத்துவது என்பது பற்றிய பலகம் மூடப்பட்டது" + "அடுத்து" - - + "பின்செல்" "மூடுக" - - + "முடிந்தது" diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index 637dc6b498..b7cb7af59f 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -79,21 +79,19 @@ "సిస్టమ్ నావిగేషన్ సెట్టింగ్‌లు" "షేర్ చేయండి" "స్క్రీన్‌షాట్" + + "ఈ చర్యను యాప్ గానీ, మీ సంస్థ గానీ అనుమతించవు" "నావిగేషన్ ట్యుటోరియల్‌ను స్కిప్ చేయాలా?" "%1$s యాప్‌లో మీరు తర్వాత కనుగొనవచ్చు" "రద్దు చేయి" "స్కిప్ చేయి" - - - - - + "టాస్క్‌బార్ శిక్షణకు సంబంధించిన ప్యానెల్ కనిపించింది" + "టాస్క్‌బార్ శిక్షణకు సంబంధించిన ప్యానెల్ మూసివేయబడింది" + "తర్వాత" - - + "వెనుకకు" "మూసివేయండి" - - + "పూర్తయింది" diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index ba5017d500..4205a62bfc 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -79,6 +79,8 @@ "การตั้งค่าการนำทางของระบบ" "แชร์" "ภาพหน้าจอ" + + "แอปหรือองค์กรของคุณไม่อนุญาตการดำเนินการนี้" "ข้ามบทแนะนำการนำทางไหม" "คุณดูบทแนะนำนี้ได้ภายหลังในแอป \"%1$s\"" @@ -86,7 +88,8 @@ "ข้าม" "แถบงาน Education ปรากฎขึ้น" "ปิดแถบงาน Education แล้ว" - "แตะค้างไว้เพื่อซ่อนแถบงานได้ทุกเมื่อ" + + "ถัดไป" "กลับ" "ปิด" diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index 68365e8450..86787a8ce2 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -79,21 +79,19 @@ "Mga setting ng navigation ng system" "Ibahagi" "Screenshot" + + "Hindi pinapayagan ng app o ng iyong organisasyon ang pagkilos na ito" "Laktawan ang tutorial sa pag-navigate?" "Makikita mo ito sa %1$s app sa ibang pagkakataon" "Kanselahin" "Laktawan" - - - - - + "Lumabas ang edukasyon sa taskbar" + "Sarado ang edukasyon sa taskbar" + "Susunod" - - + "Bumalik" "Isara" - - + "Tapos na" diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index c27ed1bcb9..9f51423b14 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -79,6 +79,8 @@ "Sistem gezinme ayarları" "Paylaş" "Ekran görüntüsü" + + "Uygulamanız veya kuruluşunuz bu işleme izin vermiyor" "Gezinme eğitimi atlansın mı?" "Bunu daha sonra %1$s uygulamasında bulabilirsiniz" @@ -86,7 +88,8 @@ "Atla" "Görev çubuğu eğitimi görüntülendi" "Görev çubuğu eğitimi kapatıldı" - "Görev çubuğunu gizlemek için istediğiniz zaman basılı tutun" + + "İleri" "Geri" "Kapat" diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 3b93f81a92..12119de943 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -79,21 +79,19 @@ "Системні налаштування навігації" "Поділитися" "Знімок екрана" + + "Ця дія заборонена додатком або адміністратором організації" "Пропустити посібник із навігації?" "Ви знайдете його пізніше в додатку %1$s" "Скасувати" "Пропустити" - - - - - + "Панель завдань Education відкрито" + "Панель завдань Education закрито" + "Далі" - - + "Назад" "Закрити" - - + "Готово" diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index d18a8de270..0a62055b5c 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -79,21 +79,19 @@ "سسٹم نیویگیشن کی ترتیبات" "اشتراک کریں" "اسکرین شاٹ" + + "ایپ یا آپ کی تنظیم کی جانب سے اس کارروائی کی اجازت نہیں ہے" "نیویگیشن کا ٹیوٹوریل نظر انداز کریں؟" "آپ اسے بعد میں %1$s ایپ میں تلاش کر سکتے ہیں" "منسوخ کریں" "نظر انداز کریں" - - - - - + "ٹاکس بار کا تعلیمی پینل ظاہر ہو گیا" + "ٹاسک بار کا تعلیمی پینل بند ہو گیا" + "آگے" - - + "پیچھے" "بند کریں" - - + "ہو گیا" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index 45d857ed53..dcd413fe6a 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -79,21 +79,19 @@ "Tizim navigatsiya sozlamalari" "Ulashish" "Skrinshot" + + "Bu amal ilova yoki tashkilotingiz tomonidan taqiqlangan" "Navigatsiya darsi yopilsinmi?" "Bu darslar %1$s ilovasida chiqadi" "Bekor qilish" "Tashlab ketish" - - - - - + "Taʼlim vazifalar paneli chiqdi" + "Taʼlim vazifalar paneli yopildi" + "Keyingisi" - - + "Orqaga" "Yopish" - - + "Tayyor" diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index c3a8e91a14..304fe7ccb1 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -79,6 +79,8 @@ "Chế độ cài đặt di chuyển trên hệ thống" "Chia sẻ" "Chụp ảnh màn hình" + + "Ứng dụng hoặc tổ chức của bạn không cho phép thực hiện hành động này" "Bỏ qua phần hướng dẫn thao tác?" "Bạn có thể tìm lại phần hướng dẫn này trong ứng dụng %1$s" @@ -86,7 +88,8 @@ "Bỏ qua" "Đã hiện bảng hướng dẫn trên thanh tác vụ" "Đã đóng bảng hướng dẫn trên thanh tác vụ" - "Chạm và giữ để ẩn thanh tác vụ bất cứ lúc nào" + + "Tiếp theo" "Quay lại" "Đóng" diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index fa1d133520..eb4ae7846b 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -79,21 +79,19 @@ "系统导航设置" "分享" "屏幕截图" + + "该应用或您所在的单位不允许执行此操作" "要跳过导航教程吗?" "您之后可以在“%1$s”应用中找到此教程" "取消" "跳过" - - - - - + "任务栏教程已显示" + "任务栏教程已关闭" + "继续" - - + "返回" "关闭" - - + "完成" diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index a2ce7a08d1..4a0d1460a3 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -79,6 +79,8 @@ "系統導覽設定" "分享" "螢幕截圖" + + "應用程式或您的機構不允許此操作" "要略過手勢操作教學課程嗎?" "您之後可以在「%1$s」應用程式找到這些說明" @@ -86,7 +88,8 @@ "略過" "顯示咗工作列教學" "閂咗工作列教學" - "按住即可隨時隱藏工作列" + + "繼續" "返回" "關閉" diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index 1633c1631e..f73d533244 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -79,21 +79,19 @@ "系統操作機制設定" "分享" "螢幕截圖" + + "這個應用程式或貴機構不允許執行這個動作" "要略過手勢操作教學課程嗎?" "你之後可以在「%1$s」應用程式找到這些說明" "取消" "略過" - - - - - + "工作列教學課程已顯示" + "工作列教學課程已關閉" + "繼續" - - + "返回" "關閉" - - + "完成" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 0b8655e884..076712aa2d 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -79,21 +79,19 @@ "Amasethingi wokuzulazula isistimu" "Yabelana" "Isithombe-skrini" + + "Lesi senzo asivunyelwanga uhlelo lokusebenza noma inhlangano yakho" "Yeqa isifundo sokuzulazula?" "Lokhu ungakuthola kamuva ku-app ye-%1$s" "Khansela" "Yeqa" - - - - - + "Imfuno yebha yomsebenzi ivelile" + "Imfundo yebha yomsebenzi ivaliwe" + "Okulandelayo" - - + "Emuva" "Vala" - - + "Kwenziwe" From 53900282f8f58bc6d02f6a836c3a25c051757d2f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 2 Sep 2021 04:39:00 +0000 Subject: [PATCH 06/13] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I6d36dc91926963e14ece7d0e2c51c7c13364ed53 --- res/values-ta/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 25a1739c3e..94f534362a 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -138,7 +138,7 @@ "நிலை %1$sக்கு நகர்த்து" "விரும்பும் நிலை %1$sக்கு நகர்த்து" "உருப்படி நகர்த்தப்பட்டது" - "இந்தக் கோப்புறையில் சேர்க்கும்: %1$s" + "இந்த ஃபோல்டரில் சேர்க்கும்: %1$s" "%1$s உள்ள கோப்புறையில் சேர்க்கும்" "கோப்புறையில் உருப்படி சேர்க்கப்பட்டது" "இதனுடன் கோப்புறையை உருவாக்கும்: %1$s" From 3c4e89d0f772b3155fad837ff19f2b4177973fbf Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 2 Sep 2021 04:39:39 +0000 Subject: [PATCH 07/13] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I44b996552c244ac05c8155883514a0a17b9681b7 --- res/values-ta/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 25a1739c3e..94f534362a 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -138,7 +138,7 @@ "நிலை %1$sக்கு நகர்த்து" "விரும்பும் நிலை %1$sக்கு நகர்த்து" "உருப்படி நகர்த்தப்பட்டது" - "இந்தக் கோப்புறையில் சேர்க்கும்: %1$s" + "இந்த ஃபோல்டரில் சேர்க்கும்: %1$s" "%1$s உள்ள கோப்புறையில் சேர்க்கும்" "கோப்புறையில் உருப்படி சேர்க்கப்பட்டது" "இதனுடன் கோப்புறையை உருவாக்கும்: %1$s" From 1ec81a93cc14c103cc0b1d4e4e6e275b45f2d004 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 2 Sep 2021 04:40:17 +0000 Subject: [PATCH 08/13] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I909b0cb92b885cbae61b9fe5e43580b4ef75c013 --- res/values-ta/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 25a1739c3e..94f534362a 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -138,7 +138,7 @@ "நிலை %1$sக்கு நகர்த்து" "விரும்பும் நிலை %1$sக்கு நகர்த்து" "உருப்படி நகர்த்தப்பட்டது" - "இந்தக் கோப்புறையில் சேர்க்கும்: %1$s" + "இந்த ஃபோல்டரில் சேர்க்கும்: %1$s" "%1$s உள்ள கோப்புறையில் சேர்க்கும்" "கோப்புறையில் உருப்படி சேர்க்கப்பட்டது" "இதனுடன் கோப்புறையை உருவாக்கும்: %1$s" From 57e261ceef0d404b2325baa9c1a26cc54b5df1d5 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Tue, 31 Aug 2021 11:36:53 -0700 Subject: [PATCH 09/13] Quickswitch with staged split * UI polish/animations needed. * One known bug (b/198310766), temp work around is to swipe up to home. Bug: 181704764 Test: * Open apps in staged split and quickswitch between GroupedTaskView and fullscreen apps. * QS to fullscreen app and then go into overview and re-launch split screen tasks * QS to fullscreen app, wait 5 seconds, swipe into overview, no GroupedTaskView shown Change-Id: I0ce10a944d86be5c927eeaaef922559a40f39923 --- .../launcher3/BaseQuickstepLauncher.java | 2 +- .../android/quickstep/AbsSwipeUpHandler.java | 2 +- .../android/quickstep/RecentsActivity.java | 2 +- .../quickstep/SwipeUpAnimationLogic.java | 3 +- .../util/LauncherSplitScreenListener.java | 51 ++++++++++++++++++- .../util/SplitSelectStateController.java | 27 +++++++--- .../quickstep/views/GroupedTaskView.java | 12 ++++- .../android/quickstep/views/RecentsView.java | 5 +- 8 files changed, 89 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index b4b29aaae3..033cf8e17b 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -297,7 +297,7 @@ public abstract class BaseQuickstepLauncher extends Launcher mActionsView = findViewById(R.id.overview_actions_view); RecentsView overviewPanel = (RecentsView) getOverviewPanel(); SplitSelectStateController controller = - new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this)); + new SplitSelectStateController(SystemUiProxy.INSTANCE.get(this)); overviewPanel.init(mActionsView, controller); mActionsView.setDp(getDeviceProfile()); mActionsView.updateVerticalMargin(SysUINavigationMode.getMode(this)); diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 6e90a3a5a7..0d83510e15 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -531,7 +531,7 @@ public abstract class AbsSwipeUpHandler, ActivityManager.RunningTaskInfo[] runningTasks; if (mIsSwipeForStagedSplit) { int[] splitTaskIds = - LauncherSplitScreenListener.INSTANCE.getNoCreate().getSplitTaskIds(); + LauncherSplitScreenListener.INSTANCE.getNoCreate().getRunningSplitTaskIds(); runningTasks = new ActivityManager.RunningTaskInfo[splitTaskIds.length]; for (int i = 0; i < splitTaskIds.length; i++) { int taskId = splitTaskIds[i]; diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 03e2395029..cc6cfd72f7 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -122,7 +122,7 @@ public final class RecentsActivity extends StatefulActivity { SYSUI_PROGRESS.set(getRootView().getSysUiScrim(), 0f); SplitSelectStateController controller = - new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this)); + new SplitSelectStateController(SystemUiProxy.INSTANCE.get(this)); mDragLayer.recreateControllers(); mFallbackRecentsView.init(mActionsView, controller); } diff --git a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java index 1f57e9962a..e14dbb181b 100644 --- a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java +++ b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java @@ -90,7 +90,8 @@ public abstract class SwipeUpAnimationLogic implements mGestureState = gestureState; mIsSwipeForStagedSplit = ENABLE_SPLIT_SELECT.get() && - LauncherSplitScreenListener.INSTANCE.getNoCreate().getSplitTaskIds().length > 1; + LauncherSplitScreenListener.INSTANCE.getNoCreate() + .getRunningSplitTaskIds().length > 1; TaskViewSimulator primaryTVS = new TaskViewSimulator(context, gestureState.getActivityInterface()); diff --git a/quickstep/src/com/android/quickstep/util/LauncherSplitScreenListener.java b/quickstep/src/com/android/quickstep/util/LauncherSplitScreenListener.java index da665d4423..0f4ed014f0 100644 --- a/quickstep/src/com/android/quickstep/util/LauncherSplitScreenListener.java +++ b/quickstep/src/com/android/quickstep/util/LauncherSplitScreenListener.java @@ -11,20 +11,54 @@ import com.android.launcher3.util.SplitConfigurationOptions.StagePosition; import com.android.launcher3.util.SplitConfigurationOptions.StageType; import com.android.launcher3.util.SplitConfigurationOptions.StagedSplitTaskPosition; import com.android.quickstep.SystemUiProxy; +import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.wm.shell.splitscreen.ISplitScreenListener; /** * Listeners for system wide split screen position and stage changes. - * Use {@link #getSplitTaskIds()} to determine which tasks, if any, are in staged split. + * + * Use {@link #getRunningSplitTaskIds()} to determine which tasks, if any, are actively in + * staged split. + * + * Use {@link #getPersistentSplitIds()} to know if tasks were in split screen before a quickswitch + * gesture happened. */ public class LauncherSplitScreenListener extends ISplitScreenListener.Stub { public static final MainThreadInitializedObject INSTANCE = new MainThreadInitializedObject<>(LauncherSplitScreenListener::new); + private static final int[] EMPTY_ARRAY = {}; + private final StagedSplitTaskPosition mMainStagePosition = new StagedSplitTaskPosition(); private final StagedSplitTaskPosition mSideStagePosition = new StagedSplitTaskPosition(); + private boolean mIsRecentsListFrozen = false; + private final TaskStackChangeListener mTaskStackListener = new TaskStackChangeListener() { + @Override + public void onRecentTaskListFrozenChanged(boolean frozen) { + super.onRecentTaskListFrozenChanged(frozen); + mIsRecentsListFrozen = frozen; + + if (frozen) { + mPersistentGroupedIds = getRunningSplitTaskIds(); + } else { + // TODO(b/198310766) Need to also explicitly exit split screen if + // we're not currently viewing split screened apps + mPersistentGroupedIds = EMPTY_ARRAY; + } + } + }; + + /** + * Gets set to current split taskIDs whenever the task list is frozen, and set to empty array + * whenever task list unfreezes. + * When not null, this indicates that we need to load a GroupedTaskView as the most recent + * page, so user can quickswitch back to a grouped task. + */ + private int[] mPersistentGroupedIds; + public LauncherSplitScreenListener(Context context) { mMainStagePosition.stageType = SplitConfigurationOptions.STAGE_TYPE_MAIN; mSideStagePosition.stageType = SplitConfigurationOptions.STAGE_TYPE_SIDE; @@ -33,17 +67,30 @@ public class LauncherSplitScreenListener extends ISplitScreenListener.Stub { /** Also call {@link #destroy()} when done. */ public void init() { SystemUiProxy.INSTANCE.getNoCreate().registerSplitScreenListener(this); + TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener); } public void destroy() { SystemUiProxy.INSTANCE.getNoCreate().unregisterSplitScreenListener(this); + TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener); } + /** + * This method returns the active split taskIDs that were active if a user quickswitched from + * split screen to a fullscreen app as long as the recents task list remains frozen. + */ + public int[] getPersistentSplitIds() { + if (mIsRecentsListFrozen) { + return mPersistentGroupedIds; + } else { + return getRunningSplitTaskIds(); + } + } /** * @return index 0 will be task in left/top position, index 1 in right/bottom position. * Will return empty array if device is not in staged split */ - public int[] getSplitTaskIds() { + public int[] getRunningSplitTaskIds() { if (mMainStagePosition.taskId == -1 || mSideStagePosition.taskId == -1) { return new int[]{}; } diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java index ac5f5d81be..3069504943 100644 --- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java @@ -22,7 +22,6 @@ import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITIO import android.app.ActivityThread; import android.graphics.Rect; -import android.os.Handler; import android.os.IBinder; import android.view.RemoteAnimationAdapter; import android.view.SurfaceControl; @@ -40,6 +39,8 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; import com.android.systemui.shared.system.RemoteTransitionCompat; import com.android.systemui.shared.system.RemoteTransitionRunner; +import java.util.function.Consumer; + /** * Represent data needed for the transient state when user has selected one app for split screen * and is in the process of either a) selecting a second app or b) exiting intention to invoke split @@ -52,7 +53,7 @@ public class SplitSelectStateController { private Task mSecondTask; private Rect mInitialBounds; - public SplitSelectStateController(Handler handler, SystemUiProxy systemUiProxy) { + public SplitSelectStateController(SystemUiProxy systemUiProxy) { mSystemUiProxy = systemUiProxy; } @@ -71,13 +72,14 @@ public class SplitSelectStateController { */ public void setSecondTaskId(Task taskView) { mSecondTask = taskView; - launchTasks(mInitialTask, mSecondTask, mStagePosition); + launchTasks(mInitialTask, mSecondTask, mStagePosition, null /*callback*/); } /** * @param stagePosition representing location of task1 */ - public void launchTasks(Task task1, Task task2, @StagePosition int stagePosition) { + public void launchTasks(Task task1, Task task2, @StagePosition int stagePosition, + Consumer callback) { // Assume initial task is for top/left part of screen final int[] taskIds = stagePosition == STAGE_POSITION_TOP_OR_LEFT ? new int[]{task1.key.id, task2.key.id} @@ -90,7 +92,7 @@ public class SplitSelectStateController { new RemoteTransitionCompat(animationRunner, MAIN_EXECUTOR)); } else { RemoteSplitLaunchAnimationRunner animationRunner = - new RemoteSplitLaunchAnimationRunner(task1, task2); + new RemoteSplitLaunchAnimationRunner(task1, task2, callback); final RemoteAnimationAdapter adapter = new RemoteAnimationAdapter( RemoteAnimationAdapterCompat.wrapRemoteAnimationRunner(animationRunner), 300, 150, @@ -136,10 +138,13 @@ public class SplitSelectStateController { private final Task mInitialTask; private final Task mSecondTask; + private final Consumer mSuccessCallback; - RemoteSplitLaunchAnimationRunner(Task initialTask, Task secondTask) { + RemoteSplitLaunchAnimationRunner(Task initialTask, Task secondTask, + Consumer successCallback) { mInitialTask = initialTask; mSecondTask = secondTask; + mSuccessCallback = successCallback; } @Override @@ -147,13 +152,21 @@ public class SplitSelectStateController { RemoteAnimationTargetCompat[] wallpapers, RemoteAnimationTargetCompat[] nonApps, Runnable finishedCallback) { TaskViewUtils.composeRecentsSplitLaunchAnimatorLegacy(mInitialTask, - mSecondTask, apps, wallpapers, nonApps, finishedCallback); + mSecondTask, apps, wallpapers, nonApps, () -> { + finishedCallback.run(); + if (mSuccessCallback != null) { + mSuccessCallback.accept(true); + } + }); // After successful launch, call resetState resetState(); } @Override public void onAnimationCancelled() { + if (mSuccessCallback != null) { + mSuccessCallback.accept(false); + } resetState(); } } diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java index e1e1c65c55..d3077ad276 100644 --- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java +++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java @@ -3,6 +3,8 @@ package com.android.quickstep.views; import android.content.Context; import android.util.AttributeSet; +import androidx.annotation.NonNull; + import com.android.launcher3.R; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.SplitConfigurationOptions; @@ -12,6 +14,8 @@ import com.android.quickstep.util.CancellableTask; import com.android.quickstep.util.RecentsOrientedState; import com.android.systemui.shared.recents.model.Task; +import java.util.function.Consumer; + /** * TaskView that contains and shows thumbnails for not one, BUT TWO(!!) tasks * @@ -98,10 +102,16 @@ public class GroupedTaskView extends TaskView { @Override public RunnableList launchTaskAnimated() { getRecentsView().getSplitPlaceholder().launchTasks(mTask, mSecondaryTask, - SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT); + SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT, null /*callback*/); return null; } + @Override + public void launchTask(@NonNull Consumer callback, boolean freezeTaskList) { + getRecentsView().getSplitPlaceholder().launchTasks(mTask, mSecondaryTask, + SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT, callback); + } + @Override public void onRecycle() { super.onRecycle(); diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 810eccea8a..c6e2a5d199 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1259,7 +1259,7 @@ public abstract class RecentsView Date: Thu, 26 Aug 2021 11:55:28 -0700 Subject: [PATCH 10/13] Enable staged split for sc-v2 Bug: 181704764 Change-Id: Id4b0d8a2e3cc110a6aad5f33e29bc6f54c7e3c44 --- src/com/android/launcher3/config/FeatureFlags.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index d5972a72b6..f091262c35 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -239,7 +239,7 @@ public final class FeatureFlags { "Enables scrim during app launch animation."); public static final BooleanFlag ENABLE_SPLIT_SELECT = getDebugFlag( - "ENABLE_SPLIT_SELECT", false, "Uses new split screen selection overview UI"); + "ENABLE_SPLIT_SELECT", true, "Uses new split screen selection overview UI"); public static final BooleanFlag ENABLE_ENFORCED_ROUNDED_CORNERS = new DeviceFlag( "ENABLE_ENFORCED_ROUNDED_CORNERS", true, "Enforce rounded corners on all App Widgets"); From 4dd4159fdc47e8644cb557af186bed033a106106 Mon Sep 17 00:00:00 2001 From: Nick Chameyev Date: Fri, 27 Aug 2021 14:11:53 +0100 Subject: [PATCH 11/13] Add taskbar icons unfold animation Adds 'move from center' animation for taskbar icons when unfolding foldable devices. Moves unfold transition progress provider from quickstep launcher activity to TouchInteractionService to widen the scope when this provider is available to cover both launcher activity and taskbar. Launcher activity and taskbar get their own instances of unfold transition progress provider using ScopedUnfoldTransitionProgressProvider wrapper. This wrapper allows to get transition progress provider that emits events only when clients are ready to handle them. Bug: 193794563 Test: manual Change-Id: I27581bd4e145a74f526bf60f2a545e56ded322f9 --- .../launcher3/BaseQuickstepLauncher.java | 65 ++++++++ .../taskbar/TaskbarActivityContext.java | 22 +-- .../launcher3/taskbar/TaskbarControllers.java | 5 + .../launcher3/taskbar/TaskbarManager.java | 13 +- .../TaskbarUnfoldAnimationController.java | 87 +++++++++++ .../taskbar/TaskbarViewController.java | 53 ++++++- .../uioverrides/QuickstepLauncher.java | 54 ------- .../LauncherUnfoldAnimationController.java | 58 ++------ ...ViewsMoveFromCenterTranslationApplier.java | 45 ++++++ ...copedUnfoldTransitionProgressProvider.java | 140 ++++++++++++++++++ ...UnfoldMoveFromCenterWorkspaceAnimator.java | 21 +-- src/com/android/launcher3/BubbleTextView.java | 23 ++- .../android/launcher3/folder/FolderIcon.java | 33 ++++- 13 files changed, 484 insertions(+), 135 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java create mode 100644 quickstep/src/com/android/quickstep/util/LauncherViewsMoveFromCenterTranslationApplier.java create mode 100644 quickstep/src/com/android/quickstep/util/ScopedUnfoldTransitionProgressProvider.java diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index b4b29aaae3..ca4256769e 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -35,6 +35,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.ServiceConnection; +import android.hardware.SensorManager; +import android.hardware.devicestate.DeviceStateManager; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Handler; @@ -73,6 +75,8 @@ import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; import com.android.quickstep.TouchInteractionService; import com.android.quickstep.TouchInteractionService.TISBinder; +import com.android.quickstep.util.LauncherUnfoldAnimationController; +import com.android.quickstep.util.ProxyScreenStatusProvider; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.RemoteFadeOutAnimationListener; import com.android.quickstep.util.SplitSelectStateController; @@ -82,6 +86,9 @@ import com.android.quickstep.views.SplitPlaceholderView; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityOptionsCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.unfold.UnfoldTransitionFactory; +import com.android.systemui.unfold.UnfoldTransitionProgressProvider; +import com.android.systemui.unfold.config.UnfoldTransitionConfig; import java.util.List; import java.util.stream.Stream; @@ -117,6 +124,7 @@ public abstract class BaseQuickstepLauncher extends Launcher public void onServiceConnected(ComponentName componentName, IBinder iBinder) { mTaskbarManager = ((TISBinder) iBinder).getTaskbarManager(); mTaskbarManager.setLauncher(BaseQuickstepLauncher.this); + Log.d(TAG, "TIS service connected"); resetServiceBindRetryState(); @@ -142,16 +150,41 @@ public abstract class BaseQuickstepLauncher extends Launcher private @Nullable DragOptions mNextWorkspaceDragOptions = null; private SplitPlaceholderView mSplitPlaceholderView; + private @Nullable UnfoldTransitionProgressProvider mUnfoldTransitionProgressProvider; + private @Nullable LauncherUnfoldAnimationController mLauncherUnfoldAnimationController; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SysUINavigationMode.INSTANCE.get(this).addModeChangeListener(this); addMultiWindowModeChangedListener(mDepthController); + initUnfoldTransitionProgressProvider(); + } + + @Override + protected void onResume() { + super.onResume(); + + if (mLauncherUnfoldAnimationController != null) { + mLauncherUnfoldAnimationController.onResume(); + } + } + + @Override + protected void onPause() { + if (mLauncherUnfoldAnimationController != null) { + mLauncherUnfoldAnimationController.onPause(); + } + + super.onPause(); } @Override public void onDestroy() { mAppTransitionManager.onActivityDestroyed(); + if (mUnfoldTransitionProgressProvider != null) { + mUnfoldTransitionProgressProvider.destroy(); + } SysUINavigationMode.INSTANCE.get(this).removeModeChangeListener(this); @@ -160,6 +193,11 @@ public abstract class BaseQuickstepLauncher extends Launcher mTaskbarManager.clearLauncher(this); } resetServiceBindRetryState(); + + if (mLauncherUnfoldAnimationController != null) { + mLauncherUnfoldAnimationController.onDestroy(); + } + super.onDestroy(); } @@ -334,6 +372,28 @@ public abstract class BaseQuickstepLauncher extends Launcher mConnectionAttempts = 0; } + private void initUnfoldTransitionProgressProvider() { + final UnfoldTransitionConfig config = UnfoldTransitionFactory.createConfig(this); + if (config.isEnabled()) { + mUnfoldTransitionProgressProvider = + UnfoldTransitionFactory.createUnfoldTransitionProgressProvider( + this, + config, + ProxyScreenStatusProvider.INSTANCE, + getSystemService(DeviceStateManager.class), + getSystemService(SensorManager.class), + getMainThreadHandler(), + getMainExecutor() + ); + + mLauncherUnfoldAnimationController = new LauncherUnfoldAnimationController( + this, + getWindowManager(), + mUnfoldTransitionProgressProvider + ); + } + } + public void setTaskbarUIController(LauncherTaskbarUIController taskbarUIController) { mTaskbarUIController = taskbarUIController; } @@ -373,6 +433,11 @@ public abstract class BaseQuickstepLauncher extends Launcher return mTaskbarStateHandler; } + @Nullable + public UnfoldTransitionProgressProvider getUnfoldTransitionProgressProvider() { + return mUnfoldTransitionProgressProvider; + } + @Override public boolean supportsAdaptiveIconAnimation(View clickedView) { return mAppTransitionManager.hasControlRemoteAppTransitionPermission() diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 8c12567ccf..51d031b3f2 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -62,6 +62,7 @@ import com.android.launcher3.util.ViewCache; import com.android.launcher3.views.ActivityContext; import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.SysUINavigationMode.Mode; +import com.android.quickstep.util.ScopedUnfoldTransitionProgressProvider; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -98,7 +99,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ private boolean mIsDestroyed = false; public TaskbarActivityContext(Context windowContext, DeviceProfile dp, - TaskbarNavButtonController buttonController) { + TaskbarNavButtonController buttonController, ScopedUnfoldTransitionProgressProvider + unfoldTransitionProgressProvider) { super(windowContext, Themes.getActivityThemeRes(windowContext)); mDeviceProfile = dp; @@ -120,6 +122,14 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ FrameLayout navButtonsView = mDragLayer.findViewById(R.id.navbuttons_view); StashedHandleView stashedHandleView = mDragLayer.findViewById(R.id.stashed_handle); + Display display = windowContext.getDisplay(); + Context c = display.getDisplayId() == Display.DEFAULT_DISPLAY + ? windowContext.getApplicationContext() + : windowContext.getApplicationContext().createDisplayContext(display); + mWindowManager = c.getSystemService(WindowManager.class); + mLeftCorner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT); + mRightCorner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT); + // Construct controllers. mControllers = new TaskbarControllers(this, new TaskbarDragController(this), @@ -129,18 +139,12 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ R.color.popup_color_primary_light), new TaskbarDragLayerController(this, mDragLayer), new TaskbarViewController(this, taskbarView), + new TaskbarUnfoldAnimationController(unfoldTransitionProgressProvider, + mWindowManager), new TaskbarKeyguardController(this), new StashedHandleViewController(this, stashedHandleView), new TaskbarStashController(this), new TaskbarEduController(this)); - - Display display = windowContext.getDisplay(); - Context c = display.getDisplayId() == Display.DEFAULT_DISPLAY - ? windowContext.getApplicationContext() - : windowContext.getApplicationContext().createDisplayContext(display); - mWindowManager = c.getSystemService(WindowManager.class); - mLeftCorner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT); - mRightCorner = display.getRoundedCorner(RoundedCorner.POSITION_BOTTOM_RIGHT); } public void init() { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index 11975430b1..6144881902 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -31,6 +31,7 @@ public class TaskbarControllers { public final RotationButtonController rotationButtonController; public final TaskbarDragLayerController taskbarDragLayerController; public final TaskbarViewController taskbarViewController; + public final TaskbarUnfoldAnimationController taskbarUnfoldAnimationController; public final TaskbarKeyguardController taskbarKeyguardController; public final StashedHandleViewController stashedHandleViewController; public final TaskbarStashController taskbarStashController; @@ -46,6 +47,7 @@ public class TaskbarControllers { RotationButtonController rotationButtonController, TaskbarDragLayerController taskbarDragLayerController, TaskbarViewController taskbarViewController, + TaskbarUnfoldAnimationController taskbarUnfoldAnimationController, TaskbarKeyguardController taskbarKeyguardController, StashedHandleViewController stashedHandleViewController, TaskbarStashController taskbarStashController, @@ -57,6 +59,7 @@ public class TaskbarControllers { this.rotationButtonController = rotationButtonController; this.taskbarDragLayerController = taskbarDragLayerController; this.taskbarViewController = taskbarViewController; + this.taskbarUnfoldAnimationController = taskbarUnfoldAnimationController; this.taskbarKeyguardController = taskbarKeyguardController; this.stashedHandleViewController = stashedHandleViewController; this.taskbarStashController = taskbarStashController; @@ -75,6 +78,7 @@ public class TaskbarControllers { } taskbarDragLayerController.init(this); taskbarViewController.init(this); + taskbarUnfoldAnimationController.init(this); taskbarKeyguardController.init(navbarButtonsViewController); stashedHandleViewController.init(this); taskbarStashController.init(this); @@ -89,6 +93,7 @@ public class TaskbarControllers { rotationButtonController.onDestroy(); taskbarDragLayerController.onDestroy(); taskbarKeyguardController.onDestroy(); + taskbarUnfoldAnimationController.onDestroy(); taskbarViewController.onDestroy(); stashedHandleViewController.onDestroy(); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java index 4ed83f295e..ec98bbf05a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java @@ -42,6 +42,7 @@ import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.SysUINavigationMode.Mode; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TouchInteractionService; +import com.android.quickstep.util.ScopedUnfoldTransitionProgressProvider; /** * Class to manage taskbar lifecycle @@ -58,6 +59,10 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen private final TaskbarNavButtonController mNavButtonController; private final SettingsCache.OnChangeListener mUserSetupCompleteListener; + // The source for this provider is set when Launcher is available + private final ScopedUnfoldTransitionProgressProvider mUnfoldProgressProvider = + new ScopedUnfoldTransitionProgressProvider(); + private TaskbarActivityContext mTaskbarActivityContext; private BaseQuickstepLauncher mLauncher; /** @@ -120,6 +125,9 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen */ public void setLauncher(@NonNull BaseQuickstepLauncher launcher) { mLauncher = launcher; + mUnfoldProgressProvider.setSourceProvider(launcher + .getUnfoldTransitionProgressProvider()); + if (mTaskbarActivityContext != null) { mTaskbarActivityContext.setUIController( new LauncherTaskbarUIController(launcher, mTaskbarActivityContext)); @@ -135,6 +143,7 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen if (mTaskbarActivityContext != null) { mTaskbarActivityContext.setUIController(TaskbarUIController.DEFAULT); } + mUnfoldProgressProvider.setSourceProvider(null); } } @@ -153,8 +162,8 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen return; } - mTaskbarActivityContext = new TaskbarActivityContext( - mContext, dp.copy(mContext), mNavButtonController); + mTaskbarActivityContext = new TaskbarActivityContext(mContext, dp.copy(mContext), + mNavButtonController, mUnfoldProgressProvider); mTaskbarActivityContext.init(); if (mLauncher != null) { mTaskbarActivityContext.setUIController( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java new file mode 100644 index 0000000000..43f015cd2d --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUnfoldAnimationController.java @@ -0,0 +1,87 @@ +/* + * 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.launcher3.taskbar; + +import android.view.View; +import android.view.WindowManager; + +import com.android.quickstep.util.LauncherViewsMoveFromCenterTranslationApplier; +import com.android.quickstep.util.ScopedUnfoldTransitionProgressProvider; +import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; + +/** + * Controls animation of taskbar icons when unfolding foldable devices + */ +public class TaskbarUnfoldAnimationController { + + private final ScopedUnfoldTransitionProgressProvider mUnfoldTransitionProgressProvider; + private final UnfoldMoveFromCenterAnimator mMoveFromCenterAnimator; + private final TransitionListener mTransitionListener = new TransitionListener(); + private TaskbarViewController mTaskbarViewController; + + public TaskbarUnfoldAnimationController(ScopedUnfoldTransitionProgressProvider + unfoldTransitionProgressProvider, WindowManager windowManager) { + mUnfoldTransitionProgressProvider = unfoldTransitionProgressProvider; + mMoveFromCenterAnimator = new UnfoldMoveFromCenterAnimator(windowManager, + new LauncherViewsMoveFromCenterTranslationApplier()); + } + + /** + * Initializes the controller + * @param taskbarControllers references to all other taskbar controllers + */ + public void init(TaskbarControllers taskbarControllers) { + mTaskbarViewController = taskbarControllers.taskbarViewController; + mTaskbarViewController.addOneTimePreDrawListener(() -> + mUnfoldTransitionProgressProvider.setReadyToHandleTransition(true)); + mUnfoldTransitionProgressProvider.addCallback(mTransitionListener); + } + + /** + * Destroys the controller + */ + public void onDestroy() { + mUnfoldTransitionProgressProvider.setReadyToHandleTransition(false); + mUnfoldTransitionProgressProvider.removeCallback(mTransitionListener); + } + + private class TransitionListener implements TransitionProgressListener { + + @Override + public void onTransitionStarted() { + mMoveFromCenterAnimator.updateDisplayProperties(); + View[] icons = mTaskbarViewController.getIconViews(); + for (View icon : icons) { + // TODO(b/193794563) we should re-register views if they are re-bound/re-inflated + // during the animation + mMoveFromCenterAnimator.registerViewForAnimation(icon); + } + + mMoveFromCenterAnimator.onTransitionStarted(); + } + + @Override + public void onTransitionFinished() { + mMoveFromCenterAnimator.onTransitionFinished(); + } + + @Override + public void onTransitionProgress(float progress) { + mMoveFromCenterAnimator.onTransitionProgress(progress); + } + } +} diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index f1748afce3..f359a3dbaa 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -16,20 +16,24 @@ package com.android.launcher3.taskbar; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; -import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X; import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.quickstep.AnimatedFloat.VALUE; import android.graphics.Rect; +import android.util.FloatProperty; import android.view.MotionEvent; import android.view.View; +import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnPreDrawListener; +import com.android.launcher3.BubbleTextView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; +import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.AnimatedFloat; @@ -117,6 +121,25 @@ public class TaskbarViewController { mTaskbarView.setClickAndLongClickListenersForIcon(icon); } + /** + * Adds one time pre draw listener to the taskbar view, it is called before + * drawing a frame and invoked only once + * @param listener callback that will be invoked before drawing the next frame + */ + public void addOneTimePreDrawListener(Runnable listener) { + mTaskbarView.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() { + @Override + public boolean onPreDraw() { + final ViewTreeObserver viewTreeObserver = mTaskbarView.getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + listener.run(); + viewTreeObserver.removeOnPreDrawListener(this); + } + return true; + } + }); + } + public Rect getIconLayoutBounds() { return mTaskbarView.getIconLayoutBounds(); } @@ -194,7 +217,7 @@ public class TaskbarViewController { float childCenter = (child.getLeft() + child.getRight()) / 2; float hotseatIconCenter = hotseatPadding.left + hotseatCellSize * info.screenId + hotseatCellSize / 2; - setter.setFloat(child, VIEW_TRANSLATE_X, hotseatIconCenter - childCenter, LINEAR); + setter.setFloat(child, ICON_TRANSLATE_X, hotseatIconCenter - childCenter, LINEAR); } AnimatorPlaybackController controller = setter.createPlaybackController(); @@ -257,4 +280,30 @@ public class TaskbarViewController { return false; } } + + public static final FloatProperty ICON_TRANSLATE_X = + new FloatProperty("taskbarAligmentTranslateX") { + + @Override + public void setValue(View view, float v) { + if (view instanceof BubbleTextView) { + ((BubbleTextView) view).setTranslationXForTaskbarAlignmentAnimation(v); + } else if (view instanceof FolderIcon) { + ((FolderIcon) view).setTranslationForTaskbarAlignmentAnimation(v); + } else { + view.setTranslationX(v); + } + } + + @Override + public Float get(View view) { + if (view instanceof BubbleTextView) { + return ((BubbleTextView) view) + .getTranslationXForTaskbarAlignmentAnimation(); + } else if (view instanceof FolderIcon) { + return ((FolderIcon) view).getTranslationXForTaskbarAlignmentAnimation(); + } + return view.getTranslationX(); + } + }; } diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 14bc380b8b..2009cd75d9 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -36,13 +36,9 @@ import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SY import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; -import android.hardware.SensorManager; -import android.hardware.devicestate.DeviceStateManager; import android.view.HapticFeedbackConstants; import android.view.View; -import androidx.annotation.Nullable; - import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; @@ -79,14 +75,9 @@ import com.android.quickstep.SysUINavigationMode; import com.android.quickstep.SysUINavigationMode.Mode; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; -import com.android.quickstep.util.LauncherUnfoldAnimationController; -import com.android.quickstep.util.ProxyScreenStatusProvider; import com.android.quickstep.util.QuickstepOnboardingPrefs; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; -import com.android.systemui.unfold.UnfoldTransitionFactory; -import com.android.systemui.unfold.UnfoldTransitionProgressProvider; -import com.android.systemui.unfold.config.UnfoldTransitionConfig; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -106,51 +97,10 @@ public class QuickstepLauncher extends BaseQuickstepLauncher { private FixedContainerItems mAllAppsPredictions; private HotseatPredictionController mHotseatPredictionController; - @Nullable - private LauncherUnfoldAnimationController mLauncherUnfoldAnimationController; - @Override protected void setupViews() { super.setupViews(); mHotseatPredictionController = new HotseatPredictionController(this); - - final UnfoldTransitionConfig config = UnfoldTransitionFactory.createConfig(this); - if (config.isEnabled()) { - final UnfoldTransitionProgressProvider unfoldTransitionProgressProvider = - UnfoldTransitionFactory.createUnfoldTransitionProgressProvider( - this, - config, - ProxyScreenStatusProvider.INSTANCE, - getSystemService(DeviceStateManager.class), - getSystemService(SensorManager.class), - getMainThreadHandler(), - getMainExecutor() - ); - - mLauncherUnfoldAnimationController = new LauncherUnfoldAnimationController( - this, - getWindowManager(), - unfoldTransitionProgressProvider - ); - } - } - - @Override - protected void onResume() { - super.onResume(); - - if (mLauncherUnfoldAnimationController != null) { - mLauncherUnfoldAnimationController.onResume(); - } - } - - @Override - protected void onPause() { - if (mLauncherUnfoldAnimationController != null) { - mLauncherUnfoldAnimationController.onPause(); - } - - super.onPause(); } @Override @@ -281,10 +231,6 @@ public class QuickstepLauncher extends BaseQuickstepLauncher { public void onDestroy() { super.onDestroy(); mHotseatPredictionController.destroy(); - - if (mLauncherUnfoldAnimationController != null) { - mLauncherUnfoldAnimationController.onDestroy(); - } } @Override diff --git a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java index c5ab84daf7..47d35808d6 100644 --- a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java +++ b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java @@ -37,26 +37,23 @@ public class LauncherUnfoldAnimationController { private static final float MAX_WIDTH_INSET_FRACTION = 0.15f; private final Launcher mLauncher; - private final UnfoldTransitionProgressProvider mUnfoldTransitionProgressProvider; - private final UnfoldMoveFromCenterWorkspaceAnimator mMoveFromCenterWorkspaceAnimation; @Nullable private HorizontalInsettableView mQsbInsettable; - private final AnimationListener mAnimationListener = new AnimationListener(); - - private boolean mIsTransitionRunning = false; - private boolean mIsReadyToPlayAnimation = false; + private final ScopedUnfoldTransitionProgressProvider mProgressProvider; public LauncherUnfoldAnimationController( Launcher launcher, WindowManager windowManager, UnfoldTransitionProgressProvider unfoldTransitionProgressProvider) { mLauncher = launcher; - mUnfoldTransitionProgressProvider = unfoldTransitionProgressProvider; - mMoveFromCenterWorkspaceAnimation = new UnfoldMoveFromCenterWorkspaceAnimator(launcher, - windowManager); - mUnfoldTransitionProgressProvider.addCallback(mAnimationListener); + mProgressProvider = new ScopedUnfoldTransitionProgressProvider( + unfoldTransitionProgressProvider); + + mProgressProvider.addCallback(new UnfoldMoveFromCenterWorkspaceAnimator(launcher, + windowManager)); + mProgressProvider.addCallback(new QsbAnimationListener()); } /** @@ -73,7 +70,7 @@ public class LauncherUnfoldAnimationController { @Override public boolean onPreDraw() { if (obs.isAlive()) { - onPreDrawAfterResume(); + mProgressProvider.setReadyToHandleTransition(true); obs.removeOnPreDrawListener(this); } return true; @@ -85,12 +82,7 @@ public class LauncherUnfoldAnimationController { * Called when launcher activity is paused */ public void onPause() { - if (mIsTransitionRunning) { - mIsTransitionRunning = false; - mAnimationListener.onTransitionFinished(); - } - - mIsReadyToPlayAnimation = false; + mProgressProvider.setReadyToHandleTransition(false); mQsbInsettable = null; } @@ -98,48 +90,24 @@ public class LauncherUnfoldAnimationController { * Called when launcher activity is destroyed */ public void onDestroy() { - mUnfoldTransitionProgressProvider.removeCallback(mAnimationListener); + mProgressProvider.destroy(); } - /** - * Called after performing layouting of the views after configuration change - */ - private void onPreDrawAfterResume() { - mIsReadyToPlayAnimation = true; - - if (mIsTransitionRunning) { - mMoveFromCenterWorkspaceAnimation.onTransitionStarted(); - } - } - - private class AnimationListener implements TransitionProgressListener { + private class QsbAnimationListener implements TransitionProgressListener { @Override public void onTransitionStarted() { - mIsTransitionRunning = true; - - if (mIsReadyToPlayAnimation) { - mMoveFromCenterWorkspaceAnimation.onTransitionStarted(); - } } @Override public void onTransitionFinished() { - if (mIsReadyToPlayAnimation) { - mMoveFromCenterWorkspaceAnimation.onTransitionFinished(); - - if (mQsbInsettable != null) { - mQsbInsettable.setHorizontalInsets(0); - } + if (mQsbInsettable != null) { + mQsbInsettable.setHorizontalInsets(0); } - - mIsTransitionRunning = false; } @Override public void onTransitionProgress(float progress) { - mMoveFromCenterWorkspaceAnimation.onTransitionProgress(progress); - if (mQsbInsettable != null) { float insetPercentage = comp(progress) * MAX_WIDTH_INSET_FRACTION; mQsbInsettable.setHorizontalInsets(insetPercentage); diff --git a/quickstep/src/com/android/quickstep/util/LauncherViewsMoveFromCenterTranslationApplier.java b/quickstep/src/com/android/quickstep/util/LauncherViewsMoveFromCenterTranslationApplier.java new file mode 100644 index 0000000000..effdfdd97b --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/LauncherViewsMoveFromCenterTranslationApplier.java @@ -0,0 +1,45 @@ +/* + * 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.NonNull; +import android.view.View; + +import com.android.launcher3.BubbleTextView; +import com.android.launcher3.folder.FolderIcon; +import com.android.launcher3.widget.NavigableAppWidgetHostView; +import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator.TranslationApplier; + +/** + * Class that allows to set translations for move from center animation independently + * from other translations for certain launcher views + */ +public class LauncherViewsMoveFromCenterTranslationApplier implements TranslationApplier { + + @Override + public void apply(@NonNull View view, float x, float y) { + if (view instanceof NavigableAppWidgetHostView) { + ((NavigableAppWidgetHostView) view).setTranslationForMoveFromCenterAnimation(x, y); + } else if (view instanceof BubbleTextView) { + ((BubbleTextView) view).setTranslationForMoveFromCenterAnimation(x, y); + } else if (view instanceof FolderIcon) { + ((FolderIcon) view).setTranslationForMoveFromCenterAnimation(x, y); + } else { + view.setTranslationX(x); + view.setTranslationY(y); + } + } +} diff --git a/quickstep/src/com/android/quickstep/util/ScopedUnfoldTransitionProgressProvider.java b/quickstep/src/com/android/quickstep/util/ScopedUnfoldTransitionProgressProvider.java new file mode 100644 index 0000000000..2ef311ff3e --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/ScopedUnfoldTransitionProgressProvider.java @@ -0,0 +1,140 @@ +/* + * 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.NonNull; +import android.annotation.Nullable; + +import com.android.systemui.unfold.UnfoldTransitionProgressProvider; +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * Manages progress listeners that can have smaller lifespan than the unfold animation. + * Allows to limit getting transition updates to only when + * {@link ScopedUnfoldTransitionProgressProvider#setReadyToHandleTransition} is called + * with readyToHandleTransition = true + * + * If the transition has already started by the moment when the clients are ready to play + * the transition then it will report transition started callback and current animation progress. + */ +public final class ScopedUnfoldTransitionProgressProvider implements + UnfoldTransitionProgressProvider, TransitionProgressListener { + + private static final float PROGRESS_UNSET = -1f; + + @Nullable + private UnfoldTransitionProgressProvider mSource; + + private final List mListeners = new ArrayList<>(); + + private boolean mIsReadyToHandleTransition; + private boolean mIsTransitionRunning; + private float mLastTransitionProgress = PROGRESS_UNSET; + + public ScopedUnfoldTransitionProgressProvider() { + this(null); + } + + public ScopedUnfoldTransitionProgressProvider(@Nullable UnfoldTransitionProgressProvider + source) { + setSourceProvider(source); + } + + /** + * Sets the source for the unfold transition progress updates, + * it replaces current provider if it is already set + * @param provider transition provider that emits transition progress updates + */ + public void setSourceProvider(@Nullable UnfoldTransitionProgressProvider provider) { + if (mSource != null) { + mSource.removeCallback(this); + } + + if (provider != null) { + mSource = provider; + mSource.addCallback(this); + } + } + + /** + * Allows to notify this provide whether the listeners can play the transition or not. + * Call this method with readyToHandleTransition = true when all listeners + * are ready to consume the transition progress events. + * Call it with readyToHandleTransition = false when listeners can't process the events. + */ + public void setReadyToHandleTransition(boolean isReadyToHandleTransition) { + if (mIsTransitionRunning) { + if (mIsReadyToHandleTransition) { + mListeners.forEach(TransitionProgressListener::onTransitionStarted); + + if (mLastTransitionProgress != PROGRESS_UNSET) { + mListeners.forEach(listener -> + listener.onTransitionProgress(mLastTransitionProgress)); + } + } else { + mIsTransitionRunning = false; + mListeners.forEach(TransitionProgressListener::onTransitionFinished); + } + } + + mIsReadyToHandleTransition = isReadyToHandleTransition; + } + + @Override + public void addCallback(@NonNull TransitionProgressListener listener) { + mListeners.add(listener); + } + + @Override + public void removeCallback(@NonNull TransitionProgressListener listener) { + mListeners.remove(listener); + } + + @Override + public void destroy() { + mSource.removeCallback(this); + } + + @Override + public void onTransitionStarted() { + this.mIsTransitionRunning = true; + if (mIsReadyToHandleTransition) { + mListeners.forEach(TransitionProgressListener::onTransitionStarted); + } + } + + @Override + public void onTransitionProgress(float progress) { + if (mIsReadyToHandleTransition) { + mListeners.forEach(listener -> listener.onTransitionProgress(progress)); + } + + mLastTransitionProgress = progress; + } + + @Override + public void onTransitionFinished() { + if (mIsReadyToHandleTransition) { + mListeners.forEach(TransitionProgressListener::onTransitionFinished); + } + + mIsTransitionRunning = false; + mLastTransitionProgress = PROGRESS_UNSET; + } +} diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java index 482092d367..95403b2d0c 100644 --- a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java @@ -15,20 +15,16 @@ */ package com.android.quickstep.util; -import android.annotation.NonNull; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; -import com.android.launcher3.BubbleTextView; 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.launcher3.widget.NavigableAppWidgetHostView; import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator; -import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator.TranslationApplier; import com.android.systemui.unfold.UnfoldTransitionProgressProvider; import java.util.HashMap; @@ -49,7 +45,7 @@ public class UnfoldMoveFromCenterWorkspaceAnimator public UnfoldMoveFromCenterWorkspaceAnimator(Launcher launcher, WindowManager windowManager) { mLauncher = launcher; mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager, - new WorkspaceViewsTranslationApplier()); + new LauncherViewsMoveFromCenterTranslationApplier()); } @Override @@ -122,19 +118,4 @@ public class UnfoldMoveFromCenterWorkspaceAnimator view.setClipChildren(originalClipChildren); } } - - private static class WorkspaceViewsTranslationApplier implements TranslationApplier { - - @Override - public void apply(@NonNull View view, float x, float y) { - if (view instanceof NavigableAppWidgetHostView) { - ((NavigableAppWidgetHostView) view).setTranslationForMoveFromCenterAnimation(x, y); - } else if (view instanceof BubbleTextView) { - ((BubbleTextView) view).setTranslationForMoveFromCenterAnimation(x, y); - } else { - view.setTranslationX(x); - view.setTranslationY(y); - } - } - } } diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index e52d1be18c..54920e1e17 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -90,6 +90,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, private final PointF mTranslationForReorderBounce = new PointF(0, 0); private final PointF mTranslationForReorderPreview = new PointF(0, 0); + private float mTranslationXForTaskbarAlignmentAnimation = 0f; + private final PointF mTranslationForMoveFromCenterAnimation = new PointF(0, 0); private float mScaleForReorderBounce = 1f; @@ -825,7 +827,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, private void updateTranslation() { super.setTranslationX(mTranslationForReorderBounce.x + mTranslationForReorderPreview.x - + mTranslationForMoveFromCenterAnimation.x); + + mTranslationForMoveFromCenterAnimation.x + + mTranslationXForTaskbarAlignmentAnimation); super.setTranslationY(mTranslationForReorderBounce.y + mTranslationForReorderPreview.y + mTranslationForMoveFromCenterAnimation.y); } @@ -860,11 +863,29 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, return mScaleForReorderBounce; } + /** + * Sets translation values for move from center animation + */ public void setTranslationForMoveFromCenterAnimation(float x, float y) { mTranslationForMoveFromCenterAnimation.set(x, y); updateTranslation(); } + /** + * Sets translationX for taskbar to launcher alignment animation + */ + public void setTranslationXForTaskbarAlignmentAnimation(float translationX) { + mTranslationXForTaskbarAlignmentAnimation = translationX; + updateTranslation(); + } + + /** + * Returns translationX value for taskbar to launcher alignment animation + */ + public float getTranslationXForTaskbarAlignmentAnimation() { + return mTranslationXForTaskbarAlignmentAnimation; + } + public View getView() { return this; } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 60d8cdbd7c..439df80284 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -132,6 +132,9 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel private Rect mTouchArea = new Rect(); + private final PointF mTranslationForMoveFromCenterAnimation = new PointF(0, 0); + private float mTranslationXForTaskbarAlignmentAnimation = 0f; + private final PointF mTranslationForReorderBounce = new PointF(0, 0); private final PointF mTranslationForReorderPreview = new PointF(0, 0); private float mScaleForReorderBounce = 1f; @@ -765,8 +768,11 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel } private void updateTranslation() { - super.setTranslationX(mTranslationForReorderBounce.x + mTranslationForReorderPreview.x); - super.setTranslationY(mTranslationForReorderBounce.y + mTranslationForReorderPreview.y); + super.setTranslationX(mTranslationForReorderBounce.x + mTranslationForReorderPreview.x + + mTranslationForMoveFromCenterAnimation.x + + mTranslationXForTaskbarAlignmentAnimation); + super.setTranslationY(mTranslationForReorderBounce.y + mTranslationForReorderPreview.y + + mTranslationForMoveFromCenterAnimation.y); } public void setReorderBounceOffset(float x, float y) { @@ -778,6 +784,29 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel offset.set(mTranslationForReorderBounce); } + /** + * Sets translationX value for taskbar to launcher alignment animation + */ + public void setTranslationForTaskbarAlignmentAnimation(float translationX) { + mTranslationXForTaskbarAlignmentAnimation = translationX; + updateTranslation(); + } + + /** + * Returns translation values for taskbar to launcher alignment animation + */ + public float getTranslationXForTaskbarAlignmentAnimation() { + return mTranslationXForTaskbarAlignmentAnimation; + } + + /** + * Sets translation values for move from center animation + */ + public void setTranslationForMoveFromCenterAnimation(float x, float y) { + mTranslationForMoveFromCenterAnimation.set(x, y); + updateTranslation(); + } + @Override public void setReorderPreviewOffset(float x, float y) { mTranslationForReorderPreview.set(x, y); From 96dad8b03931853eff3daccf74f82846a7142052 Mon Sep 17 00:00:00 2001 From: Pat Manning Date: Fri, 6 Aug 2021 14:24:56 +0000 Subject: [PATCH 12/13] Animate scrolling grid into place when there is a gap between last tasks and clear all. - Stagger animation starts - Adds a grid translation property to TaskView for animating these translations. Also fixes an issue where the gap between clear all and focused task is greater than spacing between grid tasks and clear all. Test: manual Fix: 188793333 Change-Id: Ib2ba8b1b84dc63c4ba186bd0b9b4962d3c66ce5a --- .../quickstep/views/ClearAllButton.java | 23 +- .../android/quickstep/views/RecentsView.java | 241 +++++++++++++++--- .../com/android/quickstep/views/TaskView.java | 26 +- 3 files changed, 244 insertions(+), 46 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java index b9a90062b7..22c87b0919 100644 --- a/quickstep/src/com/android/quickstep/views/ClearAllButton.java +++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java @@ -39,10 +39,24 @@ public class ClearAllButton extends Button { } }; + public static final FloatProperty DISMISS_ALPHA = + new FloatProperty("dismissAlpha") { + @Override + public Float get(ClearAllButton view) { + return view.mDismissAlpha; + } + + @Override + public void setValue(ClearAllButton view, float v) { + view.setDismissAlpha(v); + } + }; + private final StatefulActivity mActivity; private float mScrollAlpha = 1; private float mContentAlpha = 1; private float mVisibilityAlpha = 1; + private float mDismissAlpha = 1; private float mFullscreenProgress = 1; private float mGridProgress = 1; @@ -97,6 +111,13 @@ public class ClearAllButton extends Button { } } + public void setDismissAlpha(float alpha) { + if (mDismissAlpha != alpha) { + mDismissAlpha = alpha; + updateAlpha(); + } + } + public void onRecentsViewScroll(int scroll, boolean gridEnabled) { RecentsView recentsView = getRecentsView(); if (recentsView == null) { @@ -123,7 +144,7 @@ public class ClearAllButton extends Button { } private void updateAlpha() { - final float alpha = mScrollAlpha * mContentAlpha * mVisibilityAlpha; + final float alpha = mScrollAlpha * mContentAlpha * mVisibilityAlpha * mDismissAlpha; setAlpha(alpha); setClickable(Math.min(alpha, 1) == 1); } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index aeb10aaff6..dff82cc320 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -29,6 +29,7 @@ import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA; import static com.android.launcher3.LauncherState.BACKGROUND_APP; import static com.android.launcher3.QuickstepTransitionManager.RECENTS_LAUNCH_DURATION; import static com.android.launcher3.Utilities.EDGE_NAV_BAR; +import static com.android.launcher3.Utilities.boundToRange; import static com.android.launcher3.Utilities.mapToRange; import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.Utilities.squaredTouchSlop; @@ -49,6 +50,7 @@ import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.SystemUiController.UI_STATE_FULLSCREEN_TASK; import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId; +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; @@ -359,6 +361,7 @@ public abstract class RecentsView= bottomRowIdArray.size() ? topRowIdArray.get( + topRowIdArray.size() - 1) : bottomRowIdArray.get(bottomRowIdArray.size() - 1); + return getTaskViewFromTaskViewId(lastTaskViewId); + } + + private int getSnapToLastTaskScrollDiff() { + // Snap to a position where ClearAll is just invisible. + int screenStart = mOrientationHandler.getPrimaryScroll(this); + int clearAllWidth = mOrientationHandler.getPrimarySize(mClearAllButton); + int clearAllScroll = getScrollForPage(indexOfChild(mClearAllButton)); + int targetScroll = clearAllScroll + (mIsRtl ? clearAllWidth : -clearAllWidth); + return screenStart - targetScroll; + } + + private int getSnapToFocusedTaskScrollDiff(boolean isClearAllHidden) { + int screenStart = mOrientationHandler.getPrimaryScroll(this); + int targetScroll = getScrollForPage(indexOfChild(getFocusedTaskView())); + if (!isClearAllHidden) { + int clearAllWidth = mOrientationHandler.getPrimarySize(mClearAllButton); + int taskGridHorizontalDiff = mLastComputedTaskSize.right - mLastComputedGridSize.right; + int clearAllFocusScrollDiff = taskGridHorizontalDiff - clearAllWidth; + targetScroll += mIsRtl ? clearAllFocusScrollDiff : -clearAllFocusScrollDiff; + } + return screenStart - targetScroll; + } + private boolean isTaskViewWithinBounds(TaskView tv, int start, int end) { int taskStart = mOrientationHandler.getChildStart(tv) + (int) tv.getOffsetAdjustment( showAsFullscreen(), showAsGrid()); @@ -1083,7 +1123,6 @@ public abstract class RecentsView 0) { setSwipeDownShouldLaunchApp(true); @@ -2676,6 +2715,94 @@ public abstract class RecentsView bottomGridRowSize; + boolean bottomRowLonger = bottomGridRowSize > topGridRowSize; + boolean dismissedTaskFromTop = mTopRowIdSet.contains(dismissedTaskViewId); + boolean dismissedTaskFromBottom = !dismissedTaskFromTop && !isFocusedTaskDismissed; + float gapWidth = 0; + if ((topRowLonger && dismissedTaskFromTop) + || (bottomRowLonger && dismissedTaskFromBottom)) { + gapWidth = dismissedTaskWidth; + } else if ((topRowLonger && nextFocusedTaskFromTop) + || (bottomRowLonger && !nextFocusedTaskFromTop)) { + gapWidth = nextFocusedTaskWidth; + } + if (gapWidth > 0) { + if (taskCount > 2) { + // Compensate the removed gap. + longGridRowWidthDiff += mIsRtl ? -gapWidth : gapWidth; + if (isClearAllHidden) { + // If ClearAllButton isn't fully shown, snap to the last task. + longGridRowWidthDiff += getSnapToLastTaskScrollDiff(); + } + } else { + // If only focused task will be left, snap to focused task instead. + longGridRowWidthDiff += getSnapToFocusedTaskScrollDiff(isClearAllHidden); + } + } + + // If we need to animate the grid to compensate the clear all gap, we split the second + // half of the dismiss pending animation (in which the non-dismissed tasks slide into + // place) in half again, making the first quarter the existing non-dismissal sliding + // and the second quarter this new animation of gap filling. This is due to the fact + // that PendingAnimation is a single animation, not a sequence of animations, so we + // fake it using interpolation. + if (longGridRowWidthDiff != 0) { + closeGapBetweenClearAll = true; + // Stagger the offsets of each additional task for a delayed animation. We use + // half here as this animation is half of half of an animation (1/4th). + float halfAdditionalDismissTranslationOffset = + (0.5f * ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET); + dismissTranslationInterpolationEnd = Utilities.boundToRange( + END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET + + (taskCount - 1) * halfAdditionalDismissTranslationOffset, + END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET, 1); + for (int i = 0; i < taskCount; i++) { + TaskView taskView = getTaskViewAt(i); + anim.setFloat(taskView, TaskView.GRID_END_TRANSLATION_X, longGridRowWidthDiff, + clampToProgress(LINEAR, dismissTranslationInterpolationEnd, 1)); + dismissTranslationInterpolationEnd = Utilities.boundToRange( + dismissTranslationInterpolationEnd + - halfAdditionalDismissTranslationOffset, + END_DISMISS_TRANSLATION_INTERPOLATION_OFFSET, 1); + if (ENABLE_QUICKSTEP_LIVE_TILE.get() && mEnableDrawingLiveTile + && taskView.isRunningTask()) { + anim.addOnFrameCallback(() -> { + runActionOnRemoteHandles( + remoteTargetHandle -> + remoteTargetHandle.mTaskViewSimulator + .taskPrimaryTranslation.value = + TaskView.GRID_END_TRANSLATION_X.get(taskView)); + redrawLiveTile(); + }); + } + } + + // Change alpha of clear all if translating grid to hide it + if (isClearAllHidden) { + anim.setFloat(mClearAllButton, DISMISS_ALPHA, 0, LINEAR); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + mClearAllButton.setDismissAlpha(1); + } + }); + } + } + } + int distanceFromDismissedTask = 0; for (int i = 0; i < count; i++) { View child = getChildAt(i); @@ -2755,22 +2882,25 @@ public abstract class RecentsView() { @Override public void accept(Boolean success) { @@ -2829,49 +2961,68 @@ public abstract class RecentsView 2) { + pageToSnapTo = indexOfChild(mClearAllButton); + if (isClearAllHidden) { + int clearAllWidth = mOrientationHandler.getPrimarySize( + mClearAllButton); + mCurrentPageScrollDiff = + isRtl() ? clearAllWidth : -clearAllWidth; } - } else { - int snappedTaskViewId = snappedTaskView.getTaskViewId(); - boolean isSnappedTaskInTopRow = mTopRowIdSet.contains( - snappedTaskViewId); - IntArray taskViewIdArray = - isSnappedTaskInTopRow ? getTopRowIdArray() - : getBottomRowIdArray(); - int snappedIndex = taskViewIdArray.indexOf(snappedTaskViewId); - taskViewIdArray.removeValue(dismissedTaskViewId); - if (snappedIndex < taskViewIdArray.size()) { - taskViewIdToSnapTo = taskViewIdArray.get(snappedIndex); - } else if (snappedIndex == taskViewIdArray.size()) { - // If the snapped task is the last item from the dismissed row, - // snap to the same column in the other grid row - IntArray inverseRowTaskViewIdArray = - isSnappedTaskInTopRow ? getBottomRowIdArray() - : getTopRowIdArray(); - if (snappedIndex < inverseRowTaskViewIdArray.size()) { - taskViewIdToSnapTo = inverseRowTaskViewIdArray.get( - snappedIndex); + } else if (isClearAllHidden) { + // Snap to focused task if clear all is hidden. + pageToSnapTo = 0; + } + } else { + // Get the id of the task view we will snap to based on the current + // page's relative position as the order of indices change over time due + // to dismissals. + TaskView snappedTaskView = getTaskViewAtByAbsoluteIndex(mCurrentPage); + if (snappedTaskView != null) { + if (snappedTaskView.getTaskViewId() == mFocusedTaskViewId) { + if (finalNextFocusedTaskView != null) { + taskViewIdToSnapTo = + finalNextFocusedTaskView.getTaskViewId(); + } else { + taskViewIdToSnapTo = mFocusedTaskViewId; + } + } else { + int snappedTaskViewId = snappedTaskView.getTaskViewId(); + boolean isSnappedTaskInTopRow = mTopRowIdSet.contains( + snappedTaskViewId); + IntArray taskViewIdArray = + isSnappedTaskInTopRow ? getTopRowIdArray() + : getBottomRowIdArray(); + int snappedIndex = taskViewIdArray.indexOf(snappedTaskViewId); + taskViewIdArray.removeValue(dismissedTaskViewId); + if (snappedIndex < taskViewIdArray.size()) { + taskViewIdToSnapTo = taskViewIdArray.get(snappedIndex); + } else if (snappedIndex == taskViewIdArray.size()) { + // If the snapped task is the last item from the + // dismissed row, + // snap to the same column in the other grid row + IntArray inverseRowTaskViewIdArray = + isSnappedTaskInTopRow ? getBottomRowIdArray() + : getTopRowIdArray(); + if (snappedIndex < inverseRowTaskViewIdArray.size()) { + taskViewIdToSnapTo = inverseRowTaskViewIdArray.get( + snappedIndex); + } } } } - } - int primaryScroll = mOrientationHandler.getPrimaryScroll(RecentsView.this); - int currentPageScroll = getScrollForPage(pageToSnapTo); - mCurrentPageScrollDiff = primaryScroll - currentPageScroll; + int primaryScroll = mOrientationHandler.getPrimaryScroll( + RecentsView.this); + int currentPageScroll = getScrollForPage(pageToSnapTo); + mCurrentPageScrollDiff = primaryScroll - currentPageScroll; + } } else if (dismissedIndex < pageToSnapTo || pageToSnapTo == taskCount - 1) { - pageToSnapTo -= 1; + pageToSnapTo--; } removeViewInLayout(dismissedTaskView); mTopRowIdSet.remove(dismissedTaskViewId); @@ -2936,7 +3087,13 @@ public abstract class RecentsView GRID_END_TRANSLATION_X = + new FloatProperty("gridEndTranslationX") { + @Override + public void setValue(TaskView taskView, float v) { + taskView.setGridEndTranslationX(v); + } + + @Override + public Float get(TaskView taskView) { + return taskView.mGridEndTranslationX; + } + }; + public static final FloatProperty SNAPSHOT_SCALE = new FloatProperty("snapshotScale") { @Override @@ -381,6 +394,8 @@ public class TaskView extends FrameLayout implements Reusable { // The following grid translations scales with mGridProgress. private float mGridTranslationX; private float mGridTranslationY; + // The following grid translation is used to animate closing the gap between grid and clear all. + private float mGridEndTranslationX; // Applied as a complement to gridTranslation, for adjusting the carousel overview and quick // switch. private float mNonGridTranslationX; @@ -950,8 +965,8 @@ public class TaskView extends FrameLayout implements Reusable { protected void resetViewTransforms() { // fullscreenTranslation and accumulatedTranslation should not be reset, as // resetViewTransforms is called during Quickswitch scrolling. - mDismissTranslationX = mTaskOffsetTranslationX = mTaskResistanceTranslationX = - mSplitSelectTranslationX = 0f; + mDismissTranslationX = mTaskOffsetTranslationX = + mTaskResistanceTranslationX = mSplitSelectTranslationX = mGridEndTranslationX = 0f; mDismissTranslationY = mTaskOffsetTranslationY = mTaskResistanceTranslationY = mSplitSelectTranslationY = 0f; setSnapshotScale(1f); @@ -1162,6 +1177,11 @@ public class TaskView extends FrameLayout implements Reusable { return mGridTranslationY; } + private void setGridEndTranslationX(float gridEndTranslationX) { + mGridEndTranslationX = gridEndTranslationX; + applyTranslationX(); + } + public float getScrollAdjustment(boolean fullscreenEnabled, boolean gridEnabled) { float scrollAdjustment = 0; if (gridEnabled) { @@ -1191,7 +1211,7 @@ public class TaskView extends FrameLayout implements Reusable { private void applyTranslationX() { setTranslationX(mDismissTranslationX + mTaskOffsetTranslationX + mTaskResistanceTranslationX - + mSplitSelectTranslationX + getPersistentTranslationX()); + + mSplitSelectTranslationX + mGridEndTranslationX + getPersistentTranslationX()); } private void applyTranslationY() { From bfec974f591eeca5b1a174d8ef5312d3fcdad130 Mon Sep 17 00:00:00 2001 From: Hongwei Wang Date: Fri, 3 Sep 2021 10:27:51 -0700 Subject: [PATCH 13/13] Do not trigger PiP on tapping on TaskView Regression from ag/15158868, we should not send onUserLeaveHint on tapping on the app icon in Recents / Overview. Video: http://recall/-/aaaaaabFQoRHlzixHdtY/fr0fdecPEned7rMjgdWhCQ Bug: 198682451 Test: manual, tap on app icon in Recents, see video Change-Id: I66888a75eec30d7e8ba7e09059399381516812ac --- quickstep/src/com/android/quickstep/views/TaskView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 8a20da6cfd..0e6c0fd318 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -838,6 +838,7 @@ public class TaskView extends FrameLayout implements Reusable { RecentsView recentsView = getRecentsView(); recentsView.switchToScreenshot( () -> recentsView.finishRecentsAnimation(true /* toRecents */, + false /* shouldPip */, this::showTaskMenu)); } else { showTaskMenu();