From fbf327f9ee569ba8e48ce477e25c83ebac0b3b90 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 17 May 2018 15:28:41 -0700 Subject: [PATCH 01/31] Skip processing fallback icons as they are already badged and have shadow Bug: 79496830 Change-Id: I3e601fda570eefdb277bfd50c846c5a2864f4b3a --- .../android/launcher3/graphics/LauncherIcons.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/graphics/LauncherIcons.java b/src/com/android/launcher3/graphics/LauncherIcons.java index 3b5585bcfe..f020d2d7cd 100644 --- a/src/com/android/launcher3/graphics/LauncherIcons.java +++ b/src/com/android/launcher3/graphics/LauncherIcons.java @@ -360,16 +360,18 @@ public class LauncherIcons implements AutoCloseable { .getShortcutIconDrawable(shortcutInfo, mFillResIconDpi); IconCache cache = LauncherAppState.getInstance(mContext).getIconCache(); - Bitmap unbadgedBitmap = null; + final Bitmap unbadgedBitmap; if (unbadgedDrawable != null) { unbadgedBitmap = createScaledBitmapWithoutShadow(unbadgedDrawable, 0); } else { if (fallbackIconProvider != null) { - unbadgedBitmap = fallbackIconProvider.get(); - } - if (unbadgedBitmap == null) { - unbadgedBitmap = cache.getDefaultIcon(Process.myUserHandle()).icon; + // Fallback icons are already badged and with appropriate shadow + Bitmap fullIcon = fallbackIconProvider.get(); + if (fullIcon != null) { + return createIconBitmap(fullIcon); + } } + unbadgedBitmap = cache.getDefaultIcon(Process.myUserHandle()).icon; } BitmapInfo result = new BitmapInfo(); From 4e21c1b5523fc80545260762a95c5d0f386cb734 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 16 May 2018 18:15:38 -0700 Subject: [PATCH 02/31] Cleanup how we set back button alpha Add BackButtonAlphaHandler to set back button alpha, instead of setting it from multiple places. Also force back button alpha to be 1 if swipe up is disabled (b/80091187) Change-Id: I49b63a0e6b033a3a947a847669a398f1b9ff0564 --- .../uioverrides/BackButtonAlphaHandler.java | 62 +++++++++++++++++++ .../launcher3/uioverrides/UiFactory.java | 12 ++-- .../quickstep/OverviewInteractionState.java | 11 ++++ .../launcher3/LauncherStateManager.java | 1 - .../allapps/AllAppsTransitionController.java | 9 --- .../AbstractStateChangeTouchController.java | 12 ---- 6 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java diff --git a/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java b/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java new file mode 100644 index 0000000000..2e6dcc0e77 --- /dev/null +++ b/quickstep/src/com/android/launcher3/uioverrides/BackButtonAlphaHandler.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2018 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.uioverrides; + +import android.animation.ValueAnimator; + +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherState; +import com.android.launcher3.LauncherStateManager; +import com.android.launcher3.anim.AnimatorSetBuilder; +import com.android.quickstep.OverviewInteractionState; + +public class BackButtonAlphaHandler implements LauncherStateManager.StateHandler { + + private static final String TAG = "BackButtonAlphaHandler"; + + private final Launcher mLauncher; + private final OverviewInteractionState mOverviewInteractionState; + + public BackButtonAlphaHandler(Launcher launcher) { + mLauncher = launcher; + mOverviewInteractionState = OverviewInteractionState.getInstance(mLauncher); + } + + @Override + public void setState(LauncherState state) { + UiFactory.onLauncherStateOrFocusChanged(mLauncher); + } + + @Override + public void setStateWithAnimation(LauncherState toState, + AnimatorSetBuilder builder, LauncherStateManager.AnimationConfig config) { + if (!config.playNonAtomicComponent()) { + return; + } + float fromAlpha = mOverviewInteractionState.getBackButtonAlpha(); + float toAlpha = toState.hideBackButton ? 0 : 1; + if (Float.compare(fromAlpha, toAlpha) != 0) { + ValueAnimator anim = ValueAnimator.ofFloat(fromAlpha, toAlpha); + anim.setDuration(config.duration); + anim.addUpdateListener(valueAnimator -> { + final float alpha = (float) valueAnimator.getAnimatedValue(); + mOverviewInteractionState.setBackButtonAlpha(alpha, false); + }); + builder.play(anim); + } + } +} diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index b371677f39..76820b6aa6 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -78,11 +78,13 @@ public class UiFactory { } public static StateHandler[] getStateHandler(Launcher launcher) { - return new StateHandler[] { - launcher.getAllAppsController(), launcher.getWorkspace(), - new RecentsViewStateController(launcher)}; + return new StateHandler[] {launcher.getAllAppsController(), launcher.getWorkspace(), + new RecentsViewStateController(launcher), new BackButtonAlphaHandler(launcher)}; } + /** + * Sets the back button visibility based on the current state/window focus. + */ public static void onLauncherStateOrFocusChanged(Launcher launcher) { boolean shouldBackButtonBeHidden = launcher != null && launcher.getStateManager().getState().hideBackButton @@ -96,10 +98,6 @@ public class UiFactory { .setBackButtonAlpha(shouldBackButtonBeHidden ? 0 : 1, true /* animate */); } - public static void setBackButtonAlpha(Launcher launcher, float alpha, boolean animate) { - OverviewInteractionState.getInstance(launcher).setBackButtonAlpha(alpha,animate); - } - public static void resetOverview(Launcher launcher) { RecentsView recents = launcher.getOverviewPanel(); recents.reset(); diff --git a/quickstep/src/com/android/quickstep/OverviewInteractionState.java b/quickstep/src/com/android/quickstep/OverviewInteractionState.java index d60574676e..922a7ff295 100644 --- a/quickstep/src/com/android/quickstep/OverviewInteractionState.java +++ b/quickstep/src/com/android/quickstep/OverviewInteractionState.java @@ -91,6 +91,7 @@ public class OverviewInteractionState { // These are updated on the background thread private ISystemUiProxy mISystemUiProxy; private boolean mSwipeUpEnabled = true; + private float mBackButtonAlpha = 1; private Runnable mOnSwipeUpSettingChangedListener; @@ -117,7 +118,14 @@ public class OverviewInteractionState { return mSwipeUpEnabled; } + public float getBackButtonAlpha() { + return mBackButtonAlpha; + } + public void setBackButtonAlpha(float alpha, boolean animate) { + if (!mSwipeUpEnabled) { + alpha = 1; + } mUiHandler.removeMessages(MSG_SET_BACK_BUTTON_ALPHA); mUiHandler.obtainMessage(MSG_SET_BACK_BUTTON_ALPHA, animate ? 1 : 0, 0, alpha) .sendToTarget(); @@ -128,6 +136,9 @@ public class OverviewInteractionState { } private boolean handleUiMessage(Message msg) { + if (msg.what == MSG_SET_BACK_BUTTON_ALPHA) { + mBackButtonAlpha = (float) msg.obj; + } mBgHandler.obtainMessage(msg.what, msg.arg1, msg.arg2, msg.obj).sendToTarget(); return true; } diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index e6fc4c6d46..3fcdee934c 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -396,7 +396,6 @@ public class LauncherStateManager { setRestState(null); } - UiFactory.onLauncherStateOrFocusChanged(mLauncher); UiFactory.onLauncherStateOrResumeChanged(mLauncher); } diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index b5c821ac25..2c3e3ee7b2 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -25,11 +25,9 @@ import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager.AnimationConfig; import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.R; -import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.PropertySetter; -import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ScrimView; @@ -184,13 +182,6 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil anim.setDuration(config.duration); anim.setInterpolator(builder.getInterpolator(ANIM_VERTICAL_PROGRESS, interpolator)); anim.addListener(getProgressAnimatorListener()); - if (toState.hideBackButton) { - anim.addUpdateListener(animation -> { - final float alpha = (float) animation.getAnimatedValue(); - UiFactory.setBackButtonAlpha(mLauncher, 1 - Utilities.boundToRange(alpha, 0, 1), - false /* animate */); - }); - } builder.play(anim); diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index 0e68538692..24382b7d00 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -42,7 +42,6 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.AnimatorSetBuilder; -import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; @@ -224,8 +223,6 @@ public abstract class AbstractStateChangeTouchController cancelAtomicComponentsController(); } mProgressMultiplier = initCurrentAnimation(animComponents); - mCurrentAnimation.getAnimationPlayer().addUpdateListener(animation -> - setBackButtonAlphaWithProgress((float) animation.getAnimatedValue())); mCurrentAnimation.dispatchOnStart(); return true; } @@ -284,7 +281,6 @@ public abstract class AbstractStateChangeTouchController mAtomicComponentsController.setPlayFraction(fraction - mAtomicComponentsStartProgress); } maybeUpdateAtomicAnim(mFromState, mToState, fraction); - setBackButtonAlphaWithProgress(fraction); } /** @@ -477,14 +473,6 @@ public abstract class AbstractStateChangeTouchController } } - private void setBackButtonAlphaWithProgress(float progress) { - if (mFromState.hideBackButton ^ mToState.hideBackButton) { - progress = Utilities.boundToRange(progress, 0, 1); - final float alpha = mToState.hideBackButton ? 1 - progress : progress; - UiFactory.setBackButtonAlpha(mLauncher, alpha, false /* animate */); - } - } - private void logReachedState(int logAction) { // Transition complete. log the action mLauncher.getUserEventDispatcher().logStateChangeAction(logAction, From 783cd3cf213ddb37920d1e88ddb9ce83352e8754 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 22 May 2018 11:06:36 -0700 Subject: [PATCH 03/31] Making clear-all action accessible on a fallback Overview. Bug: 72222505 Test: Manual Change-Id: I063081b4fa009882e50852e107490fddae0f86b7 --- .../fallback/FallbackRecentsView.java | 19 +++++++++++++++++++ .../android/quickstep/views/RecentsView.java | 8 ++++++++ .../com/android/quickstep/views/TaskView.java | 13 +++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 9e2de33954..c5d74c7d93 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -20,8 +20,10 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import com.android.launcher3.DeviceProfile; +import com.android.launcher3.R; import com.android.quickstep.RecentsActivity; import com.android.quickstep.util.LayoutUtils; import com.android.quickstep.views.RecentsView; @@ -71,4 +73,21 @@ public class FallbackRecentsView extends RecentsView { // Just use the activity task size for multi-window as well. return false; } + + @Override + public void addTaskAccessibilityActionsExtra(AccessibilityNodeInfo info) { + info.addAction( + new AccessibilityNodeInfo.AccessibilityAction( + R.string.recents_clear_all, + getContext().getText(R.string.recents_clear_all))); + } + + @Override + public boolean performTaskAccessibilityActionExtra(int action) { + if (action == R.string.recents_clear_all) { + dismissAllTasks(); + return true; + } + return false; + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index a6da89f205..65b53fe84f 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -53,6 +53,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; +import android.view.accessibility.AccessibilityNodeInfo; import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; @@ -1321,4 +1322,11 @@ public abstract class RecentsView extends PagedView impl protected boolean isPageOrderFlipped() { return FLIP_RECENTS; } + + public void addTaskAccessibilityActionsExtra(AccessibilityNodeInfo info) { + } + + public boolean performTaskAccessibilityActionExtra(int action) { + return false; + } } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 82aa45a18c..2f1a0fe95c 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -17,6 +17,7 @@ package com.android.quickstep.views; import static android.widget.Toast.LENGTH_SHORT; + import static com.android.quickstep.views.TaskThumbnailView.DIM_ALPHA_MULTIPLIER; import android.animation.Animator; @@ -116,7 +117,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } launchTask(true /* animate */); BaseActivity.fromContext(context).getUserEventDispatcher().logTaskLaunchOrDismiss( - Touch.TAP, Direction.NONE, ((RecentsView) getParent()).indexOfChild(this), + Touch.TAP, Direction.NONE, getRecentsView().indexOfChild(this), TaskUtils.getComponentKeyForTask(getTask().key)); }); setOutlineProvider(new TaskOutlineProvider(getResources())); @@ -318,12 +319,14 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback context.getText(menuOption.labelResId))); } } + + getRecentsView().addTaskAccessibilityActionsExtra(info); } @Override public boolean performAccessibilityAction(int action, Bundle arguments) { if (action == R.string.accessibility_close_task) { - ((RecentsView) getParent()).dismissTask(this, true /*animateTaskView*/, + getRecentsView().dismissTask(this, true /*animateTaskView*/, true /*removeTask*/); return true; } @@ -339,9 +342,15 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } } + if (getRecentsView().performTaskAccessibilityActionExtra(action)) return true; + return super.performAccessibilityAction(action, arguments); } + private RecentsView getRecentsView() { + return (RecentsView) getParent(); + } + public void notifyTaskLaunchFailed(String tag) { String msg = "Failed to launch task"; if (mTask != null) { From 0bd0244a73cc0b6dc40156fd707f402bb53d5dba Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 22 May 2018 11:20:16 -0700 Subject: [PATCH 04/31] Reset the vertical progress when the discovery bounce is closed Since discovery bounce runs on absolute values, it can sometime leave the vertical progress at an old value, if it is closed after the state change. Also simplifying discovery bounce animation to use xml everytime. Bug: 80099242 Change-Id: Iebc249dd02f474cbed85b695eeeb8c2bf60b935d --- proguard.flags | 6 ++ .../launcher3/allapps/DiscoveryBounce.java | 69 ++++++++++--------- 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/proguard.flags b/proguard.flags index e9f6db462e..555d13e44c 100644 --- a/proguard.flags +++ b/proguard.flags @@ -120,6 +120,12 @@ *; } +# Discovery bounce animation +-keep class com.android.launcher3.allapps.DiscoveryBounce$VerticalProgressWrapper { + public void setProgress(float); + public float getProgress(); +} + # BUG(70852369): Surpress additional warnings after changing from Proguard to R8 -dontwarn android.app.** -dontwarn android.view.** diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index e1cd06a8b9..a0a79c87df 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -24,14 +24,9 @@ import static com.android.launcher3.userevent.nano.LauncherLogProto.ContainerTyp import android.animation.Animator; import android.animation.AnimatorInflater; import android.animation.AnimatorListenerAdapter; -import android.animation.Keyframe; -import android.animation.ObjectAnimator; -import android.animation.PropertyValuesHolder; -import android.animation.TimeInterpolator; import android.app.ActivityManager; import android.os.Handler; import android.view.MotionEvent; -import android.view.animation.PathInterpolator; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; @@ -52,21 +47,21 @@ public class DiscoveryBounce extends AbstractFloatingView { private final Launcher mLauncher; private final Animator mDiscoBounceAnimation; - public DiscoveryBounce(Launcher launcher, Animator animator) { + public DiscoveryBounce(Launcher launcher, float delta) { super(launcher, null); mLauncher = launcher; - - mDiscoBounceAnimation = animator; AllAppsTransitionController controller = mLauncher.getAllAppsController(); - mDiscoBounceAnimation.setTarget(controller); - mDiscoBounceAnimation.addListener(controller.getProgressAnimatorListener()); + mDiscoBounceAnimation = + AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce); + mDiscoBounceAnimation.setTarget(new VerticalProgressWrapper(controller, delta)); mDiscoBounceAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { handleClose(false); } }); + mDiscoBounceAnimation.addListener(controller.getProgressAnimatorListener()); } @Override @@ -102,6 +97,9 @@ public class DiscoveryBounce extends AbstractFloatingView { if (mIsOpen) { mIsOpen = false; mLauncher.getDragLayer().removeView(this); + // Reset the all-apps progress to what ever it was previously. + mLauncher.getAllAppsController().setProgress(mLauncher.getStateManager() + .getState().getVerticalProgress(mLauncher)); } } @@ -115,6 +113,12 @@ public class DiscoveryBounce extends AbstractFloatingView { return (type & TYPE_ON_BOARD_POPUP) != 0; } + private void show(int containerType) { + mIsOpen = true; + mLauncher.getDragLayer().addView(this); + mLauncher.getUserEventDispatcher().logActionBounceTip(containerType); + } + public static void showForHomeIfNeeded(Launcher launcher) { showForHomeIfNeeded(launcher, true); } @@ -133,11 +137,7 @@ public class DiscoveryBounce extends AbstractFloatingView { return; } - DiscoveryBounce view = new DiscoveryBounce(launcher, - AnimatorInflater.loadAnimator(launcher, R.animator.discovery_bounce)); - view.mIsOpen = true; - launcher.getDragLayer().addView(view); - launcher.getUserEventDispatcher().logActionBounceTip(HOTSEAT); + new DiscoveryBounce(launcher, 0).show(HOTSEAT); } public static void showForOverviewIfNeeded(Launcher launcher) { @@ -164,26 +164,29 @@ public class DiscoveryBounce extends AbstractFloatingView { return; } - float verticalProgress = OVERVIEW.getVerticalProgress(launcher); + new DiscoveryBounce(launcher, (1 - OVERVIEW.getVerticalProgress(launcher))) + .show(PREDICTION); + } - TimeInterpolator pathInterpolator = new PathInterpolator(0.35f, 0, 0.5f, 1); - Keyframe keyframe3 = Keyframe.ofFloat(0.423f, verticalProgress - (1 - 0.9738f)); - keyframe3.setInterpolator(pathInterpolator); - Keyframe keyframe4 = Keyframe.ofFloat(0.754f, verticalProgress); - keyframe4.setInterpolator(pathInterpolator); + /** + * A wrapper around {@link AllAppsTransitionController} allowing a fixed shift in the value. + */ + public static class VerticalProgressWrapper { - PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe("progress", - Keyframe.ofFloat(0, verticalProgress), - Keyframe.ofFloat(0.246f, verticalProgress), keyframe3, keyframe4, - Keyframe.ofFloat(1f, verticalProgress)); - ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(null, - new PropertyValuesHolder[]{propertyValuesHolder}); - animator.setDuration(2166); - animator.setRepeatCount(5); + private final float mDelta; + private final AllAppsTransitionController mController; - DiscoveryBounce view = new DiscoveryBounce(launcher, animator); - view.mIsOpen = true; - launcher.getDragLayer().addView(view); - launcher.getUserEventDispatcher().logActionBounceTip(PREDICTION); + private VerticalProgressWrapper(AllAppsTransitionController controller, float delta) { + mController = controller; + mDelta = delta; + } + + public float getProgress() { + return mController.getProgress() + mDelta; + } + + public void setProgress(float progress) { + mController.setProgress(progress - mDelta); + } } } From 15067109b1198f70e5d33b9d0f24a104bdb96b33 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 22 May 2018 14:05:15 -0700 Subject: [PATCH 05/31] Tighten up loading of visible task data - Certain animations can run after the launcher state has changed, triggering loading of task data even when the overview state is not visible. Only allow re/loading of this data when we are in the overview state. Bug: 76162466 Change-Id: Ie1f492ef712ea4aa2db6f2e1bc7ba4390742875b --- quickstep/src/com/android/quickstep/views/RecentsView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index f038eff8a0..f06342fdeb 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -582,6 +582,11 @@ public abstract class RecentsView extends PagedView impl * and unloads the associated task data for tasks that are no longer visible. */ public void loadVisibleTaskData() { + if (!mOverviewStateEnabled) { + // Skip loading visible task data if we've already left the overview state + return; + } + RecentsTaskLoader loader = mModel.getRecentsTaskLoader(); int centerPageIndex = getPageNearestToCenterOfScreen(); int lower = Math.max(0, centerPageIndex - 2); From f1507a6a647adde9a77db3efb2a92558c4dc2473 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Mon, 21 May 2018 11:59:48 -0700 Subject: [PATCH 06/31] Making overview panel accessible via Tab Keyboard navigation of AllAppsContainerView is broken in TOT; disabling focusing there is necessary for Recents. Bug: 72222505 Test: Manual Change-Id: I85d544f7c8dbdaf12e49de51c6626bbc3dc32917 --- quickstep/res/layout/task.xml | 5 +++- .../quickstep/views/ClearAllButton.java | 9 +++++++ .../android/quickstep/views/RecentsView.java | 25 +++++++++++++++++++ .../quickstep/views/RecentsViewContainer.java | 10 ++++++++ res/layout/all_apps.xml | 3 +-- .../android/launcher3/views/ScrimView.java | 1 + 6 files changed, 50 insertions(+), 3 deletions(-) diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml index 429f3a28ea..f163872161 100644 --- a/quickstep/res/layout/task.xml +++ b/quickstep/res/layout/task.xml @@ -13,9 +13,11 @@ See the License for the specific language governing permissions and limitations under the License. --> - \ No newline at end of file diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java index d5c43a0f56..25e3dc6c14 100644 --- a/quickstep/src/com/android/quickstep/views/ClearAllButton.java +++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java @@ -19,6 +19,7 @@ package com.android.quickstep.views; import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS; import android.content.Context; +import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -43,4 +44,12 @@ public class ClearAllButton extends Button { } return res; } + + @Override + protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + super.onFocusChanged(focused, direction, previouslyFocusedRect); + if (focused) { + mRecentsView.revealClearAllButton(); + } + } } diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index a6da89f205..0d8a601352 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -41,6 +41,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.os.UserHandle; +import android.support.annotation.Nullable; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -967,6 +968,13 @@ public abstract class RecentsView extends PagedView impl if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_TAB: + if (!event.isAltPressed() && + getNextPage() == + (event.isShiftPressed() ? 0 : getChildCount() - 1)) { + // If not Alt-Tab navigation, don't loop forever in the carousel and leave + // it once we reached the end. + return false; + } snapToPageRelative(event.isShiftPressed() ? -1 : 1); return true; case KeyEvent.KEYCODE_DPAD_RIGHT: @@ -992,6 +1000,22 @@ public abstract class RecentsView extends PagedView impl return super.dispatchKeyEvent(event); } + @Override + protected void onFocusChanged(boolean gainFocus, int direction, + @Nullable Rect previouslyFocusedRect) { + super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); + if (gainFocus && getChildCount() > 0) { + switch (direction) { + case FOCUS_FORWARD: + setCurrentPage(0); + break; + case FOCUS_BACKWARD: + setCurrentPage(getChildCount() - 1); + break; + } + } + } + public void snapToTaskAfterNext() { snapToPageRelative(1); } @@ -1303,6 +1327,7 @@ public abstract class RecentsView extends PagedView impl } public void revealClearAllButton() { + setCurrentPage(getChildCount() - 1); // Loads tasks info if needed. scrollTo(mIsRtl ? 0 : computeMaxScrollX(), 0); } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index 429432b2fa..06e2e89037 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -25,10 +25,13 @@ import android.util.AttributeSet; import android.util.FloatProperty; import android.view.Gravity; import android.view.MotionEvent; +import android.view.View; import com.android.launcher3.InsettableFrameLayout; import com.android.launcher3.R; +import java.util.ArrayList; + public class RecentsViewContainer extends InsettableFrameLayout { public static final FloatProperty CONTENT_ALPHA = new FloatProperty("contentAlpha") { @@ -104,4 +107,11 @@ public class RecentsViewContainer extends InsettableFrameLayout { mRecentsView.setContentAlpha(alpha); setVisibility(alpha > 0 ? VISIBLE : GONE); } + + @Override + public void addFocusables(ArrayList views, int direction, int focusableMode) { + // Carousel is first in tab order. + views.add(mRecentsView); + views.add(mClearAllButton); + } } \ No newline at end of file diff --git a/res/layout/all_apps.xml b/res/layout/all_apps.xml index 5e7b117c43..02d793e1c0 100644 --- a/res/layout/all_apps.xml +++ b/res/layout/all_apps.xml @@ -23,8 +23,7 @@ android:layout_height="match_parent" android:clipChildren="true" android:clipToPadding="false" - android:focusable="true" - android:focusableInTouchMode="true" + android:focusable="false" android:saveEnabled="false" > diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 6bbce00fe1..ea05cdc5c8 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -118,6 +118,7 @@ public class ScrimView extends View implements Insettable, OnChangeListener, ViewCompat.setAccessibilityDelegate(this, mAccessibilityHelper); mAM = (AccessibilityManager) context.getSystemService(ACCESSIBILITY_SERVICE); + setFocusable(false); } @NonNull From 56e1019e95a502fbc8144a6ba651095c0e12def1 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 22 May 2018 13:22:25 -0700 Subject: [PATCH 07/31] Making caret visibility part of state definition > Hiding the caret in fast overview state > Hiding caret in task swipe down interaction Bug: 79700605 Change-Id: I984d535bc75802501e8aeb13c8f37387f331e5bc --- .../launcher3/uioverrides/OverviewState.java | 4 +-- .../quickstep/views/LauncherRecentsView.java | 11 +++++++- .../quickstep/views/ShelfScrimView.java | 9 ------ src/com/android/launcher3/LauncherState.java | 5 ++-- .../allapps/AllAppsTransitionController.java | 4 +++ .../android/launcher3/views/ScrimView.java | 28 ++++++++++++++++++- 6 files changed, 46 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 3a49294c51..0116a8e0e7 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -100,9 +100,9 @@ public class OverviewState extends LauncherState { @Override public int getVisibleElements(Launcher launcher) { if (launcher.getDeviceProfile().isVerticalBarLayout()) { - return 0; + return VERTICAL_SWIPE_INDICATOR; } else { - return HOTSEAT_SEARCH_BOX | + return HOTSEAT_SEARCH_BOX | VERTICAL_SWIPE_INDICATOR | (launcher.getAppsView().getFloatingHeaderView().hasVisibleContent() ? ALL_APPS_HEADER_EXTRA : HOTSEAT_ICONS); } diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index 950f7fb997..5aca4f3263 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -35,6 +35,9 @@ import android.view.ViewDebug; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; +import com.android.launcher3.R; +import com.android.launcher3.anim.Interpolators; +import com.android.launcher3.views.ScrimView; import com.android.quickstep.OverviewInteractionState; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.LayoutUtils; @@ -136,6 +139,12 @@ public class LauncherRecentsView extends RecentsView { } anim.play(ObjectAnimator.ofFloat( mActivity.getAllAppsController(), ALL_APPS_PROGRESS, allAppsProgressOffscreen)); + + ObjectAnimator dragHandleAnim = ObjectAnimator.ofInt( + mActivity.findViewById(R.id.scrim_view), ScrimView.DRAG_HANDLE_ALPHA, 0); + dragHandleAnim.setInterpolator(Interpolators.ACCEL_2); + anim.play(dragHandleAnim); + return anim; } @@ -150,7 +159,7 @@ public class LauncherRecentsView extends RecentsView { mActivity.getStateManager().goToState(NORMAL, false /* animate */); } else { LauncherState state = mActivity.getStateManager().getState(); - mActivity.getAllAppsController().setProgress(state.getVerticalProgress(mActivity)); + mActivity.getAllAppsController().setState(state); } super.onTaskLaunched(success); } diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java index 24afd4868e..aca8351a06 100644 --- a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java +++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java @@ -153,15 +153,6 @@ public class ShelfScrimView extends ScrimView { } } - @Override - protected void updateDragHandleAlpha() { - if (mDrawingFlatColor) { - super.updateDragHandleAlpha(); - } else if (mDragHandle != null) { - mDragHandle.setAlpha(255); - } - } - @Override protected void onDraw(Canvas canvas) { float translate = drawBackground(canvas); diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index fbe27b0ace..76681f280f 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -51,6 +51,7 @@ public class LauncherState { public static final int ALL_APPS_HEADER = 1 << 2; public static final int ALL_APPS_HEADER_EXTRA = 1 << 3; // e.g. app predictions public static final int ALL_APPS_CONTENT = 1 << 4; + public static final int VERTICAL_SWIPE_INDICATOR = 1 << 5; protected static final int FLAG_MULTI_PAGE = 1 << 0; protected static final int FLAG_DISABLE_ACCESSIBILITY = 1 << 1; @@ -201,9 +202,9 @@ public class LauncherState { public int getVisibleElements(Launcher launcher) { if (launcher.getDeviceProfile().isVerticalBarLayout()) { - return HOTSEAT_ICONS; + return HOTSEAT_ICONS | VERTICAL_SWIPE_INDICATOR; } - return HOTSEAT_ICONS | HOTSEAT_SEARCH_BOX; + return HOTSEAT_ICONS | HOTSEAT_SEARCH_BOX | VERTICAL_SWIPE_INDICATOR; } /** diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java index 2c3e3ee7b2..ccd55863c4 100644 --- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java +++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java @@ -4,6 +4,7 @@ import static com.android.launcher3.LauncherState.ALL_APPS_CONTENT; import static com.android.launcher3.LauncherState.ALL_APPS_HEADER; import static com.android.launcher3.LauncherState.ALL_APPS_HEADER_EXTRA; import static com.android.launcher3.LauncherState.OVERVIEW; +import static com.android.launcher3.LauncherState.VERTICAL_SWIPE_INDICATOR; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_VERTICAL_PROGRESS; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; @@ -198,6 +199,9 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil setter.setViewAlpha(mAppsView.getContentView(), hasContent ? 1 : 0, LINEAR); setter.setViewAlpha(mAppsView.getScrollBar(), hasContent ? 1 : 0, LINEAR); mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, hasContent, setter); + + setter.setInt(mScrimView, ScrimView.DRAG_HANDLE_ALPHA, + (visibleElements & VERTICAL_SWIPE_INDICATOR) != 0 ? 255 : 0, LINEAR); } public AnimatorListenerAdapter getProgressAnimatorListener() { diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 6bbce00fe1..d01da43d19 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -45,6 +45,7 @@ import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import android.support.v4.widget.ExploreByTouchHelper; import android.util.AttributeSet; +import android.util.Property; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -73,6 +74,19 @@ import java.util.List; public class ScrimView extends View implements Insettable, OnChangeListener, AccessibilityStateChangeListener, StateListener { + public static final Property DRAG_HANDLE_ALPHA = + new Property(Integer.TYPE, "dragHandleAlpha") { + + @Override + public Integer get(ScrimView scrimView) { + return scrimView.mDragHandleAlpha; + } + + @Override + public void set(ScrimView scrimView, Integer value) { + scrimView.setDragHandleAlpha(value); + } + }; private static final int WALLPAPERS = R.string.wallpaper_button_text; private static final int WIDGETS = R.string.widget_button_text; private static final int SETTINGS = R.string.settings_button_text; @@ -102,6 +116,8 @@ public class ScrimView extends View implements Insettable, OnChangeListener, @Nullable protected Drawable mDragHandle; + private int mDragHandleAlpha = 255; + public ScrimView(Context context, AttributeSet attrs) { super(context, attrs); mLauncher = Launcher.getLauncher(context); @@ -187,7 +203,17 @@ public class ScrimView extends View implements Insettable, OnChangeListener, protected void updateDragHandleAlpha() { if (mDragHandle != null) { - mDragHandle.setAlpha(Math.round(255 * Utilities.boundToRange(mProgress, 0, 1))); + mDragHandle.setAlpha(mDragHandleAlpha); + } + } + + private void setDragHandleAlpha(int alpha) { + if (alpha != mDragHandleAlpha) { + mDragHandleAlpha = alpha; + if (mDragHandle != null) { + mDragHandle.setAlpha(mDragHandleAlpha); + invalidate(); + } } } From 788c0514938be2886f8aa8377e219fc7083a74e4 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Tue, 22 May 2018 14:09:29 -0700 Subject: [PATCH 08/31] Add mStartState to determine if user swipes up from Home. Bug: 80146880 Test: Manual test Change-Id: Ia0743bff3f2a5b3998a798743138b012ec461a94 --- .../launcher3/uioverrides/LandscapeEdgeSwipeController.java | 2 +- .../launcher3/uioverrides/PortraitStatesTouchController.java | 2 +- .../launcher3/touch/AbstractStateChangeTouchController.java | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java index 68773b4188..6d1061990b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/LandscapeEdgeSwipeController.java @@ -72,7 +72,7 @@ public class LandscapeEdgeSwipeController extends AbstractStateChangeTouchContro @Override protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); - if (mFromState == NORMAL && targetState == OVERVIEW) { + if (mStartState == NORMAL && targetState == OVERVIEW) { RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java index 987f952baf..3fb7cd4802 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/PortraitStatesTouchController.java @@ -202,7 +202,7 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr @Override protected void onSwipeInteractionCompleted(LauncherState targetState, int logAction) { super.onSwipeInteractionCompleted(targetState, logAction); - if (mFromState == NORMAL && targetState == OVERVIEW) { + if (mStartState == NORMAL && targetState == OVERVIEW) { RecentsModel.getInstance(mLauncher).onOverviewShown(true, TAG); } } diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index 0e68538692..c89012ac57 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -73,6 +73,7 @@ public abstract class AbstractStateChangeTouchController private boolean mNoIntercept; protected int mStartContainerType; + protected LauncherState mStartState; protected LauncherState mFromState; protected LauncherState mToState; protected AnimatorPlaybackController mCurrentAnimation; @@ -238,8 +239,10 @@ public abstract class AbstractStateChangeTouchController @Override public void onDragStart(boolean start) { + mStartState = mLauncher.getStateManager().getState(); if (mCurrentAnimation == null) { - mFromState = mToState = null; + mFromState = mStartState; + mToState = null; mAtomicComponentsController = null; reinitCurrentAnimation(false, mDetector.wasInitialTouchPositive()); mDisplacementShift = 0; From 15b82e14a86e17d69f0762cbe5810ecf685e5802 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 22 May 2018 17:07:12 -0700 Subject: [PATCH 09/31] Removing FLIP_RECENTS Bug: 72222505 Test: Manual Change-Id: I9c84aa3418a5551abec26f03e870da598072e82c --- .../com/android/quickstep/views/RecentsView.java | 16 ++++------------ .../quickstep/views/RecentsViewContainer.java | 5 ----- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index ae8ebbe09f..829ed6c7ac 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -110,7 +110,6 @@ public abstract class RecentsView extends PagedView impl return recentsView.mAdjacentScale; } }; - public static final boolean FLIP_RECENTS = true; private static final int DISMISS_TASK_DURATION = 300; // The threshold at which we update the SystemUI flags when animating from the task into the app private static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.6f; @@ -268,10 +267,7 @@ public abstract class RecentsView extends PagedView impl mQuickScrubController = new QuickScrubController(mActivity, this); mModel = RecentsModel.getInstance(context); - mIsRtl = Utilities.isRtl(getResources()); - if (FLIP_RECENTS) { - mIsRtl = !mIsRtl; - } + mIsRtl = !Utilities.isRtl(getResources()); setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents); @@ -1339,18 +1335,14 @@ public abstract class RecentsView extends PagedView impl @Override public void addChildrenForAccessibility(ArrayList outChildren) { - if (FLIP_RECENTS) { - for (int i = getChildCount() - 1; i >= 0; --i) { - outChildren.add(getChildAt(i)); - } - } else { - super.addChildrenForAccessibility(outChildren); + for (int i = getChildCount() - 1; i >= 0; --i) { + outChildren.add(getChildAt(i)); } } @Override protected boolean isPageOrderFlipped() { - return FLIP_RECENTS; + return true; } public void addTaskAccessibilityActionsExtra(AccessibilityNodeInfo info) { diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index 06e2e89037..846c28b562 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -23,7 +23,6 @@ import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.util.FloatProperty; -import android.view.Gravity; import android.view.MotionEvent; import android.view.View; @@ -67,10 +66,6 @@ public class RecentsViewContainer extends InsettableFrameLayout { }); mRecentsView = findViewById(R.id.overview_panel); - final InsettableFrameLayout.LayoutParams params = - (InsettableFrameLayout.LayoutParams) mClearAllButton.getLayoutParams(); - params.gravity = Gravity.TOP | (RecentsView.FLIP_RECENTS ? Gravity.START : Gravity.END); - mClearAllButton.setLayoutParams(params); mClearAllButton.forceHasOverlappingRendering(false); mRecentsView.setClearAllButton(mClearAllButton); From 73c27ec176270cb2dff8f0c974a64eddb383b377 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Wed, 16 May 2018 18:06:23 -0700 Subject: [PATCH 10/31] Enable new open app transitions when in multiwindow mode. Bug: 79118278 Change-Id: Iba79948256d70c913af0a9a584eb040f3a8b4151 --- .../LauncherAppTransitionManagerImpl.java | 76 ++++++++++++------- .../android/quickstep/RecentsActivity.java | 4 +- .../com/android/quickstep/views/TaskView.java | 2 +- .../launcher3/BaseDraggingActivity.java | 9 +-- src/com/android/launcher3/Launcher.java | 6 +- .../LauncherAppTransitionManager.java | 6 +- .../launcher3/popup/SystemShortcut.java | 2 +- 7 files changed, 61 insertions(+), 44 deletions(-) diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 2e31ef239e..6703bb546e 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -184,7 +184,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag // before our internal listeners. mLauncher.getStateManager().setCurrentAnimation(anim); - anim.play(getIconAnimator(v)); + Rect windowTargetBounds = getWindowTargetBounds(targetCompats); + anim.play(getIconAnimator(v, windowTargetBounds)); if (launcherClosing) { Pair launcherContentAnimator = getLauncherContentAnimator(true /* isAppOpening */); @@ -196,7 +197,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } }); } - anim.play(getOpeningWindowAnimators(v, targetCompats)); + anim.play(getOpeningWindowAnimators(v, targetCompats, windowTargetBounds)); } if (launcherClosing) { @@ -213,7 +214,26 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag return ActivityOptionsCompat.makeRemoteAnimation(new RemoteAnimationAdapterCompat( runner, duration, statusBarTransitionDelay)); } - return getDefaultActivityLaunchOptions(launcher, v); + return super.getActivityLaunchOptions(launcher, v); + } + + /** + * Return the window bounds of the opening target. + * In multiwindow mode, we need to get the final size of the opening app window target to help + * figure out where the floating view should animate to. + */ + private Rect getWindowTargetBounds(RemoteAnimationTargetCompat[] targets) { + Rect bounds = new Rect(0, 0, mDeviceProfile.widthPx, mDeviceProfile.heightPx); + if (mLauncher.isInMultiWindowModeCompat()) { + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == MODE_OPENING) { + bounds.set(target.sourceContainerBounds); + bounds.offsetTo(target.position.x, target.position.y); + return bounds; + } + } + } + return bounds; } public void setRemoteAnimationProvider(RemoteAnimationProvider animationProvider) { @@ -382,7 +402,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag /** * @return Animator that controls the icon used to launch the target. */ - private AnimatorSet getIconAnimator(View v) { + private AnimatorSet getIconAnimator(View v, Rect windowTargetBounds) { final boolean isBubbleTextView = v instanceof BubbleTextView; mFloatingView = new View(mLauncher); if (isBubbleTextView && v.getTag() instanceof ItemInfoWithIcon ) { @@ -418,7 +438,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag viewLocationLeft += rect.left; viewLocationTop += rect.top; int viewLocationStart = mIsRtl - ? mDeviceProfile.widthPx - rect.right + ? windowTargetBounds.width() - rect.right : viewLocationLeft; LayoutParams lp = new LayoutParams(rect.width(), rect.height()); lp.ignoreInsets = true; @@ -438,12 +458,15 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag v.setVisibility(View.INVISIBLE); AnimatorSet appIconAnimatorSet = new AnimatorSet(); - // Animate the app icon to the center - float centerX = mDeviceProfile.widthPx / 2; - float centerY = mDeviceProfile.heightPx / 2; + int[] dragLayerBounds = new int[2]; + mDragLayer.getLocationOnScreen(dragLayerBounds); + + // Animate the app icon to the center of the window bounds in screen coordinates. + float centerX = windowTargetBounds.centerX() - dragLayerBounds[0]; + float centerY = windowTargetBounds.centerY() - dragLayerBounds[1]; float xPosition = mIsRtl - ? mDeviceProfile.widthPx - lp.getMarginStart() - rect.width() + ? windowTargetBounds.width() - lp.getMarginStart() - rect.width() : lp.getMarginStart(); float dX = centerX - xPosition - (lp.width / 2); float dY = centerY - lp.topMargin - (lp.height / 2); @@ -469,8 +492,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag // Scale the app icon to take up the entire screen. This simplifies the math when // animating the app window position / scale. - float maxScaleX = mDeviceProfile.widthPx / (float) rect.width(); - float maxScaleY = mDeviceProfile.heightPx / (float) rect.height(); + float maxScaleX = windowTargetBounds.width() / (float) rect.width(); + float maxScaleY = windowTargetBounds.height() / (float) rect.height(); float scale = Math.max(maxScaleX, maxScaleY); ObjectAnimator scaleAnim = ObjectAnimator .ofFloat(mFloatingView, SCALE_PROPERTY, startScale, scale); @@ -505,7 +528,8 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag /** * @return Animator that controls the window of the opening targets. */ - private ValueAnimator getOpeningWindowAnimators(View v, RemoteAnimationTargetCompat[] targets) { + private ValueAnimator getOpeningWindowAnimators(View v, RemoteAnimationTargetCompat[] targets, + Rect windowTargetBounds) { Rect bounds = new Rect(); if (v.getParent() instanceof DeepShortcutView) { // Deep shortcut views have their icon drawn in a separate view. @@ -544,31 +568,35 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float iconHeight = bounds.height() * mFloatingView.getScaleY(); // Scale the app window to match the icon size. - float scaleX = iconWidth / mDeviceProfile.widthPx; - float scaleY = iconHeight / mDeviceProfile.heightPx; + float scaleX = iconWidth / windowTargetBounds.width(); + float scaleY = iconHeight / windowTargetBounds.height(); float scale = Math.min(1f, Math.min(scaleX, scaleY)); matrix.setScale(scale, scale); // Position the scaled window on top of the icon - int deviceWidth = mDeviceProfile.widthPx; - int deviceHeight = mDeviceProfile.heightPx; - float scaledWindowWidth = deviceWidth * scale; - float scaledWindowHeight = deviceHeight * scale; + int windowWidth = windowTargetBounds.width(); + int windowHeight = windowTargetBounds.height(); + float scaledWindowWidth = windowWidth * scale; + float scaledWindowHeight = windowHeight * scale; float offsetX = (scaledWindowWidth - iconWidth) / 2; float offsetY = (scaledWindowHeight - iconHeight) / 2; - mFloatingView.getLocationInWindow(floatingViewBounds); + if (mLauncher.isInMultiWindowModeCompat()) { + mFloatingView.getLocationOnScreen(floatingViewBounds); + } else { + mFloatingView.getLocationInWindow(floatingViewBounds); + } float transX0 = floatingViewBounds[0] - offsetX; float transY0 = floatingViewBounds[1] - offsetY; matrix.postTranslate(transX0, transY0); // Animate the window crop so that it starts off as a square, and then reveals // horizontally. - float cropHeight = deviceHeight * easePercent + deviceWidth * (1 - easePercent); - float initialTop = (deviceHeight - deviceWidth) / 2f; + float cropHeight = windowHeight * easePercent + windowWidth * (1 - easePercent); + float initialTop = (windowHeight - windowWidth) / 2f; crop.left = 0; crop.top = (int) (initialTop * (1 - easePercent)); - crop.right = deviceWidth; + crop.right = windowWidth; crop.bottom = (int) (crop.top + cropHeight); TransactionCompat t = new TransactionCompat(); @@ -579,10 +607,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag for (RemoteAnimationTargetCompat target : targets) { if (target.mode == MODE_OPENING) { t.setAlpha(target.leash, mAlpha.value); - - // TODO: This isn't correct at the beginning of the animation, but better - // than nothing. - matrix.postTranslate(target.position.x, target.position.y); t.setMatrix(target.leash, matrix); t.setWindowCrop(target.leash, crop); t.deferTransactionUntil(target.leash, surface, getNextFrameNumber(surface)); diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index b472d611ae..3adb290bb8 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -176,8 +176,8 @@ public class RecentsActivity extends BaseDraggingActivity { } @Override - public ActivityOptions getActivityLaunchOptions(final View v, boolean useDefaultLaunchOptions) { - if (useDefaultLaunchOptions || !(v instanceof TaskView)) { + public ActivityOptions getActivityLaunchOptions(final View v) { + if (!(v instanceof TaskView)) { return null; } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 82aa45a18c..744960c09d 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -168,7 +168,7 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback final ActivityOptions opts; if (animate) { opts = BaseDraggingActivity.fromContext(getContext()) - .getActivityLaunchOptions(this, false); + .getActivityLaunchOptions(this); } else { opts = ActivityOptions.makeCustomAnimation(getContext(), 0, 0); } diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index e47dbe5358..d9e7d20336 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -141,13 +141,12 @@ public abstract class BaseDraggingActivity extends BaseActivity return new Rect(pos[0], pos[1], pos[0] + v.getWidth(), pos[1] + v.getHeight()); } - public final Bundle getActivityLaunchOptionsAsBundle(View v, boolean useDefaultLaunchOptions) { - ActivityOptions activityOptions = getActivityLaunchOptions(v, useDefaultLaunchOptions); + public final Bundle getActivityLaunchOptionsAsBundle(View v) { + ActivityOptions activityOptions = getActivityLaunchOptions(v); return activityOptions == null ? null : activityOptions.toBundle(); } - public abstract ActivityOptions getActivityLaunchOptions( - View v, boolean useDefaultLaunchOptions); + public abstract ActivityOptions getActivityLaunchOptions(View v); public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { if (mIsSafeModeEnabled && !Utilities.isSystemApp(this, intent)) { @@ -160,7 +159,7 @@ public abstract class BaseDraggingActivity extends BaseActivity boolean useLaunchAnimation = (v != null) && !intent.hasExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION); Bundle optsBundle = useLaunchAnimation - ? getActivityLaunchOptionsAsBundle(v, isInMultiWindowModeCompat()) + ? getActivityLaunchOptionsAsBundle(v) : null; UserHandle user = item == null ? null : item.user; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index e851499be6..1e47431665 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1598,10 +1598,8 @@ public class Launcher extends BaseDraggingActivity @TargetApi(Build.VERSION_CODES.M) @Override - public ActivityOptions getActivityLaunchOptions(View v, boolean useDefaultLaunchOptions) { - return useDefaultLaunchOptions - ? mAppTransitionManager.getDefaultActivityLaunchOptions(this, v) - : mAppTransitionManager.getActivityLaunchOptions(this, v); + public ActivityOptions getActivityLaunchOptions(View v) { + return mAppTransitionManager.getActivityLaunchOptions(this, v); } public LauncherAppTransitionManager getAppTransitionManager() { diff --git a/src/com/android/launcher3/LauncherAppTransitionManager.java b/src/com/android/launcher3/LauncherAppTransitionManager.java index 04f9b3affa..4037a23ff4 100644 --- a/src/com/android/launcher3/LauncherAppTransitionManager.java +++ b/src/com/android/launcher3/LauncherAppTransitionManager.java @@ -33,7 +33,7 @@ public class LauncherAppTransitionManager { context, R.string.app_transition_manager_class); } - public ActivityOptions getDefaultActivityLaunchOptions(Launcher launcher, View v) { + public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) { if (Utilities.ATLEAST_MARSHMALLOW) { int left = 0, top = 0; int width = v.getMeasuredWidth(), height = v.getMeasuredHeight(); @@ -58,8 +58,4 @@ public class LauncherAppTransitionManager { } return null; } - - public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) { - return getDefaultActivityLaunchOptions(launcher, v); - } } diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index a20149e1c1..3c1cc9057d 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -76,7 +76,7 @@ public abstract class SystemShortcut extends Ite BaseDraggingActivity activity, ItemInfo itemInfo) { return (view) -> { Rect sourceBounds = activity.getViewBounds(view); - Bundle opts = activity.getActivityLaunchOptionsAsBundle(view, false); + Bundle opts = activity.getActivityLaunchOptionsAsBundle(view); new PackageManagerHelper(activity).startDetailsActivityForInfo( itemInfo, sourceBounds, opts); activity.getUserEventDispatcher().logActionOnControl(Action.Touch.TAP, From 4a545dd1b20a48c008fc749faf1d1701e87073b8 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 23 May 2018 14:19:45 +0200 Subject: [PATCH 11/31] Use SyncRtSurfaceTransactionApplier for app closing/opening To ensure 100% synchronization, fixing jank. Test: Open and close apps Bug: 78611607 Change-Id: I5646bb259c90b65e1abe0fd67c9918f6a2b196cc --- quickstep/libs/sysui_shared.jar | Bin 129096 -> 131921 bytes .../LauncherAppTransitionManagerImpl.java | 45 ++++++++++-------- .../util/RemoteAnimationProvider.java | 11 +++-- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 53a6ceb4d06e87b31c69070e18eb74622257cc26..41bf7299742b44f2331aa24db043245a54290060 100644 GIT binary patch delta 11675 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 SmT;DE(rj>W#}l_jfcsz33MSD2 delta 8876 zcmZvBbzBtf_clX!cL|bGg3^sh$P$7eh@^CvfJiJNAt4gN(xC{_vB**a(v65pF5TtQ zt?%xF&-ZzLpLhS6Yp#>`Irq%Y%oz^H??&K}+y`M{Q)A%c<6}feR>YG?W1$Wjfv7`e zF9(1+LJ>d}9ttE5cZfj{V*n|1l_2Gk$>0=EoFpKD{2l{vq5Tw4v_T>Q5Qo-MLGk}F z>KX?appDFMv=KCelLQkh3hB6n+Ymqj$d@oc5E3^5T!$L)IuW2L;VeK9iV#`HMQg$( zVV3}+kU@xI5*sUIAc!fXMWO~i4q7Km=Q&ygWinPn`%h##6-&Ht%m^``2B@LkCVJ># z$m~!o17vy{nX`x4HZj`YB})S>aSB8mLjXQNFcBd_nwVok25FoD@S#Djk7>}l9t8>z zwppalo1tWApHQVRC3F%H=Eh4aXiF3w5n4G*M<%f)3L9cF2M{N6B`=^!r7#7k24o!@ zb@ERnNXs062g#WS2%sSuK3FIj^eo%)GHdXZSfX$a4YVq^@p8Ey1!tGQtyJSux3S{& zWj2~sAyjDV;f_COQ6iJESn>)$m>Abb3T5jRx>VEco5sJ&1}%l;EF*gh{w{V|J>5P9 z2;mBHm4u_onCMo5r|v;F$K%i^Q1H~*C5ze>?kfNlv}2}>0;PA^P6Qr60?;W{jDt=tEgld}{srK}W~qRFbaYe$K(JFf;N?G^2f_Ln zfxv%BlUV_~e@Q{?e^1%oqusH=2si=Je`!Q>172u*7}7hkQdf-z!88Pc)5}wZTC^!G zEM6Gcq(&!K>2{S|qY99T)`FR+0}beYL6Ar^c^9CE*=hjaE*F@q3y8wpw19W$3lD-a zhbZg;RItZ7fHGPIhE#DzmlQ^B0EAqkBqKl@Z2?<;1ZZ8_B5NfIDcuL?Ac_Y7E-d0P zVE^~3M_!u;06R?43MjbLZE8k_Wwil9E>BTeKpYPN1{lH?@VM*0elGf1Ym;A2Ln2nxxpp>$CE-fPXSuk z>z9DYr8)9mBy(ABBvOWaKLaRX`VoL4Ho8Hml|!=60W#P`G|+gtqzq29J6cHDIkIr` zuYpgOYe4R_ZnP)ljq|D)ju!wU44MciTt-0FTo0_jq0OX5EssUy!#t8lT1W0aFUmd^ zSK**F5$;4n+LOPm=S-OdZri5Tsj!>+%r-1hs9$(9PT@lN-NSXP{nVl&JKIt55H9|X z1Yg@hsTrx6y8iRMnQSmt3v**n3%-Dz1x^!4nG2_wLD)iy#L2O=XlPHgr1(Gu*DNF{ z#1MSrII9J5oo>pUTi8h8Gq**_y$Fh0y@e1L+^xW6@zo$AuDY~phYd0BI%%~#ZEl`# zTAmCfyCf2JB~6KZwi>eA3QjjmtS|8wXZkKva`s)`#7WPi#gX|#NF5P2cb???rw={+ zXL}VT=}#KdS`O5C?Yo>bnt9CmjIVJm+)5_^&)l9&vF&pf6;V<0E7l0C&)L0pI9wbS z`$~mvOJ$ot_RP8*yG%p3GBBw9V!=fy^qpU^kw56o$MHK8ws7A%Nuvq@kVx&+7uhvn zGS9{I(91{t79yosJzv&@l z@Vk@~))xVEg~etRjaq?1DyF$fD?86FyykefjI#UdpSmntnEVDw-jcAoJ^I0y;UJIA z9Y$8}Sw0{~_PXesd`v3^@1dZhD7lXp=zFSQn6fF(TJ`FV^iOk-I$F}+8h-E{B`tq; zVSQq&*w6`D&!k%PZrSxMjXlfscf(eL(+i$f zrxW8zx|_b;QYE>|>d#ej^eRwwyW(ONV~NFZqJOV`m%=odWFk_?B3}qg03mG{5lK`w zR>Jp;R{kabjgK~#SmKo=bYt(9o&6tTO?$rOZgw&t8YA8O1kVt3j`&VE#g9GpsJ9hN z>s&lUX8))qT@R67LcU~hpK1~|_2M}p2+BH-)=h zw`KL;O(rFQ(ir_aR*O#FoNyQnA5YIPy3{9_jlPJW(-V#@5k1kXNf1@ToC*sz1 zxVg>@`HgoUgoj@#_^$mvHU`ETAqK|(p7fA^MVc7@{2=`A0T4LQUEh%A4;;p1Rwc{E z$wjSxY>x#;#N!x)!Z3vzn5rtw;qbeP6H7Kn@v>uqHv=00CH|-!`wROY#{3;c2BSen z(ciEq9E&AsoVJYc)XrN|eXO5aXM9N=G>Yo*nwcDE3dMQ9^TvN$Y9;Hh?t~$`+(~u{LA99z5sos5kF}-lYNJtKJh%z%cPUv*kjGc z4Dtl=v}Htn!0BTm2>;x}R)|H>Oj8k_JDyd)sO_*U#U4HmdC@<;E6->|XRQIwo;Ddb`@dyuN3`haD}zI}6! z6Bj0DAnUG1=bcvaZpVTxq1yfNwb)4=+m!pO5B5qyV1|bg-<}V0I58+2-p)GD3Q+1H z`Ir@u?aXU4p7?f8h6+dO^T;TV(`OBJuF`z^69ej1AA<)(PV|)99x8-MEC-D|c^el| zl|`lLU)Dx$6CQBpIciw5jlQS9SH}ZN3y;f6hQh0IJ?rwG?iSfg_})@idOd$y15KC^h%Cg`|53A{e^-<1ErVNq z&bA(re@Olk9_t6gAC%v5 z4My!H8kFBFKpw#tbIjWB2Dmfr>^M52a^~^tx670ZHCC&@0_?Iqe+G_ z7U5oCW{ed_uVuP<=g(zHmd0vP)6xcMEX25et>IDLke}vN*`-b#I#wpRM~S)!+K(wg zzjdb`*Ls1*2Q{~Ue9!2g%$lu{9V}Vj00i3%PhgJ*h2MwdC>K1IQttWw`6qjd8I7cl zT*3U3;hvOOc7a%P*7PF{RXXF2>zrivYfZc};K2Iic#`dJ*-1xF?{7#YsBSpEW;pfH z3+?A67IWqQ!RaJcwzzM~?dn_SWx}%Dn>TH_$|z-pcSpU{{h>@Q7DnCXnMQYapQJa2F8ZWzvilWknW^r2rU%^afsHNt#s?H@nJMkM zh=WhyoaNO$#p+FP?s9Iw*IH(vU4Q2)$fCFSxLVZ=H{SZj$*+Q*+o!qslyJpw&l3jJ z=2}&Tf(1=vvFAQIRL3jK_kU3OZhC5JdtHtJkQ!1s*O0^o+ zj`=53AB}j@4{#au5qu|nM&bR^oyFZm$V}dsnJT(HDK*zfkh1GBpqnH;7b>-Z(EOpPJ)y1b0P{qXS|dMYF?RkNF_ zEs$x#{dEaLR;S<)?oi)~a=$D4{b%P%D(m5&LwJ9Ip*Y0v4N$E@CHj50(p2E7xRI)#l_(8#G|MK>Rp-=9a<$6T+Xi^HB{6_{o{Q{HxJ%_VZMhPN_rcfi5tD zPCT@^65^3{5x*>f@bw|38+&{lAxuOU>i6t{eTPCA%`?!Lq8G6n5kVt|bC-=J*}xe+ z)#2>|1V%AMR=!_cWGlfkrI{sFn1uar{&da^yMtC6@gKwO>nsB$!y*x4QpwP@Sm6PJ zpY!SzPl6uHMHa3q6V<(=HO#K=C79@_k@_>?YTt#%$ z$jg7AS=h9CESg+s_}W;t{h)8;$A?q{+*-wgm2-WRSU|MZ@ zSXVSn?o;n8)9w-AspS4#rI&gmFsbj0EK}dENsL``wR-#JowvR1eR&VGl9r*ly$8@3uDE*9S`Cjk8F0&RljL(YFo9>Kfn24QB-?gtQ zm+aF5?+=?|CQqI3uawsAeF%aXYaH#DdV=-)`|dV9uw5OTF)~X75qxchVienBBZi5| z>7n8I5i6lz{?I7d{|S0^v;a!g4}Cr=+di%!JQob>T3GV@Dy~8Q={5bv%Ma$ztYat3 z%)sj$L6l}$xgu>}b$RSL#F z(2Z3`yU17)9Rbm-2u|x^Qm;{g2^)Qw{hRo<@rY#0Ym=LSWxhMqN3(x0QC*IWcqG{h zU|`(D`oCR9eFsP`2L!=%A)zMtm{s?Jzb5~5ye^u6{V*~3UNG(_n=zJz7w}YXTg>*y z#RuOW`VZF_cbI*D_`Ey^nS{s8uyXDfSlq+nmpjvERcCqalRZ1$&m4ITyk@|BwL zJ_|L^qFq$IQ`MXV5-;8D0K>-83)KF zwoB+8b7#@?4Mldr+86wGo+-(i>F?+f3Lg6qb|F}Hj?1DT$m^JYe!>4nz%>Q(_t&Dj ziuueyb85$xQQ5re*F*&Sy2+Mh_cGQ7>`F&!Fa`UhRuq+dP1_7|nDxlB8D+cS@9p-z zo|`MdY)`r6x~gqY!89fO+H2e6_jHCbS;S0-a(KhiE=s+!9<5T1OpOUU3>wu-tk4s7 zLIlZTmN%bdyDqUz_8-;lwci*_4cso-rU%Ug=4N3*tt|u`HfGciVjYD~ZoE@?Bzw0y zWRBNJp+3~9A@GX;7h^P4XAF4`E~DQarHf#P)MrP>TjEexd=u6q~iph*W>a}?je$F3#Iw_OzPKoP-r8jPE_I*qj@@QqQLP0zo(3EJ*F;$ zbp-UHc~n|;SRQQmHnUOzYV0*q^T|22j&ev{C*|D6ps{S81gG#Tg)Cgb=J({!gtgxk z4=O|+1O`-%m$WzvP-OpR7>%xeA2cYIA;7gRw@!=og9f{u*R)g4F$r@~d$LHjiwYNq z+3oB5K(05bDN^h|774>EOj7dZwQyKKA>Ue*`UKWnL+`PJ1%f9X%gG-5RZbW$-+Ce= z#i8?QnJP$NyTqY{P4^dlz0+etaY#pmCd|HGNP=X%4*EhGCv`VgH*m0bfVGDEb%x85 zx7w?>gs11PTxqc(-a$FBl7|l3F&fl3-VEk;AaYgE%{pie-Cey7721Z?kPvvPvkKh#9A2 ztluAJoBqt`lYl9M!JRSTWbUaKUSh7r+b69mR*Yq{$~4y;YWd!pehGPI^5APTp$(t> z&x%(%DFoo*Hr*wKhy9+^q}kF|i;Yn&ngh~@e$Ca+QBRdT0%SR27>9Jc%MCp;Uo^ts z7g~6F^H_%!w@vhVwF$L04fIl%CN{w@;EmDMGbPbg`(-Jw2y28IF!f#H1JWRe$8R?o ze4u;IJ!0#JT6V21`@VKI9&`sWNrp9y+FyIW+<5_xxgFo@(IP}`Usx-SZ$;(I6uwy; z`f7+i3jwNWn7F+U@>UKCZe!@mg6_`ISi~&F#!?>LAFbGJa}L@2l40(k^9nPdcSMUn zW7~GAoK!_L?aR;Ky#hplXs%;#);AUhB_~zUqlw+mPqu14i6u$&f~4vmwBYVSdDz~5arEE_Y{aHp2XT1V~ zvdnR=cN`Dynjp4I5UXEX|s8qS9-aujfNLP1Se($QTRRUI+aKGtQm{ZP#WyovFLt*IUo6 zYKWVU1vKiq_x4I0~1LLfc=&WecjSDaL-j`~%jQu1c*7xK$j_(~EJ#PvKH+S87?O+3xib4xX`z9Ol<=9XLg zq^|{;9~PPC0lTQx+d(F)#?H0DHp%uQN$z7X-cw5RE`9qSW~%lTSS=5Q!V5c*^Y#UU=v=JC58&OH$m9}uyVR#pSkVw%l@88 zTRu*;V9w{wmFoU9@8dl;G{3>D}so{Rj)Vwe8a++vuBc-ARuZkWI>^lorf2=PbbMU_LT6x7>42G zbZA;_=v~>S;MkV=XYKP0#FWSTHkrzq1x+Kl{l45_VJbX+xJpDl@ZC= z9y^8laWYLIYb2n2iSM`I@7Bb%Zo*sl%faER%D{8uU~VjgwV?Bx<-s}9jA)AjCkvh1 zBmtX=niz8*ZSU1KeSYr?WYQEaa46iXE-eQ$i=Pprn@?FJy5iI zZMr32wa~Csw6mOWX!pXTJ+6~6T($<&!b-4(?j&f9HrRY2_W-!IoKewu50iUxq7TeK zixZei`dlT%=VVg3K=hs=ujgX+hmY?PyThW^d!yDT=4BviEr$DiG@pGyDt`2R)S1id z2pSgR*f_WNpS0yJ!yEehs*5H1{86n#Wf;x2T*uL&;Io>!0by1({`txpY1W{3O>GrT zeLMcJr$17AQ$%?@l0UPd4}f~mp})qQ(1LuNeMIx` z2OZ=b4Tc;LT}MwWAjm0`7$gY5B!tibm^853dcYDrdw?P5joFve2IOSo4SK=_yWas+ zqB-(me&_;vdQNR@q?u-HU zXiz!^SfK&c_?0Mh{7Up|94SK0xC|zMFf@Qq0B&fYGYL4M!RJZjNDQTOdkXMCgMul* z7Y*3qfDIZ%!T}#Nz???T-%!dS)5usTu=f{O&mbpSC}v~^a6tp*S-=hrN@oFcG$5P1 za_BpEC7PSNvbsMH_@i|O=K)7FkXg9$Q@jAUqZ!u4tHe?k0c$k#XA!wlR8YsIs|**G zuB;v`UxoO*jAT#)P{9?XXB0^L3-DI23gx+aRhGq7;5pi%<=WLs=l%lAb!3Jp^O^N4 zhdLWqp!qMjxrwYQN+)v@c!KtWxplQbkH28{FVNY(5;bjK74zn=D<ql4lJUj-TqVpLzzRFqlE%=c76baej{+Lz?~ph|xy>ez(#8k5R?De;IZD z0l3im|Gq^i{YQU4?@~WW7?TgRrX*8LCM=G!D>56C7ftpeN%e|L5^}#0AVS?n*wHnR z0gy6`s{hF-Ah7@@FfVNMzjGEhlwc- zF~P*7Myo0;%G{Jg4j^I)Ffio*qq^FJQq@HFY6cUN2{XP8Mesv-urQfPtud@IwD>VF Lmim!zfEfP|r7aQx diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 6703bb546e..80d24d0357 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -71,6 +71,7 @@ import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; +import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.system.ActivityCompat; @@ -79,6 +80,8 @@ import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; +import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier.SurfaceParams; import com.android.systemui.shared.system.TransactionCompat; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -545,6 +548,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag Rect crop = new Rect(); Matrix matrix = new Matrix(); + RemoteAnimationTargetSet openingTargets = new RemoteAnimationTargetSet(targets, + MODE_OPENING); + RemoteAnimationTargetSet closingTargets = new RemoteAnimationTargetSet(targets, + MODE_CLOSING); + SyncRtSurfaceTransactionApplier surfaceApplier = new SyncRtSurfaceTransactionApplier( + mFloatingView); + ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setDuration(APP_LAUNCH_DURATION); appAnimator.addUpdateListener(new MultiValueUpdateListener() { @@ -554,13 +564,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag @Override public void onUpdate(float percent) { - final Surface surface = getSurface(mFloatingView); - final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; - if (frameNumber == -1) { - // Booo, not cool! Our surface got destroyed, so no reason to animate anything. - Log.w(TAG, "Failed to animate, surface got destroyed."); - return; - } final float easePercent = AGGRESSIVE_EASE.getInterpolation(percent); // Calculate app icon size. @@ -571,7 +574,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float scaleX = iconWidth / windowTargetBounds.width(); float scaleY = iconHeight / windowTargetBounds.height(); float scale = Math.min(1f, Math.min(scaleX, scaleY)); - matrix.setScale(scale, scale); // Position the scaled window on top of the icon int windowWidth = windowTargetBounds.width(); @@ -588,7 +590,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } float transX0 = floatingViewBounds[0] - offsetX; float transY0 = floatingViewBounds[1] - offsetY; - matrix.postTranslate(transX0, transY0); // Animate the window crop so that it starts off as a square, and then reveals // horizontally. @@ -599,22 +600,24 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag crop.right = windowWidth; crop.bottom = (int) (crop.top + cropHeight); - TransactionCompat t = new TransactionCompat(); if (isFirstFrame) { - RemoteAnimationProvider.prepareTargetsForFirstFrame(targets, t, MODE_OPENING); + TransactionCompat t = new TransactionCompat(); + RemoteAnimationProvider.prepareTargetsForFirstFrame(closingTargets.apps, t, + MODE_OPENING); + t.setEarlyWakeup(); + t.apply(); isFirstFrame = false; } - for (RemoteAnimationTargetCompat target : targets) { - if (target.mode == MODE_OPENING) { - t.setAlpha(target.leash, mAlpha.value); - t.setMatrix(target.leash, matrix); - t.setWindowCrop(target.leash, crop); - t.deferTransactionUntil(target.leash, surface, getNextFrameNumber(surface)); - } - } - t.setEarlyWakeup(); - t.apply(); + SurfaceParams[] params = new SurfaceParams[openingTargets.apps.length]; + for (int i = openingTargets.apps.length - 1; i >= 0; i--) { + RemoteAnimationTargetCompat target = openingTargets.apps[i]; + matrix.setScale(scale, scale); + matrix.postTranslate(transX0, transY0); + params[i] = new SurfaceParams(target.leash, mAlpha.value, matrix, crop, + RemoteAnimationProvider.getLayer(target, MODE_OPENING)); + } + surfaceApplier.scheduleApply(params); matrix.reset(); } }); diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java index bbf223d1ef..86a0dea28d 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java @@ -54,11 +54,14 @@ public interface RemoteAnimationProvider { static void prepareTargetsForFirstFrame(RemoteAnimationTargetCompat[] targets, TransactionCompat t, int boostModeTargets) { for (RemoteAnimationTargetCompat target : targets) { - int layer = target.mode == boostModeTargets - ? Integer.MAX_VALUE - : target.prefixOrderIndex; - t.setLayer(target.leash, layer); + t.setLayer(target.leash, getLayer(target, boostModeTargets)); t.show(target.leash); } } + + static int getLayer(RemoteAnimationTargetCompat target, int boostModeTarget) { + return target.mode == boostModeTarget + ? Integer.MAX_VALUE + : target.prefixOrderIndex; + } } From 0d25fc094ddd5971460228219b12d60e3cc6cfbe Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 23 May 2018 14:07:08 +0000 Subject: [PATCH 12/31] Revert "Use SyncRtSurfaceTransactionApplier for app closing/opening" This reverts commit 4a545dd1b20a48c008fc749faf1d1701e87073b8. Reason for revert: Messes up SF vsync timings. Bug: 78611607 Change-Id: I5978eb65a7bab0d75b4150b8d394a28b38fc1da4 --- quickstep/libs/sysui_shared.jar | Bin 131921 -> 129096 bytes .../LauncherAppTransitionManagerImpl.java | 45 ++++++++---------- .../util/RemoteAnimationProvider.java | 11 ++--- 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar index 41bf7299742b44f2331aa24db043245a54290060..53a6ceb4d06e87b31c69070e18eb74622257cc26 100644 GIT binary patch delta 8876 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 Lmim!zfEfP|r7aQx delta 11675 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 SmT;DE(rj>W#}l_jfcsz33MSD2 diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java index 80d24d0357..6703bb546e 100644 --- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java @@ -71,7 +71,6 @@ import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.quickstep.util.ClipAnimationHelper; import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; -import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.system.ActivityCompat; @@ -80,8 +79,6 @@ import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; -import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier; -import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplier.SurfaceParams; import com.android.systemui.shared.system.TransactionCompat; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -548,13 +545,6 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag Rect crop = new Rect(); Matrix matrix = new Matrix(); - RemoteAnimationTargetSet openingTargets = new RemoteAnimationTargetSet(targets, - MODE_OPENING); - RemoteAnimationTargetSet closingTargets = new RemoteAnimationTargetSet(targets, - MODE_CLOSING); - SyncRtSurfaceTransactionApplier surfaceApplier = new SyncRtSurfaceTransactionApplier( - mFloatingView); - ValueAnimator appAnimator = ValueAnimator.ofFloat(0, 1); appAnimator.setDuration(APP_LAUNCH_DURATION); appAnimator.addUpdateListener(new MultiValueUpdateListener() { @@ -564,6 +554,13 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag @Override public void onUpdate(float percent) { + final Surface surface = getSurface(mFloatingView); + final long frameNumber = surface != null ? getNextFrameNumber(surface) : -1; + if (frameNumber == -1) { + // Booo, not cool! Our surface got destroyed, so no reason to animate anything. + Log.w(TAG, "Failed to animate, surface got destroyed."); + return; + } final float easePercent = AGGRESSIVE_EASE.getInterpolation(percent); // Calculate app icon size. @@ -574,6 +571,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag float scaleX = iconWidth / windowTargetBounds.width(); float scaleY = iconHeight / windowTargetBounds.height(); float scale = Math.min(1f, Math.min(scaleX, scaleY)); + matrix.setScale(scale, scale); // Position the scaled window on top of the icon int windowWidth = windowTargetBounds.width(); @@ -590,6 +588,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag } float transX0 = floatingViewBounds[0] - offsetX; float transY0 = floatingViewBounds[1] - offsetY; + matrix.postTranslate(transX0, transY0); // Animate the window crop so that it starts off as a square, and then reveals // horizontally. @@ -600,24 +599,22 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag crop.right = windowWidth; crop.bottom = (int) (crop.top + cropHeight); + TransactionCompat t = new TransactionCompat(); if (isFirstFrame) { - TransactionCompat t = new TransactionCompat(); - RemoteAnimationProvider.prepareTargetsForFirstFrame(closingTargets.apps, t, - MODE_OPENING); - t.setEarlyWakeup(); - t.apply(); + RemoteAnimationProvider.prepareTargetsForFirstFrame(targets, t, MODE_OPENING); isFirstFrame = false; } - SurfaceParams[] params = new SurfaceParams[openingTargets.apps.length]; - for (int i = openingTargets.apps.length - 1; i >= 0; i--) { - RemoteAnimationTargetCompat target = openingTargets.apps[i]; - matrix.setScale(scale, scale); - matrix.postTranslate(transX0, transY0); - - params[i] = new SurfaceParams(target.leash, mAlpha.value, matrix, crop, - RemoteAnimationProvider.getLayer(target, MODE_OPENING)); + for (RemoteAnimationTargetCompat target : targets) { + if (target.mode == MODE_OPENING) { + t.setAlpha(target.leash, mAlpha.value); + t.setMatrix(target.leash, matrix); + t.setWindowCrop(target.leash, crop); + t.deferTransactionUntil(target.leash, surface, getNextFrameNumber(surface)); + } } - surfaceApplier.scheduleApply(params); + t.setEarlyWakeup(); + t.apply(); + matrix.reset(); } }); diff --git a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java index 86a0dea28d..bbf223d1ef 100644 --- a/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java +++ b/quickstep/src/com/android/quickstep/util/RemoteAnimationProvider.java @@ -54,14 +54,11 @@ public interface RemoteAnimationProvider { static void prepareTargetsForFirstFrame(RemoteAnimationTargetCompat[] targets, TransactionCompat t, int boostModeTargets) { for (RemoteAnimationTargetCompat target : targets) { - t.setLayer(target.leash, getLayer(target, boostModeTargets)); + int layer = target.mode == boostModeTargets + ? Integer.MAX_VALUE + : target.prefixOrderIndex; + t.setLayer(target.leash, layer); t.show(target.leash); } } - - static int getLayer(RemoteAnimationTargetCompat target, int boostModeTarget) { - return target.mode == boostModeTarget - ? Integer.MAX_VALUE - : target.prefixOrderIndex; - } } From 1d19e2f152de0ff55a83a54d81311620d70883f1 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 22 May 2018 23:12:10 -0700 Subject: [PATCH 13/31] Start springs for All Apps when user flings up. Bug: 77695481 Change-Id: Ifecfbbb89601947118f620f522662aee8a61946e --- .../allapps/AllAppsContainerView.java | 32 +++++++++++++++++++ .../AbstractStateChangeTouchController.java | 3 ++ .../launcher3/views/SpringRelativeLayout.java | 13 ++++++++ 3 files changed, 48 insertions(+) diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java index f8648bba02..68ad6e346f 100644 --- a/src/com/android/launcher3/allapps/AllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java @@ -15,12 +15,14 @@ */ package com.android.launcher3.allapps; +import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Rect; import android.os.Process; +import android.support.animation.DynamicAnimation; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; @@ -61,6 +63,10 @@ import com.android.launcher3.views.SpringRelativeLayout; public class AllAppsContainerView extends SpringRelativeLayout implements DragSource, Insettable, OnDeviceProfileChangeListener { + private static final float FLING_VELOCITY_MULTIPLIER = 135f; + // Starts the springs after at least 55% of the animation has passed. + private static final float FLING_ANIMATION_THRESHOLD = 0.55f; + private final Launcher mLauncher; private final AdapterHolder[] mAH; private final ItemInfoMatcher mPersonalMatcher = ItemInfoMatcher.ofUser(Process.myUserHandle()); @@ -455,6 +461,32 @@ public class AllAppsContainerView extends SpringRelativeLayout implements DragSo } } + /** + * Adds an update listener to {@param animator} that adds springs to the animation. + */ + public void addSpringFromFlingUpdateListener(ValueAnimator animator, float velocity) { + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator valueAnimator) { + if (valueAnimator.getAnimatedFraction() >= FLING_ANIMATION_THRESHOLD) { + int searchViewId = getSearchView().getId(); + addSpringView(searchViewId); + + finishWithShiftAndVelocity(1, velocity * FLING_VELOCITY_MULTIPLIER, + new DynamicAnimation.OnAnimationEndListener() { + @Override + public void onAnimationEnd(DynamicAnimation animation, + boolean canceled, float value, float velocity) { + removeSpringView(searchViewId); + } + }); + + animator.removeUpdateListener(this); + } + } + }); + } + public class AdapterHolder { public static final int MAIN = 0; public static final int WORK = 1; diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index 24382b7d00..61bd5c88a7 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -396,6 +396,9 @@ public abstract class AbstractStateChangeTouchController updateSwipeCompleteAnimation(anim, Math.max(duration, getRemainingAtomicDuration()), targetState, velocity, fling); mCurrentAnimation.dispatchOnStart(); + if (fling && targetState == LauncherState.ALL_APPS) { + mLauncher.getAppsView().addSpringFromFlingUpdateListener(anim, velocity); + } anim.start(); if (mAtomicAnim == null) { startAtomicComponentsAnim(endProgress, anim.getDuration()); diff --git a/src/com/android/launcher3/views/SpringRelativeLayout.java b/src/com/android/launcher3/views/SpringRelativeLayout.java index 598738b9f7..5022d65a30 100644 --- a/src/com/android/launcher3/views/SpringRelativeLayout.java +++ b/src/com/android/launcher3/views/SpringRelativeLayout.java @@ -17,6 +17,7 @@ package com.android.launcher3.views; import android.content.Context; import android.graphics.Canvas; +import android.support.animation.DynamicAnimation; import android.support.animation.FloatPropertyCompat; import android.support.animation.SpringAnimation; import android.support.animation.SpringForce; @@ -79,6 +80,11 @@ public class SpringRelativeLayout extends RelativeLayout { mSpringViews.put(id, true); } + public void removeSpringView(int id) { + mSpringViews.delete(id); + invalidate(); + } + @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { if (mDampedScrollShift != 0 && mSpringViews.get(child.getId())) { @@ -110,6 +116,13 @@ public class SpringRelativeLayout extends RelativeLayout { mSpring.start(); } + protected void finishWithShiftAndVelocity(float shift, float velocity, + DynamicAnimation.OnAnimationEndListener listener) { + setDampedScrollShift(shift); + mSpring.addEndListener(listener); + finishScrollWithVelocity(velocity); + } + public EdgeEffectFactory createEdgeEffectFactory() { return new SpringEdgeEffectFactory(); } From e598699dc510d9f69b05554aa482107ed24bc9ba Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 23 May 2018 10:51:37 -0700 Subject: [PATCH 14/31] Remove custom focus logic Using the system logic for focus handling so that partially visible contents are properly handled, eg in overview only hotseat is visible This does changes the focus logic on workspace when both icons and widgets or different sizes are present, we may consider reviving (parts of) this logic in the future Bug: 80189843 Change-Id: I874e284e0a62b579c24d36db9b74da3de7a7e367 --- src/com/android/launcher3/FocusHelper.java | 3 +++ src/com/android/launcher3/Hotseat.java | 1 - src/com/android/launcher3/Workspace.java | 2 -- src/com/android/launcher3/folder/FolderPagedView.java | 4 ---- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/FocusHelper.java b/src/com/android/launcher3/FocusHelper.java index 1f18ea1ac8..466b7b242f 100644 --- a/src/com/android/launcher3/FocusHelper.java +++ b/src/com/android/launcher3/FocusHelper.java @@ -65,6 +65,9 @@ class FullscreenKeyEventListener implements View.OnKeyListener { } } +/** + * TODO: Reevaluate if this is still required + */ public class FocusHelper { private static final String TAG = "FocusHelper"; diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java index c6025fe5f7..ee4b1130d0 100644 --- a/src/com/android/launcher3/Hotseat.java +++ b/src/com/android/launcher3/Hotseat.java @@ -112,7 +112,6 @@ public class Hotseat extends FrameLayout implements LogContainerProvider, Insett allAppsButton.setCompoundDrawables(null, d, null, null); allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label)); - allAppsButton.setOnKeyListener(new HotseatIconKeyEventListener()); if (mLauncher != null) { allAppsButton.setOnClickListener((v) -> { if (!mLauncher.isInState(ALL_APPS)) { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 6631f771c1..42e8fde3b4 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -881,7 +881,6 @@ public class Workspace extends PagedView final CellLayout layout; if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { layout = mLauncher.getHotseat().getLayout(); - child.setOnKeyListener(new HotseatIconKeyEventListener()); // Hide folder title in the hotseat if (child instanceof FolderIcon) { @@ -893,7 +892,6 @@ public class Workspace extends PagedView ((FolderIcon) child).setTextVisible(true); } layout = getScreenWithId(screenId); - child.setOnKeyListener(new IconKeyEventListener()); } ViewGroup.LayoutParams genericLp = child.getLayoutParams(); diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java index fa7565adb0..9be71f95c9 100644 --- a/src/com/android/launcher3/folder/FolderPagedView.java +++ b/src/com/android/launcher3/folder/FolderPagedView.java @@ -31,7 +31,6 @@ import android.view.ViewDebug; import com.android.launcher3.BubbleTextView; import com.android.launcher3.CellLayout; import com.android.launcher3.DeviceProfile; -import com.android.launcher3.FocusHelper.PagedFolderKeyEventListener; import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.ItemInfo; import com.android.launcher3.Launcher; @@ -88,7 +87,6 @@ public class FolderPagedView extends PagedView { private int mGridCountY; private Folder mFolder; - private PagedFolderKeyEventListener mKeyListener; public FolderPagedView(Context context, AttributeSet attrs) { super(context, attrs); @@ -108,7 +106,6 @@ public class FolderPagedView extends PagedView { public void setFolder(Folder folder) { mFolder = folder; - mKeyListener = new PagedFolderKeyEventListener(folder); mPageIndicator = folder.findViewById(R.id.folder_page_indicator); initParentViews(folder); } @@ -241,7 +238,6 @@ public class FolderPagedView extends PagedView { textView.setOnClickListener(ItemClickHandler.INSTANCE); textView.setOnLongClickListener(mFolder); textView.setOnFocusChangeListener(mFocusIndicatorHelper); - textView.setOnKeyListener(mKeyListener); textView.setLayoutParams(new CellLayout.LayoutParams( item.cellX, item.cellY, item.spanX, item.spanY)); From 8fbd56e1390c874300df882bfa46e74ad32d9514 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Tue, 22 May 2018 18:09:28 -0700 Subject: [PATCH 15/31] Fixing arrow navigation in task carousel Bug: 80155387 Change-Id: Icbdca2e8ad2a0e7e7dfbc8493942787d9fa58a62 --- .../android/quickstep/views/RecentsView.java | 34 ++++++++----------- .../quickstep/views/RecentsViewContainer.java | 8 +++++ 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 829ed6c7ac..0358028bc7 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -930,11 +930,16 @@ public abstract class RecentsView extends PagedView impl set.play(anim); } - private void snapToPageRelative(int delta) { + private boolean snapToPageRelative(int delta, boolean cycle) { if (getPageCount() == 0) { - return; + return false; } - snapToPage((getNextPage() + getPageCount() + delta) % getPageCount()); + final int newPageUnbound = getNextPage() + delta; + if (!cycle && (newPageUnbound < 0 || newPageUnbound >= getChildCount())) { + return false; + } + snapToPage((newPageUnbound + getPageCount()) % getPageCount()); + return true; } @Override @@ -970,21 +975,12 @@ public abstract class RecentsView extends PagedView impl if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_TAB: - if (!event.isAltPressed() && - getNextPage() == - (event.isShiftPressed() ? 0 : getChildCount() - 1)) { - // If not Alt-Tab navigation, don't loop forever in the carousel and leave - // it once we reached the end. - return false; - } - snapToPageRelative(event.isShiftPressed() ? -1 : 1); - return true; + return snapToPageRelative(event.isShiftPressed() ? -1 : 1, + event.isAltPressed() /* cycle */); case KeyEvent.KEYCODE_DPAD_RIGHT: - snapToPageRelative(mIsRtl ? -1 : 1); - return true; + return snapToPageRelative(mIsRtl ? -1 : 1, false /* cycle */); case KeyEvent.KEYCODE_DPAD_LEFT: - snapToPageRelative(mIsRtl ? 1 : -1); - return true; + return snapToPageRelative(mIsRtl ? 1 : -1, false /* cycle */); case KeyEvent.KEYCODE_DEL: case KeyEvent.KEYCODE_FORWARD_DEL: dismissTask((TaskView) getChildAt(getNextPage()), true /*animateTaskView*/, @@ -1012,16 +1008,14 @@ public abstract class RecentsView extends PagedView impl setCurrentPage(0); break; case FOCUS_BACKWARD: + case FOCUS_RIGHT: + case FOCUS_LEFT: setCurrentPage(getChildCount() - 1); break; } } } - public void snapToTaskAfterNext() { - snapToPageRelative(1); - } - public float getContentAlpha() { return mContentAlpha; } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index 846c28b562..3391214dee 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -70,6 +70,14 @@ public class RecentsViewContainer extends InsettableFrameLayout { mRecentsView.setClearAllButton(mClearAllButton); mClearAllButton.setRecentsView(mRecentsView); + + if (mRecentsView.isRtl()) { + mClearAllButton.setNextFocusRightId(mRecentsView.getId()); + mRecentsView.setNextFocusLeftId(mClearAllButton.getId()); + } else { + mClearAllButton.setNextFocusLeftId(mRecentsView.getId()); + mRecentsView.setNextFocusRightId(mClearAllButton.getId()); + } } @Override From 46d07f7cb0dc95d28b83bacf2c2b6807009b3ff2 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Tue, 22 May 2018 15:41:25 -0700 Subject: [PATCH 16/31] Log the parent of the PREDICTION container type (ALLAPPS OR TASKSWITCHER) Bug: 79423536 Change-Id: I23ff0d4d0aa3fec781e9b6c8792d2d7a738ca6c8 --- src/com/android/launcher3/BaseActivity.java | 8 ++++-- src/com/android/launcher3/Launcher.java | 25 +++++++++++++++++-- .../logging/UserEventDispatcher.java | 16 +++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java index 4219667557..e117deb818 100644 --- a/src/com/android/launcher3/BaseActivity.java +++ b/src/com/android/launcher3/BaseActivity.java @@ -30,7 +30,9 @@ import android.view.View.AccessibilityDelegate; import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; import com.android.launcher3.uioverrides.UiFactory; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.util.SystemUiController; import java.io.FileDescriptor; @@ -38,7 +40,7 @@ import java.io.PrintWriter; import java.lang.annotation.Retention; import java.util.ArrayList; -public abstract class BaseActivity extends Activity { +public abstract class BaseActivity extends Activity implements UserEventDelegate{ public static final int INVISIBLE_BY_STATE_HANDLER = 1 << 0; public static final int INVISIBLE_BY_APP_TRANSITIONS = 1 << 1; @@ -89,9 +91,11 @@ public abstract class BaseActivity extends Activity { return null; } + public void modifyUserEvent(LauncherLogProto.LauncherEvent event) {} + public final UserEventDispatcher getUserEventDispatcher() { if (mUserEventDispatcher == null) { - mUserEventDispatcher = UserEventDispatcher.newInstance(this, mDeviceProfile); + mUserEventDispatcher = UserEventDispatcher.newInstance(this, mDeviceProfile, this); } return mUserEventDispatcher; } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 14390ec027..48f9a809e8 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -24,6 +24,7 @@ import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_LAUNCHER_LOAD; import static com.android.launcher3.logging.LoggerUtils.newContainerTarget; +import static com.android.launcher3.logging.LoggerUtils.newTarget; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -91,6 +92,7 @@ import com.android.launcher3.keyboard.CustomActionsPopup; import com.android.launcher3.keyboard.ViewGroupFocusHelper; import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.UserEventDispatcher; +import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; import com.android.launcher3.model.ModelWriter; import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.popup.PopupContainerWithArrow; @@ -100,6 +102,7 @@ import com.android.launcher3.states.InternalStateHandler; import com.android.launcher3.states.RotationHelper; import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.uioverrides.UiFactory; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; @@ -140,8 +143,8 @@ import java.util.Set; /** * Default launcher application. */ -public class Launcher extends BaseDraggingActivity - implements LauncherExterns, LauncherModel.Callbacks, LauncherProviderChangeListener { +public class Launcher extends BaseDraggingActivity implements LauncherExterns, + LauncherModel.Callbacks, LauncherProviderChangeListener, UserEventDelegate{ public static final String TAG = "Launcher"; static final boolean LOGD = false; @@ -1645,6 +1648,24 @@ public class Launcher extends BaseDraggingActivity } } + @Override + public void modifyUserEvent(LauncherLogProto.LauncherEvent event) { + if (event.srcTarget != null && event.srcTarget.length > 0 && + event.srcTarget[1].containerType == ContainerType.PREDICTION) { + Target[] targets = new Target[3]; + targets[0] = event.srcTarget[0]; + targets[1] = event.srcTarget[1]; + targets[2] = newTarget(Target.Type.CONTAINER); + event.srcTarget = targets; + LauncherState state = mStateManager.getState(); + if (state == LauncherState.ALL_APPS) { + event.srcTarget[2].containerType = ContainerType.ALLAPPS; + } else if (state == LauncherState.OVERVIEW) { + event.srcTarget[2].containerType = ContainerType.TASKSWITCHER; + } + } + } + public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { boolean success = super.startActivitySafely(v, intent, item); if (success && v instanceof BubbleTextView) { diff --git a/src/com/android/launcher3/logging/UserEventDispatcher.java b/src/com/android/launcher3/logging/UserEventDispatcher.java index 1842e19a45..d1e1051eee 100644 --- a/src/com/android/launcher3/logging/UserEventDispatcher.java +++ b/src/com/android/launcher3/logging/UserEventDispatcher.java @@ -70,7 +70,8 @@ public class UserEventDispatcher { FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isPropertyEnabled(LogConfig.USEREVENT); private static final String UUID_STORAGE = "uuid"; - public static UserEventDispatcher newInstance(Context context, DeviceProfile dp) { + public static UserEventDispatcher newInstance(Context context, DeviceProfile dp, + UserEventDelegate delegate) { SharedPreferences sharedPrefs = Utilities.getDevicePrefs(context); String uuidStr = sharedPrefs.getString(UUID_STORAGE, null); if (uuidStr == null) { @@ -79,6 +80,7 @@ public class UserEventDispatcher { } UserEventDispatcher ued = Utilities.getOverrideObject(UserEventDispatcher.class, context.getApplicationContext(), R.string.user_event_dispatcher_class); + ued.mDelegate = delegate; ued.mIsInLandscapeMode = dp.isVerticalBarLayout(); ued.mIsInMultiWindowMode = dp.isMultiWindowMode; ued.mUuidStr = uuidStr; @@ -86,6 +88,14 @@ public class UserEventDispatcher { return ued; } + public static UserEventDispatcher newInstance(Context context, DeviceProfile dp) { + return newInstance(context, dp, null); + } + + public interface UserEventDelegate { + void modifyUserEvent(LauncherEvent event); + } + /** * Implemented by containers to provide a container source for a given child. */ @@ -134,6 +144,7 @@ public class UserEventDispatcher { private String mUuidStr; protected InstantAppResolver mInstantAppResolver; private boolean mAppOrTaskLaunch; + private UserEventDelegate mDelegate; // APP_ICON SHORTCUT WIDGET // -------------------------------------------------------------- @@ -162,6 +173,9 @@ public class UserEventDispatcher { newItemTarget(v, mInstantAppResolver), newTarget(Target.Type.CONTAINER)); if (fillInLogContainerData(event, v)) { + if (mDelegate != null) { + mDelegate.modifyUserEvent(event); + } fillIntentInfo(event.srcTarget[0], intent); } dispatchUserEvent(event, intent); From 422e1f9c69efdbc7ccfe10e8ebdadcf30a25022e Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Wed, 23 May 2018 13:20:10 -0700 Subject: [PATCH 17/31] Only log swipe interaction on swipe end Previously we were logging new states as we swipe past them; now we just log the start and end states when lifting your finger. Bug: 80102083 Change-Id: Icec6c3dab1441023a3cdcadb7b56ecef8313cb8c --- .../AbstractStateChangeTouchController.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java index a9006e3143..453810c067 100644 --- a/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java +++ b/src/com/android/launcher3/touch/AbstractStateChangeTouchController.java @@ -42,9 +42,9 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.AnimatorSetBuilder; +import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; -import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.launcher3.util.FlingBlockCheck; import com.android.launcher3.util.PendingAnimation; import com.android.launcher3.util.TouchController; @@ -181,17 +181,6 @@ public abstract class AbstractStateChangeTouchController return false; } - if (reachedToState) { - logReachedState(Touch.SWIPE); - } - if (newFromState == ALL_APPS) { - mStartContainerType = ContainerType.ALLAPPS; - } else if (newFromState == NORMAL) { - mStartContainerType = getLogContainerTypeForNormalState(); - } else if (newFromState == OVERVIEW){ - mStartContainerType = ContainerType.TASKSWITCHER; - } - mFromState = newFromState; mToState = newToState; @@ -237,6 +226,13 @@ public abstract class AbstractStateChangeTouchController @Override public void onDragStart(boolean start) { mStartState = mLauncher.getStateManager().getState(); + if (mStartState == ALL_APPS) { + mStartContainerType = LauncherLogProto.ContainerType.ALLAPPS; + } else if (mStartState == NORMAL) { + mStartContainerType = getLogContainerTypeForNormalState(); + } else if (mStartState == OVERVIEW){ + mStartContainerType = LauncherLogProto.ContainerType.TASKSWITCHER; + } if (mCurrentAnimation == null) { mFromState = mStartState; mToState = null; @@ -332,23 +328,21 @@ public abstract class AbstractStateChangeTouchController @Override public void onDragEnd(float velocity, boolean fling) { - final int logAction; - final LauncherState targetState; - final float progress = mCurrentAnimation.getProgressFraction(); + final int logAction = fling ? Touch.FLING : Touch.SWIPE; boolean blockedFling = fling && mFlingBlockCheck.isBlocked(); if (blockedFling) { fling = false; } + final LauncherState targetState; + final float progress = mCurrentAnimation.getProgressFraction(); if (fling) { - logAction = Touch.FLING; targetState = Float.compare(Math.signum(velocity), Math.signum(mProgressMultiplier)) == 0 ? mToState : mFromState; // snap to top or bottom using the release velocity } else { - logAction = Touch.SWIPE; float successProgress = mToState == ALL_APPS ? MIN_PROGRESS_TO_ALL_APPS : SUCCESS_TRANSITION_PROGRESS; targetState = (progress > successProgress) ? mToState : mFromState; @@ -472,20 +466,20 @@ public abstract class AbstractStateChangeTouchController shouldGoToTargetState = !reachedTarget; } if (shouldGoToTargetState) { - if (targetState != mFromState) { - logReachedState(logAction); + if (targetState != mStartState) { + logReachedState(logAction, targetState); } mLauncher.getStateManager().goToState(targetState, false /* animated */); } } - private void logReachedState(int logAction) { + private void logReachedState(int logAction, LauncherState targetState) { // Transition complete. log the action mLauncher.getUserEventDispatcher().logStateChangeAction(logAction, getDirectionForLog(), mStartContainerType, - mFromState.containerType, - mToState.containerType, + mStartState.containerType, + targetState.containerType, mLauncher.getWorkspace().getCurrentPage()); } From 79141a1236ebf9d540b72cd1bf1bc56d4b5fe954 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 16 May 2018 15:54:31 -0700 Subject: [PATCH 18/31] Accessibility sugar for Recents Adding various-pitch earcorns that depend on the scroll state and position in the list notifications. This is for Talkback. Bug: 72222505 Test: Manual Change-Id: I99ffe553f7a20d057940197d97506bc1a14a193e --- .../android/quickstep/views/RecentsView.java | 30 +++++++++++++++++++ .../com/android/quickstep/views/TaskView.java | 8 ++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 0358028bc7..186de36814 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -54,7 +54,9 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; +import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.ListView; import com.android.launcher3.BaseActivity; import com.android.launcher3.DeviceProfile; @@ -1334,6 +1336,34 @@ public abstract class RecentsView extends PagedView impl } } + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + + final AccessibilityNodeInfo.CollectionInfo + collectionInfo = AccessibilityNodeInfo.CollectionInfo.obtain( + 1, getChildCount(), false, + AccessibilityNodeInfo.CollectionInfo.SELECTION_MODE_NONE); + info.setCollectionInfo(collectionInfo); + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { + event.setFromIndex(getCurrentPage()); + event.setToIndex(getCurrentPage()); + event.setItemCount(getChildCount()); + } + } + + @Override + public CharSequence getAccessibilityClassName() { + // To hear position-in-list related feedback from Talkback. + return ListView.class.getName(); + } + @Override protected boolean isPageOrderFlipped() { return true; diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 0df0580fea..213d9cb592 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -320,7 +320,13 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback } } - getRecentsView().addTaskAccessibilityActionsExtra(info); + final RecentsView recentsView = getRecentsView(); + recentsView.addTaskAccessibilityActionsExtra(info); + + final AccessibilityNodeInfo.CollectionItemInfo itemInfo = + AccessibilityNodeInfo.CollectionItemInfo.obtain( + 0, 1, recentsView.indexOfChild(this), 1, false); + info.setCollectionItemInfo(itemInfo); } @Override From 793a0238fc19abe41b723b6945b9fa3b63cffc8b Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 23 May 2018 13:57:50 -0700 Subject: [PATCH 19/31] Import translations. DO NOT MERGE Change-Id: Ifb3ec95e81a8988a78e8b4dd90fee00b355525c3 Auto-generated-cl: translation import --- quickstep/res/values-af/strings.xml | 3 +-- quickstep/res/values-am/strings.xml | 3 +-- quickstep/res/values-ar/strings.xml | 3 +-- quickstep/res/values-as/strings.xml | 3 +-- quickstep/res/values-az/strings.xml | 3 +-- quickstep/res/values-b+sr+Latn/strings.xml | 3 +-- quickstep/res/values-be/strings.xml | 3 +-- quickstep/res/values-bg/strings.xml | 3 +-- quickstep/res/values-bn/strings.xml | 3 +-- quickstep/res/values-bs/strings.xml | 3 +-- quickstep/res/values-ca/strings.xml | 3 +-- quickstep/res/values-cs/strings.xml | 3 +-- quickstep/res/values-da/strings.xml | 3 +-- quickstep/res/values-de/strings.xml | 3 +-- quickstep/res/values-el/strings.xml | 3 +-- quickstep/res/values-en-rAU/strings.xml | 1 + quickstep/res/values-en-rGB/strings.xml | 1 + quickstep/res/values-en-rIN/strings.xml | 1 + quickstep/res/values-es-rUS/strings.xml | 3 +-- quickstep/res/values-es/strings.xml | 3 +-- quickstep/res/values-et/strings.xml | 3 +-- quickstep/res/values-eu/strings.xml | 3 +-- quickstep/res/values-fa/strings.xml | 3 +-- quickstep/res/values-fi/strings.xml | 3 +-- quickstep/res/values-fr-rCA/strings.xml | 3 +-- quickstep/res/values-fr/strings.xml | 3 +-- quickstep/res/values-gl/strings.xml | 3 +-- quickstep/res/values-gu/strings.xml | 3 +-- quickstep/res/values-hi/strings.xml | 3 +-- quickstep/res/values-hr/strings.xml | 3 +-- quickstep/res/values-hu/strings.xml | 3 +-- quickstep/res/values-hy/strings.xml | 3 +-- quickstep/res/values-in/strings.xml | 3 +-- quickstep/res/values-is/strings.xml | 3 +-- quickstep/res/values-it/strings.xml | 3 +-- quickstep/res/values-iw/strings.xml | 3 +-- quickstep/res/values-ja/strings.xml | 3 +-- quickstep/res/values-ka/strings.xml | 3 +-- quickstep/res/values-kk/strings.xml | 3 +-- quickstep/res/values-km/strings.xml | 3 +-- quickstep/res/values-kn/strings.xml | 3 +-- quickstep/res/values-ko/strings.xml | 3 +-- quickstep/res/values-ky/strings.xml | 3 +-- quickstep/res/values-lo/strings.xml | 3 +-- quickstep/res/values-lt/strings.xml | 3 +-- quickstep/res/values-lv/strings.xml | 3 +-- quickstep/res/values-mk/strings.xml | 3 +-- quickstep/res/values-ml/strings.xml | 3 +-- quickstep/res/values-mn/strings.xml | 3 +-- quickstep/res/values-mr/strings.xml | 3 +-- quickstep/res/values-ms/strings.xml | 3 +-- quickstep/res/values-my/strings.xml | 3 +-- quickstep/res/values-nb/strings.xml | 3 +-- quickstep/res/values-ne/strings.xml | 3 +-- quickstep/res/values-nl/strings.xml | 3 +-- quickstep/res/values-or/strings.xml | 3 +-- quickstep/res/values-pa/strings.xml | 3 +-- quickstep/res/values-pl/strings.xml | 3 +-- quickstep/res/values-pt-rPT/strings.xml | 3 +-- quickstep/res/values-pt/strings.xml | 3 +-- quickstep/res/values-ro/strings.xml | 1 + quickstep/res/values-ru/strings.xml | 3 +-- quickstep/res/values-si/strings.xml | 1 + quickstep/res/values-sk/strings.xml | 3 +-- quickstep/res/values-sl/strings.xml | 3 +-- quickstep/res/values-sq/strings.xml | 3 +-- quickstep/res/values-sr/strings.xml | 3 +-- quickstep/res/values-sv/strings.xml | 3 +-- quickstep/res/values-sw/strings.xml | 3 +-- quickstep/res/values-ta/strings.xml | 3 +-- quickstep/res/values-te/strings.xml | 3 +-- quickstep/res/values-th/strings.xml | 3 +-- quickstep/res/values-tl/strings.xml | 3 +-- quickstep/res/values-tr/strings.xml | 3 +-- quickstep/res/values-uk/strings.xml | 3 +-- quickstep/res/values-ur/strings.xml | 3 +-- quickstep/res/values-uz/strings.xml | 3 +-- quickstep/res/values-vi/strings.xml | 3 +-- quickstep/res/values-zh-rCN/strings.xml | 3 +-- quickstep/res/values-zh-rHK/strings.xml | 3 +-- quickstep/res/values-zh-rTW/strings.xml | 3 +-- quickstep/res/values-zu/strings.xml | 3 +-- res/values-af/strings.xml | 5 +++-- res/values-am/strings.xml | 5 +++-- res/values-ar/strings.xml | 5 +++-- res/values-as/strings.xml | 7 +++++-- res/values-az/strings.xml | 5 +++-- res/values-b+sr+Latn/strings.xml | 5 +++-- res/values-be/strings.xml | 5 +++-- res/values-bg/strings.xml | 5 +++-- res/values-bn/strings.xml | 7 +++++-- res/values-bs/strings.xml | 5 +++-- res/values-ca/strings.xml | 5 +++-- res/values-cs/strings.xml | 5 +++-- res/values-da/strings.xml | 5 +++-- res/values-de/strings.xml | 5 +++-- res/values-el/strings.xml | 5 +++-- res/values-en-rAU/strings.xml | 5 +++-- res/values-en-rGB/strings.xml | 5 +++-- res/values-en-rIN/strings.xml | 5 +++-- res/values-es-rUS/strings.xml | 5 +++-- res/values-es/strings.xml | 5 +++-- res/values-et/strings.xml | 5 +++-- res/values-eu/strings.xml | 5 +++-- res/values-fa/strings.xml | 5 +++-- res/values-fi/strings.xml | 5 +++-- res/values-fr-rCA/strings.xml | 5 +++-- res/values-fr/strings.xml | 5 +++-- res/values-gl/strings.xml | 5 +++-- res/values-gu/strings.xml | 7 +++++-- res/values-hi/strings.xml | 7 +++++-- res/values-hr/strings.xml | 5 +++-- res/values-hu/strings.xml | 5 +++-- res/values-hy/strings.xml | 5 +++-- res/values-in/strings.xml | 5 +++-- res/values-is/strings.xml | 5 +++-- res/values-it/strings.xml | 5 +++-- res/values-iw/strings.xml | 5 +++-- res/values-ja/strings.xml | 5 +++-- res/values-ka/strings.xml | 5 +++-- res/values-kk/strings.xml | 5 +++-- res/values-km/strings.xml | 5 +++-- res/values-kn/strings.xml | 7 +++++-- res/values-ko/strings.xml | 5 +++-- res/values-ky/strings.xml | 5 +++-- res/values-lo/strings.xml | 5 +++-- res/values-lt/strings.xml | 5 +++-- res/values-lv/strings.xml | 5 +++-- res/values-mk/strings.xml | 5 +++-- res/values-ml/strings.xml | 7 +++++-- res/values-mn/strings.xml | 5 +++-- res/values-mr/strings.xml | 5 +++-- res/values-ms/strings.xml | 5 +++-- res/values-my/strings.xml | 5 +++-- res/values-nb/strings.xml | 5 +++-- res/values-ne/strings.xml | 7 +++++-- res/values-nl/strings.xml | 5 +++-- res/values-or/strings.xml | 7 +++++-- res/values-pa/strings.xml | 7 +++++-- res/values-pl/strings.xml | 5 +++-- res/values-pt-rPT/strings.xml | 5 +++-- res/values-pt/strings.xml | 5 +++-- res/values-ro/strings.xml | 5 +++-- res/values-ru/strings.xml | 5 +++-- res/values-si/strings.xml | 5 +++-- res/values-sk/strings.xml | 5 +++-- res/values-sl/strings.xml | 5 +++-- res/values-sq/strings.xml | 5 +++-- res/values-sr/strings.xml | 5 +++-- res/values-sv/strings.xml | 5 +++-- res/values-sw/strings.xml | 5 +++-- res/values-ta/strings.xml | 7 +++++-- res/values-te/strings.xml | 7 +++++-- res/values-th/strings.xml | 5 +++-- res/values-tl/strings.xml | 5 +++-- res/values-tr/strings.xml | 5 +++-- res/values-uk/strings.xml | 5 +++-- res/values-ur/strings.xml | 7 +++++-- res/values-uz/strings.xml | 5 +++-- res/values-vi/strings.xml | 5 +++-- res/values-zh-rCN/strings.xml | 5 +++-- res/values-zh-rHK/strings.xml | 5 +++-- res/values-zh-rTW/strings.xml | 7 ++++--- res/values-zu/strings.xml | 5 +++-- 164 files changed, 353 insertions(+), 319 deletions(-) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index b33456d31c..8ae493fb6e 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -25,6 +25,5 @@ "Geen onlangse items nie" "Maak toe" "Vee alles uit" - - + "Onlangse programme" diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 2f303c078b..4ca0c67979 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -25,6 +25,5 @@ "ምንም የቅርብ ጊዜ ንጥሎች የሉም" "ዝጋ" "ሁሉንም አጽዳ" - - + "የቅርብ ጊዜ መተግበሪያዎች" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index e22bef47e5..c04b618699 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -25,6 +25,5 @@ "ليست هناك عناصر تم استخدامها مؤخرًا" "إغلاق" "محو الكل" - - + "التطبيقات التي تمّ استخدامها مؤخرًا" diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index 7294f142dd..812a24649a 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -25,6 +25,5 @@ "কোনো শেহতীয়া বস্তু নাই" "বন্ধ কৰক" "সকলো মচক" - - + "শেহতীয়া এপসমূহ" diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 4c2f8ec717..832ed8c5f6 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -25,6 +25,5 @@ "Son elementlər yoxdur" "Bağlayın" "Hamısını silin" - - + "Son tətbiqlər" diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index bf66aef80e..fc4c8c0d08 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -25,6 +25,5 @@ "Nema nedavnih stavki" "Zatvori" "Obriši sve" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index 48ed4c579b..c5d03d47a5 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -25,6 +25,5 @@ "Няма новых элементаў" "Закрыць" "Ачысціць усё" - - + "Нядаўнія праграмы" diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index 30308ad0ca..2672b83653 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -25,6 +25,5 @@ "Няма скорошни елементи" "Затваряне" "Изчистване на всички" - - + "Скорошни приложения" diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 80eb639056..0a824c2dd1 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -25,6 +25,5 @@ "কোনো সাম্প্রতিক আইটেম নেই" "বন্ধ করুন" "সবকিছু খালি করুন" - - + "সম্প্রতি ব্যবহৃত অ্যাপ" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 201f46144b..6bf38eba15 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -25,6 +25,5 @@ "Nema nedavnih stavki" "Zatvaranje" "Obriši sve" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index c6b93e3712..2d51703ae4 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -25,6 +25,5 @@ "No hi ha cap element recent" "Tanca" "Esborra-ho tot" - - + "Aplicacions recents" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index 023244c554..a178df08b4 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -25,6 +25,5 @@ "Žádné nedávné položky" "Zavřít" "Vymazat vše" - - + "Poslední aplikace" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 5d1e763732..d0d629f5a1 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -25,6 +25,5 @@ "Ingen nye elementer" "Luk" "Ryd alt" - - + "Seneste apps" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index cf2f1940ac..aee8b85b8c 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -25,6 +25,5 @@ "Keine kürzlich verwendeten Elemente" "Schließen" "Alle Apps schließen" - - + "Zuletzt aktive Apps" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 9cf05763d6..7364b82823 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -25,6 +25,5 @@ "Δεν υπάρχουν πρόσφατα στοιχεία" "Κλείσιμο" "Διαγραφή όλων" - - + "Πρόσφατες εφαρμογές" diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index 61d031b5d0..d0dc1e8cb8 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -25,4 +25,5 @@ "No recent items" "Close" "Clear all" + "Recent apps" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index 61d031b5d0..d0dc1e8cb8 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -25,4 +25,5 @@ "No recent items" "Close" "Clear all" + "Recent apps" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index 61d031b5d0..d0dc1e8cb8 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -25,4 +25,5 @@ "No recent items" "Close" "Clear all" + "Recent apps" diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 320892abae..83e9d96aa1 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -25,6 +25,5 @@ "No hay elementos recientes" "Cerrar" "Borrar todo" - - + "Apps recientes" diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index abccec881b..e076df56ef 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -25,6 +25,5 @@ "No hay elementos recientes" "Cerrar" "Borrar todo" - - + "Aplicaciones recientes" diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 5143406ce1..85de9c0ab7 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -25,6 +25,5 @@ "Hiljutisi üksusi pole" "Sule" "Sule kõik" - - + "Hiljutised rakendused" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index 879aa28ceb..60943ccc4f 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -25,6 +25,5 @@ "Ez dago azkenaldi honetako ezer" "Itxi" "Garbitu guztiak" - - + "Azken aplikazioak" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index b76e9a5656..4a30daa30c 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -25,6 +25,5 @@ "بدون موارد اخیر" "بستن" "پاک کردن همه" - - + "برنامه‌های اخیر" diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index bbfaa11e10..8f4135001f 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -25,6 +25,5 @@ "Ei viimeaikaisia kohteita" "Sulje" "Poista kaikki" - - + "Viimeisimmät sovellukset" diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index 7cad9fca95..7177996415 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -25,6 +25,5 @@ "Aucun élément récent" "Fermer" "Tout effacer" - - + "Applications récentes" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 078ab2b5cd..0deb00bc35 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -25,6 +25,5 @@ "Aucun élément récent" "Fermer" "Tout effacer" - - + "Applications récentes" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index 549d804771..8c217eb7bb 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -25,6 +25,5 @@ "Non hai elementos recentes" "Pecha a aplicación" "Borrar todo" - - + "Aplicacións recentes" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 27235f2bcf..8b9a538ed1 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -25,6 +25,5 @@ "તાજેતરની કોઈ આઇટમ નથી" "બંધ કરો" "બધું સાફ કરો" - - + "તાજેતરની ઍપ" diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 46b404f529..83c31e78da 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -25,6 +25,5 @@ "हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है" "बंद करें" "सभी ऐप्लिकेशन बंद करें" - - + "हाल ही में इस्तेमाल किए गए एेप्लिकेशन" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index b8682608f2..baa8d85acb 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -25,6 +25,5 @@ "Nema nedavnih stavki" "Zatvori" "Izbriši sve" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index 60cd6a1ddc..d971374774 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -25,6 +25,5 @@ "Nincsenek mostanában használt elemek" "Bezárás" "Összes törlése" - - + "Legutóbbi alkalmazások" diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index c908263b6d..b4b9b98095 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -25,6 +25,5 @@ "Վերջին տարրեր չկան" "Փակել" "Փակել բոլորը" - - + "Վերջին օգտագործած հավելվածները" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index ff6267c9b3..787c14338e 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -25,6 +25,5 @@ "Tidak ada item yang baru dibuka" "Tutup" "Hapus semua" - - + "Aplikasi baru-baru ini" diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index bbb460729c..1aface0c90 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -25,6 +25,5 @@ "Engin nýleg atriði" "Loka" "Hreinsa allt" - - + "Nýleg forrit" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 6175a4720c..192ec44c72 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -25,6 +25,5 @@ "Nessun elemento recente" "Chiudi" "Cancella tutto" - - + "App recenti" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index 9afb842e32..64c35ec116 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -25,6 +25,5 @@ "אין פריטים אחרונים" "סגירה" "ניקוי הכול" - - + "אפליקציות אחרונות" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index e478d4acc1..558112cded 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -25,6 +25,5 @@ "最近のアイテムはありません" "閉じる" "すべてクリア" - - + "最近使ったアプリ" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index 3d9726c790..5f061debb8 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -25,6 +25,5 @@ "ბოლოს გამოყენებული ერთეულები არ არის" "დახურვა" "ყველას გასუფთავება" - - + "ბოლოდროინდელი აპები" diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index 80cab46bbd..3e72130f1f 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -25,6 +25,5 @@ "Соңғы элементтер жоқ" "Жабу" "Барлығын өшіру" - - + "Соңғы пайдаланылған қолданбалар" diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index 36a9ad98db..6ae948258b 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -25,6 +25,5 @@ "មិនមានធាតុថ្មីៗទេ" "បិទ" "សម្អាត​ទាំងអស់" - - + "កម្មវិធី​ថ្មីៗ" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index 314638cab2..591418b9c2 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -25,6 +25,5 @@ "ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ" "ಮುಚ್ಚಿ" "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" - - + "ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 557ee4a01c..5b1ecbd2e7 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -25,6 +25,5 @@ "최근 항목이 없습니다." "닫기" "모두 삭제" - - + "최근 앱" diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 1575af6506..9f84037f7b 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -25,6 +25,5 @@ "Акыркы колдонмолор жок" "Жабуу" "Баарын тазалоо" - - + "Акыркы колдонмолор" diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index 3e332be0b2..ed1cb6e849 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -25,6 +25,5 @@ "ບໍ່ມີລາຍການຫຼ້າສຸດ" "ປິດ" "ລຶບລ້າງທັງໝົດ" - - + "ແອັບຫຼ້າສຸດ" diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 4dd2680230..c16fc56bbd 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -25,6 +25,5 @@ "Nėra jokių naujausių elementų" "Uždaryti" "Išvalyti viską" - - + "Naujausios programos" diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 7eb385fa8d..2dee41c43a 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -25,6 +25,5 @@ "Nav nesenu vienumu." "Aizvērt" "Notīrīt visu" - - + "Pēdējās izmantotās lietotnes" diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index 9e959d3170..ff16cea8cb 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -25,6 +25,5 @@ "Нема неодамнешни ставки" "Затвори" "Исчисти ги сите" - - + "Неодамнешни апликации" diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index 1d7b927a9c..624aded2a3 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -25,6 +25,5 @@ "സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല" "അവസാനിപ്പിക്കുക" "എല്ലാം മായ്‌ക്കുക" - - + "സമീപകാല ആപ്പുകൾ" diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 5031388f96..f9021252bd 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -25,6 +25,5 @@ "Сүүлийн үеийн зүйл алга" "Хаах" "Бүгдийг устгах" - - + "Саяхны аппууд" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 939963e46e..7a669dd647 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -25,6 +25,5 @@ "कोणतेही अलीकडील आयटम नाहीत" "बंद" "सर्व साफ करा" - - + "अलीकडील अॅप्स" diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 0e93bf6c1a..699586373c 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -25,6 +25,5 @@ "Tiada item terbaharu" "Tutup" "Kosongkan semua" - - + "Apl terbaharu" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index ebffc3c3b4..ae6dc7d0a0 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -25,6 +25,5 @@ "မကြာမီကဖွင့်ထားသည်များ မရှိပါ" "ပိတ်ရန်" "အားလုံးကို ရှင်းရန်" - - + "လတ်တလောသုံး အက်ပ်များ" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 97870b15cc..cb8ee10f8e 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -25,6 +25,5 @@ "Ingen nylige elementer" "Lukk" "Fjern alt" - - + "Nylige apper" diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index c9a6c6b894..4efae7b080 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -25,6 +25,5 @@ "हालसालैको कुनै पनि वस्तु छैन" "बन्द गर्नुहोस्" "सबै खाली गर्नुहोस्" - - + "हालसालैका अनुप्रयोगहरू" diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index e3acf0dc36..8ef2a5d5ce 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -25,6 +25,5 @@ "Geen recente items" "Sluiten" "Alles wissen" - - + "Recente apps" diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index 5e5e420ff6..6895ef5f5f 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -25,6 +25,5 @@ "କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ" "ବନ୍ଦ କରନ୍ତୁ" "ସବୁ ଖାଲି କରନ୍ତୁ" - - + "ସାମ୍ପ୍ରତିକ ଆପ୍‌" diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index fec9f03fbe..4159c30b3f 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -25,6 +25,5 @@ "ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ" "ਬੰਦ ਕਰੋ" "ਸਭ ਕਲੀਅਰ ਕਰੋ" - - + "ਹਾਲੀਆ ਐਪਾਂ" diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 54196e8465..cf15abd171 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -25,6 +25,5 @@ "Brak ostatnich elementów" "Zamknij" "Wyczyść wszystko" - - + "Ostatnie aplikacje" diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index afc6295373..36c7e3c455 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -25,6 +25,5 @@ "Nenhum item recente" "Fechar" "Limpar tudo" - - + "Aplicações recentes" diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index 9e43cd7c0a..41f53f0e98 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -25,6 +25,5 @@ "Nenhum item recente" "Fechar" "Limpar tudo" - - + "Apps recentes" diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index a8889d4b4a..032d886fb1 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -25,4 +25,5 @@ "Niciun element recent" "Închideți" "Ștergeți tot" + "Aplicații recente" diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 832aa0aa19..6a218fc6b8 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -25,6 +25,5 @@ "Здесь пока ничего нет." "Закрыть" "Очистить все" - - + "Недавние приложения" diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index 61bb8ba81c..c01211ac51 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -25,4 +25,5 @@ "මෑත අයිතම නැත" "වසන්න" "සියල්ල හිස් කරන්න" + "මෑත යෙදුම්" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index da4585bf1d..2cd394208e 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -25,6 +25,5 @@ "Žiadne nedávne položky" "Zavrieť" "Vymazať všetko" - - + "Nedávne aplikácie" diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index 6a25e9d834..06eb95d863 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -25,6 +25,5 @@ "Ni nedavnih elementov" "Zapri" "Počisti vse" - - + "Nedavne aplikacije" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index 521b8c75cc..00231e1340 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -25,6 +25,5 @@ "Nuk ka asnjë artikull të fundit" "Mbyll" "Pastroji të gjitha" - - + "Aplikacionet e fundit" diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index 054cda5945..0077ee244c 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -25,6 +25,5 @@ "Нема недавних ставки" "Затвори" "Обриши све" - - + "Недавне апликације" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 1a0ecc13e1..f05d79f2af 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -25,6 +25,5 @@ "Listan med de senaste åtgärderna är tom" "Stäng" "Rensa alla" - - + "Senaste apparna" diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index be26e8bc66..e6ce953dbd 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -25,6 +25,5 @@ "Hakuna vipengee vya hivi karibuni" "Funga" "Ondoa zote" - - + "Programu za hivi karibuni" diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 886b017a8f..19518e1810 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -25,6 +25,5 @@ "சமீபத்தியவை எதுவுமில்லை" "மூடும்" "எல்லாம் அழி" - - + "சமீபத்திய ஆப்ஸ்" diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index a0a818cf61..4c0e5ac563 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -25,6 +25,5 @@ "ఇటీవలి అంశాలు ఏవీ లేవు" "మూసివేయండి" "అన్నీ తీసివేయండి" - - + "ఇటీవలి యాప్‌లు" diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index 5a162b729d..8dfda248c3 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -25,6 +25,5 @@ "ไม่มีรายการล่าสุด" "ปิด" "ล้างทั้งหมด" - - + "แอปล่าสุด" diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index af7ff97fa7..ab3cac9dc2 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -25,6 +25,5 @@ "Walang kamakailang item" "Isara" "I-clear lahat" - - + "Mga kamakailang app" diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index 760a61ffd5..9693413034 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -25,6 +25,5 @@ "Yeni öğe yok" "Kapat" "Tümünü temizle" - - + "Son uygulamalar" diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 41babaa879..2afcb31865 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -25,6 +25,5 @@ "Немає нещодавніх додатків" "Закрити" "Очистити все" - - + "Нещодавні додатки" diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 9dd7b8d33c..f493a2f64d 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -25,6 +25,5 @@ "کوئی حالیہ آئٹم نہیں" "بند کریں" "سبھی کو صاف کریں" - - + "حالیہ ایپس" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index c78f000ca5..4911925984 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -25,6 +25,5 @@ "Yaqinda ishlatilgan ilovalar yo‘q" "Yopish" "Hammasini tozalash" - - + "Yaqinda ishlatilgan ilovalar" diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index 4b1d1c0257..406faf5f8c 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -25,6 +25,5 @@ "Không có mục gần đây nào" "Đóng" "Xóa tất cả" - - + "Ứng dụng gần đây" diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index 17cf6c31a1..71ac114979 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -25,6 +25,5 @@ "近期没有任何内容" "关闭" "全部清除" - - + "最近用过的应用" diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 1203cf01fc..ab29a91bfe 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -25,6 +25,5 @@ "最近沒有任何項目" "關閉" "全部清除" - - + "最近使用的應用程式" diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index ed708b4950..1a9448c59f 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -25,6 +25,5 @@ "最近沒有任何項目" "關閉" "全部清除" - - + "最近使用的應用程式" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 1aa34b6b6d..3d4f37250a 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -25,6 +25,5 @@ "Azikho izinto zakamuva" "Vala" "Sula konke" - - + "Izinhlelo zokusebenza zakamuva" diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 87924e79b3..35539e3608 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -108,6 +108,8 @@ "%1$s laai tans af, %2$s voltooid" "%1$s wag tans om te installeer" "%1$s-legstukke" + "Legstukkelys" + "Legstukkelys is toegemaak" "Voeg by tuisskerm" "Skuif item hierheen" "Item is by tuisskerm gevoeg" @@ -130,8 +132,7 @@ "Verminder hoogte" "Legstukgrootte is verander na breedte %1$s hoogte %2$s" "Kortpaaie" - - + "Kortpaaie en kennisgewings" "Maak toe" "Kennisgewing is toegemaak" "Persoonlik" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 46647c62d9..921fbd9162 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -108,6 +108,8 @@ "%1$s በመውረድ ላይ፣ %2$s ተጠናቋል" "%1$s ለመጫን በመጠበቅ ላይ" "%1$s ንዑስ ፕሮግራሞች" + "የመግብሮች ዝርዝር" + "የመግብሮች ዝርዝር ተዘግቷል" "ወደ መነሻ ማያ ገጽ ያክሉ" "ንጥልን ወደዚህ ውሰድ" "ወደ መነሻ ማያ ገጽ ንጥል ታክሏል" @@ -130,8 +132,7 @@ "ቁመት ይቀንሱ" "የመግብር መጠን ወደ ስፋት %1$s ቁመት %2$s ተለውጧል" "አቋራጮች" - - + "አቋራጮች እና ማሳወቂያዎች" "አሰናብት" "ማሳወቂያ ተሰናብቷል" "የግል" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index c094c3ad8b..ecf32d4f77 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -112,6 +112,8 @@ "جارٍ تنزيل %1$s، اكتمل %2$s" "%1$s في انتظار التثبيت" "أدوات %1$s" + "قائمة الأدوات" + "تم إغلاق قائمة الأدوات." "إضافة إلى الشاشة الرئيسية" "نقل العنصر إلى هنا" "تمت إضافة العنصر إلى الشاشة الرئيسية" @@ -134,8 +136,7 @@ "تقليل الارتفاع" "تم تغيير حجم الأداة إلى العرض %1$s والارتفاع %2$s" "الاختصارات" - - + "الاختصارات والإشعارات" "تجاهل" "تم تجاهل الإشعار" "شخصية" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 41deec31ec..5c896e4f24 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -108,6 +108,10 @@ "%1$s ডাউনল\'ড কৰি থকা হৈছে, %2$s সম্পূৰ্ণ হ\'ল" "%1$s ইনষ্টল হোৱালৈ অপেক্ষা কৰি থকা হৈছে" "%1$s ৱিজেট" + + + + "গৃহ স্ক্ৰীণত যোগ কৰক" "বস্তুটো ইয়ালৈ স্থানান্তৰ কৰক" "বস্তুটো গৃহ স্ক্ৰীণত যোগ কৰা হ\'ল" @@ -130,8 +134,7 @@ "উচ্চতা হ্ৰাস কৰক" "ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ %1$s আৰু উচ্চতা %2$s কৰা হ\'ল" "শ্বৰ্টকাটসমূহ" - - + "শ্বৰ্টকাট আৰু জাননীসমূহ" "অগ্ৰাহ্য কৰক" "জাননী অগ্ৰাহ্য কৰা হৈছে" "ব্যক্তিগত" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index dd0f022a1b..3b36f37b25 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -108,6 +108,8 @@ "%1$s endirilir, %2$s tamamlandı" "%1$s yüklənmək üçün gözləyir" "%1$s vidcetləri" + "Vidcet siyahısı" + "Vidcet siyahısı bağlandı" "Əsas ekrana əlavə edin" "Elementi bura köçürün" "Element əsas ekrana əlavə edildi" @@ -130,8 +132,7 @@ "Hündürlüyü azaldın" "Vidcetin eni %1$s hündürlüyü %2$s kimi ölçüləndirildi" "Qısa yollar" - - + "Qısayol və bildirişlər" "Rədd edin" "Bildiriş rədd edildi" "Şəxsi" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 9a2062f84f..3fb8bf50c5 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -109,6 +109,8 @@ "%1$s se preuzima, završeno je %2$s" "%1$s čeka na instaliranje" "Vidžeti za %1$s" + "Lista vidžeta" + "Lista vidžeta je zatvorena" "Dodaj na početni ekran" "Premesti stavku ovde" "Stavka je dodata na početni ekran" @@ -131,8 +133,7 @@ "Smanji visinu" "Veličina vidžeta je promenjena na širinu %1$s i visinu %2$s" "Prečice" - - + "Prečice i obaveštenja" "Odbaci" "Obaveštenje je odbačeno" "Lične" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index ea312e7b18..59a8f1fa2b 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -110,6 +110,8 @@ "Ідзе спампоўка %1$s, %2$s завершана" "%1$s чакае ўсталёўкі" "Віджэты %1$s" + "Спіс віджэтаў" + "Спіс віджэтаў закрыты" "Дадаць на Галоўны экран" "Перамясціць элемент сюды" "Элемент дададзены на галоўны экран" @@ -132,8 +134,7 @@ "Паменшыць вышыню" "Памеры віджэта зменены на: шырыня %1$s, вышыня %2$s" "Ярлыкі" - - + "Ярлыкі і апавяшчэнні" "Адхіліць" "Апавяшчэнне адхілена" "Асабістыя" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 92000496d7..47825f6bd0 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -108,6 +108,8 @@ "%1$s се изтегля. Завършено: %2$s" "%1$s изчаква инсталиране" "Приспособления за %1$s" + "Списък с приспособления" + "Списъкът с приспособления е затворен" "Добавяне към началния екран" "Преместване на елемента тук" "Елементът е добавен към началния екран" @@ -130,8 +132,7 @@ "Намаляване на височината" "Приспособлението е преоразмерено към ширина %1$s и височина %2$s" "Преки пътища" - - + "Преки пътища и известия" "Отхвърляне" "Известието е отхвърлено" "Лични" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index b11fae9ad9..651f400ef6 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -108,6 +108,10 @@ "%1$s ডাউনলোড হচ্ছে %2$s সম্পন্ন হয়েছে" "%1$s ইনস্টলের অপেক্ষায় রয়েছে" "%1$s উইজেট" + + + + "হোম স্ক্রীনে যোগ করুন" "এখানে আইটেম সরান" "হোম স্ক্রীনে আইটেম যোগ করা হয়েছে" @@ -130,8 +134,7 @@ "উচ্চতা কমান" "উইজেটের আকার প্রস্থ %1$s উচ্চতা %2$s তে পরিবর্তন করা হয়েছে" "শর্টকাট" - - + "শর্টকাট এবং বিজ্ঞপ্তি" "খারিজ করুন" "বিজ্ঞপ্তি খারিজ করা হয়েছে" "ব্যক্তিগত" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 94d3ca0676..848176df02 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -109,6 +109,8 @@ "%1$s se preuzima, završeno %2$s" "%1$s čeka da se instalira" "Vidžeti za aplikaciju %1$s" + "Spisak vidžeta" + "Spisak vidžeta je zatvoren" "Dodaj na početni ekran" "Premjesti stavku ovdje" "Stavka je dodana na Početni ekran." @@ -131,8 +133,7 @@ "Smanji visinu" "Veličina vidžeta je promijenjena na širinu %1$s visinu %2$s" "Prečice" - - + "Prečice i obavještenja" "Odbaci" "Obavještenje je odbačeno" "Lične" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 2364e722e0..27f9c3132a 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -108,6 +108,8 @@ "S\'està baixant %1$s, %2$s completat" "S\'està esperant per instal·lar %1$s" "Widgets de: %1$s" + "Llista de widgets" + "S\'ha tancat la llista de widgets" "Afegeix a la pantalla d\'inici" "Mou l\'element aquí" "S\'ha afegit l\'element a la pantalla d\'inici" @@ -130,8 +132,7 @@ "Redueix l\'alçada" "S\'ha canviat la mida del widget a l\'amplada %1$s i l\'alçada %2$s" "Dreceres" - - + "Dreceres i notificacions" "Ignora" "S\'ha ignorat la notificació" "Personal" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index f84e437c1c..48adf44be5 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -110,6 +110,8 @@ "Stahování aplikace %1$s (dokončeno %2$s)" "Instalace aplikace %1$s čeká na zahájení" "Widgety %1$s" + "Seznam widgetů" + "Seznam widgetů zavřen" "Přidat na plochu" "Přesunout položku sem" "Položka byla přidána na plochu" @@ -132,8 +134,7 @@ "Snížit výšku" "Velikost widgetu upravena: šířka %1$s, výška %2$s" "Zkratky" - - + "Zkratky a oznámení" "Zavřít" "Oznámení bylo zavřeno" "Osobní" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 1d6984c757..d141ad9ff9 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -108,6 +108,8 @@ "%1$s downloades. %2$s er gennemført" "%1$s venter på at installere" "%1$s-widgets" + "Liste med widgets" + "Listen med widgets blev lukket" "Føj til startskærm" "Flyt elementet hertil" "Elementet er føjet til startskærmen" @@ -130,8 +132,7 @@ "Reducer højden" "Størrelsen for widgetten er ændret til bredde %1$s og højde %2$s" "Genveje" - - + "Genveje og underretninger" "Afvis" "Underretningen blev afvist" "Personlige" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index af07f1c8f0..c309a55689 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -108,6 +108,8 @@ "%1$s wird heruntergeladen, %2$s abgeschlossen" "Warten auf Installation von %1$s" "%1$s-Widgets" + "Widgetliste" + "Widgetliste geschlossen" "Zum Startbildschirm hinzufügen" "Element hierhin verschieben" "Element zum Startbildschirm hinzugefügt" @@ -130,8 +132,7 @@ "Höhe verringern" "Größe des Widgets zu Breite %1$s und Höhe %2$s geändert" "Verknüpfungen" - - + "Verknüpfungen und Benachrichtigungen" "Schließen" "Benachrichtigung geschlossen" "Privat" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 3de0aaf5ac..3208fcbd10 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -108,6 +108,8 @@ "Λήψη %1$s, ολοκληρώθηκε %2$s" "%1$s σε αναμονή για εγκατάσταση" "Γραφικά στοιχεία %1$s" + "Λίστα γραφικών στοιχείων" + "Η λίστα γραφικών στοιχείων έκλεισε" "Προσθήκη στην αρχική οθόνη" "Μετακίνηση στοιχείου εδώ" "Το στοιχείο προστέθηκε στην αρχική οθόνη" @@ -130,8 +132,7 @@ "Μείωση του ύψους" "Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε %1$s πλάτος και %2$s ύψος" "Συντομεύσεις" - - + "Συντομεύσεις και ειδοποιήσεις" "Παράβλεψη" "Η ειδοποίηση παραβλέφθηκε" "Προσωπικές" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index cca8e859da..245ee43580 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -108,6 +108,8 @@ "%1$s downloading, %2$s complete" "%1$s waiting to install" "%1$s widgets" + "Widgets list" + "Widgets list closed" "Add to Home screen" "Move item here" "Item added to home screen" @@ -130,8 +132,7 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" - "%1$d shortcuts for %2$s" - "%1$d shortcuts and %2$d notifications for %3$s" + "Shortcuts and notifications" "Dismiss" "Notification dismissed" "Personal" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index cca8e859da..245ee43580 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -108,6 +108,8 @@ "%1$s downloading, %2$s complete" "%1$s waiting to install" "%1$s widgets" + "Widgets list" + "Widgets list closed" "Add to Home screen" "Move item here" "Item added to home screen" @@ -130,8 +132,7 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" - "%1$d shortcuts for %2$s" - "%1$d shortcuts and %2$d notifications for %3$s" + "Shortcuts and notifications" "Dismiss" "Notification dismissed" "Personal" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index cca8e859da..245ee43580 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -108,6 +108,8 @@ "%1$s downloading, %2$s complete" "%1$s waiting to install" "%1$s widgets" + "Widgets list" + "Widgets list closed" "Add to Home screen" "Move item here" "Item added to home screen" @@ -130,8 +132,7 @@ "Decrease height" "Widget re-sized to width %1$s height %2$s" "Short cuts" - "%1$d shortcuts for %2$s" - "%1$d shortcuts and %2$d notifications for %3$s" + "Shortcuts and notifications" "Dismiss" "Notification dismissed" "Personal" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index f991da7f86..368e4ba633 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -108,6 +108,8 @@ "Se completó el %2$s de la descarga de %1$s" "Instalación de %1$s en espera" "Widgets de %1$s" + "Lista de widgets" + "Se cerró la lista de widgets" "Agregar a la pantalla principal" "Mover elemento aquí" "Se agregó el elemento a la pantalla principal." @@ -130,8 +132,7 @@ "Reducir la altura" "Se cambió la dimensión del widget a %1$s de ancho y %2$s de alto." "Accesos directos" - - + "Accesos directos y notificaciones" "Descartar" "Se descartó la notificación" "Personales" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 1dbe8e904d..0829533282 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -108,6 +108,8 @@ "Descargando %1$s (%2$s completado)" "Esperando para instalar %1$s" "Widgets de %1$s" + "Lista de widgets" + "Lista de widgets cerrada" "Añadir a la pantalla de inicio" "Mover elemento aquí" "Elemento añadido a la pantalla de inicio" @@ -130,8 +132,7 @@ "Reducir altura" "Se ha modificado el tamaño del widget a %1$s de ancho y %2$s de alto" "Accesos directos" - - + "Accesos directos y notificaciones" "Ignorar" "Notificación ignorada" "Personal" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 94b0103e61..1e5caa6427 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -108,6 +108,8 @@ "Rakenduse %1$s allalaadimine, %2$s on valmis" "%1$s on installimise ootel" "Teenuse %1$s vidinad" + "Vidinate loend" + "Vidinate loend on suletud" "Lisa avaekraanile" "Teisalda üksus siia" "Üksus lisati avaekraanile" @@ -130,8 +132,7 @@ "Vähenda kõrgust" "Vidina suurust muudeti. Laius: %1$s. Kõrgus: %2$s" "Otseteed" - - + "Otseteed ja märguanded" "Loobu" "Märguandest loobuti" "Isiklik" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index a13c49325a..b69228a294 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -108,6 +108,8 @@ "%1$s deskargatzen, %2$s osatuta" "%1$s instalatzeko zain" "%1$s widgetak" + "Widget-zerrenda" + "Itxi da widget-zerrenda" "Gehitu hasierako pantailan" "Ekarri elementua hona" "Gehitu da elementua hasierako pantailan" @@ -130,8 +132,7 @@ "Txikitu altuera" "Aldatu da widgetaren tamaina. Zabalera: %1$s. Altuera: %2$s." "Lasterbideak" - - + "Lasterbideak eta jakinarazpenak" "Baztertu" "Baztertu egin da jakinarazpena" "Pertsonalak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index da12ebe7b3..aa06188f21 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -108,6 +108,8 @@ "درحال بارگیری %1$s، %2$s کامل شد" "%1$s درانتظار نصب" "ابزارک‌های %1$s" + "فهرست ابزارک‌ها" + "فهرست ابزارک‌ها بسته شد" "افزودن به صفحه اصلی" "انتقال مورد به اینجا" "مورد به صفحه اصلی اضافه شد" @@ -130,8 +132,7 @@ "کاهش ارتفاع" "اندازه ابزارک به عرض %1$s ارتفاع %2$s تغییر کرد" "میان‌برها" - - + "میان‌برها و اعلان‌ها" "رد کردن" "اعلان رد شد" "شخصی" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 96214d30ad..4b361ac3c4 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -108,6 +108,8 @@ "%1$s latautuu, valmiina %2$s" "%1$s odottaa asennusta" "Widgetit: %1$s" + "Widget-luettelo" + "Widget-luettelo suljettu" "Lisää aloitusnäytölle" "Siirrä kohde tänne" "Kohde lisättiin aloitusnäytölle." @@ -130,8 +132,7 @@ "Vähennä korkeutta" "Widgetin kokoa muutettiin. Sen leveys on nyt %1$s ja korkeus %2$s." "Pikakuvakkeet" - - + "Pikakuvakkeet ja ilmoitukset" "Hylkää" "Ilmoitus hylätty" "Henkilökohtaiset" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index aebb42df2f..29b003e081 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -108,6 +108,8 @@ "Téléchargement de %1$s : %2$s" "%1$s en attente d\'installation" "Widgets pour %1$s" + "Liste des widgets" + "Liste des widgets fermée" "Ajouter à l\'écran d\'accueil" "Déplacer l\'élément ici" "Élément ajouté à l\'écran d\'accueil" @@ -130,8 +132,7 @@ "Diminuer la hauteur" "Le widget a été redimensionné (largeur : %1$s, hauteur : %2$s)" "Raccourcis" - - + "Raccourcis et notifications" "Ignorer" "Notification ignorée" "Personnel" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 6c5c120690..d47ab427ca 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -108,6 +108,8 @@ "%1$s en cours de téléchargement, %2$s effectué(s)" "%1$s en attente d\'installation" "Widgets %1$s" + "Liste des widgets" + "La liste des widgets est fermée" "Ajouter à l\'écran d\'accueil" "Déplacer l\'élément ici" "L\'élément a bien été ajouté à l\'écran d\'accueil." @@ -130,8 +132,7 @@ "Diminuer la hauteur" "Le widget a bien été redimensionné (largeur : %1$s, hauteur : %2$s)." "Raccourcis" - - + "Raccourcis et notifications" "Ignorer" "Notification ignorée" "Personnelles" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 4dd7ae71b1..b94d693511 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -108,6 +108,8 @@ "Descargando %1$s (%2$s completado)" "Esperando para instalar %1$s" "Widgets de: %1$s" + "Lista de widgets" + "Pechouse a lista de widgets" "Engadir á pantalla de inicio" "Mover elemento aquí" "Engadiuse o elemento á pantalla de inicio" @@ -130,8 +132,7 @@ "Reducir altura" "Cambiouse o tamaño do widget polo ancho %1$s e a altura %2$s" "Atallos" - - + "Atallos e notificacións" "Ignorar" "Ignorouse a notificación" "Persoal" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index aa0b3af1f0..6468d8b753 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -108,6 +108,10 @@ "%1$s ડાઉનલોડ કરી રહ્યાં છે, %2$s પૂર્ણ" "%1$s, ઇન્સ્ટૉલ થવાની રાહ જોઈ રહ્યું છે" "%1$s વિજેટ" + + + + "હોમ સ્ક્રીન પર ઉમેરો" "આઇટમ અહીં ખસેડો" "હોમ સ્ક્રીનમાં આઇટમ ઉમેરી" @@ -130,8 +134,7 @@ "ઊંચાઈ ઘટાડો" "વિજેટનો આકાર બદલીને %1$s પહોળાઈ %2$s ઊંચાઈ કર્યો" "શૉર્ટકટ્સ" - - + "શૉર્ટકટ અને નોટિફિકેશનો" "છોડી દો" "સૂચના છોડી દીધી" "મનગમતી ઍપ" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 1b47fcbbea..1b5ce26794 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -108,6 +108,10 @@ "%1$s डाउनलोड हो रहा है, %2$s पूर्ण" "%1$s के इंस्टॉल होने की प्रतीक्षा की जा रही है" "%1$s विजेट" + + + + "होम स्‍क्रीन में जोड़ें" "आइटम यहां ले जाएं" "होम स्क्रीन में आइटम जोड़ा गया" @@ -130,8 +134,7 @@ "ऊंचाई घटाएं" "विजेट का आकार बदलकर उसकी चौड़ाई %1$s और ऊंचाई %2$s कर दी गई" "शॉर्टकट" - - + "शॉर्टकट और सूचनाएं" "खारिज करें" "सूचना को खारिज किया गया" "निजी ऐप" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 077da67e25..ea340d68a7 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -109,6 +109,8 @@ "Preuzimanje aplikacije %1$s, dovršeno %2$s" "Čekanje na instaliranje aplikacije %1$s" "%1$s widgeti" + "Popis widgeta" + "Popis widgeta zatvoren" "Dodavanje na početni zaslon" "Premjesti stavku ovdje" "Stavka je dodana na početni zaslon" @@ -131,8 +133,7 @@ "Smanjenje visine" "Širina widgeta promijenjena je na %1$s, a visina na %2$s" "Prečaci" - - + "Prečaci i obavijesti" "Odbaci" "Obavijest je odbačena" "Osobno" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 797bde44ad..7b8738186e 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -108,6 +108,8 @@ "A(z) %1$s letöltése, %2$s kész" "A(z) %1$s telepítésre vár" "%1$s-modulok" + "Widgetlista" + "Widgetlista bezárva" "Hozzáadás a kezdőképernyőhöz" "Elem áthelyezése ide" "Elem hozzáadva a kezdőképernyőhöz" @@ -130,8 +132,7 @@ "Magasság csökkentése" "Modul átméretezve %1$s szélességre és %2$s magasságra" "Gyorsparancsok" - - + "Parancsikonok és értesítések" "Elvetés" "Értesítés elvetve" "Személyes" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 79210f3a77..2b4a38bd7b 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -108,6 +108,8 @@ "%1$s–ի ներբեռնում (%2$s)" "%1$s-ի տեղադրման սպասում" "%1$s վիջեթներ" + "Վիջեթների ցանկ" + "Վիջեթների ցանկը փակվեց" "Ավելացնել Հիմնական էկրանին" "Տեղափոխել տարրն այստեղ" "Տարրն ավելացվեց հիմնական էկրանին" @@ -130,8 +132,7 @@ "Նվազեցնել բարձրությունը" "Վիջեթի լայնությունը փոխվել է %1$s-ի, իսկ բարձրությունը՝ %2$s-ի" "Դյուրանցումներ" - - + "Դյուրանցումներ և ծանուցումներ" "Անտեսել" "Ծանուցումը մերժված է" "Անձնական" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 6e8f46a2cd..78ffc96845 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -108,6 +108,8 @@ "%1$s sedang didownload, %2$s selesai" "%1$s menunggu dipasang" "Widget %1$s" + "Daftar widget" + "Daftar widget ditutup" "Tambahkan ke Layar Utama" "Pindahkan item ke sini" "Item ditambahkan ke layar utama" @@ -130,8 +132,7 @@ "Kurangi tinggi" "Widget diubah ukurannya menjadi lebar %1$s tinggi %2$s" "Pintasan" - - + "Pintasan dan notifikasi" "Tutup" "Notifikasi ditutup" "Pribadi" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 49843b668c..04842e4f4b 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -108,6 +108,8 @@ "%1$s í niðurhali, %2$s lokið" "%1$s bíður uppsetningar" "%1$s-græjur" + "Græjulisti" + "Græjulista lokað" "Bæta á heimaskjá" "Færa atriði hingað" "Atriði bætt á heimaskjáinn" @@ -130,8 +132,7 @@ "Minnka hæð" "Stærð græju breytt í %1$s á breidd og %2$s á hæð" "Flýtileiðir" - - + "Flýtileiðir og tilkynningar" "Hunsa" "Tilkynningu lokað" "Persónulegt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 5fc68a51b5..28a8f93564 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -108,6 +108,8 @@ "Download di %1$s in corso, %2$s completato" "%1$s in attesa di installazione" "Widget di %1$s" + "Elenco di widget" + "Elenco di widget chiuso" "Aggiungi a schermata Home" "Sposta elemento qui" "Elemento aggiunto alla schermata Home" @@ -130,8 +132,7 @@ "Riduci altezza" "Widget ridimensionato a larghezza %1$s, altezza %2$s" "Scorciatoie" - - + "Scorciatoie e notifiche" "Ignora" "Notifica ignorata" "Personali" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index 806aeefb5c..d4302c66c3 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -110,6 +110,8 @@ "מוריד את %1$s, %2$s הושלמו" "מחכה להתקנה של %1$s" "ווידג\'טים של %1$s" + "רשימת ווידג\'טים" + "רשימת הווידג\'טים נסגרה" "הוסף למסך דף הבית" "העבר את הפריט לכאן" "הפריט הועבר אל מסך דף הבית" @@ -132,8 +134,7 @@ "הקטן גובה" "גודל הווידג\'ט שונה - רוחב %1$s גובה %2$s" "קיצורי דרך" - - + "קיצורי דרך והודעות" "סגור" "ההודעה נסגרה" "אישיות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index baa59ab94e..2598d1839e 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -108,6 +108,8 @@ "%1$sをダウンロード中、%2$s完了" "%1$sのインストール待ち" "%1$sのウィジェット" + "ウィジェット リスト" + "ウィジェット リストを閉じました" "ホーム画面に追加" "アイテムをここに移動" "アイテムをホーム画面に追加しました" @@ -130,8 +132,7 @@ "高さを低くする" "ウィジェットのサイズを幅%1$s、高さ%2$sに変更しました" "ショートカット" - - + "ショートカットと通知" "表示しない" "通知を非表示にしました" "個人用" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 64c8573e12..3bdbab7423 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -108,6 +108,8 @@ "მიმდინარეობს %1$s-ის ჩამოტვირთვა, %2$s დასრულდა" "%1$s ელოდება ინსტალაციას" "%1$s-ის ვიჯეტები" + "ვიჯეტების სია" + "ვიჯეტების სია დაიხურა" "მთავარ ეკრანზე დამატება" "ერთეულის გადაადგილება აქ" "ერთეული დაემატა მთავარ ეკრანს" @@ -130,8 +132,7 @@ "სიმაღლის შემცირება" "ვიჯეტის ზომები შეიცვალა: სიგანე %1$s სიმაღლე %2$s" "მალსახმობები" - - + "მალსახმობები და შეტყობინებები" "დახურვა" "შეტყობინება დაიხურა" "პირადი" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 2ad595458d..98afcccfe0 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -108,6 +108,8 @@ "%1$s жүктелуде, %2$s аяқталды" "%1$s орнату күтілуде" "%1$s виджеті" + "Виджеттер тізімі" + "Видджеттер тізімі жабылды" "Негізгі экранға қосу" "Элементті мұнда жылжыту" "Элемент негізгі экранға қосылды" @@ -130,8 +132,7 @@ "Биіктігін азайту" "Виджет өлшемінің ені %1$s, биіктігі %2$s болып өзгертілді" "Таңбашалар" - - + "Таңбашалар мен хабарландырулар" "Бас тарту" "Хабарландырудан бас тартылды" "Жеке" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index e3659c99ff..ba8d775a62 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -108,6 +108,8 @@ "កំពុងដោនឡូត %1$s បានបញ្ចប់ %2$s" "%1$s កំពុងរង់ចាំការដំឡើង" "ធាតុ​ក្រាហ្វិក %1$s" + "បញ្ជីធាតុ​ក្រាហ្វិក" + "បាន​បិទ​បញ្ជីធាតុ​ក្រាហ្វិក" "បន្ថែមទៅអេក្រង់ដើម" "ផ្លាស់ធាតុមកទីនេះ" "ធាតុដែលត្រូវបានបន្ថែមទៅអេក្រង់ដើម" @@ -130,8 +132,7 @@ "បន្ថយកម្ពស់" "ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង %1$s កម្ពស់ប្រវែង %2$s" "ផ្លូវកាត់" - - + "ផ្លូវកាត់ និង​ការជូនដំណឹង" "បដិសេធ" "បាន​បដិសេធ​ការជូនដំណឹង" "ផ្ទាល់ខ្លួន" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 7a68378d2a..e73ff39da0 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -108,6 +108,10 @@ "%1$s ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ, %2$s ಪೂರ್ಣಗೊಂಡಿದೆ" "%1$s ಸ್ಥಾಪಿಸಲು ಕಾಯಲಾಗುತ್ತಿದೆ" "%1$s ವಿಜೆಟ್‌ಗಳು" + + + + "ಮುಖಪುಟಕ್ಕೆ ಸೇರಿಸು" "ಐಟಂ ಇಲ್ಲಿಗೆ ಸರಿಸಿ" "ಮುಖಪುಟ ಪರದೆಗೆ ಐಟಂ ಸೇರಿಸಲಾಗಿದೆ" @@ -130,8 +134,7 @@ "ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ" "ವಿಜೆಟ್ ಅನ್ನು %1$s ಅಗಲ %2$s ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ" "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು" - - + "ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು ಮತ್ತು ಅಧಿಸೂಚನೆಗಳು" "ವಜಾಗೊಳಿಸಿ" "ಅಧಿಸೂಚನೆಯನ್ನು ವಜಾಗೊಳಿಸಲಾಗಿದೆ" "ವೈಯಕ್ತಿಕ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 4a6f3faa10..5e68b1733e 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -108,6 +108,8 @@ "%1$s 다운로드 중, %2$s 완료" "%1$s 설치 대기 중" "%1$s 위젯" + "위젯 목록" + "위젯 목록 닫힘" "홈 화면에 추가" "여기에 항목을 이동" "홈 화면에 항목 추가됨" @@ -130,8 +132,7 @@ "높이 줄이기" "폭 %1$s, 높이 %2$s로 위젯 크기 조정됨" "바로가기" - - + "바로가기 및 알림" "닫기" "알림이 해제되었습니다." "개인" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index ce0dc3f866..da7813e741 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -108,6 +108,8 @@ "%1$s жүктөлүп алынууда, %2$s аяктады" "%1$s орнотулушу күтүлүүдө" "%1$s виджеттери" + "Виджеттердин тизмеси" + "Виджеттердин тизмеси жабык" "Башкы экранга кошуу" "Бул нерсени бул жерге жылдыруу" "Башкы экранга кошулду" @@ -130,8 +132,7 @@ "Жапыздатуу" "Виджеттин кеңдиги %1$s бийиктиги %2$s болду" "Кыска жолдор" - - + "Кыска жолдор жана билдирмелер" "Этибарга албоо" "Эскертме көз жаздымда калтырылды" "Жеке колдонмолор" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index a195eaf97f..d0d127f996 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -108,6 +108,8 @@ "%1$s ກຳ​ລັງ​ດາວ​ໂຫຼດ, %2$s ສຳ​ເລັດ" "%1$s ກຳ​ລັງ​ລໍ​ຖ້າ​ຕິດ​ຕັ້ງ" "ວິດເຈັດ %1$s" + "ລາຍຊື່ວິດເຈັດ" + "ປິດລາຍຊື່ວິດເຈັດແລ້ວ" "ເພີ່ມໃສ່ໜ້າຈໍຫຼັກ" "Move item here" "ເພີ່ມ​ລາຍ​ການ​ໃສ່​ໜ້າ​ຈໍ​ຫຼັກ​ແລ້ວ" @@ -130,8 +132,7 @@ "ຫຼຸດ​ລວງ​ສູງ​ລົງ" "ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ %1$s ລວງ​ສູງ %2$s ແລ້ວ" "ທາງລັດ" - - + "ປຸ່ມລັດ ແລະ ການແຈ້ງເຕືອນ" "ປິດໄວ້" "ປິດການແຈ້ງເຕືອນແລ້ວ" "ສ່ວນຕົວ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index ac8684c012..c323fd838f 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -110,6 +110,8 @@ "Atsisiunčiama programa „%1$s“, %2$s baigta" "Laukiama, kol bus įdiegta programa „%1$s“" "„%1$s“ valdikliai" + "Valdiklių sąrašas" + "Valdiklių sąrašas uždarytas" "Pridėti prie pagrind. ekrano" "Perkelti elementą čia" "Elementas pridėtas prie pagrindinio ekrano" @@ -132,8 +134,7 @@ "Sumažinti aukštį" "Valdiklio dydis pakeistas: plotis – %1$s, aukštis – %2$s" "Spartieji klavišai" - - + "Spartieji klavišai ir pranešimai" "Atsisakyti" "Pranešimo atsisakyta" "Asmeninės" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 0ed4093184..be03811c9a 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -109,6 +109,8 @@ "Lietotnes %1$s lejupielāde (%2$s pabeigti)" "Notiek %1$s instalēšana" "%1$s logrīki" + "Logrīku saraksts" + "Logrīku saraksts aizvērts" "Pievienot sākuma ekrānam" "Pārvietot vienumu šeit" "Vienums pievienots sākuma ekrānam" @@ -131,8 +133,7 @@ "Samazināt augstumu" "Logrīka lielums mainīts — platums: %1$s, augstums: %2$s." "Saīsnes" - - + "Saīsnes un paziņojumi" "Nerādīt" "Paziņojums netiek rādīts" "Personīgās lietotnes" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 3a033153e4..e5dd02776b 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -108,6 +108,8 @@ "Се презема %1$s, %2$s завршено" "%1$s чека да се инсталира" "Виџети за %1$s" + "Список со виџети" + "Списокот со виџети е затворен" "Додај на Почетен екран" "Премести ја ставката овде" "Ставката е додадена на почетниот екран" @@ -130,8 +132,7 @@ "Намали висина" "Големината на виџетот е променета на ширина %1$s висина %2$s" "Кратенки" - - + "Кратенки и известувања" "Отфрли" "Известувањето е отфрлено" "Лично" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 7ad2803df9..d6a2fd1a92 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -108,6 +108,10 @@ "%1$s ഡൗൺലോഡ് ചെയ്യുന്നു, %2$s പൂർത്തിയായി" "ഇൻസ്റ്റാൾ ചെയ്യാൻ %1$s കാക്കുന്നു" "%1$s വിജറ്റുകൾ" + + + + "ഹോം സ്ക്രീനിൽ ചേർക്കുക" "ഇനം ഇവിടേക്ക് നീക്കുക" "ഹോം സ്‌ക്രീനിൽ ഇനം ചേർത്തു" @@ -130,8 +134,7 @@ "ഉയരം കുറയ്‌ക്കുക" "വീതി %1$s ഉയരം %2$s-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി" "കുറുക്കുവഴികൾ" - - + "കുറുക്കുവഴികളും അറിയിപ്പുകളും" "നിരസിക്കുക" "അറിയിപ്പ് നിരസിച്ചു" "വ്യക്തിപരം" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 3dcc49542b..9fbb1e51e4 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -108,6 +108,8 @@ "%1$s-г татаж байна, %2$s татсан" "%1$s нь суулгахыг хүлээж байна" "%1$s жижиг хэрэгсэл" + "Жижиг хэрэгслийн жагсаалт" + "Жижиг хэрэгслийн жагсаалтыг хаасан" "Нүүр дэлгэц нэмэх" "Энд байршуулах" "Нүүр дэлгэцэнд нэмсэн зүйл" @@ -130,8 +132,7 @@ "Намсгах" "Виджэтийн өргөн %1$s, өндөр %2$s болсон" "Товчлол" - - + "Товчлол болон мэдэгдэл" "Хаах" "Мэдэгдлийг хаасан" "Хувийн" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 7b9aebd8a8..a297e06491 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -108,6 +108,8 @@ "%1$s डाउनलोड होत आहे , %2$s पूर्ण झाले" "%1$s इंस्टॉल करण्याची प्रतिक्षा करत आहे" "%1$s विजेट" + "विजेट सूची" + "विजेट सूची बंद केली" "होम स्क्रीनवर जोडा" "आयटम येथे हलवा" "आयटम मुख्य स्क्रीनवर जोडला" @@ -130,8 +132,7 @@ "उंची कमी करा" "विजेटचा आकार रुंदी %1$s उंची %2$s मध्ये बदलला" "शॉर्टकट" - - + "शॉर्टकट आणि सूचना" "डिसमिस करा" "सूचना डिसमिस केली" "वैयक्तिक" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index ea178b89d7..71047fbc50 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -108,6 +108,8 @@ "%1$s memuat turun, %2$s selesai" "%1$s menunggu untuk dipasang" "Widget %1$s" + "Senarai widget" + "Senarai widget ditutup" "Tambahkan pada Skrin Utama" "Alihkan item ke sini" "Item ditambahkan pada skrin utama" @@ -130,8 +132,7 @@ "Kurangkan ketinggian" "Saiz widget diubah menjadi %1$s lebar %2$s tinggi" "Pintasan" - - + "Pintasan dan pemberitahuan" "Ketepikan" "Pemberitahuan diketepikan" "Peribadi" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 315ebf5700..6c261853a4 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -108,6 +108,8 @@ "%1$s ဒေါင်းလုဒ်လုပ်နေသည်၊ %2$s ပြီးပါပြီ" "%1$s ကိုထည့်သွင်းရန်စောင့်နေသည်" "%1$s ဝိဂျက်များ" + "ဝိဂျက်စာရင်း" + "ဝိဂျက်စာရင်းကို ပိတ်ထားသည်" "ပင်မမျက်နှာစာသို့ ထည့်ပါ" "၎င်းအား ဤသို့ ရွှေ့ပါ" "ပင်မ ဖန်မျက်နှာပြင်သို့ ထည့်ပြီး၏" @@ -130,8 +132,7 @@ "အမြင့်အား လျှော့ပါ" "Widget အား အကျယ် %1$s အမြင့် %2$s အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏" "ဖြတ်လမ်းများ" - - + "ဖြတ်လမ်းလင့်ခ်နှင့် အကြောင်းကြားချက်များ" "ပယ်ရန်" "အသိပေးချက်ကို ဖယ်ထုတ်ပြီးပါပြီ" "ကိုယ်ပိုင်" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index d5beead867..67a912b08a 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -108,6 +108,8 @@ "Laster ned %1$s, %2$s er fullført" "Venter på å installere %1$s" "%1$s-moduler" + "Modulliste" + "Modullisten er lukket" "Legg til på startskjermen" "Flytt elementet hit" "Elementet er lagt til på startskjermen" @@ -130,8 +132,7 @@ "Reduser høyden" "Størrelsen på modulen er endret til bredde %1$s og høyde %2$s" "Snarveier" - - + "Snarveier og varsler" "Avvis" "Varselet ble avvist" "Personlig" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index f44c47bd90..50c427969c 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -108,6 +108,10 @@ "%1$s डाउनलोड गर्दै, %2$s सम्पन्‍न" "%1$s स्थापना गर्न प्रतीक्षा गर्दै" "%1$s विजेटहरू" + + + + "गृह स्क्रिनमा थप्नुहोस्" "वस्तु यहाँ सार्नुहोस्" "वस्तु गृह स्क्रिनमा थपियो" @@ -130,8 +134,7 @@ "उँचाइ घटाउनुहोस्" "विजेट चौडाइ %1$s उचाइ %2$s मा पुनः आकार मिलाइयो" "सर्टकटहरू" - - + "सर्टकट तथा सूचनाहरू" "खारेज गर्नुहोस्" "सूचना खारेज गरियो" "व्यक्तिगत" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index e1c059ad48..64f4d7912b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -108,6 +108,8 @@ "%1$s wordt gedownload, %2$s voltooid" "%1$s wacht op installatie" "%1$s-widgets" + "Lijst met widgets" + "Lijst met widgets gesloten" "Toevoegen aan startscherm" "Item hier naartoe verplaatsen" "Item toegevoegd aan startscherm" @@ -130,8 +132,7 @@ "Hoogte verkleinen" "Formaat van widget gewijzigd in breedte %1$s en hoogte %2$s" "Snelkoppelingen" - - + "Snelkoppelingen en meldingen" "Sluiten" "Melding gesloten" "Privé" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 9152b43c45..5fa6607bf9 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -108,6 +108,10 @@ "%1$s ଡାଉନଲୋଡ୍‌ ହେଉଛି, %2$s ସମ୍ପୂର୍ଣ୍ଣ" "%1$s ଇନଷ୍ଟଲ୍‌ ହେବାକୁ ଅପେକ୍ଷା କରିଛି" "%1$s ୱିଜେଟ୍‌" + + + + "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଯୋଡ଼ନ୍ତୁ" "ଆଇଟମ୍‌କୁ ଏଠାକୁ ଘୁଞ୍ଚାନ୍ତୁ" "ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଆଇଟମ୍‌ ଯୋଡ଼ାଗଲା" @@ -130,8 +134,7 @@ "ଉଚ୍ଚତା କମ୍‌ କରନ୍ତୁ" "ୱିଜେଟକୁ %1$s ଓସାର ଓ %2$s ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା" "ଶର୍ଟକଟ୍‍" - - + "ଶର୍ଟକଟ୍ ଓ ବିଜ୍ଞପ୍ତି" "ଖାରଜ କରନ୍ତୁ" "ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା" "ବ୍ୟକ୍ତିଗତ" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 237e5190af..3400e7bdcf 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -108,6 +108,10 @@ "%1$s ਡਾਉਨਲੋਡ ਹੋਰ ਰਿਹਾ ਹੈ, %2$s ਸੰਪੂਰਣ" "%1$s ਸਥਾਪਤ ਕਰਨ ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ" "%1$s ਵਿਜੇਟ" + + + + "ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਇੱਥੇ ਮੂਵ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ" @@ -130,8 +134,7 @@ "ਉਂਚਾਈ ਘਟਾਓ" "ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ %1$s ਉਂਚਾਈ %2$s ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ" "ਸ਼ਾਰਟਕੱਟ" - - + "ਸ਼ਾਰਟਕੱਟ ਅਤੇ ਸੂਚਨਾਵਾਂ" "ਖਾਰਜ ਕਰੋ" "ਸੂਚਨਾ ਖਾਰਜ ਕੀਤੀ ਗਈ" "ਨਿੱਜੀ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 65de77703c..776f39dce4 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -110,6 +110,8 @@ "Pobieranie elementu %1$s, ukończono: %2$s" "%1$s oczekuje na instalację" "%1$s – widżety" + "Lista widgetów" + "Lista widgetów zamknięta" "Dodaj do strony głównej" "Przenieś element tutaj" "Element został dodany do ekranu głównego" @@ -132,8 +134,7 @@ "Zmniejsz wysokość" "Szerokość i wysokość widżetu zmieniła się na %1$s x %2$s" "Skróty" - - + "Skróty i powiadomienia" "Odrzuć" "Powiadomienie odrzucone" "Osobiste" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 48dcebb425..40105915ce 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -108,6 +108,8 @@ "A transferir o %1$s, %2$s concluído" "A aguardar a instalação do %1$s" "Widgets de %1$s" + "Lista de widgets" + "Lista de widgets fechada." "Adicionar ao Ecrã principal" "Mover o item para aqui" "Item adicionado ao ecrã principal" @@ -130,8 +132,7 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" - - + "Atalhos e notificações" "Ignorar" "Notificação ignorada" "Pessoal" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index 25bde0add8..6238e7aefc 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -108,6 +108,8 @@ "Fazendo download de %1$s, %2$s concluído" "Aguardando instalação de %1$s" "Widgets do %1$s" + "Lista de widgets" + "Lista de widgets fechada" "Adicionar à tela inicial" "Mover item para cá" "Item adicionado à tela inicial" @@ -130,8 +132,7 @@ "Diminuir altura" "Widget redimensionado para a largura %1$s, altura %2$s" "Atalhos" - - + "Atalhos e notificações" "Dispensar" "Notificação dispensada" "Pessoais" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 1af37eb709..fb5fb96232 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -109,6 +109,8 @@ "%1$s se descarcă (finalizat %2$s)" "%1$s așteaptă instalarea" "Widgeturi %1$s" + "Listă de widgeturi" + "Lista de widgeturi este închisă" "Adăugați pe ecranul de pornire" "Mutați elementul aici" "Element adăugat pe ecranul de pornire" @@ -131,8 +133,7 @@ "Reduceți înălțimea" "Widgetul a fost redimensionat la lățimea %1$s și înălțimea %2$s" "Comenzi rapide" - "%1$d comenzi rapide pentru %2$s" - "%1$d comenzi rapide și %2$d notificări pentru %3$s" + "Comenzi rapide și notificări" "Închideți" "Notificare închisă" "Personale" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 74809dde43..dd70521a8f 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -110,6 +110,8 @@ "Скачивается \"%1$s\" (%2$s)" "Ожидание установки \"%1$s\"" "%1$s: виджеты" + "Список виджетов" + "Список виджетов закрыт" "Добавить на главный экран" "Переместить элемент сюда" "Элемент добавлен на главный экран" @@ -132,8 +134,7 @@ "Уменьшить высоту" "Изменен размер виджета: до %1$s в ширину и %2$s в высоту" "Ярлыки" - - + "Ярлыки и уведомления" "Закрыть" "Уведомление закрыто" "Личные" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 10835dc5ce..ee6112488c 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -108,6 +108,8 @@ "%1$s බාගත කරමින්, %2$s සම්පූර්ණයි" "%1$s ස්ථාපනය කිරීමට බලා සිටිමින්" "%1$s විජට්" + "විජට් ලැයිස්තුව" + "විජට් ලැයිස්තුව වසා ඇත" "මුල් තිරය වෙත එක් කරන්න" "මෙතනට අයිතමය ගෙන එන්න" "අයිතමය මුල් තිරය වෙත එකතු කරන ලදි" @@ -130,8 +132,7 @@ "උස අඩු කරන්න" "විජට් පළල %1$s උස %2$s වෙත ප්‍රමාණකරණය කරන ලදි" "කෙටිමං" - "%2$s සඳහා කෙටි මං %1$d" - "%3$s සඳහා කෙටි මං %1$dක් සහ දැනුම්දීම් %2$dක්" + "කෙටි මං සහ දැනුම්දීම්" "ඉවතලන්න" "දැනුම්දීම ඉවතලන ලදී" "පුද්ගලික" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index cbffd1b25b..649aecc8a8 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -110,6 +110,8 @@ "Sťahuje sa aplikácia %1$s. Stiahnuté: %2$s" "Aplikácia %1$s čaká na inštaláciu" "Miniaplikácie %1$s" + "Zoznam miniaplikácií" + "Zoznam miniaplikácií je zavretý" "Pridať na plochu" "Presunúť položku sem" "Položka bola pridaná na plochu" @@ -132,8 +134,7 @@ "Znížiť výšku" "Veľkosť miniaplikácie bola zmenená na %1$s x %2$s (šírka x výška)" "Skratky" - - + "Odkazy a upozornenia" "Zavrieť" "Upozornenie bolo zavreté" "Osobné" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index df934cd2fd..aa3bc4fc57 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -110,6 +110,8 @@ "Prenašanje aplikacije %1$s; preneseno %2$s" "Aplikacija %1$s čaka na namestitev" "Pripomočki za %1$s" + "Seznam pripomočkov" + "Seznam pripomočkov se je zaprl" "Dodajanje na začetni zaslon" "Premik elementa sem" "Element je bil dodan na začetni zaslon" @@ -132,8 +134,7 @@ "Zmanjšanje višine" "Velikost pripomočka je bila spremenjena na %1$s širine in %2$s višine" "Bližnjice" - - + "Bližnjice in obvestila" "Opusti" "Obvestilo je bilo opuščeno" "Osebno" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index ef7cde70e5..8cf0a8198f 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -108,6 +108,8 @@ "%1$s po shkarkohet, %2$s të përfunduara" "%1$s po pret të instalohet" "Miniaplikacionet e %1$s" + "Lista e miniaplikacioneve" + "Lista e miniaplikacioneve u mbyll" "Shto në Ekranin bazë" "Zhvendose artikullin këtu" "Artikulli u shtua tek ekrani bazë" @@ -130,8 +132,7 @@ "Zvogëlo lartësinë" "Madhësia e miniaplikacionit u ndryshua me gjerësinë %1$s dhe lartësinë %2$s" "Shkurtoret" - - + "Shkurtoret dhe njoftimet" "Hiqe" "Njoftimi u hoq" "Personale" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index d4223a8a1e..42522a579b 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -109,6 +109,8 @@ "%1$s се преузима, завршено је %2$s" "%1$s чека на инсталирање" "Виџети за %1$s" + "Листа виџета" + "Листа виџета је затворена" "Додај на почетни екран" "Премести ставку овде" "Ставка је додата на почетни екран" @@ -131,8 +133,7 @@ "Смањи висину" "Величина виџета је промењена на ширину %1$s и висину %2$s" "Пречице" - - + "Пречице и обавештења" "Одбаци" "Обавештење је одбачено" "Личне" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 2fda5e24a6..957a4cb2d4 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -108,6 +108,8 @@ "%1$s laddas ned, %2$s klart" "%1$s väntar på installation" "%1$s widgetar" + "Widgetlista" + "Widgetslistan har stängts" "Lägg till på startskärmen" "Flytta objekt hit" "Objektet har lagts till på startskärmen" @@ -130,8 +132,7 @@ "Minska höjden" "Widgetens storlek har ändrats till: bredd %1$s, höjd %2$s" "Genvägar" - - + "Genvägar och aviseringar" "Ignorera" "Aviseringen togs bort" "Privat" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 5981b8684f..faa40a71c2 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -110,6 +110,8 @@ "%1$s inapakuliwa, %2$s imekamilika" "%1$s inasubiri kusakinisha" "Wijeti za %1$s" + "Orodha ya wijeti" + "Orodha ya wijeti imefungwa" "Ongeza kwenye skrini ya Kwanza" "Hamishia kipengee hapa" "Kipengee kimeongezwa kwenye skrini ya kwanza" @@ -132,8 +134,7 @@ "Punguza urefu" "Wijeti imepunguzwa hadi upana %1$s urefu %2$s" "Njia za mkato" - - + "Arifa na njia za mkato" "Ondoa" "Arifa imeondolewa" "Binafsi" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 5ff5ecc44b..983a0d1f2d 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -108,6 +108,10 @@ "%1$sஐப் பதிவிறக்குகிறது, %2$s முடிந்தது" "%1$sஐ நிறுவுவதற்காகக் காத்திருக்கிறது" "%1$s விட்ஜெட்டுகள்" + + + + "முகப்புத் திரையில் சேர்" "இங்கு நகர்த்து" "முகப்புத் திரையில் சேர்க்கப்பட்டது" @@ -130,8 +134,7 @@ "உயரத்தைக் குறை" "அகலம் %1$s மற்றும் உயரம் %2$sக்கு விட்ஜெட் அளவு மாற்றப்பட்டது" "குறுக்குவழிகள்" - - + "ஷார்ட்கட்கள் மற்றும் அறிவிப்புகள்" "நிராகரி" "அறிவிப்பு நிராகரிக்கப்பட்டது" "தனிப்பட்டவை" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 0967119eae..a18d6496a6 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -108,6 +108,10 @@ "%1$s డౌన్‌లోడ్ అవుతోంది, %2$s పూర్తయింది" "%1$s ఇన్‌స్టాల్ కావడానికి వేచి ఉంది" "%1$s విడ్జెట్‌లు" + + + + "హోమ్ స్క్రీన్‌కు జోడించు" "అంశాన్ని ఇక్కడికి తరలించు" "అంశం హోమ్‌స్క్రీన్‌కి జోడించబడింది" @@ -130,8 +134,7 @@ "ఎత్తును తగ్గించు" "విడ్జెట్ పరిమాణం వెడల్పు %1$sకి, ఎత్తు %2$sకి మార్చబడింది" "సత్వరమార్గాలు" - - + "షార్ట్‌కట్‌లు మరియు నోటిఫికేషన్‌లు" "తీసివేయి" "నోటిఫికేషన్ తీసివేయబడింది" "వ్యక్తిగతం" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 52ea7521ed..2da32de6fd 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -108,6 +108,8 @@ "กำลังดาวน์โหลด %1$s เสร็จแล้ว %2$s" "%1$s กำลังรอติดตั้ง" "วิดเจ็ตของ %1$s" + "รายการวิดเจ็ต" + "ปิดรายการวิดเจ็ตแล้ว" "เพิ่มลงในหน้าแรก" "ย้ายรายการมาที่นี่" "เพิ่มรายการไปยังหน้าจอหลักแล้ว" @@ -130,8 +132,7 @@ "ลดความสูง" "ปรับขนาดของวิดเจ็ตเป็นกว้าง %1$s สูง %2$s แล้ว" "ทางลัด" - - + "ทางลัดและการแจ้งเตือน" "ปิด" "ปิดการแจ้งเตือนแล้ว" "ส่วนตัว" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 0047aaeb30..68d52591f0 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -108,6 +108,8 @@ "Dina-download na ang %1$s, tapos na ang %2$s" "Hinihintay nang mag-install ang %1$s" "Mga widget ng %1$s" + "Listahan ng mga widget" + "Nakasara ang listahan ng mga widget" "Idagdag sa Home screen" "Ilipat ang item dito" "Naidagdag sa home screen ang item" @@ -130,8 +132,7 @@ "Bawasan ang taas" "Na-resize ang widget sa lapad %1$s taas %2$s" "Mga Shortcut" - - + "Mga shortcut at notification" "I-dismiss" "Na-dismiss ang notification" "Personal" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index cfa9f9eaf3..af121f237f 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -108,6 +108,8 @@ "%1$s indiriliyor, %2$s tamamlandı" "%1$s uygulaması yüklenmek için bekliyor" "%1$s widget\'ları" + "Widget listesi" + "Widget listesi kapalı" "Ana ekrana ekle" "Öğeyi buraya taşı" "Öğe ana ekrana eklendi" @@ -130,8 +132,7 @@ "Yüksekliği azalt" "Widget, %1$s genişlik ve %2$s yükseklik değerine yeniden boyutlandırıldı" "Kısayollar" - - + "Kısayollar ve bildirimler" "Kapat" "Bildirim kapatıldı" "Kişisel" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index aa5c676b1a..305c9aaef7 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -110,6 +110,8 @@ "%1$s завантажується, %2$s" "%1$s очікує на завантаження" "Віджети додатка %1$s" + "Список віджетів" + "Список віджектів закрито" "Додати на головний екран" "Перемістити елемент сюди" "Елемент додано на головний екран" @@ -132,8 +134,7 @@ "Зменшити висоту" "Розміри віджета змінено на %1$s завширшки та %2$s заввишки" "Ярлики" - - + "Ярлики та сповіщення" "Закрити" "Сповіщення закрито" "Особисті додатки" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index d8e339df07..7853fd4b36 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -108,6 +108,10 @@ "%1$s ڈاؤن لوڈ ہو رہا ہے، %2$s مکمل ہو گیا" "%1$s انسٹال ہونے کا انتظار کر رہی ہے" "%1$s ویجیٹس" + + + + "ہوم اسکرین میں شامل کریں" "آئٹم یہاں منتقل کریں" "آئٹم کو ہوم اسکرین میں شامل کر دیا گیا" @@ -130,8 +134,7 @@ "اونچائی کم کریں" "ویجیٹ کے سائز کو چوڑائی %1$s اونچائی %2$s میں تبدیل کر دیا گیا" "شارٹ کٹس" - - + "شارٹ کٹس اور اطلاعات" "برخاست کریں" "اطلاع مسترد ہو گئی" "ذاتی" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 6b53e9657f..287ec09f76 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -108,6 +108,8 @@ "%1$s yuklab olinmoqda, %2$s bajarildi" "%1$s ilovasi o‘rnatilishi kutilmoqda" "%1$s vidjetlari" + "Vidjetlar ro‘yxati" + "Vidjetlar ro‘yxati yopildi" "Bosh ekranga qo‘shish" "Obyektni bu yerga ko‘chirish" "Obyekt bosh ekranga qo‘shildi" @@ -130,8 +132,7 @@ "Bo‘yini kichraytirish" "Vidjetning eni %1$s, bo‘yi %2$s qilib o‘zgartirildi" "Tezkor tugmalar" - - + "Yorliqlar va bildirishnomalar" "Yopish" "Bildirishnoma yopildi" "Shaxsiy" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index ab88cfec6e..06278f5cf7 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -108,6 +108,8 @@ "Đang tải xuống %1$s, %2$s hoàn tất" "Đang chờ cài đặt %1$s" "Tiện ích của %1$s" + "Danh sách tiện ích" + "Đã đóng danh sách tiện ích" "Thêm vào màn hình chính" "Di chuyển mục vào đây" "Đã thêm mục vào màn hình chính" @@ -130,8 +132,7 @@ "Giảm chiều cao" "Đã đổi kích thước tiện ích thành chiều rộng %1$s chiều cao %2$s" "Lối tắt" - - + "Phím tắt và thông báo" "Loại bỏ" "Đã loại bỏ thông báo" "Cá nhân" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index a92208c83d..640aa0e2f0 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -108,6 +108,8 @@ "正在下载%1$s,已完成 %2$s" "%1$s正在等待安装" "%1$s微件" + "微件列表" + "微件列表已关闭" "添加到主屏幕" "将项目移至此处" "已将项目添加到主屏幕" @@ -130,8 +132,7 @@ "减小高度" "微件尺寸已调整为:宽度 %1$s,高度 %2$s" "快捷方式" - - + "快捷方式和通知" "关闭" "已关闭通知" "个人" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 0f253003b5..5a8c6caec6 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -108,6 +108,8 @@ "正在下載 %1$s,已完成 %2$s" "正在等待安裝 %1$s" "%1$s小工具" + "小工具清單" + "已經關閉嘅小工具清單" "新增至主畫面" "移動項目至這裡" "已將項目加入至主畫面" @@ -130,8 +132,7 @@ "減少高度" "已調整小工具的大小至闊 %1$s%2$s" "捷徑" - - + "捷徑同通知" "關閉" "關閉咗通知" "個人" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index c187b968b7..4d37cdd20a 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -108,6 +108,8 @@ "正在下載「%1$s」,已完成 %2$s" "正在等待安裝「%1$s」" "「%1$s」小工具" + "小工具清單" + "已關閉小工具清單" "新增至主畫面" "將項目移至這裡" "已將項目新增到主畫面" @@ -130,13 +132,12 @@ "減少高度" "已將小工具的寬度和高度分別調整為 %1$s%2$s" "捷徑" - - + "捷徑和通知" "關閉" "已關閉通知" "個人" "公司" - "Work 設定檔" + "工作資料夾" "在這裡尋找辦公應用程式" "每個辦公應用程式都有徽章,並由貴機構負責管理及確保其安全。請將辦公應用程式移至主螢幕以便輕鬆存取。" "由貴機構所管理" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 6f92847c1c..8e3e5abc60 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -108,6 +108,8 @@ "I-%1$s iyalandwa, %2$s kuqediwe" "%1$s ilinde ukufakwa" "%1$s amawijethi" + "Uhlu lwamawijethi" + "Uhlu lwamawijethi luvaliwe" "Faka kusikrini sasekhaya" "Hambisa into lapha" "Into ingezwe kusikrini sasekhaya" @@ -130,8 +132,7 @@ "Nciphisa ubude" "Iwijethi inikezwe usayizi omusha ngobubanzi obungu-%1$s ubude obungu-%2$s" "Izinqamuleli" - - + "Izinqamuleli nezaziso" "Cashisa" "Isaziso sicashisiwe" "Okomuntu siqu" From 7f28fd55ff383a80caf364408c5c15d978be6c8b Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 22 May 2018 16:24:40 -0700 Subject: [PATCH 20/31] Increasing the overview size while in QuickScrub mode Bug: 80139193 Change-Id: I19ea05d3cc083628364651e9d9f581fe1aaaeaaa --- .../uioverrides/FastOverviewState.java | 12 +++- .../RecentsViewStateController.java | 6 +- .../launcher3/uioverrides/UiFactory.java | 3 +- .../quickstep/ActivityControlHelper.java | 46 +++++++++----- .../quickstep/OtherActivityTouchConsumer.java | 2 +- .../quickstep/OverviewCommandHelper.java | 10 +-- .../WindowTransformSwipeHandler.java | 26 ++++---- .../quickstep/util/ClipAnimationHelper.java | 14 +++-- .../quickstep/util/TransformedRect.java | 32 ++++++++++ .../android/quickstep/views/RecentsView.java | 63 ++++--------------- src/com/android/launcher3/PagedView.java | 4 +- 11 files changed, 124 insertions(+), 94 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/TransformedRect.java diff --git a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java index a11625a346..da85990bbe 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; import com.android.quickstep.QuickScrubController; import com.android.quickstep.views.RecentsView; @@ -45,6 +46,15 @@ public class FastOverviewState extends OverviewState { @Override public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) { - return new float[] {1f, 0.5f}; + return new float[] {getOverviewScale(launcher.getDeviceProfile()), 0.5f}; + } + + public static float getOverviewScale(DeviceProfile dp) { + if (dp.isMultiWindowMode || dp.isVerticalBarLayout()) { + return 1f; + } + + // TODO: Calculate it dynamically based on available space + return 1.3f; } } diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java index e43b24a6af..e3aabd6c87 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.uioverrides; +import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.FAST_OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; @@ -24,7 +25,6 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_START_INTERPOLATOR; import static com.android.quickstep.QuickScrubController.QUICK_SCRUB_TRANSLATION_Y_FACTOR; import static com.android.quickstep.views.LauncherRecentsView.TRANSLATION_Y_FACTOR; -import static com.android.quickstep.views.RecentsView.ADJACENT_SCALE; import static com.android.quickstep.views.RecentsViewContainer.CONTENT_ALPHA; import android.animation.ValueAnimator; @@ -59,7 +59,7 @@ public class RecentsViewStateController implements StateHandler { public void setState(LauncherState state) { mRecentsViewContainer.setContentAlpha(state.overviewUi ? 1 : 0); float[] scaleTranslationYFactor = state.getOverviewScaleAndTranslationYFactor(mLauncher); - mRecentsView.setAdjacentScale(scaleTranslationYFactor[0]); + SCALE_PROPERTY.set(mRecentsView, scaleTranslationYFactor[0]); mRecentsView.setTranslationYFactor(scaleTranslationYFactor[1]); if (state.overviewUi) { mRecentsView.updateEmptyMessage(); @@ -77,7 +77,7 @@ public class RecentsViewStateController implements StateHandler { PropertySetter setter = config.getPropertySetter(builder); float[] scaleTranslationYFactor = toState.getOverviewScaleAndTranslationYFactor(mLauncher); Interpolator scaleInterpolator = builder.getInterpolator(ANIM_OVERVIEW_SCALE, LINEAR); - setter.setFloat(mRecentsView, ADJACENT_SCALE, scaleTranslationYFactor[0], scaleInterpolator); + setter.setFloat(mRecentsView, SCALE_PROPERTY, scaleTranslationYFactor[0], scaleInterpolator); Interpolator transYInterpolator = scaleInterpolator; if (mLauncher.getStateManager().getState() == OVERVIEW && toState == FAST_OVERVIEW) { transYInterpolator = Interpolators.clampToProgress(QUICK_SCRUB_START_INTERPOLATOR, 0, diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index 76820b6aa6..d0c7b21172 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -19,6 +19,7 @@ package com.android.launcher3.uioverrides; import static android.view.View.VISIBLE; import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; import static com.android.launcher3.AbstractFloatingView.TYPE_HIDE_BACK_BUTTON; +import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; @@ -207,7 +208,7 @@ public class UiFactory { public static void prepareToShowOverview(Launcher launcher) { RecentsView overview = launcher.getOverviewPanel(); if (overview.getVisibility() != VISIBLE || overview.getContentAlpha() == 0) { - overview.setAdjacentScale(1.33f); + SCALE_PROPERTY.set(overview, 1.33f); } } diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index ae0affee04..d47fec5fca 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -20,6 +20,8 @@ import static com.android.launcher3.LauncherState.FAST_OVERVIEW; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.anim.Interpolators.LINEAR; +import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; +import static com.android.quickstep.TouchConsumer.INTERACTION_QUICK_SCRUB; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_BACK; import static com.android.systemui.shared.system.NavigationBarCompat.HIT_TARGET_ROTATION; @@ -48,9 +50,12 @@ import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.dragndrop.DragLayer; +import com.android.launcher3.uioverrides.FastOverviewState; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; +import com.android.quickstep.TouchConsumer.InteractionType; import com.android.quickstep.util.LayoutUtils; +import com.android.quickstep.util.TransformedRect; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.LauncherLayoutListener; @@ -83,7 +88,8 @@ public interface ActivityControlHelper { void onTransitionCancelled(T activity, boolean activityVisible); - int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect); + int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, + @InteractionType int interactionType, TransformedRect outRect); void onSwipeUpComplete(T activity); @@ -157,14 +163,18 @@ public interface ActivityControlHelper { } @Override - public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { - LayoutUtils.calculateLauncherTaskSize(context, dp, outRect); + public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, + @InteractionType int interactionType, TransformedRect outRect) { + LayoutUtils.calculateLauncherTaskSize(context, dp, outRect.rect); + if (interactionType == INTERACTION_QUICK_SCRUB) { + outRect.scale = FastOverviewState.getOverviewScale(dp); + } if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; return dp.hotseatBarSizePx + dp.hotseatBarSidePaddingPx + hotseatInset; } else { - return dp.heightPx - outRect.bottom; + return dp.heightPx - outRect.rect.bottom; } } @@ -204,9 +214,10 @@ public interface ActivityControlHelper { return new AnimationFactory() { @Override - public void createActivityController(long transitionLength) { + public void createActivityController(long transitionLength, + @InteractionType int interactionType) { createActivityControllerInternal(activity, activityVisible, startState, - transitionLength, callback); + transitionLength, interactionType, callback); } @Override @@ -218,13 +229,16 @@ public interface ActivityControlHelper { private void createActivityControllerInternal(Launcher activity, boolean wasVisible, LauncherState startState, long transitionLength, + @InteractionType int interactionType, Consumer callback) { + LauncherState endState = interactionType == INTERACTION_QUICK_SCRUB + ? FAST_OVERVIEW : OVERVIEW; if (wasVisible) { DeviceProfile dp = activity.getDeviceProfile(); long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); activity.getStateManager().goToState(startState, false); callback.accept(activity.getStateManager() - .createAnimationToNewWorkspace(OVERVIEW, accuracy)); + .createAnimationToNewWorkspace(endState, accuracy)); return; } @@ -238,7 +252,7 @@ public interface ActivityControlHelper { float scrollRange = Math.max(controller.getShiftRange(), 1); float progressDelta = (transitionLength / scrollRange); - float endProgress = OVERVIEW.getVerticalProgress(activity); + float endProgress = endState.getVerticalProgress(activity); float startProgress = endProgress + progressDelta; ObjectAnimator shiftAnim = ObjectAnimator.ofFloat( controller, ALL_APPS_PROGRESS, startProgress, endProgress); @@ -381,14 +395,15 @@ public interface ActivityControlHelper { } @Override - public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect) { - LayoutUtils.calculateFallbackTaskSize(context, dp, outRect); + public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, + @InteractionType int interactionType, TransformedRect outRect) { + LayoutUtils.calculateFallbackTaskSize(context, dp, outRect.rect); if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); int hotseatInset = dp.isSeascape() ? targetInsets.left : targetInsets.right; return dp.hotseatBarSizePx + dp.hotseatBarSidePaddingPx + hotseatInset; } else { - return dp.heightPx - outRect.bottom; + return dp.heightPx - outRect.rect.bottom; } } @@ -401,7 +416,7 @@ public interface ActivityControlHelper { public AnimationFactory prepareRecentsUI(RecentsActivity activity, boolean activityVisible, Consumer callback) { if (activityVisible) { - return (transitionLength) -> { }; + return (transitionLength, interactionType) -> { }; } RecentsViewContainer rv = activity.getOverviewPanelContainer(); @@ -418,11 +433,12 @@ public interface ActivityControlHelper { rv.setContentAlpha(1); } createActivityController(getSwipeUpDestinationAndLength( - activity.getDeviceProfile(), activity, new Rect())); + activity.getDeviceProfile(), activity, INTERACTION_NORMAL, + new TransformedRect()), INTERACTION_NORMAL); } @Override - public void createActivityController(long transitionLength) { + public void createActivityController(long transitionLength, int interactionType) { if (!isAnimatingHome) { return; } @@ -543,7 +559,7 @@ public interface ActivityControlHelper { default void onRemoteAnimationReceived(RemoteAnimationTargetSet targets) { } - void createActivityController(long transitionLength); + void createActivityController(long transitionLength, @InteractionType int interactionType); default void onTransitionCancelled() { } } diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 23738fb257..a2aa4b9474 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -326,10 +326,10 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC mPassedInitialSlop = true; } - notifyGestureStarted(); if (mInteractionHandler != null) { mInteractionHandler.updateInteractionType(interactionType); } + notifyGestureStarted(); } @Override diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java index 7b29323835..41a45501d0 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java @@ -21,6 +21,7 @@ import static android.content.Intent.ACTION_PACKAGE_REMOVED; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR; +import static com.android.quickstep.TouchConsumer.INTERACTION_NORMAL; import static com.android.systemui.shared.system.ActivityManagerWrapper .CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.PackageManagerWrapper @@ -59,6 +60,7 @@ import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.FallbackActivityControllerHelper; import com.android.quickstep.ActivityControlHelper.LauncherActivityControllerHelper; import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.util.TransformedRect; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -282,7 +284,7 @@ public class OverviewCommandHelper { }); factory.onRemoteAnimationReceived(null); if (wasVisible) { - factory.createActivityController(RECENTS_LAUNCH_DURATION); + factory.createActivityController(RECENTS_LAUNCH_DURATION, INTERACTION_NORMAL); } mActivity = activity; mRecentsView = mActivity.getOverviewPanel(); @@ -342,9 +344,9 @@ public class OverviewCommandHelper { loc[0] + rootView.getWidth(), loc[1] + rootView.getHeight()); clipHelper.updateSource(homeBounds, runningTaskTarget); - Rect targetRect = new Rect(); - mHelper.getSwipeUpDestinationAndLength( - mActivity.getDeviceProfile(), mActivity, targetRect); + TransformedRect targetRect = new TransformedRect(); + mHelper.getSwipeUpDestinationAndLength(mActivity.getDeviceProfile(), mActivity, + INTERACTION_NORMAL, targetRect); clipHelper.updateTargetRect(targetRect); clipHelper.prepareAnimation(false /* isOpening */); diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 84b2176488..e93c80789f 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -65,6 +65,7 @@ import com.android.quickstep.ActivityControlHelper.AnimationFactory; import com.android.quickstep.ActivityControlHelper.LayoutListener; import com.android.quickstep.TouchConsumer.InteractionType; import com.android.quickstep.util.ClipAnimationHelper; +import com.android.quickstep.util.TransformedRect; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; @@ -181,7 +182,7 @@ public class WindowTransformSwipeHandler { private LayoutListener mLayoutListener; private RecentsView mRecentsView; private QuickScrubController mQuickScrubController; - private AnimationFactory mAnimationFactory = (t) -> { }; + private AnimationFactory mAnimationFactory = (t, i) -> { }; private Runnable mLauncherDrawnCallback; @@ -302,9 +303,9 @@ public class WindowTransformSwipeHandler { private void initTransitionEndpoints(DeviceProfile dp) { mDp = dp; - Rect tempRect = new Rect(); + TransformedRect tempRect = new TransformedRect(); mTransitionDragLength = mActivityControlHelper - .getSwipeUpDestinationAndLength(dp, mContext, tempRect); + .getSwipeUpDestinationAndLength(dp, mContext, mInteractionType, tempRect); mClipAnimationHelper.updateTargetRect(tempRect); } @@ -488,7 +489,7 @@ public class WindowTransformSwipeHandler { */ public void buildAnimationController() { initTransitionEndpoints(mActivity.getDeviceProfile()); - mAnimationFactory.createActivityController(mTransitionDragLength); + mAnimationFactory.createActivityController(mTransitionDragLength, mInteractionType); } private void onAnimatorPlaybackControllerCreated(AnimatorPlaybackController anim) { @@ -793,13 +794,16 @@ public class WindowTransformSwipeHandler { int scrollForFirstTask = mRecentsView.getScrollForPage(0); int scrollForSecondTask = mRecentsView.getChildCount() > 1 ? mRecentsView.getScrollForPage(1) : scrollForFirstTask; - int offsetFromFirstTask = scrollForFirstTask - scrollForSecondTask; - final float interpolation; - if (mRecentsView.getWidth() == 0) { - interpolation = scrollForSecondTask == scrollForFirstTask ? 0 : 1; - } else { - interpolation = (float) offsetFromFirstTask / (mRecentsView.getWidth() / 2); - } + float offsetFromFirstTask = scrollForFirstTask - scrollForSecondTask; + + TransformedRect tempRect = new TransformedRect(); + mActivityControlHelper + .getSwipeUpDestinationAndLength(mDp, mContext, mInteractionType, tempRect); + float distanceToReachEdge = mDp.widthPx / 2 + tempRect.rect.width() / 2 + + mContext.getResources().getDimensionPixelSize(R.dimen.recents_page_spacing); + float interpolation = Math.min(1, + Math.abs(offsetFromFirstTask) / distanceToReachEdge); + mClipAnimationHelper.offsetTarget( firstTask.getCurveScaleForInterpolation(interpolation), offsetFromFirstTask, mActivityControlHelper.getTranslationYForQuickScrub(mActivity), diff --git a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java index 8c7f104a64..cc24f1d8a2 100644 --- a/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -80,6 +80,7 @@ public class ClipAnimationHelper { private final RectF mTmpRectF = new RectF(); private float mTargetScale = 1f; + private float mOffsetScale = 1f; private Interpolator mInterpolator = LINEAR; // We translate y slightly faster than the rest of the animation for quick scrub. private Interpolator mOffsetYInterpolator = LINEAR; @@ -106,11 +107,13 @@ public class ClipAnimationHelper { updateSourceStack(target); } - public void updateTargetRect(Rect targetRect) { + public void updateTargetRect(TransformedRect targetRect) { + mOffsetScale = targetRect.scale; mSourceRect.set(mSourceInsets.left, mSourceInsets.top, mSourceStackBounds.width() - mSourceInsets.right, mSourceStackBounds.height() - mSourceInsets.bottom); - mTargetRect.set(targetRect); + mTargetRect.set(targetRect.rect); + Utilities.scaleRectFAboutCenter(mTargetRect, targetRect.scale); mTargetRect.offset(mHomeStackBounds.left - mSourceStackBounds.left, mHomeStackBounds.top - mSourceStackBounds.top); @@ -145,7 +148,8 @@ public class ClipAnimationHelper { synchronized (mTargetOffset) { // Stay lined up with the center of the target, since it moves for quick scrub. - currentRect.offset(mTargetOffset.x * progress, mTargetOffset.y * offsetYProgress); + currentRect.offset(mTargetOffset.x * mOffsetScale * progress, + mTargetOffset.y * offsetYProgress); } mClipRect.left = (int) (mSourceWindowClipInsets.left * progress); @@ -219,8 +223,8 @@ public class ClipAnimationHelper { mSourceInsets.set(activity.getDeviceProfile().getInsets()); } - Rect targetRect = new Rect(); - dl.getDescendantRectRelativeToSelf(ttv, targetRect); + TransformedRect targetRect = new TransformedRect(); + dl.getDescendantRectRelativeToSelf(ttv, targetRect.rect); updateTargetRect(targetRect); // Transform the clip relative to the target rect. diff --git a/quickstep/src/com/android/quickstep/util/TransformedRect.java b/quickstep/src/com/android/quickstep/util/TransformedRect.java new file mode 100644 index 0000000000..79f11e405b --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/TransformedRect.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2018 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.graphics.Rect; + +/** + * A wrapper around {@link Rect} with additional transformation properties + */ +public class TransformedRect { + + public final Rect rect = new Rect(); + public float scale = 1; + + public void set(TransformedRect transformedRect) { + rect.set(transformedRect.rect); + scale = transformedRect.scale; + } +} diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 186de36814..4f169fb472 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -47,7 +47,6 @@ import android.text.StaticLayout; import android.text.TextPaint; import android.util.ArraySet; import android.util.AttributeSet; -import android.util.FloatProperty; import android.util.SparseBooleanArray; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -100,18 +99,6 @@ public abstract class RecentsView extends PagedView impl private final Rect mTempRect = new Rect(); - public static final FloatProperty ADJACENT_SCALE = - new FloatProperty("adjacentScale") { - @Override - public void setValue(RecentsView recentsView, float v) { - recentsView.setAdjacentScale(v); - } - - @Override - public Float get(RecentsView recentsView) { - return recentsView.mAdjacentScale; - } - }; private static final int DISMISS_TASK_DURATION = 300; // The threshold at which we update the SystemUI flags when animating from the task into the app private static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.6f; @@ -122,6 +109,7 @@ public abstract class RecentsView extends PagedView impl private final QuickScrubController mQuickScrubController; private final float mFastFlingVelocity; private final RecentsModel mModel; + private final int mTaskTopMargin; private final ScrollState mScrollState = new ScrollState(); // Keeps track of the previously known visible tasks for purposes of loading/unloading task data @@ -232,8 +220,6 @@ public abstract class RecentsView extends PagedView impl @ViewDebug.ExportedProperty(category = "launcher") private float mContentAlpha = 1; - @ViewDebug.ExportedProperty(category = "launcher") - private float mAdjacentScale = 1; // Keeps track of task views whose visual state should not be reset private ArraySet mIgnoreResetTaskViews = new ArraySet<>(); @@ -271,6 +257,8 @@ public abstract class RecentsView extends PagedView impl mIsRtl = !Utilities.isRtl(getResources()); setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); + mTaskTopMargin = getResources() + .getDimensionPixelSize(R.dimen.task_thumbnail_top_margin); mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents); mEmptyIcon.setCallback(this); @@ -518,8 +506,7 @@ public abstract class RecentsView extends PagedView impl DeviceProfile dp = mActivity.getDeviceProfile(); getTaskSize(dp, mTempRect); - mTempRect.top -= getResources() - .getDimensionPixelSize(R.dimen.task_thumbnail_top_margin); + mTempRect.top -= mTaskTopMargin; setPadding(mTempRect.left - mInsets.left, mTempRect.top - mInsets.top, dp.availableWidthPx + mInsets.left - mTempRect.right, dp.availableHeightPx + mInsets.top - mTempRect.bottom); @@ -1038,36 +1025,7 @@ public abstract class RecentsView extends PagedView impl updateClearAllButtonAlpha(); } - public void setAdjacentScale(float adjacentScale) { - if (mAdjacentScale == adjacentScale) { - return; - } - mAdjacentScale = adjacentScale; - TaskView currTask = getPageAt(mCurrentPage); - if (currTask == null) { - return; - } - currTask.setZoomScale(mAdjacentScale); - - if (mCurrentPage - 1 >= 0) { - TaskView adjacentTask = getPageAt(mCurrentPage - 1); - float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, - mAdjacentScale, 0); - adjacentTask.setZoomScale(scaleAndTranslation[0]); - adjacentTask.setTranslationX(-scaleAndTranslation[1]); - adjacentTask.setTranslationY(scaleAndTranslation[2]); - } - if (mCurrentPage + 1 < getChildCount()) { - TaskView adjacentTask = getPageAt(mCurrentPage + 1); - float[] scaleAndTranslation = getAdjacentScaleAndTranslation(currTask, adjacentTask, - mAdjacentScale, 0); - adjacentTask.setZoomScale(scaleAndTranslation[0]); - adjacentTask.setTranslationX(scaleAndTranslation[1]); - adjacentTask.setTranslationY(scaleAndTranslation[2]); - } - } - - private float[] getAdjacentScaleAndTranslation(TaskView currTask, TaskView adjacentTask, + private float[] getAdjacentScaleAndTranslation(TaskView currTask, float currTaskToScale, float currTaskToTranslationY) { float displacement = currTask.getWidth() * (currTaskToScale - currTask.getCurveScale()); sTempFloatArray[0] = currTaskToScale; @@ -1080,7 +1038,6 @@ public abstract class RecentsView extends PagedView impl public void onViewAdded(View child) { super.onViewAdded(child); child.setAlpha(mContentAlpha); - setAdjacentScale(mAdjacentScale); onChildViewsChanged(); } @@ -1106,6 +1063,12 @@ public abstract class RecentsView extends PagedView impl protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); updateEmptyStateUi(changed); + + // Set the pivot points to match the task preview center + setPivotY(((mInsets.top + getPaddingTop() + mTaskTopMargin) + + (getHeight() - mInsets.bottom - getPaddingBottom())) / 2); + setPivotX(((mInsets.left + getPaddingLeft()) + + (getWidth() - mInsets.right - getPaddingRight())) / 2); } private void updateEmptyStateUi(boolean sizeChanged) { @@ -1176,14 +1139,14 @@ public abstract class RecentsView extends PagedView impl if (taskIndex - 1 >= 0) { TaskView adjacentTask = getPageAt(taskIndex - 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(centerTask, - adjacentTask, toScale, toTranslationY); + toScale, toTranslationY); scaleAndTranslation[1] = -scaleAndTranslation[1]; anim.play(createAnimForChild(adjacentTask, scaleAndTranslation)); } if (taskIndex + 1 < getPageCount()) { TaskView adjacentTask = getPageAt(taskIndex + 1); float[] scaleAndTranslation = getAdjacentScaleAndTranslation(centerTask, - adjacentTask, toScale, toTranslationY); + toScale, toTranslationY); anim.play(createAnimForChild(adjacentTask, scaleAndTranslation)); } } else { diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index efbd004894..5cc2e8fc55 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -440,9 +440,7 @@ public abstract class PagedView extends ViewGrou if (getUnboundedScrollX() != mScroller.getCurrX() || getScrollY() != mScroller.getCurrY() || mOverScrollX != mScroller.getCurrX()) { - float scaleX = mFreeScroll ? getScaleX() : 1f; - int scrollX = (int) (mScroller.getCurrX() * (1 / scaleX)); - scrollTo(scrollX, mScroller.getCurrY()); + scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); } if (shouldInvalidate) { invalidate(); From 17839d5f62dd05c19da727d072caa22f31a76ba7 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 23 May 2018 14:45:56 -0700 Subject: [PATCH 21/31] Removing discovery bouncer from accessibility It was obstructing views under it. Solves both Talkback and Switch Access issues. Bug: 80192025 Test: Manual Change-Id: Ia7fad91e1fcb857afbf68f879550c670279cee68 --- src/com/android/launcher3/AbstractFloatingView.java | 11 ++++++++--- .../android/launcher3/allapps/DiscoveryBounce.java | 2 +- src/com/android/launcher3/dragndrop/DragLayer.java | 3 ++- src/com/android/launcher3/views/BaseDragLayer.java | 10 ++++++---- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/com/android/launcher3/AbstractFloatingView.java b/src/com/android/launcher3/AbstractFloatingView.java index c75509eaba..daf20323d0 100644 --- a/src/com/android/launcher3/AbstractFloatingView.java +++ b/src/com/android/launcher3/AbstractFloatingView.java @@ -51,6 +51,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch TYPE_WIDGET_RESIZE_FRAME, TYPE_WIDGETS_FULL_SHEET, TYPE_ON_BOARD_POPUP, + TYPE_DISCOVERY_BOUNCE, TYPE_QUICKSTEP_PREVIEW, TYPE_TASK_MENU, @@ -64,6 +65,7 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch public static final int TYPE_WIDGET_RESIZE_FRAME = 1 << 3; public static final int TYPE_WIDGETS_FULL_SHEET = 1 << 4; public static final int TYPE_ON_BOARD_POPUP = 1 << 5; + public static final int TYPE_DISCOVERY_BOUNCE = 1 << 6; // Popups related to quickstep UI public static final int TYPE_QUICKSTEP_PREVIEW = 1 << 6; @@ -72,14 +74,17 @@ public abstract class AbstractFloatingView extends LinearLayout implements Touch public static final int TYPE_ALL = TYPE_FOLDER | TYPE_ACTION_POPUP | TYPE_WIDGETS_BOTTOM_SHEET | TYPE_WIDGET_RESIZE_FRAME | TYPE_WIDGETS_FULL_SHEET - | TYPE_QUICKSTEP_PREVIEW | TYPE_ON_BOARD_POPUP | TYPE_TASK_MENU | TYPE_OPTIONS_POPUP; + | TYPE_QUICKSTEP_PREVIEW | TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE | TYPE_TASK_MENU + | TYPE_OPTIONS_POPUP; // Type of popups which should be kept open during launcher rebind public static final int TYPE_REBIND_SAFE = TYPE_WIDGETS_FULL_SHEET - | TYPE_QUICKSTEP_PREVIEW | TYPE_ON_BOARD_POPUP; + | TYPE_QUICKSTEP_PREVIEW | TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE; // Usually we show the back button when a floating view is open. Instead, hide for these types. - public static final int TYPE_HIDE_BACK_BUTTON = TYPE_ON_BOARD_POPUP; + public static final int TYPE_HIDE_BACK_BUTTON = TYPE_ON_BOARD_POPUP | TYPE_DISCOVERY_BOUNCE; + + public static final int TYPE_ACCESSIBLE = TYPE_ALL & ~TYPE_DISCOVERY_BOUNCE; protected boolean mIsOpen; diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java index a0a79c87df..3c3c4066d3 100644 --- a/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -110,7 +110,7 @@ public class DiscoveryBounce extends AbstractFloatingView { @Override protected boolean isOfType(int type) { - return (type & TYPE_ON_BOARD_POPUP) != 0; + return (type & TYPE_DISCOVERY_BOUNCE) != 0; } private void show(int containerType) { diff --git a/src/com/android/launcher3/dragndrop/DragLayer.java b/src/com/android/launcher3/dragndrop/DragLayer.java index 53e9e2dacc..6d2d3cb442 100644 --- a/src/com/android/launcher3/dragndrop/DragLayer.java +++ b/src/com/android/launcher3/dragndrop/DragLayer.java @@ -218,7 +218,8 @@ public class DragLayer extends BaseDragLayer { @Override public void addChildrenForAccessibility(ArrayList childrenForAccessibility) { - View topView = AbstractFloatingView.getTopOpenView(mActivity); + View topView = AbstractFloatingView.getTopOpenViewWithType(mActivity, + AbstractFloatingView.TYPE_ACCESSIBLE); if (topView != null) { addAccessibleChildToList(topView, childrenForAccessibility); if (isInAccessibleDrag()) { diff --git a/src/com/android/launcher3/views/BaseDragLayer.java b/src/com/android/launcher3/views/BaseDragLayer.java index 2f142acc9d..8457b2bcda 100644 --- a/src/com/android/launcher3/views/BaseDragLayer.java +++ b/src/com/android/launcher3/views/BaseDragLayer.java @@ -16,6 +16,8 @@ package com.android.launcher3.views; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; + import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; @@ -36,8 +38,6 @@ import com.android.launcher3.util.TouchController; import java.util.ArrayList; -import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; - /** * A viewgroup with utility methods for drag-n-drop and touch interception */ @@ -100,7 +100,8 @@ public abstract class BaseDragLayer extends Inse @Override public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { // Shortcuts can appear above folder - View topView = AbstractFloatingView.getTopOpenView(mActivity); + View topView = AbstractFloatingView.getTopOpenViewWithType(mActivity, + AbstractFloatingView.TYPE_ACCESSIBLE); if (topView != null) { if (child == topView) { return super.onRequestSendAccessibilityEvent(child, event); @@ -114,7 +115,8 @@ public abstract class BaseDragLayer extends Inse @Override public void addChildrenForAccessibility(ArrayList childrenForAccessibility) { - View topView = AbstractFloatingView.getTopOpenView(mActivity); + View topView = AbstractFloatingView.getTopOpenViewWithType(mActivity, + AbstractFloatingView.TYPE_ACCESSIBLE); if (topView != null) { // Only add the top view as a child for accessibility when it is open addAccessibleChildToList(topView, childrenForAccessibility); From d5ccb6978dbf458280bbea17af4df655510f68d0 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 23 May 2018 18:01:50 -0700 Subject: [PATCH 22/31] Reverting task order reported via accessibility. Now tasks go in the natural left-to-right direction. Bug: 72222505 Test: Manual Change-Id: I9e90d0eaaaa3ca0a73b2fe6d20e82689c2b2f376 --- quickstep/src/com/android/quickstep/views/RecentsView.java | 5 +++-- quickstep/src/com/android/quickstep/views/TaskView.java | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 4f169fb472..2f6ce8a3e4 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1315,8 +1315,9 @@ public abstract class RecentsView extends PagedView impl super.onInitializeAccessibilityEvent(event); if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { - event.setFromIndex(getCurrentPage()); - event.setToIndex(getCurrentPage()); + final int visiblePageNumber = getChildCount() - getCurrentPage() - 1; + event.setFromIndex(visiblePageNumber); + event.setToIndex(visiblePageNumber); event.setItemCount(getChildCount()); } } diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java index 213d9cb592..5413a13199 100644 --- a/quickstep/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/src/com/android/quickstep/views/TaskView.java @@ -325,7 +325,8 @@ public class TaskView extends FrameLayout implements TaskCallbacks, PageCallback final AccessibilityNodeInfo.CollectionItemInfo itemInfo = AccessibilityNodeInfo.CollectionItemInfo.obtain( - 0, 1, recentsView.indexOfChild(this), 1, false); + 0, 1, recentsView.getChildCount() - recentsView.indexOfChild(this) - 1, 1, + false); info.setCollectionItemInfo(itemInfo); } From ededa9cce28ec47f4b6a392db165044c3189be64 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 22 May 2018 14:14:38 -0700 Subject: [PATCH 23/31] Initial changes to support full-width quickscrubbing. Bug: 79945202 Change-Id: Ida8443432faafc74fbdc0a7dae87f0cf8c8ce648 --- .../android/quickstep/OtherActivityTouchConsumer.java | 10 ++++------ .../com/android/quickstep/QuickScrubController.java | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index a2aa4b9474..9ba3328319 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -265,12 +265,10 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC if (Looper.myLooper() != Looper.getMainLooper()) { startActivity.run(); - if (!mIsDeferredDownTarget) { - try { - drawWaitLock.await(LAUNCHER_DRAW_TIMEOUT_MS, TimeUnit.MILLISECONDS); - } catch (Exception e) { - // We have waited long enough for launcher to draw - } + try { + drawWaitLock.await(LAUNCHER_DRAW_TIMEOUT_MS, TimeUnit.MILLISECONDS); + } catch (Exception e) { + // We have waited long enough for launcher to draw } } else { // We should almost always get touch-town on background thread. This is an edge case diff --git a/quickstep/src/com/android/quickstep/QuickScrubController.java b/quickstep/src/com/android/quickstep/QuickScrubController.java index abb479dea7..8e1a3d5d8a 100644 --- a/quickstep/src/com/android/quickstep/QuickScrubController.java +++ b/quickstep/src/com/android/quickstep/QuickScrubController.java @@ -49,7 +49,7 @@ public class QuickScrubController implements OnAlarmListener { * Snap to a new page when crossing these thresholds. The first and last auto-advance. */ private static final float[] QUICK_SCRUB_THRESHOLDS = new float[] { - 0.04f, 0.27f, 0.50f, 0.73f, 0.96f + 0.05f, 0.20f, 0.35f, 0.50f, 0.65f, 0.80f, 0.95f }; private static final String TAG = "QuickScrubController"; From ccd90231e606e6a2c0ee55f49ad347723aa2f75f Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 23 May 2018 17:07:33 -0700 Subject: [PATCH 24/31] Calculate the scale up for quickscrub based on the available size of the screen Bug: 80139193 Change-Id: I0492ce5bfa347bad12a09a13e404ded77e797623 --- quickstep/res/values/dimens.xml | 1 + .../uioverrides/FastOverviewState.java | 29 +++++++++++++++---- .../quickstep/ActivityControlHelper.java | 6 ++-- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index ad5f767be0..ed18bf5e3a 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -21,6 +21,7 @@ 12dp 2dp 10dp + 20dp diff --git a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java index da85990bbe..43d982230b 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/FastOverviewState.java @@ -15,8 +15,13 @@ */ package com.android.launcher3.uioverrides; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Rect; + import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; +import com.android.launcher3.R; import com.android.quickstep.QuickScrubController; import com.android.quickstep.views.RecentsView; @@ -25,6 +30,12 @@ import com.android.quickstep.views.RecentsView; */ public class FastOverviewState extends OverviewState { + private static final float MAX_PREVIEW_SCALE_UP = 1.3f; + /** + * Vertical transition of the task previews relative to the full container. + */ + public static final float OVERVIEW_TRANSLATION_FACTOR = 0.5f; + private static final int STATE_FLAGS = FLAG_DISABLE_RESTORE | FLAG_DISABLE_INTERACTION | FLAG_OVERVIEW_UI | FLAG_HIDE_BACK_BUTTON | FLAG_DISABLE_ACCESSIBILITY; @@ -46,15 +57,23 @@ public class FastOverviewState extends OverviewState { @Override public float[] getOverviewScaleAndTranslationYFactor(Launcher launcher) { - return new float[] {getOverviewScale(launcher.getDeviceProfile()), 0.5f}; + RecentsView recentsView = launcher.getOverviewPanel(); + recentsView.getTaskSize(sTempRect); + + return new float[] {getOverviewScale(launcher.getDeviceProfile(), sTempRect, launcher), + OVERVIEW_TRANSLATION_FACTOR}; } - public static float getOverviewScale(DeviceProfile dp) { - if (dp.isMultiWindowMode || dp.isVerticalBarLayout()) { + public static float getOverviewScale(DeviceProfile dp, Rect taskRect, Context context) { + if (dp.isVerticalBarLayout()) { return 1f; } - // TODO: Calculate it dynamically based on available space - return 1.3f; + Resources res = context.getResources(); + float usedHeight = taskRect.height() + res.getDimension(R.dimen.task_thumbnail_top_margin); + float usedWidth = taskRect.width() + 2 * (res.getDimension(R.dimen.recents_page_spacing) + + res.getDimension(R.dimen.quickscrub_adjacent_visible_width)); + return Math.min(Math.min(dp.availableHeightPx / usedHeight, + dp.availableWidthPx / usedWidth), MAX_PREVIEW_SCALE_UP); } } diff --git a/quickstep/src/com/android/quickstep/ActivityControlHelper.java b/quickstep/src/com/android/quickstep/ActivityControlHelper.java index d47fec5fca..e202c574ad 100644 --- a/quickstep/src/com/android/quickstep/ActivityControlHelper.java +++ b/quickstep/src/com/android/quickstep/ActivityControlHelper.java @@ -153,8 +153,8 @@ public interface ActivityControlHelper { @Override public float getTranslationYForQuickScrub(Launcher activity) { LauncherRecentsView recentsView = activity.getOverviewPanel(); - float transYFactor = FAST_OVERVIEW.getOverviewScaleAndTranslationYFactor(activity)[1]; - return recentsView.computeTranslationYForFactor(transYFactor); + return recentsView.computeTranslationYForFactor( + FastOverviewState.OVERVIEW_TRANSLATION_FACTOR); } @Override @@ -167,7 +167,7 @@ public interface ActivityControlHelper { @InteractionType int interactionType, TransformedRect outRect) { LayoutUtils.calculateLauncherTaskSize(context, dp, outRect.rect); if (interactionType == INTERACTION_QUICK_SCRUB) { - outRect.scale = FastOverviewState.getOverviewScale(dp); + outRect.scale = FastOverviewState.getOverviewScale(dp, outRect.rect, context); } if (dp.isVerticalBarLayout()) { Rect targetInsets = dp.getInsets(); From 6ec237a26046aece0fde6dcfe866ba3570874475 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 24 May 2018 11:23:31 -0700 Subject: [PATCH 25/31] Wait until the remote transtions are received before trying to quickscrub animations Bug: 80219743 Change-Id: Ib94568827f30b996477d82f38675e3cd55031849 --- .../com/android/quickstep/WindowTransformSwipeHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index e93c80789f..191c237f68 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -273,8 +273,8 @@ public class WindowTransformSwipeHandler { | STATE_SCALED_CONTROLLER_APP, this::notifyTransitionCancelled); - mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START, - this::onQuickScrubStart); + mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START + | STATE_APP_CONTROLLER_RECEIVED, this::onQuickScrubStart); mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_QUICK_SCRUB_START | STATE_SCALED_CONTROLLER_RECENTS, this::onFinishedTransitionToQuickScrub); mStateCallback.addCallback(STATE_LAUNCHER_STARTED | STATE_CURRENT_TASK_FINISHED From 1b0c5032d1b773d93fed3b1b14587163b86ca521 Mon Sep 17 00:00:00 2001 From: Vadim Tryshev Date: Wed, 23 May 2018 12:54:27 -0700 Subject: [PATCH 26/31] Fixing keyboard navigation when Overview list is empty Bug: 80155387 Change-Id: Ife86fe4b718ef01291a04b21020155110d75fa7b Testing: Manual --- .../android/launcher3/uioverrides/AllAppsState.java | 7 ------- .../launcher3/uioverrides/OverviewState.java | 5 ----- .../com/android/quickstep/views/RecentsView.java | 12 ++---------- .../quickstep/views/RecentsViewContainer.java | 13 ++++++++++--- src/com/android/launcher3/LauncherState.java | 6 +----- src/com/android/launcher3/LauncherStateManager.java | 13 +++++-------- .../android/launcher3/states/SpringLoadedState.java | 6 ------ .../android/launcher3/uioverrides/AllAppsState.java | 7 ------- 8 files changed, 18 insertions(+), 51 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java index d86ba6aa6c..1eaa8bc92c 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/AllAppsState.java @@ -18,8 +18,6 @@ package com.android.launcher3.uioverrides; import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; -import android.view.View; - import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; @@ -61,11 +59,6 @@ public class AllAppsState extends LauncherState { return 0f; } - @Override - public View getFinalFocus(Launcher launcher) { - return launcher.getAppsView(); - } - @Override public float[] getWorkspaceScaleAndTranslation(Launcher launcher) { float[] scaleAndTranslation = LauncherState.OVERVIEW.getWorkspaceScaleAndTranslation( diff --git a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java index 0116a8e0e7..9169ffbc1e 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/OverviewState.java @@ -83,11 +83,6 @@ public class OverviewState extends LauncherState { DiscoveryBounce.showForOverviewIfNeeded(launcher); } - @Override - public View getFinalFocus(Launcher launcher) { - return launcher.getOverviewPanel(); - } - public PageAlphaProvider getWorkspacePageAlphaProvider(Launcher launcher) { return new PageAlphaProvider(DEACCEL_2) { @Override diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 4f169fb472..4d6b89cff1 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -271,6 +271,7 @@ public abstract class RecentsView extends PagedView impl .getDimensionPixelSize(R.dimen.recents_empty_message_text_padding); setWillNotDraw(false); updateEmptyMessage(); + setFocusable(false); } public boolean isRtl() { @@ -931,16 +932,6 @@ public abstract class RecentsView extends PagedView impl return true; } - @Override - public void onVisibilityAggregated(boolean isVisible) { - super.onVisibilityAggregated(isVisible); - if (isVisible && !isFocused()) { - // Having focus, even in touch mode, keeps us from losing [Alt+]Tab by preventing - // switching to keyboard mode. - requestFocus(); - } - } - private void runDismissAnimation(PendingAnimation pendingAnim) { AnimatorPlaybackController controller = AnimatorPlaybackController.wrap( pendingAnim.anim, DISMISS_TASK_DURATION); @@ -1285,6 +1276,7 @@ public abstract class RecentsView extends PagedView impl private void onChildViewsChanged() { final int childCount = getChildCount(); mClearAllButton.setVisibility(childCount == 0 ? INVISIBLE : VISIBLE); + setFocusable(childCount != 0); } public void revealClearAllButton() { diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index 3391214dee..31c8b64480 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -113,8 +113,15 @@ public class RecentsViewContainer extends InsettableFrameLayout { @Override public void addFocusables(ArrayList views, int direction, int focusableMode) { - // Carousel is first in tab order. - views.add(mRecentsView); - views.add(mClearAllButton); + if (mRecentsView.getChildCount() > 0) { + // Carousel is first in tab order. + views.add(mRecentsView); + views.add(mClearAllButton); + } + } + + public boolean requestFocus(int direction, Rect previouslyFocusedRect) { + return mRecentsView.requestFocus(direction, previouslyFocusedRect) || + super.requestFocus(direction, previouslyFocusedRect); } } \ No newline at end of file diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index 76681f280f..5b010dc2d4 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -18,11 +18,11 @@ package com.android.launcher3; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS; import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; + import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.states.RotationHelper.REQUEST_NONE; import android.graphics.Rect; -import android.view.View; import android.view.animation.Interpolator; import com.android.launcher3.states.SpringLoadedState; @@ -196,10 +196,6 @@ public class LauncherState { public void onStateDisabled(Launcher launcher) { } - public View getFinalFocus(Launcher launcher) { - return launcher.getWorkspace(); - } - public int getVisibleElements(Launcher launcher) { if (launcher.getDeviceProfile().isVerticalBarLayout()) { return HOTSEAT_ICONS | VERTICAL_SWIPE_INDICATOR; diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 3fcdee934c..f938e2412a 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -17,6 +17,7 @@ package com.android.launcher3; import static android.view.View.VISIBLE; + import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; @@ -35,7 +36,6 @@ import android.animation.AnimatorSet; import android.os.Handler; import android.os.Looper; import android.support.annotation.IntDef; -import android.view.View; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; @@ -251,7 +251,7 @@ public class LauncherStateManager { prepareForAtomicAnimation(mState, state, builder); AnimatorSet animation = createAnimationToNewWorkspaceInternal( state, builder, onCompleteRunnable); - Runnable runnable = new StartAnimRunnable(animation, state.getFinalFocus(mLauncher)); + Runnable runnable = new StartAnimRunnable(animation); if (delay > 0) { mUiHandler.postDelayed(runnable, delay); } else { @@ -397,6 +397,8 @@ public class LauncherStateManager { } UiFactory.onLauncherStateOrResumeChanged(mLauncher); + + mLauncher.getDragLayer().requestFocus(); } public void onWindowFocusChanged() { @@ -480,11 +482,9 @@ public class LauncherStateManager { private class StartAnimRunnable implements Runnable { private final AnimatorSet mAnim; - private final View mViewToFocus; - public StartAnimRunnable(AnimatorSet anim, View viewToFocus) { + public StartAnimRunnable(AnimatorSet anim) { mAnim = anim; - mViewToFocus = viewToFocus; } @Override @@ -492,9 +492,6 @@ public class LauncherStateManager { if (mConfig.mCurrentAnimation != mAnim) { return; } - if (mViewToFocus != null) { - mViewToFocus.requestFocus(); - } mAnim.start(); } } diff --git a/src/com/android/launcher3/states/SpringLoadedState.java b/src/com/android/launcher3/states/SpringLoadedState.java index aa7d0d5a3d..35f7f8831a 100644 --- a/src/com/android/launcher3/states/SpringLoadedState.java +++ b/src/com/android/launcher3/states/SpringLoadedState.java @@ -19,7 +19,6 @@ import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_TRANSITION_M import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; import android.graphics.Rect; -import android.view.View; import com.android.launcher3.DeviceProfile; import com.android.launcher3.InstallShortcutReceiver; @@ -98,9 +97,4 @@ public class SpringLoadedState extends LauncherState { InstallShortcutReceiver.disableAndFlushInstallQueue( InstallShortcutReceiver.FLAG_DRAG_AND_DROP, launcher); } - - @Override - public View getFinalFocus(Launcher launcher) { - return null; - } } diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java index 4a2f544e8d..f7bb254565 100644 --- a/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java +++ b/src_ui_overrides/com/android/launcher3/uioverrides/AllAppsState.java @@ -19,8 +19,6 @@ import static com.android.launcher3.LauncherAnimUtils.ALL_APPS_TRANSITION_MS; import static com.android.launcher3.allapps.DiscoveryBounce.HOME_BOUNCE_SEEN; import static com.android.launcher3.anim.Interpolators.DEACCEL_2; -import android.view.View; - import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; @@ -67,11 +65,6 @@ public class AllAppsState extends LauncherState { return ALL_APPS_HEADER | ALL_APPS_CONTENT; } - @Override - public View getFinalFocus(Launcher launcher) { - return launcher.getAppsView(); - } - @Override public float[] getWorkspaceScaleAndTranslation(Launcher launcher) { return new float[] { 1f, 0, From a6afdffbbd261e54a5eaeb7bc2d6a5a0d1b5f91a Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 24 May 2018 13:49:57 -0700 Subject: [PATCH 27/31] Adding support for dark text on dark theme Bug: 80253867 Change-Id: Ib81a2fe884f68cd2dd4af1e573bd8c836f374f16 --- res/values/styles.xml | 11 ++++++++++- src/com/android/launcher3/BaseDraggingActivity.java | 8 ++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/res/values/styles.xml b/res/values/styles.xml index 631626f441..2b760f3493 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -45,7 +45,7 @@ - + +