diff --git a/quickstep/recents_ui_overrides/res/layout/overview_panel.xml b/quickstep/recents_ui_overrides/res/layout/overview_panel.xml
index eac0bfa8eb..fe57e9b3d5 100644
--- a/quickstep/recents_ui_overrides/res/layout/overview_panel.xml
+++ b/quickstep/recents_ui_overrides/res/layout/overview_panel.xml
@@ -13,12 +13,20 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
+
+
+
+
+
+
+
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
index 0019ecb427..6c64bf7c75 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
@@ -30,6 +30,7 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_HOTSEAT_TRA
import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PROGRESS;
import static com.android.quickstep.TaskViewUtils.findTaskViewToLaunch;
import static com.android.quickstep.TaskViewUtils.getRecentsWindowAnimator;
+import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -37,7 +38,6 @@ import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
-import android.util.FloatProperty;
import android.view.View;
import androidx.annotation.NonNull;
@@ -49,7 +49,6 @@ import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.anim.SpringAnimationBuilder;
import com.android.launcher3.states.StateAnimationConfig;
-import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.quickstep.util.AppWindowAnimationHelper;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
@@ -199,11 +198,10 @@ public final class LauncherAppTransitionManagerImpl extends QuickstepAppTransiti
return ObjectAnimator.ofFloat(mLauncher.getOverviewPanel(),
RecentsView.CONTENT_ALPHA, values);
case INDEX_RECENTS_TRANSLATE_X_ANIM:
- PagedOrientationHandler orientationHandler =
- ((RecentsView)mLauncher.getOverviewPanel()).getPagedViewOrientedState()
- .getOrientationHandler();
- FloatProperty translate = orientationHandler.getPrimaryViewTranslate();
- return new SpringAnimationBuilder<>(mLauncher.getOverviewPanel(), translate)
+ // TODO: Do not assume motion across X axis for adjacent page
+ return new SpringAnimationBuilder<>(
+ mLauncher.getOverviewPanel(), ADJACENT_PAGE_OFFSET)
+ .setMinimumVisibleChange(1f / mLauncher.getOverviewPanel().getWidth())
.setDampingRatio(0.8f)
.setStiffness(250)
.setValues(values)
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 8af26c6e8b..752068843c 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -19,11 +19,13 @@ import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.
import static com.android.launcher3.graphics.IconShape.getShape;
import android.content.Context;
+import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
-import android.graphics.DashPathEffect;
import android.graphics.Paint;
+import android.graphics.Path;
import android.graphics.Rect;
+import android.os.Process;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@@ -39,6 +41,7 @@ import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
import com.android.launcher3.graphics.IconPalette;
import com.android.launcher3.hybridhotseat.HotseatPredictionController;
import com.android.launcher3.icons.IconNormalizer;
+import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.touch.ItemClickHandler;
@@ -51,13 +54,18 @@ import com.android.launcher3.views.DoubleShadowBubbleTextView;
public class PredictedAppIcon extends DoubleShadowBubbleTextView implements
LauncherAccessibilityDelegate.AccessibilityActionHandler {
+ private static final int RING_SHADOW_COLOR = 0x99000000;
private static final float RING_EFFECT_RATIO = 0.11f;
boolean mIsDrawingDot = false;
private final DeviceProfile mDeviceProfile;
private final Paint mIconRingPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+ private final Path mRingPath = new Path();
private boolean mIsPinned = false;
- private int mNormalizedIconRadius;
+ private final int mNormalizedIconRadius;
+ private final BlurMaskFilter mShadowFilter;
+ private int mPlateColor;
+
public PredictedAppIcon(Context context) {
this(context, null, 0);
@@ -73,13 +81,18 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements
mNormalizedIconRadius = IconNormalizer.getNormalizedCircleSize(getIconSize()) / 2;
setOnClickListener(ItemClickHandler.INSTANCE);
setOnFocusChangeListener(Launcher.getLauncher(context).getFocusHandler());
+ int shadowSize = context.getResources().getDimensionPixelSize(
+ R.dimen.blur_size_thin_outline);
+ mShadowFilter = new BlurMaskFilter(shadowSize, BlurMaskFilter.Blur.OUTER);
}
@Override
public void onDraw(Canvas canvas) {
int count = canvas.save();
if (!mIsPinned) {
- drawEffect(canvas);
+ boolean isBadged = getTag() instanceof WorkspaceItemInfo
+ && !Process.myUserHandle().equals(((ItemInfo) getTag()).user);
+ drawEffect(canvas, isBadged);
canvas.translate(getWidth() * RING_EFFECT_RATIO, getHeight() * RING_EFFECT_RATIO);
canvas.scale(1 - 2 * RING_EFFECT_RATIO, 1 - 2 * RING_EFFECT_RATIO);
}
@@ -102,7 +115,7 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements
public void applyFromWorkspaceItem(WorkspaceItemInfo info) {
super.applyFromWorkspaceItem(info);
int color = IconPalette.getMutedColor(info.bitmap.color, 0.54f);
- mIconRingPaint.setColor(ColorUtils.setAlphaComponent(color, 200));
+ mPlateColor = ColorUtils.setAlphaComponent(color, 200);
if (mIsPinned) {
setContentDescription(info.contentDescription);
} else {
@@ -174,9 +187,25 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements
return getPaddingTop() + mDeviceProfile.folderIconOffsetYPx;
}
- private void drawEffect(Canvas canvas) {
- getShape().drawShape(canvas, getOutlineOffsetX(), getOutlineOffsetY(),
- mNormalizedIconRadius, mIconRingPaint);
+ private void drawEffect(Canvas canvas, boolean isBadged) {
+ mRingPath.reset();
+ getShape().addToPath(mRingPath, getOutlineOffsetX(), getOutlineOffsetY(),
+ mNormalizedIconRadius);
+ if (isBadged) {
+ float outlineSize = mNormalizedIconRadius * RING_EFFECT_RATIO * 2;
+ float iconSize = getIconSize() * (1 - 2 * RING_EFFECT_RATIO);
+ float badgeSize = LauncherIcons.getBadgeSizeForIconSize((int) iconSize) + outlineSize;
+ float badgeInset = mNormalizedIconRadius * 2 - badgeSize;
+ getShape().addToPath(mRingPath, getOutlineOffsetX() + badgeInset,
+ getOutlineOffsetY() + badgeInset, badgeSize / 2);
+
+ }
+ mIconRingPaint.setColor(RING_SHADOW_COLOR);
+ mIconRingPaint.setMaskFilter(mShadowFilter);
+ canvas.drawPath(mRingPath, mIconRingPaint);
+ mIconRingPaint.setColor(mPlateColor);
+ mIconRingPaint.setMaskFilter(null);
+ canvas.drawPath(mRingPath, mIconRingPaint);
}
/**
@@ -205,10 +234,8 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView implements
mOffsetX = icon.getOutlineOffsetX();
mOffsetY = icon.getOutlineOffsetY();
mIconRadius = icon.mNormalizedIconRadius;
- mOutlinePaint.setStyle(Paint.Style.STROKE);
- mOutlinePaint.setStrokeWidth(5);
- mOutlinePaint.setPathEffect(new DashPathEffect(new float[]{15, 15}, 0));
- mOutlinePaint.setColor(Color.argb(100, 245, 245, 245));
+ mOutlinePaint.setStyle(Paint.Style.FILL);
+ mOutlinePaint.setColor(Color.argb(24, 245, 245, 245));
}
/**
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java
index 3d6e519d3f..2f55fda8f0 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/RecentsViewStateController.java
@@ -15,19 +15,14 @@
*/
package com.android.launcher3.uioverrides;
-import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA;
import static com.android.launcher3.LauncherState.OVERVIEW_BUTTONS;
-import static com.android.launcher3.anim.Interpolators.AGGRESSIVE_EASE_IN_OUT;
import static com.android.launcher3.anim.Interpolators.LINEAR;
-import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_FADE;
import static com.android.quickstep.views.RecentsView.CONTENT_ALPHA;
import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS;
import android.annotation.TargetApi;
import android.os.Build;
import android.util.FloatProperty;
-import android.view.View;
-import android.view.animation.Interpolator;
import androidx.annotation.NonNull;
@@ -37,6 +32,7 @@ import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.anim.PropertySetter;
import com.android.launcher3.states.StateAnimationConfig;
+import com.android.launcher3.util.MultiValueAlpha;
import com.android.quickstep.views.ClearAllButton;
import com.android.quickstep.views.LauncherRecentsView;
import com.android.quickstep.views.RecentsView;
@@ -60,7 +56,7 @@ public final class RecentsViewStateController extends
mRecentsView.updateEmptyMessage();
mRecentsView.resetTaskVisuals();
}
- setAlphas(PropertySetter.NO_ANIM_PROPERTY_SETTER, state, LINEAR);
+ setAlphas(PropertySetter.NO_ANIM_PROPERTY_SETTER, state);
mRecentsView.setFullscreenProgress(state.getOverviewFullscreenProgress());
}
@@ -78,22 +74,17 @@ public final class RecentsViewStateController extends
AnimationSuccessListener.forRunnable(mRecentsView::resetTaskVisuals));
}
- setAlphas(builder, toState,
- config.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT));
+ setAlphas(builder, toState);
builder.setFloat(mRecentsView, FULLSCREEN_PROGRESS,
toState.getOverviewFullscreenProgress(), LINEAR);
}
- private void setAlphas(PropertySetter propertySetter, LauncherState state,
- Interpolator actionInterpolator) {
+ private void setAlphas(PropertySetter propertySetter, LauncherState state) {
float buttonAlpha = (state.getVisibleElements(mLauncher) & OVERVIEW_BUTTONS) != 0 ? 1 : 0;
propertySetter.setFloat(mRecentsView.getClearAllButton(), ClearAllButton.VISIBILITY_ALPHA,
buttonAlpha, LINEAR);
-
- View actionsView = mLauncher.getActionsView();
- if (actionsView != null) {
- propertySetter.setFloat(actionsView, VIEW_ALPHA, buttonAlpha, actionInterpolator);
- }
+ propertySetter.setFloat(mLauncher.getActionsView().getVisibilityAlpha(),
+ MultiValueAlpha.VALUE, buttonAlpha, LINEAR);
}
@Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
index a87d6d14d6..e57e84184e 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
@@ -61,13 +61,16 @@ public class BackgroundAppState extends OverviewState {
}
@Override
- public ScaleAndTranslation getOverviewScaleAndTranslation(Launcher launcher) {
+ public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ return new float[] {getOverviewScale(launcher), NO_OFFSET};
+ }
+
+ private float getOverviewScale(Launcher launcher) {
// Initialize the recents view scale to what it would be when starting swipe up
RecentsView recentsView = launcher.getOverviewPanel();
int taskCount = recentsView.getTaskViewCount();
- if (taskCount == 0) {
- return super.getOverviewScaleAndTranslation(launcher);
- }
+ if (taskCount == 0) return 1;
+
TaskView dummyTask;
if (recentsView.getCurrentPage() >= recentsView.getTaskViewStartIndex()) {
if (recentsView.getCurrentPage() <= taskCount - 1) {
@@ -78,8 +81,8 @@ public class BackgroundAppState extends OverviewState {
} else {
dummyTask = recentsView.getTaskViewAt(0);
}
- return recentsView.getTempAppWindowAnimationHelper().updateForFullscreenOverview(dummyTask)
- .getScaleAndTranslation();
+ return recentsView.getTempAppWindowAnimationHelper()
+ .updateForFullscreenOverview(dummyTask).getSrcToTargetScale();
}
@Override
@@ -106,7 +109,7 @@ public class BackgroundAppState extends OverviewState {
}
@Override
- public float getDepth(Context context) {
+ protected float getDepthUnchecked(Context context) {
return 1f;
}
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewPeekState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewPeekState.java
index 1288e7bf9b..b27f16ac08 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewPeekState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewPeekState.java
@@ -24,24 +24,18 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TR
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
-import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
import com.android.launcher3.states.StateAnimationConfig;
public class OverviewPeekState extends OverviewState {
+ private static final float OVERVIEW_OFFSET = 0.7f;
+
public OverviewPeekState(int id) {
super(id);
}
@Override
- public ScaleAndTranslation getOverviewScaleAndTranslation(Launcher launcher) {
- ScaleAndTranslation result = super.getOverviewScaleAndTranslation(launcher);
- result.translationX = NORMAL.getOverviewScaleAndTranslation(launcher).translationX
- - launcher.getResources().getDimension(R.dimen.overview_peek_distance);
- if (Utilities.isRtl(launcher.getResources())) {
- result.translationX = -result.translationX;
- }
- return result;
+ public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ return new float[] {NO_SCALE, OVERVIEW_OFFSET};
}
@Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewState.java
index bcfb11c090..e44f59fd71 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -24,7 +24,6 @@ import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_7;
import static com.android.launcher3.config.FeatureFlags.ENABLE_OVERVIEW_ACTIONS;
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
-import static com.android.launcher3.states.RotationHelper.REQUEST_ROTATE;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_FADE;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X;
@@ -123,8 +122,8 @@ public class OverviewState extends LauncherState {
}
@Override
- public ScaleAndTranslation getOverviewScaleAndTranslation(Launcher launcher) {
- return new ScaleAndTranslation(1f, 0f, 0f);
+ public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ return new float[] {NO_SCALE, NO_OFFSET};
}
@Override
@@ -144,7 +143,6 @@ public class OverviewState extends LauncherState {
@Override
public void onStateTransitionEnd(Launcher launcher) {
- launcher.getRotationHelper().setCurrentStateRequest(REQUEST_ROTATE);
DiscoveryBounce.showForOverviewIfNeeded(launcher);
RecentsView recentsView = launcher.getOverviewPanel();
AccessibilityManagerCompat.sendCustomAccessibilityEvent(
@@ -205,7 +203,7 @@ public class OverviewState extends LauncherState {
}
@Override
- public float getDepth(Context context) {
+ protected float getDepthUnchecked(Context context) {
return 1f;
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index c92a872ba9..f4f8bc9ecb 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -40,17 +40,15 @@ import static com.android.launcher3.util.VibratorWrapper.OVERVIEW_HAPTIC;
import static com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState.CANCEL;
import static com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState.HIDE;
import static com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState.PEEK;
+import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET;
import static com.android.quickstep.views.RecentsView.FULLSCREEN_PROGRESS;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.graphics.PointF;
import android.view.MotionEvent;
-import android.view.View;
import android.view.animation.Interpolator;
import com.android.launcher3.BaseQuickstepLauncher;
@@ -59,6 +57,7 @@ import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.AllAppsTransitionController;
import com.android.launcher3.anim.AnimatorPlaybackController;
+import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.graphics.OverviewScrim;
import com.android.launcher3.states.StateAnimationConfig;
@@ -237,58 +236,32 @@ public class NoButtonQuickSwitchTouchController implements TouchController,
private void setupOverviewAnimators() {
final LauncherState fromState = QUICK_SWITCH;
final LauncherState toState = OVERVIEW;
- LauncherState.ScaleAndTranslation fromScaleAndTranslation = fromState
- .getOverviewScaleAndTranslation(mLauncher);
- LauncherState.ScaleAndTranslation toScaleAndTranslation = toState
- .getOverviewScaleAndTranslation(mLauncher);
- // Update RecentView's translationX to have it start offscreen.
- float startScale = Utilities.mapRange(
- SCALE_DOWN_INTERPOLATOR.getInterpolation(Y_ANIM_MIN_PROGRESS),
- fromScaleAndTranslation.scale,
- toScaleAndTranslation.scale);
- fromScaleAndTranslation.translationX = mRecentsView.getOffscreenTranslationX(startScale);
// Set RecentView's initial properties.
- mRecentsView.setScaleX(fromScaleAndTranslation.scale);
- mRecentsView.setScaleY(fromScaleAndTranslation.scale);
- mRecentsView.setTranslationX(fromScaleAndTranslation.translationX);
- mRecentsView.setTranslationY(fromScaleAndTranslation.translationY);
+ SCALE_PROPERTY.set(mRecentsView, fromState.getOverviewScaleAndOffset(mLauncher)[0]);
+ ADJACENT_PAGE_OFFSET.set(mRecentsView, 1f);
mRecentsView.setContentAlpha(1);
mRecentsView.setFullscreenProgress(fromState.getOverviewFullscreenProgress());
+ float[] scaleAndOffset = toState.getOverviewScaleAndOffset(mLauncher);
// As we drag right, animate the following properties:
// - RecentsView translationX
// - OverviewScrim
- AnimatorSet xOverviewAnim = new AnimatorSet();
- xOverviewAnim.play(ObjectAnimator.ofFloat(mRecentsView, View.TRANSLATION_X,
- toScaleAndTranslation.translationX));
- xOverviewAnim.play(ObjectAnimator.ofFloat(
- mLauncher.getDragLayer().getOverviewScrim(), OverviewScrim.SCRIM_PROGRESS,
- toState.getOverviewScrimAlpha(mLauncher)));
- long xAccuracy = (long) (mXRange * 2);
- xOverviewAnim.setDuration(xAccuracy);
- mXOverviewAnim = AnimatorPlaybackController.wrap(xOverviewAnim, xAccuracy);
+ PendingAnimation xAnim = new PendingAnimation((long) (mXRange * 2));
+ xAnim.setFloat(mRecentsView, ADJACENT_PAGE_OFFSET, scaleAndOffset[1], LINEAR);
+ xAnim.setFloat(mLauncher.getDragLayer().getOverviewScrim(), OverviewScrim.SCRIM_PROGRESS,
+ toState.getOverviewScrimAlpha(mLauncher), LINEAR);
+ mXOverviewAnim = xAnim.createPlaybackController();
mXOverviewAnim.dispatchOnStart();
// As we drag up, animate the following properties:
- // - RecentsView translationY
// - RecentsView scale
// - RecentsView fullscreenProgress
- AnimatorSet yAnimation = new AnimatorSet();
- Animator translateYAnim = ObjectAnimator.ofFloat(mRecentsView, View.TRANSLATION_Y,
- toScaleAndTranslation.translationY);
- Animator scaleAnim = ObjectAnimator.ofFloat(mRecentsView, SCALE_PROPERTY,
- toScaleAndTranslation.scale);
- Animator fullscreenProgressAnim = ObjectAnimator.ofFloat(mRecentsView, FULLSCREEN_PROGRESS,
- fromState.getOverviewFullscreenProgress(), toState.getOverviewFullscreenProgress());
- scaleAnim.setInterpolator(SCALE_DOWN_INTERPOLATOR);
- fullscreenProgressAnim.setInterpolator(SCALE_DOWN_INTERPOLATOR);
- yAnimation.play(translateYAnim);
- yAnimation.play(scaleAnim);
- yAnimation.play(fullscreenProgressAnim);
- long yAccuracy = (long) (mYRange * 2);
- yAnimation.setDuration(yAccuracy);
- mYOverviewAnim = AnimatorPlaybackController.wrap(yAnimation, yAccuracy);
+ PendingAnimation yAnim = new PendingAnimation((long) (mYRange * 2));
+ yAnim.setFloat(mRecentsView, SCALE_PROPERTY, scaleAndOffset[0], SCALE_DOWN_INTERPOLATOR);
+ yAnim.setFloat(mRecentsView, FULLSCREEN_PROGRESS,
+ toState.getOverviewFullscreenProgress(), SCALE_DOWN_INTERPOLATOR);
+ mYOverviewAnim = yAnim.createPlaybackController();
mYOverviewAnim.dispatchOnStart();
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
index 1b3610a92d..f6f892b44b 100644
--- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
+++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
@@ -24,6 +24,7 @@ import static com.android.launcher3.touch.SingleAxisSwipeDetector.DIRECTION_POSI
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.MotionEvent;
+import android.view.View;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.BaseDraggingActivity;
@@ -209,9 +210,11 @@ public abstract class TaskViewTouchController
mPendingAnimation = mRecentsView.createTaskLaunchAnimation(
mTaskBeingDragged, maxDuration, Interpolators.ZOOM_IN);
- mTempCords[1] = mTaskBeingDragged.getHeight();
- dl.getDescendantCoordRelativeToSelf(mTaskBeingDragged, mTempCords);
- mEndDisplacement = dl.getHeight() - mTempCords[1];
+ // Since the thumbnail is what is filling the screen, based the end displacement on it.
+ View thumbnailView = mTaskBeingDragged.getThumbnail();
+ mTempCords[1] = orientationHandler.getSecondaryDimension(thumbnailView);
+ dl.getDescendantCoordRelativeToSelf(thumbnailView, mTempCords);
+ mEndDisplacement = secondaryLayerDimension - mTempCords[1];
}
mEndDisplacement *= verticalFactor;
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/AppToOverviewAnimationProvider.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/AppToOverviewAnimationProvider.java
index 9dce9847c2..e182c59570 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/AppToOverviewAnimationProvider.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/AppToOverviewAnimationProvider.java
@@ -117,6 +117,7 @@ final class AppToOverviewAnimationProvider exten
});
if (mActivity == null) {
Log.e(TAG, "Animation created, before activity");
+ anim.play(ValueAnimator.ofInt(0, 1).setDuration(RECENTS_LAUNCH_DURATION));
return anim;
}
@@ -135,6 +136,7 @@ final class AppToOverviewAnimationProvider exten
RemoteAnimationTargetCompat runningTaskTarget = targets.findTask(mTargetTaskId);
if (runningTaskTarget == null) {
Log.e(TAG, "No closing app");
+ anim.play(ValueAnimator.ofInt(0, 1).setDuration(RECENTS_LAUNCH_DURATION));
return anim;
}
@@ -181,6 +183,7 @@ final class AppToOverviewAnimationProvider exten
transaction.apply();
});
}
+ anim.play(valueAnimator);
return anim;
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java
index fadde374ba..32ab98bd4d 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/BaseSwipeUpHandler.java
@@ -31,7 +31,6 @@ import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Build;
-import android.util.Log;
import android.util.Pair;
import android.view.MotionEvent;
import android.view.View;
@@ -46,7 +45,6 @@ import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.AnimatorPlaybackController;
-import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.VibratorWrapper;
import com.android.launcher3.views.FloatingIconView;
@@ -133,13 +131,19 @@ public abstract class BaseSwipeUpHandler mBitmapSupplier;
- private final SystemUiProxy mSystemUiProxy;
+
+ protected final Context mContext;
+ protected final Supplier mBitmapSupplier;
+ protected final SystemUiProxy mSystemUiProxy;
public ImageActionsApi(Context context, Supplier bitmapSupplier) {
mContext = context;
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityInterface.java
index 455ae764a9..b4764dc506 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityInterface.java
@@ -15,8 +15,6 @@
*/
package com.android.quickstep;
-import static android.view.View.TRANSLATION_Y;
-
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
import static com.android.launcher3.LauncherAppTransitionManagerImpl.INDEX_RECENTS_FADE_ANIM;
import static com.android.launcher3.LauncherAppTransitionManagerImpl.INDEX_RECENTS_TRANSLATE_X_ANIM;
@@ -25,15 +23,14 @@ import static com.android.launcher3.LauncherState.BACKGROUND_APP;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
-import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL;
import static com.android.launcher3.anim.Interpolators.INSTANT;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.quickstep.LauncherSwipeHandler.RECENTS_ATTACH_DURATION;
+import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_OFFSET;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.animation.TimeInterpolator;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -57,7 +54,6 @@ import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.appprediction.PredictionUiStateManager;
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.statehandlers.DepthController.ClampedDepthProperty;
-import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.views.FloatingIconView;
import com.android.quickstep.SysUINavigationMode.Mode;
@@ -81,7 +77,6 @@ import java.util.function.Predicate;
*/
public final class LauncherActivityInterface implements BaseActivityInterface {
- private Runnable mAdjustInterpolatorsRunnable;
private Pair mSwipeUpPullbackStartAndMaxProgress =
BaseActivityInterface.super.getSwipeUpPullbackStartAndMaxProgress();
@@ -242,14 +237,6 @@ public final class LauncherActivityInterface implements BaseActivityInterface {
- // Adjust the translateY interpolator to account for the running task's top inset.
- // When progress <= 1, this is handled by each task view as they set their fullscreen
- // progress. However, once we go to progress > 1, fullscreen progress stays at 0, so
- // recents as a whole needs to translate further to keep up with the app window.
- TaskView runningTaskView = recentsView.getRunningTaskView();
- if (runningTaskView == null) {
- runningTaskView = recentsView.getCurrentPageTaskView();
- if (runningTaskView == null) {
- // There are no task views in LockTask mode when Overview is enabled.
- return;
- }
- }
- TimeInterpolator oldInterpolator = translateY.getInterpolator();
- Rect fallbackInsets = launcher.getDeviceProfile().getInsets();
- float extraTranslationY = runningTaskView.getThumbnail().getInsets(fallbackInsets).top;
- float normalizedTranslationY = extraTranslationY / (fromTranslationY - endTranslationY);
- translateY.setInterpolator(t -> {
- float newT = oldInterpolator.getInterpolation(t);
- return newT <= 1f ? newT : newT + normalizedTranslationY * (newT - 1);
- });
- };
+ anim.playTogether(scale, applyFullscreenProgress);
// Start pulling back when RecentsView scale is 0.75f, and let it go down to 0.5f.
- float pullbackStartProgress = (0.75f - fromScaleAndTranslation.scale)
- / (endScaleAndTranslation.scale - fromScaleAndTranslation.scale);
- float pullbackMaxProgress = (0.5f - fromScaleAndTranslation.scale)
- / (endScaleAndTranslation.scale - fromScaleAndTranslation.scale);
+ float pullbackStartProgress = (0.75f - fromScale) / (endScale - fromScale);
+ float pullbackMaxProgress = (0.5f - fromScale) / (endScale - fromScale);
mSwipeUpPullbackStartAndMaxProgress = new Pair<>(
pullbackStartProgress, pullbackMaxProgress);
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java
index 31a2814ed0..5a64382478 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherSwipeHandler.java
@@ -17,6 +17,8 @@ package com.android.quickstep;
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER;
import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS;
+import static com.android.launcher3.LauncherState.BACKGROUND_APP;
+import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.anim.Interpolators.DEACCEL;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2;
@@ -39,16 +41,17 @@ import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHO
import android.animation.Animator;
import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.graphics.PointF;
+import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Build;
import android.os.SystemClock;
-import android.util.Log;
import android.view.View;
import android.view.View.OnApplyWindowInsetsListener;
import android.view.ViewTreeObserver.OnDrawListener;
@@ -67,7 +70,6 @@ import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.logging.UserEventDispatcher;
-import com.android.launcher3.testing.TestProtocol;
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;
@@ -78,9 +80,11 @@ import com.android.quickstep.GestureState.GestureEndTarget;
import com.android.quickstep.inputconsumers.OverviewInputConsumer;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.AppWindowAnimationHelper.TargetAlphaProvider;
+import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.ShelfPeekAnim;
import com.android.quickstep.util.ShelfPeekAnim.ShelfAnimState;
+import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.views.LiveTileOverlay;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
@@ -177,6 +181,9 @@ public class LauncherSwipeHandler
private AnimatorPlaybackController mLauncherTransitionController;
private boolean mHasLauncherTransitionControllerStarted;
+ private final TaskViewSimulator mTaskViewSimulator;
+ private AnimatorPlaybackController mWindowTransitionController;
+
private AnimationFactory mAnimationFactory = (t) -> { };
private boolean mWasLauncherAlreadyVisible;
@@ -201,6 +208,9 @@ public class LauncherSwipeHandler
mTaskAnimationManager = taskAnimationManager;
mTouchTimeMs = touchTimeMs;
mContinuingLastGesture = continuingLastGesture;
+ mTaskViewSimulator = new TaskViewSimulator(context, LayoutUtils::calculateLauncherTaskSize);
+
+ initAfterSubclassConstructor();
initStateCallbacks();
}
@@ -473,23 +483,11 @@ public class LauncherSwipeHandler
} else if (mContinuingLastGesture
&& mRecentsView.getRunningTaskIndex() != mRecentsView.getNextPage()) {
recentsAttachedToAppWindow = true;
- animate = false;
} else if (runningTaskTarget != null && isNotInRecents(runningTaskTarget)) {
// The window is going away so make sure recents is always visible in this case.
recentsAttachedToAppWindow = true;
- animate = false;
} else {
recentsAttachedToAppWindow = mIsShelfPeeking || mIsLikelyToStartNewTask;
- if (animate) {
- // Only animate if an adjacent task view is visible on screen.
- TaskView adjacentTask1 = mRecentsView.getNextTaskView();
- TaskView adjacentTask2 = mRecentsView.getPreviousTaskView();
- float prevTranslationX = mRecentsView.getTranslationX();
- mRecentsView.setTranslationX(0);
- animate = (adjacentTask1 != null && adjacentTask1.getGlobalVisibleRect(TEMP_RECT))
- || (adjacentTask2 != null && adjacentTask2.getGlobalVisibleRect(TEMP_RECT));
- mRecentsView.setTranslationX(prevTranslationX);
- }
}
mAnimationFactory.setRecentsAttachedToAppWindow(recentsAttachedToAppWindow, animate);
}
@@ -523,6 +521,34 @@ public class LauncherSwipeHandler
mAnimationFactory.createActivityInterface(mTransitionDragLength);
}
+ @Override
+ protected void updateSource(Rect stackBounds, RemoteAnimationTargetCompat runningTarget) {
+ super.updateSource(stackBounds, runningTarget);
+ mTaskViewSimulator.setPreview(runningTarget, mRecentsAnimationTargets);
+ }
+
+ @Override
+ protected void initTransitionEndpoints(DeviceProfile dp) {
+ super.initTransitionEndpoints(dp);
+ mTaskViewSimulator.setDp(dp, false /* isOpening */);
+ mTaskViewSimulator.setLayoutRotation(
+ mDeviceState.getCurrentActiveRotation(),
+ mDeviceState.getDisplayRotation());
+
+ AnimatorSet anim = new AnimatorSet();
+ anim.setDuration(mTransitionDragLength * 2);
+ anim.setInterpolator(t -> t * mDragLengthFactor);
+ anim.play(ObjectAnimator.ofFloat(mTaskViewSimulator.recentsViewScale,
+ AnimatedFloat.VALUE,
+ mTaskViewSimulator.getFullScreenScale(), 1));
+ anim.play(ObjectAnimator.ofFloat(mTaskViewSimulator.fullScreenProgress,
+ AnimatedFloat.VALUE,
+ BACKGROUND_APP.getOverviewFullscreenProgress(),
+ OVERVIEW.getOverviewFullscreenProgress()));
+ mWindowTransitionController =
+ AnimatorPlaybackController.wrap(anim, mTransitionDragLength * 2);
+ }
+
/**
* We don't want to change mLauncherTransitionController if mGestureState.getEndTarget() == HOME
* (it has its own animation) or if we're already animating the current controller.
@@ -542,7 +568,6 @@ public class LauncherSwipeHandler
private void onAnimatorPlaybackControllerCreated(AnimatorPlaybackController anim) {
mLauncherTransitionController = anim;
mLauncherTransitionController.dispatchSetInterpolator(t -> t * mDragLengthFactor);
- mAnimationFactory.adjustActivityControllerInterpolators();
mLauncherTransitionController.dispatchOnStart();
updateLauncherTransitionProgress();
}
@@ -555,7 +580,9 @@ public class LauncherSwipeHandler
@Override
public void updateFinalShift() {
if (mRecentsAnimationTargets != null) {
- applyTransformUnchecked();
+ // Base class expects applyTransformUnchecked to be called here.
+ // TODO: Remove this dependency for swipe-up animation.
+ // applyTransformUnchecked();
updateSysUiFlags(mCurrentShift.value);
}
@@ -575,6 +602,16 @@ public class LauncherSwipeHandler
}
}
+ if (mWindowTransitionController != null) {
+ float progress = mCurrentShift.value / mDragLengthFactor;
+ mWindowTransitionController.setPlayFraction(progress);
+ mTransformParams
+ .setTargetSet(mRecentsAnimationTargets)
+ .setLauncherOnTop(true);
+
+ mTaskViewSimulator.setScroll(mRecentsView == null ? 0 : mRecentsView.getScrollOffset());
+ mTaskViewSimulator.apply(mTransformParams);
+ }
updateLauncherTransitionProgress();
}
@@ -1020,7 +1057,6 @@ public class LauncherSwipeHandler
mLauncherTransitionController.dispatchSetInterpolator(t -> end);
} else {
mLauncherTransitionController.dispatchSetInterpolator(adjustedInterpolator);
- mAnimationFactory.adjustActivityControllerInterpolators();
}
mLauncherTransitionController.getAnimationPlayer().setDuration(Math.max(0, duration));
@@ -1296,6 +1332,7 @@ public class LauncherSwipeHandler
private void setTargetAlphaProvider(TargetAlphaProvider provider) {
mAppWindowAnimationHelper.setTaskAlphaCallback(provider);
+ mTaskViewSimulator.setTaskAlphaCallback(provider);
updateFinalShift();
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java
index 42d944fb78..52a25589a6 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/RecentsActivity.java
@@ -71,6 +71,7 @@ public final class RecentsActivity extends BaseRecentsActivity {
mRecentsRootView = findViewById(R.id.drag_layer);
mFallbackRecentsView = findViewById(R.id.overview_panel);
mRecentsRootView.recreateControllers();
+ mFallbackRecentsView.init(findViewById(R.id.overview_actions_view));
}
@Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java
index fbf29af9fb..147f9330c7 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskOverlayFactory.java
@@ -16,7 +16,6 @@
package com.android.quickstep;
-import static com.android.launcher3.config.FeatureFlags.ENABLE_OVERVIEW_ACTIONS;
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import android.content.Context;
@@ -84,47 +83,47 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
/**
* Overlay on each task handling Overview Action Buttons.
*/
- public static class TaskOverlay {
+ public static class TaskOverlay {
private final Context mApplicationContext;
- private OverviewActionsView mActionsView;
- private final TaskThumbnailView mThumbnailView;
+ protected final TaskThumbnailView mThumbnailView;
+ private T mActionsView;
protected TaskOverlay(TaskThumbnailView taskThumbnailView) {
mApplicationContext = taskThumbnailView.getContext().getApplicationContext();
mThumbnailView = taskThumbnailView;
}
+ protected T getActionsView() {
+ if (mActionsView == null) {
+ mActionsView = BaseActivity.fromContext(mThumbnailView.getContext()).findViewById(
+ R.id.overview_actions_view);
+ }
+ return mActionsView;
+ }
+
/**
* Called when the current task is interactive for the user
*/
public void initOverlay(Task task, ThumbnailData thumbnail, Matrix matrix) {
ImageActionsApi imageApi = new ImageActionsApi(
mApplicationContext, mThumbnailView::getThumbnail);
+ getActionsView().setCallbacks(new OverlayUICallbacks() {
+ @Override
+ public void onShare() {
+ imageApi.startShareActivity();
+ }
- if (mActionsView == null && ENABLE_OVERVIEW_ACTIONS.get()
- && SysUINavigationMode.removeShelfFromOverview(mApplicationContext)) {
- mActionsView = BaseActivity.fromContext(mThumbnailView.getContext()).findViewById(
- R.id.overview_actions_view);
- }
- if (mActionsView != null) {
- mActionsView.setListener(new OverviewActionsView.Listener() {
- @Override
- public void onShare() {
- imageApi.startShareActivity();
- }
-
- @Override
- public void onScreenshot() {
- imageApi.saveScreenshot(mThumbnailView.getThumbnail(),
- getTaskSnapshotBounds(), getTaskSnapshotInsets(), task.key.id);
- }
- });
- }
-
+ @Override
+ public void onScreenshot() {
+ imageApi.saveScreenshot(mThumbnailView.getThumbnail(),
+ getTaskSnapshotBounds(), getTaskSnapshotInsets(), task.key.id);
+ }
+ });
}
+
/**
* Called when the overlay is no longer used.
*/
@@ -161,4 +160,16 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
return Insets.of(0, 0, 0, 0);
}
}
+
+ /**
+ * Callbacks the Ui can generate. This is the only way for a Ui to call methods on the
+ * controller.
+ */
+ public interface OverlayUICallbacks {
+ /** User has indicated they want to share the current task. */
+ void onShare();
+
+ /** User has indicated they want to screenshot the current task. */
+ void onScreenshot();
+ }
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
index 2c2feb21c4..9b5a935e6b 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
@@ -90,7 +90,6 @@ import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
import com.android.systemui.shared.system.InputConsumerController;
import com.android.systemui.shared.system.InputMonitorCompat;
-import com.android.systemui.shared.system.RecentsAnimationListener;
import com.android.systemui.shared.tracing.ProtoTraceable;
import java.io.FileDescriptor;
@@ -299,9 +298,6 @@ public class TouchInteractionService extends Service implements PluginListener activityInterface =
mOverviewComponentObserver.getActivityInterface();
+ final Intent overviewIntent = new Intent(
+ mOverviewComponentObserver.getOverviewIntentIgnoreSysUiState());
if (activityInterface.getCreatedActivity() == null) {
// Make sure that UI states will be initialized.
activityInterface.createActivityInitListener((wasVisible) -> {
AppLaunchTracker.INSTANCE.get(TouchInteractionService.this);
return false;
- }).register();
+ }).register(overviewIntent);
} else if (fromInit) {
// The activity has been created before the initialization of overview service. It is
// usually happens when booting or launcher is the top activity, so we should already
@@ -767,8 +756,7 @@ public class TouchInteractionService extends Service implements PluginListener ActivityManagerWrapper.getInstance()
- .startRecentsActivity(intent, null, listener, null, null));
- }
-
@Override
public void onPluginConnected(OverscrollPlugin overscrollPlugin, Context context) {
mOverscrollPlugin = overscrollPlugin;
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java
index dc0c194812..235ac16413 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -26,10 +26,10 @@ import android.util.FloatProperty;
import android.view.View;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.LauncherState.ScaleAndTranslation;
import com.android.launcher3.Utilities;
import com.android.quickstep.RecentsActivity;
import com.android.quickstep.util.LayoutUtils;
+import com.android.quickstep.views.OverviewActionsView;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.Task;
@@ -57,7 +57,6 @@ public class FallbackRecentsView extends RecentsView {
private boolean mInOverviewState = true;
private float mZoomScale = 1f;
- private float mZoomTranslationY = 0f;
private RunningTaskInfo mRunningTaskInfo;
@@ -67,6 +66,11 @@ public class FallbackRecentsView extends RecentsView {
public FallbackRecentsView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ public void init(OverviewActionsView actionsView) {
+ super.init(actionsView);
setOverviewStateEnabled(true);
setOverlayEnabled(true);
}
@@ -139,14 +143,11 @@ public class FallbackRecentsView extends RecentsView {
if (getTaskViewCount() == 0) {
mZoomScale = 1f;
- mZoomTranslationY = 0f;
} else {
TaskView dummyTask = getTaskViewAt(0);
- ScaleAndTranslation sat = getTempAppWindowAnimationHelper()
+ mZoomScale = getTempAppWindowAnimationHelper()
.updateForFullscreenOverview(dummyTask)
- .getScaleAndTranslation();
- mZoomScale = sat.scale;
- mZoomTranslationY = sat.translationY;
+ .getSrcToTargetScale();
}
setZoomProgress(mZoomInProgress);
@@ -155,7 +156,6 @@ public class FallbackRecentsView extends RecentsView {
public void setZoomProgress(float progress) {
mZoomInProgress = progress;
SCALE_PROPERTY.set(this, Utilities.mapRange(mZoomInProgress, 1, mZoomScale));
- TRANSLATION_Y.set(this, Utilities.mapRange(mZoomInProgress, 0, mZoomTranslationY));
FULLSCREEN_PROGRESS.set(this, mZoomInProgress);
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
index fe9ef2befe..1f6c506d3a 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
@@ -333,7 +333,8 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
mTaskAnimationManager.isRecentsAnimationRunning(), isLikelyToStartNewTask);
mInteractionHandler.setGestureEndCallback(this::onInteractionGestureFinished);
mMotionPauseDetector.setOnMotionPauseListener(mInteractionHandler::onMotionPauseChanged);
- mInteractionHandler.initWhenReady();
+ Intent intent = new Intent(mInteractionHandler.getLaunchIntent());
+ mInteractionHandler.initWhenReady(intent);
if (mTaskAnimationManager.isRecentsAnimationRunning()) {
mActiveCallbacks = mTaskAnimationManager.continueRecentsAnimation(mGestureState);
@@ -341,7 +342,6 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
mTaskAnimationManager.notifyRecentsAnimationState(mInteractionHandler);
notifyGestureStarted();
} else {
- Intent intent = mInteractionHandler.getLaunchIntent();
intent.putExtra(INTENT_EXTRA_LOG_TRACE_ID, mGestureState.getGestureId());
mActiveCallbacks = mTaskAnimationManager.startRecentsAnimation(mGestureState, intent,
mInteractionHandler);
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverscrollInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverscrollInputConsumer.java
index 0a21413fb4..c49b8f2d14 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverscrollInputConsumer.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OverscrollInputConsumer.java
@@ -36,17 +36,14 @@ import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.R;
import com.android.quickstep.GestureState;
import com.android.quickstep.InputConsumer;
-import com.android.quickstep.views.LauncherRecentsView;
import com.android.quickstep.views.RecentsView;
import com.android.systemui.plugins.OverscrollPlugin;
import com.android.systemui.shared.system.InputMonitorCompat;
/**
* Input consumer for handling events to pass to an {@code OverscrollPlugin}.
- *
- * @param Draggable activity subclass used by RecentsView
*/
-public class OverscrollInputConsumer extends DelegateInputConsumer {
+public class OverscrollInputConsumer extends DelegateInputConsumer {
private static final String TAG = "OverscrollInputConsumer";
@@ -61,12 +58,12 @@ public class OverscrollInputConsumer extends Del
private final float mSquaredSlop;
- private final Context mContext;
private final GestureState mGestureState;
@Nullable
private final OverscrollPlugin mPlugin;
private final GestureDetector mGestureDetector;
+ @Nullable
private RecentsView mRecentsView;
public OverscrollInputConsumer(Context context, GestureState gestureState,
@@ -77,7 +74,6 @@ public class OverscrollInputConsumer extends Del
.getInteger(R.integer.assistant_gesture_corner_deg_threshold);
mFlingThresholdPx = context.getResources()
.getDimension(R.dimen.gestures_overscroll_fling_threshold);
- mContext = context;
mGestureState = gestureState;
mPlugin = plugin;
@@ -85,9 +81,6 @@ public class OverscrollInputConsumer extends Del
mSquaredSlop = slop * slop;
mGestureDetector = new GestureDetector(context, new FlingGestureListener());
-
- gestureState.getActivityInterface().createActivityInitListener(this::onActivityInit)
- .register();
}
@Override
@@ -95,12 +88,6 @@ public class OverscrollInputConsumer extends Del
return TYPE_OVERSCROLL | mDelegate.getType();
}
- private boolean onActivityInit(Boolean alreadyOnHome) {
- mRecentsView = mGestureState.getActivityInterface().getCreatedActivity().getOverviewPanel();
-
- return true;
- }
-
@Override
public void onMotionEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
@@ -191,10 +178,17 @@ public class OverscrollInputConsumer extends Del
}
private boolean isOverscrolled() {
+ if (mRecentsView == null) {
+ BaseDraggingActivity activity = mGestureState.getActivityInterface()
+ .getCreatedActivity();
+ if (activity != null) {
+ mRecentsView = activity.getOverviewPanel();
+ }
+ }
+
// Make sure there isn't an app to quick switch to on our right
int maxIndex = 0;
- if ((mRecentsView instanceof LauncherRecentsView)
- && ((LauncherRecentsView) mRecentsView).hasRecentsExtraCard()) {
+ if (mRecentsView != null && mRecentsView.hasRecentsExtraCard()) {
maxIndex = 1;
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java
index 75a59762b6..00329b87e0 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/AppWindowAnimationHelper.java
@@ -30,13 +30,11 @@ import android.graphics.Matrix.ScaleToFit;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Build;
-import android.view.Surface;
import androidx.annotation.Nullable;
import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.Interpolators;
@@ -60,7 +58,7 @@ import com.android.systemui.shared.system.WindowManagerWrapper;
public class AppWindowAnimationHelper {
// The bounds of the source app in device coordinates
- private final Rect mSourceStackBounds = new Rect();
+ private final RectF mSourceStackBounds = new RectF();
// The insets of the source app
private final Rect mSourceInsets = new Rect();
// The source app bounds with the source insets applied, in the device coordinates
@@ -159,14 +157,10 @@ public class AppWindowAnimationHelper {
mSourceRect.set(scaledTargetRect);
}
- private float getSrcToTargetScale() {
- if (mOrientedState == null ||
- (mOrientedState.getDisplayRotation() == Surface.ROTATION_0
- || mOrientedState.getDisplayRotation() == Surface.ROTATION_180)) {
- return mSourceRect.width() / mTargetRect.width();
- } else {
- return mSourceRect.height() / mTargetRect.height();
- }
+ public float getSrcToTargetScale() {
+ return LayoutUtils.getTaskScale(mOrientedState,
+ mSourceRect.width(), mSourceRect.height(),
+ mTargetRect.width(), mTargetRect.height());
}
public void prepareAnimation(DeviceProfile dp, boolean isOpening) {
@@ -277,8 +271,9 @@ public class AppWindowAnimationHelper {
mCurrentRect.offset(params.mOffset, 0);
} else {
int displayRotation = mOrientedState.getDisplayRotation();
+ int launcherRotation = mOrientedState.getLauncherRotation();
mOrientedState.getOrientationHandler().offsetTaskRect(mCurrentRect,
- params.mOffset, displayRotation);
+ params.mOffset, displayRotation, launcherRotation);
}
}
@@ -377,15 +372,6 @@ public class AppWindowAnimationHelper {
return this;
}
- /**
- * @return The source rect's scale and translation relative to the target rect.
- */
- public LauncherState.ScaleAndTranslation getScaleAndTranslation() {
- float scale = getSrcToTargetScale();
- float translationY = mSourceRect.centerY() - mSourceRect.top - mTargetRect.centerY();
- return new LauncherState.ScaleAndTranslation(scale, 0, translationY);
- }
-
private void updateStackBoundsToMultiWindowTaskSize(BaseDraggingActivity activity) {
SystemUiProxy proxy = SystemUiProxy.INSTANCE.get(activity);
if (proxy.isActive()) {
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java
index dde76059fe..8a6c4a17ae 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/RectFSpringAnim.java
@@ -207,9 +207,23 @@ public class RectFSpringAnim {
mRectScaleAnim.skipToEnd();
}
}
+ mRectXAnimEnded = true;
+ mRectYAnimEnded = true;
+ mRectScaleAnimEnded = true;
+ maybeOnEnd();
+ }
+
+ private boolean isEnded() {
+ return mRectXAnimEnded && mRectYAnimEnded && mRectScaleAnimEnded;
}
private void onUpdate() {
+ if (isEnded()) {
+ // Prevent further updates from being called. This can happen between callbacks for
+ // ending the x/y/scale animations.
+ return;
+ }
+
if (!mOnUpdateListeners.isEmpty()) {
float currentWidth = Utilities.mapRange(mCurrentScaleProgress, mStartRect.width(),
mTargetRect.width());
@@ -229,7 +243,7 @@ public class RectFSpringAnim {
}
private void maybeOnEnd() {
- if (mAnimsStarted && mRectXAnimEnded && mRectYAnimEnded && mRectScaleAnimEnded) {
+ if (mAnimsStarted && isEnded()) {
mAnimsStarted = false;
for (Animator.AnimatorListener animatorListener : mAnimatorListeners) {
animatorListener.onAnimationEnd(null);
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
index 9cf45b3151..bde6f9af19 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/StaggeredWorkspaceAnim.java
@@ -21,6 +21,7 @@ import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_ALL_COMPONENTS;
+import static com.android.launcher3.states.StateAnimationConfig.SKIP_DEPTH_CONTROLLER;
import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW;
import android.animation.Animator;
@@ -146,7 +147,7 @@ public class StaggeredWorkspaceAnim {
*/
private void prepareToAnimate(Launcher launcher) {
StateAnimationConfig config = new StateAnimationConfig();
- config.animFlags = ANIM_ALL_COMPONENTS | SKIP_OVERVIEW;
+ config.animFlags = ANIM_ALL_COMPONENTS | SKIP_OVERVIEW | SKIP_DEPTH_CONTROLLER;
config.duration = 0;
// setRecentsAttachedToAppWindow() will animate recents out.
launcher.getStateManager().createAtomicAnimation(BACKGROUND_APP, NORMAL, config).start();
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java
new file mode 100644
index 0000000000..0131fdf5c4
--- /dev/null
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/TaskViewSimulator.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep.util;
+
+import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
+import static com.android.launcher3.touch.PagedOrientationHandler.MATRIX_POST_TRANSLATE;
+import static com.android.quickstep.util.AppWindowAnimationHelper.applySurfaceParams;
+import static com.android.quickstep.util.RecentsOrientedState.postDisplayRotation;
+import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
+import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
+import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_FULLSCREEN;
+
+import android.content.Context;
+import android.graphics.Matrix;
+import android.graphics.PointF;
+import android.graphics.Rect;
+import android.graphics.RectF;
+
+import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
+import com.android.launcher3.anim.Interpolators;
+import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.touch.PagedOrientationHandler;
+import com.android.quickstep.AnimatedFloat;
+import com.android.quickstep.RecentsAnimationTargets;
+import com.android.quickstep.util.AppWindowAnimationHelper.TargetAlphaProvider;
+import com.android.quickstep.util.AppWindowAnimationHelper.TransformParams;
+import com.android.quickstep.views.RecentsView.ScrollState;
+import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
+import com.android.quickstep.views.TaskView;
+import com.android.quickstep.views.TaskView.FullscreenDrawParams;
+import com.android.systemui.shared.recents.model.ThumbnailData;
+import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
+import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
+
+/**
+ * A utility class which emulates the layout behavior of TaskView and RecentsView
+ */
+public class TaskViewSimulator {
+
+ private final Rect mTmpCropRect = new Rect();
+ private final RectF mTempRectF = new RectF();
+
+ private final RecentsOrientedState mOrientationState;
+ private final Context mContext;
+ private final TaskSizeProvider mSizeProvider;
+
+ private final Rect mTaskRect = new Rect();
+ private final PointF mPivot = new PointF();
+ private DeviceProfile mDp;
+
+ private final Matrix mMatrix = new Matrix();
+ private RemoteAnimationTargetCompat mRunningTarget;
+ private RecentsAnimationTargets mAllTargets;
+
+ // Whether to boost the opening animation target layers, or the closing
+ private int mBoostModeTargetLayers = -1;
+ private TargetAlphaProvider mTaskAlphaCallback = (t, a) -> a;
+
+ // Thumbnail view properties
+ private final Rect mThumbnailPosition = new Rect();
+ private final ThumbnailData mThumbnailData = new ThumbnailData();
+ private final PreviewPositionHelper mPositionHelper;
+ private final Matrix mInversePositionMatrix = new Matrix();
+
+ // TaskView properties
+ private final FullscreenDrawParams mCurrentFullscreenParams;
+ private float mCurveScale = 1;
+
+ // RecentsView properties
+ public final AnimatedFloat recentsViewScale = new AnimatedFloat(() -> { });
+ public final AnimatedFloat fullScreenProgress = new AnimatedFloat(() -> { });
+ private final ScrollState mScrollState = new ScrollState();
+ private final int mPageSpacing;
+
+ // Cached calculations
+ private boolean mLayoutValid = false;
+ private boolean mScrollValid = false;
+
+ public TaskViewSimulator(Context context, TaskSizeProvider sizeProvider) {
+ mContext = context;
+ mSizeProvider = sizeProvider;
+ mPositionHelper = new PreviewPositionHelper(context);
+ mOrientationState = new RecentsOrientedState(context);
+
+ mCurrentFullscreenParams = new FullscreenDrawParams(context);
+ mPageSpacing = context.getResources().getDimensionPixelSize(R.dimen.recents_page_spacing);
+ }
+
+ /**
+ * Sets the device profile for the current state
+ */
+ public void setDp(DeviceProfile dp, boolean isOpening) {
+ mDp = dp;
+ mBoostModeTargetLayers = isOpening ? MODE_OPENING : MODE_CLOSING;
+ mLayoutValid = false;
+ }
+
+ /**
+ * @see com.android.quickstep.views.RecentsView#setLayoutRotation(int, int)
+ */
+ public void setLayoutRotation(int touchRotation, int displayRotation) {
+ if (!FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()) {
+ return;
+ }
+ mOrientationState.update(touchRotation, displayRotation,
+ mOrientationState.getLauncherRotation());
+ mLayoutValid = false;
+ }
+
+ /**
+ * @see com.android.quickstep.views.RecentsView#FULLSCREEN_PROGRESS
+ */
+ public float getFullScreenScale() {
+ if (mDp == null) {
+ return 1;
+ }
+ mSizeProvider.calculateTaskSize(mContext, mDp, mTaskRect);
+ return mOrientationState.getFullScreenScaleAndPivot(mTaskRect, mDp, mPivot);
+ }
+
+ /**
+ * Sets the targets which the simulator will control
+ */
+ public void setPreview(
+ RemoteAnimationTargetCompat runningTarget, RecentsAnimationTargets allTargets) {
+ mRunningTarget = runningTarget;
+ mAllTargets = allTargets;
+
+ mThumbnailData.insets.set(mRunningTarget.contentInsets);
+ // TODO: What is this?
+ mThumbnailData.windowingMode = WINDOWING_MODE_FULLSCREEN;
+
+ mThumbnailPosition.set(runningTarget.screenSpaceBounds);
+ // TODO: Should sourceContainerBounds already have this offset?
+ mThumbnailPosition.offsetTo(mRunningTarget.position.x, mRunningTarget.position.y);
+
+ mLayoutValid = false;
+ }
+
+ /**
+ * Updates the scroll for RecentsView
+ */
+ public void setScroll(int scroll) {
+ if (mScrollState.scroll != scroll) {
+ mScrollState.scroll = scroll;
+ mScrollValid = false;
+ }
+ }
+
+ /**
+ * Sets an alternate function which can be used to control the alpha
+ */
+ public void setTaskAlphaCallback(TargetAlphaProvider callback) {
+ mTaskAlphaCallback = callback;
+ }
+
+ /**
+ * Applies the target to the previously set parameters
+ */
+ public void apply(TransformParams params) {
+ if (mDp == null || mRunningTarget == null) {
+ return;
+ }
+ if (!mLayoutValid) {
+ mLayoutValid = true;
+
+ getFullScreenScale();
+ mThumbnailData.rotation = FeatureFlags.ENABLE_FIXED_ROTATION_TRANSFORM.get()
+ ? mOrientationState.getDisplayRotation() : mPositionHelper.getCurrentRotation();
+
+ mPositionHelper.updateThumbnailMatrix(mThumbnailPosition, mThumbnailData,
+ mDp.isMultiWindowMode, mTaskRect.width(), mTaskRect.height());
+
+ mPositionHelper.getMatrix().invert(mInversePositionMatrix);
+
+ PagedOrientationHandler poh = mOrientationState.getOrientationHandler();
+ mScrollState.halfPageSize =
+ poh.getPrimaryValue(mTaskRect.width(), mTaskRect.height()) / 2;
+ mScrollState.halfScreenSize = poh.getPrimaryValue(mDp.widthPx, mDp.heightPx) / 2;
+ mScrollValid = false;
+ }
+
+ if (!mScrollValid) {
+ mScrollValid = true;
+ int start = mOrientationState.getOrientationHandler()
+ .getPrimaryValue(mTaskRect.left, mTaskRect.top);
+ mScrollState.screenCenter = start + mScrollState.scroll + mScrollState.halfPageSize;
+ mScrollState.updateInterpolation(start, mPageSpacing);
+ mCurveScale = TaskView.getCurveScaleForInterpolation(mScrollState.linearInterpolation);
+ }
+
+ float progress = Utilities.boundToRange(fullScreenProgress.value, 0, 1);
+ mCurrentFullscreenParams.setProgress(
+ progress, recentsViewScale.value, mTaskRect.width(), mDp, mPositionHelper);
+
+ // Apply thumbnail matrix
+ RectF insets = mCurrentFullscreenParams.mCurrentDrawnInsets;
+ float scale = mCurrentFullscreenParams.mScale;
+ float taskWidth = mTaskRect.width();
+ float taskHeight = mTaskRect.height();
+
+ mMatrix.set(mPositionHelper.getMatrix());
+ mMatrix.postScale(scale, scale);
+ mMatrix.postTranslate(insets.left, insets.top);
+
+ // Apply TaskView matrix: scale, translate, scroll
+ mMatrix.postScale(mCurveScale, mCurveScale, taskWidth / 2, taskHeight / 2);
+ mMatrix.postTranslate(mTaskRect.left, mTaskRect.top);
+ mOrientationState.getOrientationHandler().set(
+ mMatrix, MATRIX_POST_TRANSLATE, mScrollState.scroll);
+
+ // Apply recensView matrix
+ mMatrix.postScale(recentsViewScale.value, recentsViewScale.value, mPivot.x, mPivot.y);
+ postDisplayRotation(mOrientationState.getDisplayRotation(),
+ mDp.widthPx, mDp.heightPx, mMatrix);
+
+ // Crop rect is the inverse of thumbnail matrix
+ mTempRectF.set(-insets.left, -insets.top,
+ taskWidth + insets.right, taskHeight + insets.bottom);
+ mInversePositionMatrix.mapRect(mTempRectF);
+ mTempRectF.roundOut(mTmpCropRect);
+
+ SurfaceParams[] surfaceParams = new SurfaceParams[mAllTargets.unfilteredApps.length];
+ for (int i = 0; i < mAllTargets.unfilteredApps.length; i++) {
+ RemoteAnimationTargetCompat app = mAllTargets.unfilteredApps[i];
+ SurfaceParams.Builder builder = new SurfaceParams.Builder(app.leash)
+ .withLayer(RemoteAnimationProvider.getLayer(app, mBoostModeTargetLayers));
+
+ if (app.mode == mAllTargets.targetMode) {
+ float alpha = mTaskAlphaCallback.getAlpha(app, params.getTargetAlpha());
+ if (app.activityType != RemoteAnimationTargetCompat.ACTIVITY_TYPE_HOME) {
+ // Fade out Assistant overlay.
+ if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_ASSISTANT
+ && app.isNotInRecents) {
+ alpha = Interpolators.ACCEL_2.getInterpolation(fullScreenProgress.value);
+ }
+
+ builder.withAlpha(alpha)
+ .withMatrix(mMatrix)
+ .withWindowCrop(mTmpCropRect)
+ .withCornerRadius(mCurrentFullscreenParams.mCurrentDrawnCornerRadius);
+ } else if (params.getTargetSet().hasRecents) {
+ // If home has a different target then recents, reverse anim the home target.
+ builder.withAlpha(fullScreenProgress.value * params.getTargetAlpha());
+ }
+ } else {
+ builder.withAlpha(1);
+ if (ENABLE_QUICKSTEP_LIVE_TILE.get() && params.isLauncherOnTop()) {
+ builder.withLayer(Integer.MAX_VALUE);
+ }
+ }
+ surfaceParams[i] = builder.build();
+ }
+
+ applySurfaceParams(params.getSyncTransactionApplier(), surfaceParams);
+ }
+
+ /**
+ * Interface for calculating taskSize
+ */
+ public interface TaskSizeProvider {
+
+ /**
+ * Sets the outRect to the expected taskSize
+ */
+ void calculateTaskSize(Context context, DeviceProfile dp, Rect outRect);
+ }
+
+}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java
index 98eb29aa67..454223e06f 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -47,7 +47,6 @@ import com.android.launcher3.appprediction.PredictionUiStateManager;
import com.android.launcher3.appprediction.PredictionUiStateManager.Client;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.statehandlers.DepthController;
-import com.android.launcher3.states.RotationHelper;
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.views.ScrimView;
@@ -88,10 +87,6 @@ public class LauncherRecentsView extends RecentsView
}
};
- private RotationHelper.ForcedRotationChangedListener mForcedRotationChangedListener =
- isForcedRotation -> LauncherRecentsView.this
- .disableMultipleLayoutRotations(!isForcedRotation);
-
public LauncherRecentsView(Context context) {
this(context, null);
}
@@ -102,10 +97,15 @@ public class LauncherRecentsView extends RecentsView
public LauncherRecentsView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- setContentAlpha(0);
mActivity.getStateManager().addStateListener(this);
}
+ @Override
+ public void init(OverviewActionsView actionsView) {
+ super.init(actionsView);
+ setContentAlpha(0);
+ }
+
@Override
public void startHome() {
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
@@ -183,27 +183,6 @@ public class LauncherRecentsView extends RecentsView
LayoutUtils.calculateLauncherTaskSize(getContext(), dp, outRect);
}
- /**
- * @return The translationX to apply to this view so that the first task is just offscreen.
- */
- public float getOffscreenTranslationX(float recentsScale) {
- LauncherState.ScaleAndTranslation overviewScaleAndTranslation =
- NORMAL.getOverviewScaleAndTranslation(mActivity);
- float offscreen = mOrientationHandler.getTranslationValue(overviewScaleAndTranslation);
- // Offset since scale pushes tasks outwards.
- getTaskSize(sTempRect);
- int taskSize = mOrientationHandler.getPrimarySize(sTempRect);
- offscreen += taskSize * (recentsScale - 1) / 2;
- if (mRunningTaskTileHidden) {
- // The first task is hidden, so offset by its width.
- offscreen -= (taskSize + getPageSpacing()) * recentsScale;
- }
- if (isRtl()) {
- offscreen = -offscreen;
- }
- return offscreen;
- }
-
@Override
protected void onTaskLaunchAnimationUpdate(float progress, TaskView tv) {
if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
@@ -344,7 +323,6 @@ public class LauncherRecentsView extends RecentsView
super.onAttachedToWindow();
PluginManagerWrapper.INSTANCE.get(getContext()).addPluginListener(
mRecentsExtraCardPluginListener, RecentsExtraCard.class);
- mActivity.getRotationHelper().addForcedRotationCallback(mForcedRotationChangedListener);
}
@Override
@@ -352,7 +330,6 @@ public class LauncherRecentsView extends RecentsView
super.onDetachedFromWindow();
PluginManagerWrapper.INSTANCE.get(getContext()).removePluginListener(
mRecentsExtraCardPluginListener);
- mActivity.getRotationHelper().removeForcedRotationCallback(mForcedRotationChangedListener);
}
@Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/OverviewActionsView.java
index 6a37e2b7de..93e68c0f5d 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/OverviewActionsView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/OverviewActionsView.java
@@ -16,34 +16,59 @@
package com.android.quickstep.views;
+import static com.android.launcher3.config.FeatureFlags.ENABLE_OVERVIEW_ACTIONS;
+import static com.android.quickstep.SysUINavigationMode.removeShelfFromOverview;
+
import android.content.Context;
import android.util.AttributeSet;
-import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.OnClickListener;
import android.widget.FrameLayout;
+import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import com.android.launcher3.R;
+import com.android.launcher3.util.MultiValueAlpha;
+import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
+import com.android.quickstep.TaskOverlayFactory.OverlayUICallbacks;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* View for showing action buttons in Overview
*/
-public class OverviewActionsView extends FrameLayout {
+public class OverviewActionsView extends FrameLayout
+ implements OnClickListener {
- private final View mScreenshotButton;
- private final View mShareButton;
+ @IntDef(flag = true, value = {
+ HIDDEN_UNSUPPORTED_NAVIGATION,
+ HIDDEN_DISABLED_FEATURE,
+ HIDDEN_NON_ZERO_ROTATION,
+ HIDDEN_NO_TASKS,
+ HIDDEN_GESTURE_RUNNING,
+ HIDDEN_NO_RECENTS})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ActionsHiddenFlags { }
- /**
- * Listener for taps on the various actions.
- */
- public interface Listener {
- /** User has initiated the share actions. */
- void onShare();
+ public static final int HIDDEN_UNSUPPORTED_NAVIGATION = 1 << 0;
+ public static final int HIDDEN_DISABLED_FEATURE = 1 << 1;
+ public static final int HIDDEN_NON_ZERO_ROTATION = 1 << 2;
+ public static final int HIDDEN_NO_TASKS = 1 << 3;
+ public static final int HIDDEN_GESTURE_RUNNING = 1 << 4;
+ public static final int HIDDEN_NO_RECENTS = 1 << 5;
- /** User has initiated the screenshot action. */
- void onScreenshot();
- }
+ private static final int INDEX_CONTENT_ALPHA = 0;
+ private static final int INDEX_VISIBILITY_ALPHA = 1;
+ private static final int INDEX_HIDDEN_FLAGS_ALPHA = 2;
+
+ private final MultiValueAlpha mMultiValueAlpha;
+
+ @ActionsHiddenFlags
+ private int mHiddenFlags;
+
+ protected T mCallbacks;
public OverviewActionsView(Context context) {
this(context, null);
@@ -54,26 +79,62 @@ public class OverviewActionsView extends FrameLayout {
}
public OverviewActionsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- this(context, attrs, defStyleAttr, 0);
+ super(context, attrs, defStyleAttr, 0);
+ mMultiValueAlpha = new MultiValueAlpha(this, 3);
}
- public OverviewActionsView(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- LayoutInflater.from(context).inflate(R.layout.overview_actions, this, true);
- mShareButton = findViewById(R.id.action_share);
- mScreenshotButton = findViewById(R.id.action_screenshot);
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ findViewById(R.id.action_share).setOnClickListener(this);
+ findViewById(R.id.action_screenshot).setOnClickListener(this);
}
/**
* Set listener for callbacks on action button taps.
*
- * @param listener for callbacks, or {@code null} to clear the listener.
+ * @param callbacks for callbacks, or {@code null} to clear the listener.
*/
- public void setListener(@Nullable OverviewActionsView.Listener listener) {
- mShareButton.setOnClickListener(
- listener == null ? null : view -> listener.onShare());
- mScreenshotButton.setOnClickListener(
- listener == null ? null : view -> listener.onScreenshot());
+ public void setCallbacks(T callbacks) {
+ mCallbacks = callbacks;
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (mCallbacks == null) {
+ return;
+ }
+ int id = view.getId();
+ if (id == R.id.action_share) {
+ mCallbacks.onShare();
+ } else if (id == R.id.action_screenshot) {
+ mCallbacks.onScreenshot();
+ }
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ updateHiddenFlags(HIDDEN_DISABLED_FEATURE, !ENABLE_OVERVIEW_ACTIONS.get());
+ updateHiddenFlags(HIDDEN_UNSUPPORTED_NAVIGATION, !removeShelfFromOverview(getContext()));
+ }
+
+ public void updateHiddenFlags(@ActionsHiddenFlags int visibilityFlags, boolean enable) {
+ if (enable) {
+ mHiddenFlags |= visibilityFlags;
+ } else {
+ mHiddenFlags &= ~visibilityFlags;
+ }
+ boolean isHidden = mHiddenFlags != 0;
+ mMultiValueAlpha.getProperty(INDEX_HIDDEN_FLAGS_ALPHA).setValue(isHidden ? 0 : 1);
+ setVisibility(isHidden ? INVISIBLE : VISIBLE);
+ }
+
+ public AlphaProperty getContentAlpha() {
+ return mMultiValueAlpha.getProperty(INDEX_CONTENT_ALPHA);
+ }
+
+ public AlphaProperty getVisibilityAlpha() {
+ return mMultiValueAlpha.getProperty(INDEX_VISIBILITY_ALPHA);
}
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
index a18f7bae05..b687920f49 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java
@@ -28,7 +28,6 @@ import static com.android.launcher3.anim.Interpolators.ACCEL;
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
import static com.android.launcher3.anim.Interpolators.LINEAR;
-import static com.android.launcher3.config.FeatureFlags.ENABLE_OVERVIEW_ACTIONS;
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.TASK_DISMISS_SWIPE_UP;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.TASK_LAUNCH_SWIPE_DOWN;
@@ -39,6 +38,10 @@ import static com.android.launcher3.userevent.nano.LauncherLogProto.ControlType.
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.SystemUiController.UI_STATE_OVERVIEW;
import static com.android.quickstep.TaskUtils.checkCurrentOrManagedUserId;
+import static com.android.quickstep.views.OverviewActionsView.HIDDEN_GESTURE_RUNNING;
+import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NON_ZERO_ROTATION;
+import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_RECENTS;
+import static com.android.quickstep.views.OverviewActionsView.HIDDEN_NO_TASKS;
import android.animation.AnimatorSet;
import android.animation.LayoutTransition;
@@ -50,8 +53,10 @@ import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Configuration;
import android.graphics.Canvas;
import android.graphics.Point;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
@@ -66,12 +71,12 @@ import android.util.AttributeSet;
import android.util.FloatProperty;
import android.util.Property;
import android.util.SparseBooleanArray;
-import android.view.Gravity;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.OrientationEventListener;
+import android.view.Surface;
import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
@@ -85,9 +90,7 @@ import androidx.annotation.Nullable;
import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
-import com.android.launcher3.InsettableFrameLayout;
import com.android.launcher3.InvariantDeviceProfile;
-import com.android.launcher3.LauncherState;
import com.android.launcher3.PagedView;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
@@ -115,19 +118,18 @@ import com.android.quickstep.RecentsAnimationController;
import com.android.quickstep.RecentsAnimationTargets;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.RecentsModel.TaskVisualsChangeListener;
-import com.android.quickstep.SysUINavigationMode;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TaskThumbnailCache;
import com.android.quickstep.TaskUtils;
import com.android.quickstep.ViewUtils;
import com.android.quickstep.util.AppWindowAnimationHelper;
-import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.RecentsOrientedState;
import com.android.systemui.plugins.ResourceProvider;
import com.android.systemui.shared.recents.IPinnedStackAnimationListener;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.ActivityManagerWrapper;
+import com.android.systemui.shared.system.ConfigurationCompat;
import com.android.systemui.shared.system.LauncherEventUtil;
import com.android.systemui.shared.system.PackageManagerWrapper;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat;
@@ -172,8 +174,23 @@ public abstract class RecentsView extends PagedView impl
}
};
- protected final RecentsOrientedState mOrientationState = new RecentsOrientedState();
+ public static final FloatProperty ADJACENT_PAGE_OFFSET =
+ new FloatProperty("adjacentPageOffset") {
+ @Override
+ public void setValue(RecentsView recentsView, float v) {
+ if (recentsView.mAdjacentPageOffset != v) {
+ recentsView.mAdjacentPageOffset = v;
+ recentsView.updateAdjacentPageOffset();
+ }
+ }
+ @Override
+ public Float get(RecentsView recentsView) {
+ return recentsView.mAdjacentPageOffset;
+ }
+ };
+
+ protected final RecentsOrientedState mOrientationState;
private OrientationEventListener mOrientationListener;
private int mPreviousRotation;
protected RecentsAnimationController mRecentsAnimationController;
@@ -185,6 +202,7 @@ public abstract class RecentsView extends PagedView impl
protected boolean mEnableDrawingLiveTile = false;
protected final Rect mTempRect = new Rect();
protected final RectF mTempRectF = new RectF();
+ private final PointF mTempPointF = new PointF();
private static final int DISMISS_TASK_DURATION = 300;
private static final int ADDITION_TASK_DURATION = 200;
@@ -195,7 +213,6 @@ public abstract class RecentsView extends PagedView impl
private final float mFastFlingVelocity;
private final RecentsModel mModel;
private final int mTaskTopMargin;
- private final int mTaskBottomMargin;
private final ClearAllButton mClearAllButton;
private final Rect mClearAllButtonDeadZoneRect = new Rect();
private final Rect mTaskViewDeadZoneRect = new Rect();
@@ -214,6 +231,8 @@ public abstract class RecentsView extends PagedView impl
private boolean mOverlayEnabled;
protected boolean mFreezeViewVisibility;
+ private float mAdjacentPageOffset = 0;
+
/**
* TODO: Call reloadIdNeeded in onTaskStackChanged.
*/
@@ -282,6 +301,9 @@ public abstract class RecentsView extends PagedView impl
}
};
+ private final RecentsOrientedState.SystemRotationChangeListener mSystemRotationChangeListener =
+ enabled -> toggleOrientationEventListener();
+
private final PinnedStackAnimationListener mIPinnedStackAnimationListener =
new PinnedStackAnimationListener();
@@ -328,8 +350,7 @@ public abstract class RecentsView extends PagedView impl
// Keeps track of the index where the first TaskView should be
private int mTaskViewStartIndex = 0;
- private View mActionsView;
- private boolean mGestureRunning = false;
+ private OverviewActionsView mActionsView;
private BaseActivity.MultiWindowModeChangedListener mMultiWindowModeChangedListener =
(inMultiWindowMode) -> {
@@ -343,10 +364,11 @@ public abstract class RecentsView extends PagedView impl
super(context, attrs, defStyleAttr);
setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing));
setEnableFreeScroll(true);
+ mOrientationState = new RecentsOrientedState(context);
mFastFlingVelocity = getResources()
.getDimensionPixelSize(R.dimen.recents_fast_fling_velocity);
- mActivity = (T) BaseActivity.fromContext(context);
+ mActivity = BaseActivity.fromContext(context);
mModel = RecentsModel.INSTANCE.get(context);
mIdp = InvariantDeviceProfile.INSTANCE.get(context);
mTempAppWindowAnimationHelper =
@@ -362,7 +384,6 @@ public abstract class RecentsView extends PagedView impl
setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
mTaskTopMargin = getResources()
.getDimensionPixelSize(R.dimen.task_thumbnail_top_margin);
- mTaskBottomMargin = LayoutUtils.thumbnailBottomMargin(context);
mSquaredTouchSlop = squaredTouchSlop(context);
mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents);
@@ -389,11 +410,6 @@ public abstract class RecentsView extends PagedView impl
int rotation = RecentsOrientedState.getRotationForUserDegreesRotated(i);
if (mPreviousRotation != rotation) {
animateRecentsRotationInPlace(rotation);
- if (rotation == 0) {
- showActionsView();
- } else {
- hideActionsView();
- }
mPreviousRotation = rotation;
}
}
@@ -468,6 +484,10 @@ public abstract class RecentsView extends PagedView impl
reset();
}
+ public void init(OverviewActionsView actionsView) {
+ mActionsView = actionsView;
+ }
+
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
@@ -481,7 +501,8 @@ public abstract class RecentsView extends PagedView impl
mIPinnedStackAnimationListener.setActivity(mActivity);
SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(
mIPinnedStackAnimationListener);
- setActionsView();
+ mOrientationState.init();
+ mOrientationState.addSystemRotationChangeListener(mSystemRotationChangeListener);
}
@Override
@@ -496,6 +517,8 @@ public abstract class RecentsView extends PagedView impl
mIdp.removeOnChangeListener(this);
SystemUiProxy.INSTANCE.get(getContext()).setPinnedStackAnimationListener(null);
mIPinnedStackAnimationListener.setActivity(null);
+ mOrientationState.removeSystemRotationChangeListener(mSystemRotationChangeListener);
+ mOrientationState.destroy();
}
@Override
@@ -507,6 +530,7 @@ public abstract class RecentsView extends PagedView impl
TaskView taskView = (TaskView) child;
mHasVisibleTaskData.delete(taskView.getTask().key.id);
mTaskViewPool.recycle(taskView);
+ mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, getTaskViewCount() == 0);
}
updateTaskStartIndex(child);
}
@@ -519,6 +543,7 @@ public abstract class RecentsView extends PagedView impl
// child direction back to match system settings.
child.setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_LTR : View.LAYOUT_DIRECTION_RTL);
updateTaskStartIndex(child);
+ mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, false);
}
private void updateTaskStartIndex(View affectingView) {
@@ -549,15 +574,6 @@ public abstract class RecentsView extends PagedView impl
}
public void setOverviewStateEnabled(boolean enabled) {
- if (supportsVerticalLandscape()
- && !TestProtocol.sDisableSensorRotation // Ignore hardware dependency for tests
- && mOrientationListener.canDetectOrientation()) {
- if (enabled) {
- mOrientationListener.enable();
- } else {
- mOrientationListener.disable();
- }
- }
mOverviewStateEnabled = enabled;
updateTaskStackListenerState();
if (!enabled) {
@@ -565,6 +581,26 @@ public abstract class RecentsView extends PagedView impl
// its thumbnail
mTmpRunningTask = null;
}
+ toggleOrientationEventListener();
+ }
+
+ private void toggleOrientationEventListener() {
+ boolean canEnable = canEnableOverviewRotationAnimation() && mOverviewStateEnabled;
+ UI_HELPER_EXECUTOR.execute(() -> {
+ if (canEnable) {
+ mOrientationListener.enable();
+ } else {
+ mOrientationListener.disable();
+ }
+ });
+ }
+
+ private boolean canEnableOverviewRotationAnimation() {
+ return supportsVerticalLandscape() // not 3P launcher
+ && !TestProtocol.sDisableSensorRotation // Ignore hardware dependency for tests..
+ && mOrientationListener.canDetectOrientation() // ..but does the hardware even work?
+ && (mOrientationState.isSystemRotationAllowed() &&
+ !mOrientationState.canLauncherRotate()); // launcher is going to rotate itself
}
public void onDigitalWellbeingToastShown() {
@@ -584,6 +620,15 @@ public abstract class RecentsView extends PagedView impl
}
}
+ @Override
+ protected void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ int windowConfigurationRotation = ConfigurationCompat
+ .getWindowConfigurationRotation(getResources().getConfiguration());
+ setLayoutInternal(mOrientationState.getTouchRotation(),
+ mOrientationState.getDisplayRotation(), windowConfigurationRotation);
+ }
+
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
@@ -668,7 +713,6 @@ public abstract class RecentsView extends PagedView impl
if (getTaskViewCount() != requiredTaskCount) {
if (indexOfChild(mClearAllButton) != -1) {
removeView(mClearAllButton);
- hideActionsView();
}
for (int i = getTaskViewCount(); i < requiredTaskCount; i++) {
addView(mTaskViewPool.getView());
@@ -678,7 +722,6 @@ public abstract class RecentsView extends PagedView impl
}
if (requiredTaskCount > 0) {
addView(mClearAllButton);
- showActionsView();
}
}
@@ -718,7 +761,6 @@ public abstract class RecentsView extends PagedView impl
if (indexOfChild(mClearAllButton) != -1) {
removeView(mClearAllButton);
}
- hideActionsView();
}
public int getTaskViewCount() {
@@ -778,7 +820,7 @@ public abstract class RecentsView extends PagedView impl
for (int i = 0; i < taskCount; i++) {
getTaskViewAt(i).setFullscreenProgress(mFullscreenProgress);
}
- if (mActionsView != null) {
+ if (mActionsView != null && mOrientationState.getLauncherRotation() == Surface.ROTATION_0) {
mActionsView.setVisibility(fullscreenProgress == 0 ? VISIBLE : INVISIBLE);
}
}
@@ -803,7 +845,6 @@ public abstract class RecentsView extends PagedView impl
mTaskHeight = mTempRect.height();
mTempRect.top -= mTaskTopMargin;
- mTempRect.bottom += mTaskBottomMargin;
setPadding(mTempRect.left - mInsets.left, mTempRect.top - mInsets.top,
dp.widthPx - mInsets.right - mTempRect.right,
dp.heightPx - mInsets.bottom - mTempRect.bottom);
@@ -980,7 +1021,7 @@ public abstract class RecentsView extends PagedView impl
setEnableDrawingLiveTile(false);
setRunningTaskHidden(true);
setRunningTaskIconScaledDown(true);
- mGestureRunning = true;
+ mActionsView.updateHiddenFlags(HIDDEN_GESTURE_RUNNING, true);
}
/**
@@ -1046,7 +1087,7 @@ public abstract class RecentsView extends PagedView impl
}
setRunningTaskHidden(false);
animateUpRunningTaskIconScale();
- mGestureRunning = false;
+ mActionsView.updateHiddenFlags(HIDDEN_GESTURE_RUNNING, false);
}
/**
@@ -1057,13 +1098,12 @@ public abstract class RecentsView extends PagedView impl
*/
public void showCurrentTask(int runningTaskId) {
if (getTaskView(runningTaskId) == null) {
- boolean wasEmpty = getTaskViewCount() == 0;
+ boolean wasEmpty = getChildCount() == 0;
// Add an empty view for now until the task plan is loaded and applied
final TaskView taskView = mTaskViewPool.getView();
addView(taskView, mTaskViewStartIndex);
if (wasEmpty) {
addView(mClearAllButton);
- showActionsView();
}
// The temporary running task is only used for the duration between the start of the
// gesture and the task list is loaded and applied
@@ -1387,7 +1427,6 @@ public abstract class RecentsView extends PagedView impl
if (getTaskViewCount() == 0) {
removeViewInLayout(mClearAllButton);
- hideActionsView();
startHome();
} else {
snapToPageImmediately(pageToSnapTo);
@@ -1530,14 +1569,12 @@ public abstract class RecentsView extends PagedView impl
int alphaInt = Math.round(alpha * 255);
mEmptyMessagePaint.setAlpha(alphaInt);
mEmptyIcon.setAlpha(alphaInt);
+ mActionsView.getContentAlpha().setValue(mContentAlpha);
+
if (alpha > 0) {
setVisibility(VISIBLE);
- if (!mGestureRunning) {
- showActionsView();
- }
} else if (!mFreezeViewVisibility) {
setVisibility(GONE);
- hideActionsView();
}
}
@@ -1548,24 +1585,33 @@ public abstract class RecentsView extends PagedView impl
public void setFreezeViewVisibility(boolean freezeViewVisibility) {
if (mFreezeViewVisibility != freezeViewVisibility) {
mFreezeViewVisibility = freezeViewVisibility;
-
if (!mFreezeViewVisibility) {
setVisibility(mContentAlpha > 0 ? VISIBLE : GONE);
- if (mContentAlpha > 0) {
- showActionsView();
- } else {
- hideActionsView();
- }
}
}
}
+ @Override
+ public void setVisibility(int visibility) {
+ super.setVisibility(visibility);
+ if (mActionsView != null) {
+ mActionsView.updateHiddenFlags(HIDDEN_NO_RECENTS, visibility != VISIBLE);
+ }
+ }
+
public void setLayoutRotation(int touchRotation, int displayRotation) {
- if (mOrientationState.update(touchRotation, displayRotation)) {
+ int launcherRotation = mOrientationState.getLauncherRotation();
+ setLayoutInternal(touchRotation, displayRotation, launcherRotation);
+ }
+
+ private void setLayoutInternal(int touchRotation, int displayRotation, int launcherRotation) {
+ if (mOrientationState.update(touchRotation, displayRotation, launcherRotation)) {
mOrientationHandler = mOrientationState.getOrientationHandler();
mIsRtl = mOrientationHandler.getRecentsRtlSetting(getResources());
setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR);
mClearAllButton.setRotation(mOrientationHandler.getDegreesRotated());
+ mActivity.getDragLayer().recreateControllers();
+ mActionsView.updateHiddenFlags(HIDDEN_NON_ZERO_ROTATION, touchRotation != 0);
requestLayout();
}
}
@@ -1589,11 +1635,6 @@ public abstract class RecentsView extends PagedView impl
return getTaskViewAtByAbsoluteIndex(getRunningTaskIndex() + 1);
}
- @Nullable
- public TaskView getPreviousTaskView() {
- return getTaskViewAtByAbsoluteIndex(getRunningTaskIndex() - 1);
- }
-
@Nullable
public TaskView getCurrentPageTaskView() {
return getTaskViewAtByAbsoluteIndex(getCurrentPage());
@@ -1653,11 +1694,29 @@ public abstract class RecentsView extends PagedView impl
updateEmptyStateUi(changed);
- // Set the pivot points to match the task preview center
- setPivotY(((mInsets.top + getPaddingTop() + mTaskTopMargin)
- + (getHeight() - mInsets.bottom - getPaddingBottom() - mTaskBottomMargin)) / 2);
- setPivotX(((mInsets.left + getPaddingLeft())
- + (getWidth() - mInsets.right - getPaddingRight())) / 2);
+ // Update the pivots such that when the task is scaled, it fills the full page
+ getTaskSize(mTempRect);
+ getPagedViewOrientedState().getFullScreenScaleAndPivot(
+ mTempRect, mActivity.getDeviceProfile(), mTempPointF);
+ setPivotX(mTempPointF.x);
+ setPivotY(mTempPointF.y);
+ updateAdjacentPageOffset();
+ }
+
+ private void updateAdjacentPageOffset() {
+ float offset = mAdjacentPageOffset * getWidth();
+ if (mIsRtl) {
+ offset = -offset;
+ }
+ int count = getChildCount();
+
+ TaskView runningTask = mRunningTaskId == -1 ? null : getTaskView(mRunningTaskId);
+ int midPoint = runningTask == null ? -1 : indexOfChild(runningTask);
+
+ for (int i = 0; i < count; i++) {
+ getChildAt(i).setTranslationX(i == midPoint ? 0 : (i < midPoint ? -offset : offset));
+ }
+ updateCurveProperties();
}
private void updateDeadZoneRects() {
@@ -1739,14 +1798,10 @@ public abstract class RecentsView extends PagedView impl
int centerTaskIndex = getCurrentPage();
boolean launchingCenterTask = taskIndex == centerTaskIndex;
- LauncherState.ScaleAndTranslation toScaleAndTranslation = appWindowAnimationHelper
- .getScaleAndTranslation();
- float toScale = toScaleAndTranslation.scale;
- float toTranslationY = toScaleAndTranslation.translationY;
+ float toScale = appWindowAnimationHelper.getSrcToTargetScale();
if (launchingCenterTask) {
RecentsView recentsView = tv.getRecentsView();
anim.play(ObjectAnimator.ofFloat(recentsView, SCALE_PROPERTY, toScale));
- anim.play(ObjectAnimator.ofFloat(recentsView, TRANSLATION_Y, toTranslationY));
anim.play(ObjectAnimator.ofFloat(recentsView, FULLSCREEN_PROGRESS, 1));
} else {
// We are launching an adjacent task, so parallax the center and other adjacent task.
@@ -2006,23 +2061,30 @@ public abstract class RecentsView extends PagedView impl
return mClearAllButton;
}
+
/**
* @return How many pixels the running task is offset on the x-axis due to the current scrollX.
*/
- public float getScrollOffset() {
+ public int getScrollOffset() {
if (getRunningTaskIndex() == -1) {
return 0;
}
- int startScroll = getScrollForPage(getRunningTaskIndex());
- int offsetX = startScroll - mOrientationHandler.getPrimaryScroll(this);
- offsetX *= mOrientationHandler.getPrimaryScale(this);
- return offsetX;
+ return getScrollForPage(getRunningTaskIndex()) - mOrientationHandler.getPrimaryScroll(this);
+ }
+
+ /**
+ * @return How many pixels the running task is offset on the x-axis due to the current scrollX
+ * and parent scale.
+ */
+ public float getScrollOffsetScaled() {
+ return getScrollOffset() * mOrientationHandler.getPrimaryScale(this);
}
public Consumer getEventDispatcher(float navbarRotation) {
float degreesRotated;
if (navbarRotation == 0) {
- degreesRotated = mOrientationState.getTouchRotationDegrees();
+ degreesRotated = mOrientationState.areMultipleLayoutOrientationsDisabled() ? 0 :
+ mOrientationHandler.getDegreesRotated();
} else {
degreesRotated = -navbarRotation;
}
@@ -2035,7 +2097,8 @@ public abstract class RecentsView extends PagedView impl
// PagedOrientationHandler
return e -> {
if (navbarRotation != 0
- && !mOrientationState.areMultipleLayoutOrientationsDisabled()) {
+ && !mOrientationState.areMultipleLayoutOrientationsDisabled()
+ && !mOrientationState.getOrientationHandler().isLayoutNaturalToLauncher()) {
mOrientationState.flipVertical(e);
super.onTouchEvent(e);
mOrientationState.flipVertical(e);
@@ -2122,36 +2185,4 @@ public abstract class RecentsView extends PagedView impl
mActivity.clearForceInvisibleFlag(STATE_HANDLER_INVISIBILITY_FLAGS);
}
}
-
- private void showActionsView() {
- if (mActionsView != null && getTaskViewCount() > 0) {
- mActionsView.setVisibility(VISIBLE);
- }
- }
-
- private void hideActionsView() {
- if (mActionsView != null) {
- mActionsView.setVisibility(GONE);
- }
- }
-
- private void setActionsView() {
- if (mActionsView == null && ENABLE_OVERVIEW_ACTIONS.get()
- && SysUINavigationMode.removeShelfFromOverview(mActivity)) {
- mActionsView = ((ViewGroup) getParent()).findViewById(R.id.overview_actions_view);
- if (mActionsView != null) {
- InsettableFrameLayout.LayoutParams layoutParams =
- new InsettableFrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,
- getResources().getDimensionPixelSize(
- R.dimen.overview_actions_height));
- layoutParams.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
- int margin = getResources().getDimensionPixelSize(
- R.dimen.overview_actions_horizontal_margin);
- layoutParams.setMarginStart(margin);
- layoutParams.setMarginEnd(margin);
- mActionsView.setLayoutParams(layoutParams);
- showActionsView();
- }
- }
- }
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java
index 178ff32b4a..a05e0fa4fc 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java
@@ -36,11 +36,9 @@ import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.util.FloatProperty;
-import android.util.Log;
import android.util.Property;
import android.view.Surface;
import android.view.View;
-import android.view.ViewGroup;
import com.android.launcher3.BaseActivity;
import com.android.launcher3.R;
@@ -50,7 +48,7 @@ import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.Themes;
import com.android.quickstep.TaskOverlayFactory;
import com.android.quickstep.TaskOverlayFactory.TaskOverlay;
-import com.android.quickstep.util.TaskCornerRadius;
+import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.plugins.OverviewScreenshotActions;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.shared.recents.model.Task;
@@ -66,6 +64,8 @@ public class TaskThumbnailView extends View implements PluginListener DIM_ALPHA =
new FloatProperty("dimAlpha") {
@Override
@@ -87,12 +87,11 @@ public class TaskThumbnailView extends View implements PluginListener 0 || mThumbnailData.isTranslucent) {
+ if (drawBackgroundOnly || mPreviewPositionHelper.mClipBottom > 0
+ || mThumbnailData.isTranslucent) {
canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mBackgroundPaint);
if (drawBackgroundOnly) {
return;
}
}
- if (mClipBottom > 0) {
+ if (mPreviewPositionHelper.mClipBottom > 0) {
canvas.save();
- canvas.clipRect(x, y, width, mClipBottom);
+ canvas.clipRect(x, y, width, mPreviewPositionHelper.mClipBottom);
canvas.drawRoundRect(x, y, width, height, cornerRadius, cornerRadius, mPaint);
canvas.restore();
} else {
@@ -324,8 +321,9 @@ public class TaskThumbnailView extends View implements PluginListener 0 && windowingModeSupportsRotation;
- // Scale the screenshot to always fit the width of the card.
-
- thumbnailScale = isOrientationDifferent
- ? getMeasuredWidth() / thumbnailHeight
- : getMeasuredWidth() / thumbnailWidth;
- }
-
- if (!isRotated) {
- // No Rotation
- mClippedInsets.offsetTo(thumbnailInsets.left * scale,
- thumbnailInsets.top * scale);
- mMatrix.setTranslate(-mClippedInsets.left, -mClippedInsets.top);
- } else {
- setThumbnailRotation(deltaRotate, thumbnailInsets, scale);
- }
-
- final float widthWithInsets;
- final float heightWithInsets;
- if (isOrientationDifferent) {
- widthWithInsets = mThumbnailData.thumbnail.getHeight() * thumbnailScale;
- heightWithInsets = mThumbnailData.thumbnail.getWidth() * thumbnailScale;
- } else {
- widthWithInsets = mThumbnailData.thumbnail.getWidth() * thumbnailScale;
- heightWithInsets = mThumbnailData.thumbnail.getHeight() * thumbnailScale;
- }
- mClippedInsets.left *= thumbnailScale;
- mClippedInsets.top *= thumbnailScale;
- mClippedInsets.right = widthWithInsets - mClippedInsets.left - getMeasuredWidth();
- mClippedInsets.bottom = heightWithInsets - mClippedInsets.top - getMeasuredHeight();
-
- mMatrix.postScale(thumbnailScale, thumbnailScale);
- mBitmapShader.setLocalMatrix(mMatrix);
-
- float bitmapHeight = Math.max((isOrientationDifferent ? thumbnailWidth : thumbnailHeight)
- * thumbnailScale, 0);
- if (Math.round(bitmapHeight) < getMeasuredHeight()) {
- mClipBottom = bitmapHeight;
- }
+ mBitmapShader.setLocalMatrix(mPreviewPositionHelper.mMatrix);
mPaint.setShader(mBitmapShader);
}
-
- mIsOrientationChanged = isOrientationDifferent;
invalidate();
// Update can be called from {@link #onSizeChanged} during layout, post handling of overlay
@@ -423,51 +362,6 @@ public class TaskThumbnailView extends View implements PluginListener 0 && windowingModeSupportsRotation;
+ // Scale the screenshot to always fit the width of the card.
+ thumbnailScale = isOrientationDifferent
+ ? canvasWidth / thumbnailHeight
+ : canvasWidth / thumbnailWidth;
+ }
+
+ if (!isRotated) {
+ // No Rotation
+ mClippedInsets.offsetTo(thumbnailInsets.left * scale,
+ thumbnailInsets.top * scale);
+ mMatrix.setTranslate(-mClippedInsets.left, -mClippedInsets.top);
+ } else {
+ setThumbnailRotation(deltaRotate, thumbnailInsets, scale, thumbnailPosition);
+ }
+ mMatrix.postTranslate(-thumbnailPosition.left, -thumbnailPosition.top);
+
+ final float widthWithInsets;
+ final float heightWithInsets;
+ if (isOrientationDifferent) {
+ widthWithInsets = thumbnailPosition.height() * thumbnailScale;
+ heightWithInsets = thumbnailPosition.width() * thumbnailScale;
+ } else {
+ widthWithInsets = thumbnailPosition.width() * thumbnailScale;
+ heightWithInsets = thumbnailPosition.height() * thumbnailScale;
+ }
+ mClippedInsets.left *= thumbnailScale;
+ mClippedInsets.top *= thumbnailScale;
+ mClippedInsets.right = widthWithInsets - mClippedInsets.left - canvasWidth;
+ mClippedInsets.bottom = heightWithInsets - mClippedInsets.top - canvasHeight;
+
+ mMatrix.postScale(thumbnailScale, thumbnailScale);
+
+ float bitmapHeight = Math.max(0,
+ (isOrientationDifferent ? thumbnailWidth : thumbnailHeight) * thumbnailScale);
+ if (Math.round(bitmapHeight) < canvasHeight) {
+ mClipBottom = bitmapHeight;
+ }
+ mIsOrientationChanged = isOrientationDifferent;
+ }
+
+ private int getRotationDelta(int oldRotation, int newRotation) {
+ int delta = newRotation - oldRotation;
+ if (delta < 0) delta += 4;
+ return delta;
+ }
+
+ /**
+ * @param deltaRotation the number of 90 degree turns from the current orientation
+ * @return {@code true} if the change in rotation results in a shift from landscape to
+ * portrait or vice versa, {@code false} otherwise
+ */
+ private boolean isOrientationChange(int deltaRotation) {
+ return deltaRotation == Surface.ROTATION_90 || deltaRotation == Surface.ROTATION_270;
+ }
+
+ private void setThumbnailRotation(int deltaRotate, Rect thumbnailInsets, float scale,
+ Rect thumbnailPosition) {
+ int newLeftInset = 0;
+ int newTopInset = 0;
+ int translateX = 0;
+ int translateY = 0;
+
+ mMatrix.setRotate(90 * deltaRotate);
+ switch (deltaRotate) { /* Counter-clockwise */
+ case Surface.ROTATION_90:
+ newLeftInset = thumbnailInsets.bottom;
+ newTopInset = thumbnailInsets.left;
+ translateX = thumbnailPosition.height();
+ break;
+ case Surface.ROTATION_270:
+ newLeftInset = thumbnailInsets.top;
+ newTopInset = thumbnailInsets.right;
+ translateY = thumbnailPosition.width();
+ break;
+ case Surface.ROTATION_180:
+ newLeftInset = -thumbnailInsets.top;
+ newTopInset = -thumbnailInsets.left;
+ translateX = thumbnailPosition.width();
+ translateY = thumbnailPosition.height();
+ break;
+ }
+ mClippedInsets.offsetTo(newLeftInset * scale, newTopInset * scale);
+ mMatrix.postTranslate(translateX - mClippedInsets.left,
+ translateY - mClippedInsets.top);
+ }
+
+ /**
+ * Insets to used for clipping the thumbnail (in case it is drawing outside its own space)
+ */
+ public RectF getInsetsToDrawInFullscreen(boolean isMultiWindowMode) {
+ // Don't show insets in multi window mode.
+ return isMultiWindowMode ? EMPTY_RECT_F : mClippedInsets;
+ }
+ }
}
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
index 470b720f5e..b0758c9e48 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java
@@ -56,6 +56,7 @@ import android.widget.FrameLayout;
import android.widget.Toast;
import com.android.launcher3.BaseDraggingActivity;
+import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorPlaybackController;
@@ -77,11 +78,11 @@ import com.android.quickstep.TaskIconCache;
import com.android.quickstep.TaskOverlayFactory;
import com.android.quickstep.TaskThumbnailCache;
import com.android.quickstep.TaskUtils;
-import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.RecentsOrientedState;
import com.android.quickstep.util.TaskCornerRadius;
import com.android.quickstep.views.RecentsView.PageCallbacks;
import com.android.quickstep.views.RecentsView.ScrollState;
+import com.android.quickstep.views.TaskThumbnailView.PreviewPositionHelper;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.ActivityOptionsCompat;
@@ -157,8 +158,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
private float mCurveScale;
private float mFullscreenProgress;
private final FullscreenDrawParams mCurrentFullscreenParams;
- private final float mCornerRadius;
- private final float mWindowCornerRadius;
private final BaseDraggingActivity mActivity;
private ObjectAnimator mIconAndDimAnimator;
@@ -211,9 +210,8 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
TaskUtils.getLaunchComponentKeyForTask(getTask().key));
mActivity.getStatsLogManager().log(TASK_LAUNCH_TAP, buildProto());
});
- mCornerRadius = TaskCornerRadius.get(context);
- mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context.getResources());
- mCurrentFullscreenParams = new FullscreenDrawParams(mCornerRadius);
+
+ mCurrentFullscreenParams = new FullscreenDrawParams(context);
mDigitalWellBeingToast = new DigitalWellBeingToast(mActivity, this);
mOutlineProvider = new TaskOutlineProvider(getContext(), mCurrentFullscreenParams);
@@ -236,11 +234,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
super.onFinishInflate();
mSnapshotView = findViewById(R.id.snapshot);
mIconView = findViewById(R.id.icon);
- final Context context = getContext();
-
- TaskView.LayoutParams thumbnailParams = (LayoutParams) mSnapshotView.getLayoutParams();
- thumbnailParams.bottomMargin = LayoutUtils.thumbnailBottomMargin(context);
- mSnapshotView.setLayoutParams(thumbnailParams);
}
public boolean isTaskOverlayModal() {
@@ -473,8 +466,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
int iconRotation = orientationState.getTouchRotation();
PagedOrientationHandler orientationHandler = orientationState.getOrientationHandler();
boolean isRtl = orientationHandler.getRecentsRtlSetting(getResources());
- LayoutParams snapshotParams = (LayoutParams) mSnapshotView.getLayoutParams();
- snapshotParams.bottomMargin = LayoutUtils.thumbnailBottomMargin(getContext());
int thumbnailPadding = (int) getResources().getDimension(R.dimen.task_thumbnail_top_margin);
LayoutParams iconParams = (LayoutParams) mIconView.getLayoutParams();
int rotation = orientationState.getTouchRotationDegrees();
@@ -501,7 +492,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
iconParams.bottomMargin = 0;
break;
}
- mSnapshotView.setLayoutParams(snapshotParams);
mIconView.setLayoutParams(iconParams);
mIconView.setRotation(rotation);
}
@@ -699,21 +689,16 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
return 1 - curveInterpolation * EDGE_SCALE_DOWN_FACTOR;
}
- public void setCurveScale(float curveScale) {
+ private void setCurveScale(float curveScale) {
mCurveScale = curveScale;
- onScaleChanged();
+ setScaleX(mCurveScale);
+ setScaleY(mCurveScale);
}
public float getCurveScale() {
return mCurveScale;
}
- private void onScaleChanged() {
- float scale = mCurveScale;
- setScaleX(scale);
- setScaleY(scale);
- }
-
@Override
public boolean hasOverlappingRendering() {
// TODO: Clip-out the icon region from the thumbnail, since they are overlapping.
@@ -723,13 +708,11 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
private static final class TaskOutlineProvider extends ViewOutlineProvider {
private final int mMarginTop;
- private final int mMarginBottom;
private FullscreenDrawParams mFullscreenParams;
TaskOutlineProvider(Context context, FullscreenDrawParams fullscreenParams) {
mMarginTop = context.getResources().getDimensionPixelSize(
R.dimen.task_thumbnail_top_margin);
- mMarginBottom = LayoutUtils.thumbnailBottomMargin(context);
mFullscreenParams = fullscreenParams;
}
@@ -744,7 +727,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
outline.setRoundRect(0,
(int) (mMarginTop * scale),
(int) ((insets.left + view.getWidth() + insets.right) * scale),
- (int) ((insets.top + view.getHeight() + insets.bottom - mMarginBottom) * scale),
+ (int) ((insets.top + view.getHeight() + insets.bottom) * scale),
mFullscreenParams.mCurrentDrawnCornerRadius);
}
}
@@ -917,23 +900,11 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
setClipToPadding(!isFullscreen);
TaskThumbnailView thumbnail = getThumbnail();
- boolean isMultiWindowMode = mActivity.getDeviceProfile().isMultiWindowMode;
- RectF insets = thumbnail.getInsetsToDrawInFullscreen(isMultiWindowMode);
- float currentInsetsLeft = insets.left * mFullscreenProgress;
- float currentInsetsRight = insets.right * mFullscreenProgress;
- mCurrentFullscreenParams.setInsets(currentInsetsLeft,
- insets.top * mFullscreenProgress,
- currentInsetsRight,
- insets.bottom * mFullscreenProgress);
- float fullscreenCornerRadius = isMultiWindowMode ? 0 : mWindowCornerRadius;
- mCurrentFullscreenParams.setCornerRadius(Utilities.mapRange(mFullscreenProgress,
- mCornerRadius, fullscreenCornerRadius) / getRecentsView().getScaleX());
- // We scaled the thumbnail to fit the content (excluding insets) within task view width.
- // Now that we are drawing left/right insets again, we need to scale down to fit them.
- if (getWidth() > 0) {
- mCurrentFullscreenParams.setScale(getWidth()
- / (getWidth() + currentInsetsLeft + currentInsetsRight));
- }
+ mCurrentFullscreenParams.setProgress(
+ mFullscreenProgress,
+ getRecentsView().getScaleX(),
+ getWidth(), mActivity.getDeviceProfile(),
+ thumbnail.getPreviewPositionHelper());
if (!getRecentsView().isTaskIconScaledDown(this)) {
// Some of the items in here are dependent on the current fullscreen params, but don't
@@ -971,26 +942,51 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
/**
* We update and subsequently draw these in {@link #setFullscreenProgress(float)}.
*/
- static class FullscreenDrawParams {
- RectF mCurrentDrawnInsets = new RectF();
- float mCurrentDrawnCornerRadius;
+ public static class FullscreenDrawParams {
+
+ private final float mCornerRadius;
+ private final float mWindowCornerRadius;
+
+ public RectF mCurrentDrawnInsets = new RectF();
+ public float mCurrentDrawnCornerRadius;
/** The current scale we apply to the thumbnail to adjust for new left/right insets. */
- float mScale = 1;
+ public float mScale = 1;
- public FullscreenDrawParams(float cornerRadius) {
- setCornerRadius(cornerRadius);
+ public FullscreenDrawParams(Context context) {
+ mCornerRadius = TaskCornerRadius.get(context);
+ mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context.getResources());
+
+ mCurrentDrawnCornerRadius = mCornerRadius;
}
- public void setInsets(float left, float top, float right, float bottom) {
- mCurrentDrawnInsets.set(left, top, right, bottom);
+ public FullscreenDrawParams() {
+ mCurrentDrawnCornerRadius = mWindowCornerRadius = mCornerRadius = 0;
}
- public void setCornerRadius(float cornerRadius) {
- mCurrentDrawnCornerRadius = cornerRadius;
+ /**
+ * Sets the progress in range [0, 1]
+ */
+ public void setProgress(float fullscreenProgress, float parentScale, int previewWidth,
+ DeviceProfile dp, PreviewPositionHelper pph) {
+ boolean isMultiWindowMode = dp.isMultiWindowMode;
+ RectF insets = pph.getInsetsToDrawInFullscreen(isMultiWindowMode);
+
+ float currentInsetsLeft = insets.left * fullscreenProgress;
+ float currentInsetsRight = insets.right * fullscreenProgress;
+ mCurrentDrawnInsets.set(currentInsetsLeft, insets.top * fullscreenProgress,
+ currentInsetsRight, insets.bottom * fullscreenProgress);
+ float fullscreenCornerRadius = isMultiWindowMode ? 0 : mWindowCornerRadius;
+
+ mCurrentDrawnCornerRadius =
+ Utilities.mapRange(fullscreenProgress, mCornerRadius, fullscreenCornerRadius)
+ / parentScale;
+
+ // We scaled the thumbnail to fit the content (excluding insets) within task view width.
+ // Now that we are drawing left/right insets again, we need to scale down to fit them.
+ if (previewWidth > 0) {
+ mScale = previewWidth / (previewWidth + currentInsetsLeft + currentInsetsRight);
+ }
}
- public void setScale(float scale) {
- mScale = scale;
- }
}
}
diff --git a/quickstep/res/drawable-v28/back_gesture_tutorial_action_button_background.xml b/quickstep/res/drawable-v28/gesture_tutorial_action_button_background.xml
similarity index 90%
rename from quickstep/res/drawable-v28/back_gesture_tutorial_action_button_background.xml
rename to quickstep/res/drawable-v28/gesture_tutorial_action_button_background.xml
index cd30ef7075..57423c2ffc 100644
--- a/quickstep/res/drawable-v28/back_gesture_tutorial_action_button_background.xml
+++ b/quickstep/res/drawable-v28/gesture_tutorial_action_button_background.xml
@@ -16,5 +16,5 @@
-
+
\ No newline at end of file
diff --git a/quickstep/res/drawable/back_gesture_tutorial_action_button_background.xml b/quickstep/res/drawable/gesture_tutorial_action_button_background.xml
similarity index 90%
rename from quickstep/res/drawable/back_gesture_tutorial_action_button_background.xml
rename to quickstep/res/drawable/gesture_tutorial_action_button_background.xml
index d7b910273a..3f3b288e2d 100644
--- a/quickstep/res/drawable/back_gesture_tutorial_action_button_background.xml
+++ b/quickstep/res/drawable/gesture_tutorial_action_button_background.xml
@@ -16,5 +16,5 @@
-
+
\ No newline at end of file
diff --git a/quickstep/res/drawable/back_gesture_tutorial_close_button.xml b/quickstep/res/drawable/gesture_tutorial_close_button.xml
similarity index 100%
rename from quickstep/res/drawable/back_gesture_tutorial_close_button.xml
rename to quickstep/res/drawable/gesture_tutorial_close_button.xml
diff --git a/quickstep/res/drawable/home_gesture.xml b/quickstep/res/drawable/home_gesture.xml
new file mode 100644
index 0000000000..c253b7e5c3
--- /dev/null
+++ b/quickstep/res/drawable/home_gesture.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/quickstep/res/layout/back_gesture_tutorial_fragment.xml b/quickstep/res/layout/back_gesture_tutorial_fragment.xml
deleted file mode 100644
index d8c25bd4d0..0000000000
--- a/quickstep/res/layout/back_gesture_tutorial_fragment.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/quickstep/res/layout/back_gesture_tutorial_activity.xml b/quickstep/res/layout/gesture_tutorial_activity.xml
similarity index 87%
rename from quickstep/res/layout/back_gesture_tutorial_activity.xml
rename to quickstep/res/layout/gesture_tutorial_activity.xml
index e894e893c3..4dc8913ef5 100644
--- a/quickstep/res/layout/back_gesture_tutorial_activity.xml
+++ b/quickstep/res/layout/gesture_tutorial_activity.xml
@@ -14,6 +14,6 @@
limitations under the License.
-->
\ No newline at end of file
diff --git a/quickstep/res/layout/gesture_tutorial_fragment.xml b/quickstep/res/layout/gesture_tutorial_fragment.xml
new file mode 100644
index 0000000000..69481ad49f
--- /dev/null
+++ b/quickstep/res/layout/gesture_tutorial_fragment.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/quickstep/res/layout/overview_actions.xml b/quickstep/res/layout/overview_actions.xml
deleted file mode 100644
index ad5efb6ae0..0000000000
--- a/quickstep/res/layout/overview_actions.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/quickstep/res/layout/overview_actions_container.xml b/quickstep/res/layout/overview_actions_container.xml
index 328c20ba4f..e163991eaf 100644
--- a/quickstep/res/layout/overview_actions_container.xml
+++ b/quickstep/res/layout/overview_actions_container.xml
@@ -16,8 +16,48 @@
-->
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/overview_actions_height"
+ android:layout_gravity="center_horizontal|bottom"
+ android:layout_marginLeft="@dimen/overview_actions_horizontal_margin"
+ android:layout_marginRight="@dimen/overview_actions_horizontal_margin" >
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index 64b8e2c3b1..e24da07509 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -22,9 +22,7 @@
"Verdeelde skerm"
"Speld vas"
"Vormvry"
- "Oorsig"
"Geen onlangse items nie"
- "Maak toe"
"Programgebruikinstellings"
"Vee alles uit"
"Onlangse programme"
@@ -34,4 +32,18 @@
"Programvoorstelle"
"Alle programme"
"Jou voorspelde programme"
+ "Kry maklik toegang tot jou mees gebruikte programme"
+ "Pixel voorspel watter programme jy volgende nodig sal hê, direk van jou tuisskerm af. Tik om op te stel."
+ "Kry programvoorstelle in die onderste ry van jou tuisskerm"
+ "Kry maklik toegang tot jou programme wat die meeste gebruik word, direk van die tuisskerm af. Voorstelle sal verander op grond van jou roetines. Programme in die onderste ry sal opskuif na jou tuisskerm."
+ "Kry maklik toegang tot jou programme wat die meeste gebruik word, direk van die tuisskerm af. Voorstelle sal verander op grond van jou roetines. Programme in die onderste ry sal na \'n nuwe vouer toe skuif."
+ "Kry programvoorstelle"
+ "Nee, dankie"
+ "Instellings"
+ "Programme wat die meeste gebruik word, verskyn hier, en verander op grond van roetines"
+ "Sleep programme van die onderste ry af om programvoorstelle te kry"
+ "Programvoorstelle is in leë spasie bygevoeg"
+ "Voorspelde program: %1$s"
+ "Deel"
+ "Skermkiekie"
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index 3daa92226c..a9de58a6d2 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -22,16 +22,28 @@
"የተከፈለ ማያ ገጽ"
"ሰካ"
"ነጻ ቅጽ"
- "ማጠቃለያ"
"ምንም የቅርብ ጊዜ ንጥሎች የሉም"
- "ዝጋ"
"የመተግበሪያ አጠቃቀም ቅንብሮች"
"ሁሉንም አጽዳ"
"የቅርብ ጊዜ መተግበሪያዎች"
"%1$s፣ %2$s"
"< 1 ደቂቃ"
"ዛሬ %1$s ቀርቷል"
- "የመተግበሪያ ጥቆማዎች"
+ "የመተግበሪያ አስተያየቶች"
"ሁሉም መተግበሪያዎች"
"የእርስዎ የሚገመቱ መተግበሪያዎች"
+ "በብዛት ስራ ላይ የዋሉ መተግበሪያዎችዎን በቀላሉ ይድረሱ"
+ "Pixel እርስዎ ቀጥለው የሚፈልጓቸውን መተግበሪያዎች ይገምታል፣ በዚያው በመነሻ ገጽዎ ላይ። ለማዋቀር መታ ያድርጉ።"
+ "በመነሻ ገጽዎ ታችኛው ረድፍ ላይ የመተግበሪያ አስተያየት ጥቆማዎችን ያግኙ"
+ "በጣም ስራ ላይ የዋሉ መተግበሪያዎችዎን በቀላሉ ከመነሻ ገጹ ሆነው ይድረሱባቸው። የአስተያየት ጥቆማዎች በእርስዎ ዕለት ተዕለት ተግባራት ላይ በመመስረት ይቀየራሉ። በታችኛው ረድፍ ላይ ያሉ መተግበሪያዎች ወደ መነሻ ገጽዎ ይወሰዳሉ።"
+ "በጣም ስራ ላይ የዋሉ መተግበሪያዎችዎን በቀላሉ ከመነሻ ገጹ ሆነው ይድረሱባቸው። የአስተያየት ጥቆማዎች በእርስዎ ዕለት ተዕለት ተግባራት ላይ በመመስረት ይቀየራሉ። በታችኛው ረድፍ ላይ ያሉ መተግበሪያዎች ወደ አዲስ አቃፊ ይወሰዳሉ።"
+ "የመተግበሪያ አስተያየት ጥቆማዎችን አግኝ"
+ "አይ፣ አመሰግናለሁ"
+ "ቅንብሮች"
+ "በብዛት ስራ ላይ የዋሉ መተግበሪያዎች እዚህ ይመጣሉ፣ እና በዕለት ተዕለት ተግባራት ላይ በመመስረት ይቀየራሉ"
+ "የመተግበሪያ ጥቆማዎችን ለማግኘት መተግበሪያዎችን ከታችኛው ረድፍ ይጎትቱ"
+ "የመተግበሪያ አስተያየት ጥቆማዎች ወደ ባዶ ቦታ ታክለዋል"
+ "የተገመተው መተግበሪያ፦ %1$s"
+ "አጋራ"
+ "ቅጽበታዊ ገጽ እይታ"
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index b036bc1ebd..99b829fad8 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -22,16 +22,28 @@
"تقسيم الشاشة"
"تثبيت"
"شكل مجاني"
- "نظرة عامة"
"ليست هناك عناصر تم استخدامها مؤخرًا"
- "إغلاق"
"إعدادات استخدام التطبيق"
"محو الكل"
"التطبيقات المستخدمة مؤخرًا"
"%1$s، %2$s"
"أقل من دقيقة"
"يتبقى اليوم %1$s."
- "اقتراحات التطبيقات"
+ "التطبيقات المقترحة"
"جميع التطبيقات"
"تطبيقاتك المتوقّعة"
+ "الوصول بسهولة إلى التطبيقات الأكثر استخدامًا"
+ "يتوقع هاتف Pixel التطبيقات التي ستحتاج إليها بعد ذلك من الشاشة الرئيسية مباشرةً. انقر للإعداد."
+ "تلقّي التطبيقات المقترحة من الصف الأسفل في الشاشة الرئيسية"
+ "يمكنك الوصول إلى التطبيقات الأكثر استخدامًا بسهولة من الشاشة الرئيسية مباشرةً. سيتم تغيير الاقتراحات استنادًا إلى سلاسل الإجراءات. سيتم نقل التطبيقات من الصف الأسفل للأعلى في الشاشة الرئيسية."
+ "يمكنك الوصول إلى التطبيقات الأكثر استخدامًا بسهولة من الشاشة الرئيسية مباشرةً. سيتم تغيير الاقتراحات استنادًا إلى سلاسل الإجراءات. سيتم نقل التطبيقات من الصف الأسفل إلى مجلد جديد."
+ "تلقّي اقتراحات عن تطبيقات"
+ "لا، شكرًا"
+ "الإعدادات"
+ "تظهر هنا التطبيقات الأكثر استخدامًا، ويستند التغيير إلى سلاسل الإجراءات."
+ "يمكنك سحب التطبيقات من الصف الأسفل لتلقّي اقتراحات."
+ "تمت إضافة التطبيقات المقترحة إلى مساحة فارغة."
+ "التطبيق المتوقع: %1$s"
+ "مشاركة"
+ "لقطة شاشة"
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index c188493e59..58a04a9431 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -22,16 +22,28 @@
"বিভাজিত স্ক্ৰীণ"
"পিন"
"Freeform"
- "অৱলোকন"
"কোনো শেহতীয়া বস্তু নাই"
- "বন্ধ কৰক"
"এপে ব্যৱহাৰ কৰা ডেটাৰ ছেটিংসমূহ"
"সকলো মচক"
"শেহতীয়া এপসমূহ"
"%1$s, %2$s"
"< ১ মিনিট"
"আজি %1$s বাকী আছ"
- "এপৰ পৰামৰ্শসমূহ"
+ "এপ চাজেশ্বন"
"সকলো এপ্"
"আপোনাৰ অনুমানিক এপ্"
+ "আপোনাৰ সকলোতকৈ বেছিকৈ ব্যৱহৃত এপ্সমূহ সহজে এক্সেছ কৰক"
+ "আপোনাক আপোনাৰ গৃহ স্ক্ৰীনত পৰৱর্তী সময়ত কোনবোৰ এপ্ আৱশ্যক হ\'ব সেয়া Pixelএ অনুমান কৰে। ছেট আপ কৰিবলৈ টিপক।"
+ "আপোনাৰ গৃহ স্ক্ৰীনৰ একেবাৰে তলৰ শাৰীটোত এপৰ পৰামর্শসমূহ পাওক"
+ "আপোনাৰ সকলোতকৈ বেছিকৈ ব্যৱহৃত এপ্সমূহ গৃহ স্ক্ৰীনতে সহজে এক্সেছ কৰক। আপোনাৰ ৰুটিনসমূহৰ ভিত্তিত পৰামর্শসমূহ সলনি হ\'ব। একেবাৰে তলৰ শাৰীটোত থকা এপ্সমূহ ওপৰৰ আপোনাৰ গৃহ স্ক্ৰীনলৈ যাব।"
+ "আপোনাৰ সকলোতকৈ বেছিকৈ ব্যৱহৃত এপ্সমূহ গৃহ স্ক্ৰীনতে সহজে এক্সেছ কৰক। আপোনাৰ ৰুটিনসমূহৰ ভিত্তিত পৰামর্শসমূহ সলনি হ\'ব। একেবাৰে তলৰ শাৰীটোত থকা এপ্সমূহ এটা নতুন ফ\'ল্ডাৰলৈ যাব।"
+ "এপৰ পৰামর্শসমূহ পাওক"
+ "নালাগে, ধন্যবাদ"
+ "ছেটিংসমূহ"
+ "সকলোতকৈ বেছিকৈ ব্যৱহৃত এপ্সমূহ ইয়াত প্ৰদর্শিত হয় আৰু ৰুটিনসমূহ ওপৰত ভিত্তি কৰি সলনি হয়"
+ "এপৰ পৰামর্শসমূহ পাবলৈ একেবাৰে তলৰ শাৰীত থকা এপ্সমূহ টানি আঁতৰাওক"
+ "খালী ঠাইত এপৰ পৰামর্শসমূহ যোগ কৰা হ\'ল"
+ "পূৰ্বানুমান কৰা এপ্: %1$s"
+ "শ্বেয়াৰ কৰক"
+ "স্ক্ৰীনশ্বট"
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index aa8fa536ac..1b1a4e874c 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -22,9 +22,7 @@
"Bölünmüş ekran"
"Sancın"
"Sərbəst rejim"
- "İcmal"
"Son elementlər yoxdur"
- "Bağlayın"
"Tətbiq istifadə ayarları"
"Hamısını silin"
"Son tətbiqlər"
@@ -34,4 +32,18 @@
"Tətbiq təklifləri"
"Bütün tətbiqlər"
"Təklif edilən tətbiqlər"
+ "Ən çox istifadə etdiyiniz tətbiqlərə asanlıqla daxil olun"
+ "Pixel növbəti dəfə ehtiyacınız olacaq tətbiqləri birbaşa Ana ekranda proqnozlaşdırır. Ayarlamaq üçün toxunun."
+ "Ana ekranın aşağı sırasında tətbiq təklifləri alın"
+ "Birbaşa Ana ekrandan ən çox istifadə edilən tətbiqlərə asanlıqla daxil olun. Təkliflər rejimlərinizə uyğun olaraq dəyişəcək. Aşağı sıradakı tətbiqlər Ana ekrana köçürüləcək."
+ "Birbaşa Əsas səhifədən ən çox istifadə edilən tətbiqlərə asanlıqla daxil olun. Təkliflər rejimlərinizə uyğun olaraq dəyişəcək. Aşağı sıradakı tətbiqlər yeni qovluğa köçürüləcək."
+ "Tətbiq təklifləri əldə edin"
+ "Xeyr, təşəkkür"
+ "Ayarlar"
+ "Ən çox istifadə edilən tətbiqlər burada görünür və rejimlərə uyğun olaraq dəyişir"
+ "Tətbiq təklifləri əldə etmək üçün tətbiqləri aşağı sıradan kənara sürüşdürün"
+ "Tətbiq təklifləri boş sahəyə əlavə edildi"
+ "Proqnozlaşdırılan tətbiq: %1$s"
+ "Paylaşın"
+ "Ekran şəkli"
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index fbbe9d2dc5..7d222e5244 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -22,9 +22,7 @@
"Podeljeni ekran"
"Zakači"
"Slobodni oblik"
- "Pregled"
"Nema nedavnih stavki"
- "Zatvori"
"Podešavanja korišćenja aplikacije"
"Obriši sve"
"Nedavne aplikacije"
@@ -34,4 +32,18 @@
"Predlozi aplikacija"
"Sve aplikacije"
"Predviđene aplikacije"
+ "Lako pristupajte aplikacijama koje najčešće koristite"
+ "Pixel predviđa koje će vam aplikacije sledeće trebati i stavlja ih na početni ekran. Dodirnite da biste podesili."
+ "Dobijajte predloge aplikacija u donjem redu početnog ekrana"
+ "Lako pristupajte aplikacijama koje najčešće koristite direktno sa početnog ekrana. Predlozi se menjaju na osnovu upotrebe. Aplikacije iz donjeg reda se premeštaju nagore na početni ekran."
+ "Lako pristupajte aplikacijama koje najčešće koristite direktno sa početnog ekrana. Predlozi se menjaju na osnovu upotrebe. Aplikacije iz donjeg reda se premeštaju u nov direktorijum."
+ "Prikazuj predloge aplikacija"
+ "Ne, hvala"
+ "Podešavanja"
+ "Ovde se prikazuju najčešće korišćene aplikacije i menjaju se u zavisnosti od upotrebe"
+ "Prevucite aplikacije iz donjeg reda da biste dobili predloge"
+ "Predlozi aplikacija se dodaju na prazno mesto"
+ "Predviđamo aplikaciju: %1$s"
+ "Deli"
+ "Napravi snimak ekrana"
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index c4a277267c..8e17867b99 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -22,9 +22,7 @@
"Падзяліць экран"
"Замацаваць"
"Адвольная форма"
- "Агляд"
"Няма новых элементаў"
- "Закрыць"
"Налады выкарыстання праграмы"
"Ачысціць усё"
"Нядаўнія праграмы"
@@ -34,4 +32,18 @@
"Прапановы праграм"
"Усе праграмы"
"Вашы праграмы з падказак"
+ "Атрымлiвайце прамы доступ да праграм, якімі вы карыстаецеся найбольш часта"
+ "Pixel падказвае, якія праграмы могуць спатрэбіцца вам далей, і памяшчае іх на Галоўны экран. Дакраніцеся, каб наладзіць."
+ "Атрымлівайце прапановы праграм у ніжнім радку на Галоўным экране."
+ "Атрымлiвайце доступ да праграм, якімі вы карыстаецеся найбольш часта, непасрэдна з Галоўнага экрана. Прапановы будуць змяняцца ў залежнасці ад вашых дзеянняў. Праграмы, якія знаходзяцца ў ніжнім радку, будуць перамешчаны на Галоўны экран."
+ "Атрымлiвайце просты доступ да праграм, якімі вы карыстаецеся найбольш часта, непасрэдна з Галоўнага экрана. Прапановы будуць змяняцца ў залежнасці ад вашых дзеянняў. Праграмы, якія знаходзяцца ў ніжнім радку, будуць перамешчаны ў новую папку."
+ "Атрымаць прапановы праграм"
+ "Не, дзякуй"
+ "Налады"
+ "Тут з\'яўляюцца праграмы, якімі вы карыстаецеся найбольш часта. Гэты спіс змяняецца на падставе вашых дзеянняў"
+ "Перацягніце праграмы з ніжняга радку, каб атрымаць прапановы праграм"
+ "Прапановы праграм дададзены на свабоднае месца"
+ "Праграма з падказкі: %1$s"
+ "Абагуліць"
+ "Здымак экрана"
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 9e8c54a9c7..0b629e0935 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -22,9 +22,7 @@
"Разделен екран"
"Фиксиране"
"Свободна форма"
- "Общ преглед"
"Няма скорошни елементи"
- "Затваряне"
"Настройки за използването на приложенията"
"Изчистване на всички"
"Скорошни приложения"
@@ -34,4 +32,18 @@
"Предложения за приложения"
"Всички приложения"
"Предвидени приложения"
+ "Лесен достъп до най-използваните от вас приложения"
+ "Pixel предвижда кои приложения ще са ви нужни в следващия момент и ви ги показва директно на началния екран. Докоснете, за да настроите."
+ "Получавайте предложения за приложения на най-долния ред на началния си екран"
+ "Осъществявайте лесен достъп до най-използваните от вас приложения директно от началния екран. Предложенията ще се променят въз основа на поредиците ви. Приложенията на най-долния ред ще се преместят на началния ви екран."
+ "Осъществявайте лесен достъп до най-използваните от вас приложения директно от началния екран. Предложенията ще се променят въз основа на поредиците ви. Приложенията на най-долния ред ще се преместят в нова папка."
+ "Получаване на предложения за приложения"
+ "Не, благодаря"
+ "Настройки"
+ "Най-използваните приложения се показват тук и се променят въз основа на поредиците"
+ "За да получавате предложения за приложения, с плъзгане премахнете приложенията от най-долния ред"
+ "Предложенията за приложения са добавени на празното място"
+ "Предвидено приложение: %1$s"
+ "Споделяне"
+ "Екранна снимка"
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 57f92e5a0c..298070c783 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -22,9 +22,7 @@
"স্ক্রিন স্প্লিট করুন"
"পিন করুন"
"ফ্রি-ফর্ম"
- "এক নজরে"
"কোনো সাম্প্রতিক আইটেম নেই"
- "বন্ধ করুন"
"অ্যাপ ব্যবহারের সেটিংস"
"সবকিছু খালি করুন"
"সম্প্রতি ব্যবহৃত অ্যাপ"
@@ -34,4 +32,18 @@
"অ্যাপের সাজেশন"
"সব অ্যাপ"
"আপনার প্রয়োজন হতে পারে এমন অ্যাপ"
+ "আপনার সব থেকে ব্যবহার করা অ্যাপ সহজেই অ্যাক্সেস করুন"
+ "Pixel আপনার হোম স্ক্রিনে পরবর্তী প্রয়োজনীয় অ্যাপের পূর্বাভাস দেয়। সেট-আপ করতে ট্যাপ করুন।"
+ "আপনার হোম স্ক্রিনের নিচে সারিতে অ্যাপ সাজেশন পান"
+ "হোম স্ক্রিনের পাশে সব থেকে ব্যবহার করা অ্যাপ সহজেই অ্যাক্সেস করুন। আপনার রুটিনের উপর ভিত্তি করে সাজেশন পরির্তন করা হবে। নিচের সারিতে থাকা অ্যাপ আপনার হোম স্ক্রিনে সরানো হবে।"
+ "হোম স্ক্রিনের পাশে সব থেকে ব্যবহার করা অ্যাপ সহজেই অ্যাক্সেস করুন। আপনার রুটিনের উপর ভিত্তি করে সাজেশন পরির্তন করা হবে। নিচের সারিতে থাকা অ্যাপ নতুন ফোল্ডারে সরানো হবে।"
+ "অ্যাপ সাজেশন পান"
+ "না থাক"
+ "সেটিংস"
+ "সব থেকে বেশি ব্যবহার করা অ্যাপ এখানে দেখানো হয় এবং রুটিনের উপর ভিত্তি করে পরিবর্তন হতে পারে"
+ "অ্যাপ সাজেশন পেতে নিচের সারিতে অ্যাপগুলি টেনে আনুন"
+ "খালি জায়গাতে অ্যাপ সাজেশন যোগ করা হয়েছে"
+ "আপনার প্রয়োজন হতে পারে এমন অ্যাপ: %1$s"
+ "শেয়ার করুন"
+ "স্ক্রিনশট"
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 7968f7cc68..bfc5e5c2bb 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -22,16 +22,28 @@
"Način rada podijeljenog ekrana"
"Zakači"
"Slobodan oblik"
- "Pregled"
"Nema nedavnih stavki"
- "Zatvaranje"
"Postavke korištenja aplikacije"
"Obriši sve"
"Nedavne aplikacije"
"%1$s, %2$s"
"< 1 min"
"Preostalo vrijeme: %1$s"
- "Prijedlozi za aplikacije"
+ "Prijedlozi aplikacija"
"Sve aplikacije"
"Predviđene aplikacije"
+ "Jednostavno pristupite najčešće korištenim aplikacijama"
+ "Pixel predviđa koje će vam aplikacije trebati sljedeće, direktno na početnom ekranu. Dodirnite da postavite."
+ "Primajte prijedloge aplikacija u donjem redu početnog ekrana"
+ "Jednostavno pristupite najčešće korištenim aplikacijama direktno na početnom ekranu. Prijedlozi će se mijenjati na osnovu vaših rutina. Aplikacije koje se nalaze u donjem redu će se premjestiti na početni ekran."
+ "Jednostavno pristupite najčešće korištenim aplikacijama, direktno na početnom ekranu. Prijedlozi će se mijenjati na osnovu vaših rutina. Aplikacije koje se nalaze u donjem redu će se premjestiti u novi folder."
+ "Prikaži prijedloge aplikacija"
+ "Ne, hvala"
+ "Postavke"
+ "Ovdje se prikazuju najčešće korištene aplikacije i njihov prikaz se mijenja na osnovu rutina"
+ "Prevucite aplikacije iz donjeg reda da dobijete prijedloge aplikacija"
+ "Prijedlozi aplikacija su dodani u prazan prostor"
+ "Predviđena aplikacija: %1$s"
+ "Dijeli"
+ "Snimak ekrana"
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index 6420aa8cb8..2a186a554f 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -22,9 +22,7 @@
"Pantalla dividida"
"Fixa"
"Format lliure"
- "Aplicacions recents"
"No hi ha cap element recent"
- "Tanca"
"Configuració d\'ús d\'aplicacions"
"Esborra-ho tot"
"Aplicacions recents"
@@ -34,4 +32,18 @@
"Suggeriments d\'aplicacions"
"Totes les aplicacions"
"Prediccions d\'aplicacions"
+ "Accedeix fàcilment a les aplicacions que més utilitzes"
+ "Pixel prediu les aplicacions que necessitaràs a continuació, directament a la pantalla d\'inici. Toca per configurar."
+ "Obtén suggeriments d\'aplicacions a la fila inferior de la pantalla d\'inici"
+ "Accedeix fàcilment a les aplicacions que més utilitzes des de la pantalla d\'inici. Els suggeriments variaran en funció de la teva rutina. Les aplicacions de la fila inferior pujaran a la pantalla d\'inici."
+ "Accedeix fàcilment a les aplicacions que més utilitzes des de la pantalla d\'inici. Els suggeriments variaran en funció de la teva rutina. Les aplicacions de la fila inferior es mouran a una carpeta nova."
+ "Obtén suggeriments d\'aplicacions"
+ "No, gràcies"
+ "Configuració"
+ "Les aplicacions que més utilitzes apareixen aquí i poden variar en funció de la teva rutina"
+ "Arrossega les aplicacions fora de la fila inferior per obtenir suggeriments d\'aplicacions"
+ "S\'han afegit suggeriments d\'aplicacions en un espai buit"
+ "Predicció d\'aplicació: %1$s"
+ "Comparteix"
+ "Captura de pantalla"
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 194ff87dc5..f80807ed6a 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -22,9 +22,7 @@
"Rozdělená obrazovka"
"PIN"
"Neomezený režim"
- "Přehled"
"Žádné nedávné položky"
- "Zavřít"
"Nastavení využití aplikací"
"Vymazat vše"
"Poslední aplikace"
@@ -34,4 +32,18 @@
"Návrhy aplikací"
"Všechny aplikace"
"Vaše předpovídané aplikace"
+ "Snadný přístup k nejpoužívanějším aplikacím"
+ "Telefon Pixel předvídá, které aplikace budete potřebovat jako další, a zobrazuje je přímo na ploše. Klepnutím zahájíte nastavení."
+ "Nechte si ve spodním řádku na ploše zobrazovat návrhy aplikací"
+ "Mějte nejpoužívanější aplikace k dispozici přímo na ploše. Návrhy se budou měnit v závislosti na sledech činností. Aplikace ve spodním řádku se přesunou na vaši plochu."
+ "Mějte nejpoužívanější aplikace k dispozici přímo na ploše. Návrhy se budou měnit v závislosti na sledech činností. Aplikace ve spodním řádku se přesunou do nové složky."
+ "Zobrazovat návrhy aplikací"
+ "Ne, díky"
+ "Nastavení"
+ "Zde se zobrazují nejpoužívanější aplikace (které se mění podle sledů činností)"
+ "Chcete-li získat návrhy aplikací, přetáhněte aplikace z dolního řádku"
+ "Volné místo bylo vyplněno návrhy aplikací"
+ "Předpokládaná aplikace: %1$s"
+ "Sdílet"
+ "Snímek obrazovky"
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index b43a76eb94..117a14cb5d 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -22,9 +22,7 @@
"Opdel skærm"
"Fastgør"
"Frit format"
- "Oversigt"
"Ingen nye elementer"
- "Luk"
"Indstillinger for appforbrug"
"Ryd alt"
"Seneste apps"
@@ -34,4 +32,18 @@
"Appforslag"
"Alle apps"
"Dine foreslåede apps"
+ "Få nem adgang til dine mest brugte apps"
+ "Pixel forudser, hvilke apps du har brug for, direkte på din startskærm. Tryk for at konfigurere"
+ "Få appforslag på den nederste række af din startskærm"
+ "Få nem adgang til dine mest brugte apps direkte fra startskærmen. Forslagene ændres ud fra dine vaner. Apps i nederste række bliver flyttet op til din startskærm."
+ "Få nem adgang til dine mest brugte apps direkte fra startskærmen. Forslagene ændres ud fra dine vaner. Apps i nederste række bliver flyttet til en ny mappe."
+ "Få appforslag"
+ "Nej tak"
+ "Indstillinger"
+ "De mest brugte apps vises her, og visningen ændres ud fra dine vaner"
+ "Træk apps væk fra den nederste række for at få appforslag"
+ "Appforslag blev føjet til tom plads"
+ "App, du forventes at skulle bruge: %1$s"
+ "Del"
+ "Screenshot"
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 449cc8c11d..1235bdff13 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -22,9 +22,7 @@
"Splitscreen"
"Anpinnen"
"Freeform-Modus"
- "Übersicht"
"Keine kürzlich verwendeten Elemente"
- "Schließen"
"Einstellungen zur App-Nutzung"
"Alle Apps schließen"
"Zuletzt aktive Apps"
@@ -34,4 +32,18 @@
"App-Vorschläge"
"Alle Apps"
"App-Vorschläge für dich"
+ "Einfacher Zugriff auf deine meistverwendeten Apps"
+ "Das Pixel prognostiziert, welche Apps du als nächste brauchst, und setzt diese direkt auf den Startbildschirm. Zum Einrichten tippen."
+ "Lass dir in der unteren Reihe auf deinem Startbildschirm Vorschläge für Apps anzeigen"
+ "Schneller Zugriff auf deine meistverwendeten Apps direkt über den Startbildschirm. Die Vorschläge richten sich nach deiner gewöhnlichen Nutzung. Apps in der unteren Reihe werden nach oben auf den Startbildschirm verschoben."
+ "Schneller Zugriff auf deine meistverwendeten Apps direkt über den Startbildschirm. Die Vorschläge richten sich nach deiner gewöhnlichen Nutzung. Apps in der unteren Reihe werden in einen neuen Ordner verschoben."
+ "App-Vorschläge erhalten"
+ "Nein danke"
+ "Einstellungen"
+ "Hier erscheinen die meistverwendeten Apps. Die Angaben können sich je nach deiner gewöhnlichen Nutzung ändern"
+ "Ziehe Apps aus der unteren Reihe heraus, um Vorschläge für Apps zu bekommen"
+ "App-Vorschläge in freiem Bereich hinzugefügt"
+ "App-Vorhersage: %1$s"
+ "Teilen"
+ "Screenshot"
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 87268df749..f02007a298 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -22,16 +22,28 @@
"Διαχωρισμός οθόνης"
"Καρφίτσωμα"
"Ελεύθερη μορφή"
- "Επισκόπηση"
"Δεν υπάρχουν πρόσφατα στοιχεία"
- "Κλείσιμο"
"Ρυθμίσεις χρήσης εφαρμογής"
"Διαγραφή όλων"
"Πρόσφατες εφαρμογές"
"%1$s, %2$s"
"< 1 λ."
"Απομένουν %1$s σήμερα"
- "Προτάσεις εφαρμογών"
+ "Προτεινόμενες εφαρμογές"
"Όλες οι εφαρμογές"
"Προβλέψεις εφαρμογών"
+ "Εύκολη πρόσβαση στις εφαρμογές που χρησιμοποιείτε περισσότερο"
+ "Το Pixel προβλέπει τις εφαρμογές που θα χρειαστείτε μετά, απευθείας στην αρχική οθόνη. Πατήστε για ρύθμιση."
+ "Δείτε τις προτεινόμενες εφαρμογές στην κάτω σειρά της αρχικής οθόνης"
+ "Αποκτήστε εύκολα πρόσβαση στις εφαρμογές που χρησιμοποιείτε περισσότερο απευθείας από την αρχική οθόνη. Οι προτάσεις θα αλλάζουν με βάση τις ρουτίνες σας. Οι εφαρμογές στην κάτω σειρά θα μετακινηθούν προς τα επάνω στην αρχική οθόνη."
+ "Αποκτήστε εύκολα πρόσβαση στις εφαρμογές που χρησιμοποιείτε περισσότερο, απευθείας από την αρχική οθόνη. Οι προτάσεις θα αλλάζουν με βάση τις ρουτίνες σας. Οι εφαρμογές στην κάτω σειρά θα μεταφερθούν σε νέο φάκελο."
+ "Προβολή προτεινόμενων εφαρμογών"
+ "Όχι, ευχαριστώ"
+ "Ρυθμίσεις"
+ "Οι εφαρμογές που χρησιμοποιείτε περισσότερο εμφανίζονται εδώ και αλλάζουν με βάση τις ρουτίνες"
+ "Σύρετε εφαρμογές μακριά από την κάτω σειρά, για να δείτε τις προτεινόμενες εφαρμογές"
+ "Οι προτεινόμενες εφαρμογές προστέθηκαν στον κενό χώρο"
+ "Εφαρμογή από πρόβλεψη: %1$s"
+ "Κοινοποίηση"
+ "Στιγμιότυπο οθόνης"
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 2d1418e5f4..e396e54f67 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -22,9 +22,7 @@
"Split screen"
"Pin"
"Freeform"
- "Overview"
"No recent items"
- "Close"
"App usage settings"
"Clear all"
"Recent apps"
@@ -34,4 +32,18 @@
"App suggestions"
"All apps"
"Your predicted apps"
+ "Easily access your most-used apps"
+ "Pixel predicts apps that you\'ll need next directly from your home screen. Tap to set up."
+ "Get app suggestions on the bottom row of your home screen"
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will move up to your home screen."
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will be moved to a new folder."
+ "Get app suggestions"
+ "No, thanks"
+ "Settings"
+ "Most-used apps appear here, and change based on routines"
+ "Drag apps off the bottom row to get app suggestions"
+ "App suggestions added to empty space"
+ "Predicted app: %1$s"
+ "Share"
+ "Screenshot"
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
new file mode 100644
index 0000000000..e396e54f67
--- /dev/null
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -0,0 +1,49 @@
+
+
+
+
+ "Split screen"
+ "Pin"
+ "Freeform"
+ "No recent items"
+ "App usage settings"
+ "Clear all"
+ "Recent apps"
+ "%1$s, %2$s"
+ "< 1 minute"
+ "%1$s left today"
+ "App suggestions"
+ "All apps"
+ "Your predicted apps"
+ "Easily access your most-used apps"
+ "Pixel predicts apps that you\'ll need next directly from your home screen. Tap to set up."
+ "Get app suggestions on the bottom row of your home screen"
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will move up to your home screen."
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will be moved to a new folder."
+ "Get app suggestions"
+ "No, thanks"
+ "Settings"
+ "Most-used apps appear here, and change based on routines"
+ "Drag apps off the bottom row to get app suggestions"
+ "App suggestions added to empty space"
+ "Predicted app: %1$s"
+ "Share"
+ "Screenshot"
+
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 2d1418e5f4..e396e54f67 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -22,9 +22,7 @@
"Split screen"
"Pin"
"Freeform"
- "Overview"
"No recent items"
- "Close"
"App usage settings"
"Clear all"
"Recent apps"
@@ -34,4 +32,18 @@
"App suggestions"
"All apps"
"Your predicted apps"
+ "Easily access your most-used apps"
+ "Pixel predicts apps that you\'ll need next directly from your home screen. Tap to set up."
+ "Get app suggestions on the bottom row of your home screen"
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will move up to your home screen."
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will be moved to a new folder."
+ "Get app suggestions"
+ "No, thanks"
+ "Settings"
+ "Most-used apps appear here, and change based on routines"
+ "Drag apps off the bottom row to get app suggestions"
+ "App suggestions added to empty space"
+ "Predicted app: %1$s"
+ "Share"
+ "Screenshot"
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 2d1418e5f4..e396e54f67 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -22,9 +22,7 @@
"Split screen"
"Pin"
"Freeform"
- "Overview"
"No recent items"
- "Close"
"App usage settings"
"Clear all"
"Recent apps"
@@ -34,4 +32,18 @@
"App suggestions"
"All apps"
"Your predicted apps"
+ "Easily access your most-used apps"
+ "Pixel predicts apps that you\'ll need next directly from your home screen. Tap to set up."
+ "Get app suggestions on the bottom row of your home screen"
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will move up to your home screen."
+ "Easily access your most-used apps directly from the home screen. Suggestions will change based on your routines. Apps on the bottom row will be moved to a new folder."
+ "Get app suggestions"
+ "No, thanks"
+ "Settings"
+ "Most-used apps appear here, and change based on routines"
+ "Drag apps off the bottom row to get app suggestions"
+ "App suggestions added to empty space"
+ "Predicted app: %1$s"
+ "Share"
+ "Screenshot"
diff --git a/quickstep/res/values-en-rXC/strings.xml b/quickstep/res/values-en-rXC/strings.xml
new file mode 100644
index 0000000000..be42e7171c
--- /dev/null
+++ b/quickstep/res/values-en-rXC/strings.xml
@@ -0,0 +1,49 @@
+
+
+
+
+ "Split screen"
+ "Pin"
+ "Freeform"
+ "No recent items"
+ "App usage settings"
+ "Clear all"
+ "Recent apps"
+ "%1$s, %2$s"
+ "< 1 minute"
+ "%1$s left today"
+ "App suggestions"
+ "All apps"
+ "Your predicted apps"
+ "Easily access your most-used apps"
+ "Pixel predicts apps youll need next, right on your Home screen. Tap to set up."
+ "Get app suggestions on the bottom row of your Home screen"
+ "Easily access your most-used apps right on the Home screen. Suggestions will change based on your routines. Apps on the bottom row will move up to your Home screen."
+ "Easily access your most-used apps, right on the Home screen. Suggestions will change based on your routines. Apps on the bottom row will move to a new folder."
+ "Get app suggestions"
+ "No thanks"
+ "Settings"
+ "Most-used apps appear here, and change based on routines"
+ "Drag apps off the bottom row to get app suggestions"
+ "App suggestions added to empty space"
+ "Predicted app: %1$s"
+ "Share"
+ "Screenshot"
+
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index 5f5d0bdfe9..f4330eaba9 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -22,16 +22,28 @@
"Pantalla dividida"
"Fijar"
"Formato libre"
- "Recientes"
"No hay elementos recientes"
- "Cerrar"
"Configuración de uso de la app"
"Borrar todo"
"Apps recientes"
"%1$s (%2$s)"
"< 1 minuto"
"Tiempo restante: %1$s"
- "Sugerencias de apps"
+ "Sugerencias de aplicaciones"
"Todas las apps"
"Predicción de tus apps"
+ "Accede fácilmente a las apps que más usas"
+ "Pixel predice las apps que usarás la próxima vez en la pantalla principal. Presiona para configurar esta opción."
+ "Obtén sugerencias de aplicaciones en la fila inferior de la pantalla principal"
+ "Accede fácilmente en la pantalla principal a las apps que más usas. Las sugerencias cambiarán según tus rutinas. Las apps de la fila inferior se moverán hacia arriba en la pantalla principal."
+ "Accede fácilmente a las apps que más usas en la pantalla principal. Las sugerencias cambiarán según tus rutinas. Las apps de la fila inferior se moverán a una nueva carpeta."
+ "Obtén sugerencias de aplicaciones"
+ "No, gracias"
+ "Configuración"
+ "Las apps que más se usan se muestran aquí y cambian según las rutinas"
+ "Arrastra apps fuera de la fila inferior para obtener sugerencias"
+ "Se agregaron sugerencias de aplicaciones a un espacio vacío"
+ "Predicción de app: %1$s"
+ "Compartir"
+ "Captura de pantalla"
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 329286b3bf..2b7f80d26d 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -22,9 +22,7 @@
"Dividir pantalla"
"Fijar"
"Formato libre"
- "Aplicaciones recientes"
- "No hay elementos recientes"
- "Cerrar"
+ "No hay nada reciente"
"Ajustes de uso de la aplicación"
"Borrar todo"
"Aplicaciones recientes"
@@ -34,4 +32,18 @@
"Sugerencias de aplicaciones"
"Todas las aplicaciones"
"Predicción de aplicaciones"
+ "Accede fácilmente a las aplicaciones que más usas"
+ "Pixel predice qué aplicaciones necesitarás a continuación y las pone directamente en tu pantalla de inicio. Toca para configurar."
+ "Haz que aparezcan sugerencias de aplicaciones en la fila inferior de la pantalla de inicio"
+ "Accede fácilmente desde la pantalla de inicio a las aplicaciones que más usas. Las sugerencias cambiarán según tus rutinas. Las aplicaciones de la fila inferior pasarán a mostrarse en la pantalla de inicio."
+ "Accede fácilmente desde la pantalla de inicio a las aplicaciones que más usas. Las sugerencias cambiarán según tus rutinas. Las aplicaciones de la fila inferior se pondrán en una carpeta nueva."
+ "Ver sugerencias de aplicaciones"
+ "No, gracias"
+ "Ajustes"
+ "Las aplicaciones que más usas aparecen aquí, y van variando según tus rutinas"
+ "Mueve aplicaciones de la fila inferior para ver sugerencias de aplicaciones"
+ "Se han añadido sugerencias de aplicaciones a espacios vacíos"
+ "Aplicación sugerida: %1$s"
+ "Compartir"
+ "Hacer captura de pantalla"
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 0577b0f562..1e3fa4eec5 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -22,9 +22,7 @@
"Jagatud ekraan"
"Kinnita"
"Vabavorm"
- "Ülevaade"
"Hiljutisi üksusi pole"
- "Sule"
"Rakenduse kasutuse seaded"
"Sule kõik"
"Hiljutised rakendused"
@@ -34,4 +32,18 @@
"Rakenduste soovitused"
"Kõik rakendused"
"Teie ennustatud rakendused"
+ "Pääsete enim kasutatavatele rakendustele hõlpsasti juurde"
+ "Pixel ennustab otse avakuval, millist rakendust järgmisena kasutate. Puudutage funktsiooni seadistamiseks."
+ "Hankige avakuva alumisel real rakenduste soovitusi"
+ "Pääsete enim kasutatavatele rakendustele hõlpsasti juurde otse avakuvalt. Soovitused muutuvad olenevalt teie rutiinist. Alumisel real olevad rakendused teisaldatakse teie avakuvale."
+ "Pääsete enim kasutatavatele rakendustele hõlpsasti juurde otse avakuvalt. Soovitused muutuvad olenevalt teie rutiinist. Alumisel real olevad rakendused teisaldatakse uude kausta."
+ "Hangi rakenduste soovitusi"
+ "Tänan, ei"
+ "Seaded"
+ "Siin kuvatakse enim kasutatavad rakendused, mis võivad olenevalt rutiinist muutuda."
+ "Rakenduste soovituste hankimiseks lohistage rakendused alumiselt realt ära"
+ "Tühjale kohale lisati rakenduste soovitused"
+ "Ennustatud rakendus: %1$s"
+ "Jaga"
+ "Ekraanipilt"
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index cc26695a60..6f29409d88 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -22,16 +22,28 @@
"تقسیم صفحه"
"پین"
"Freeform"
- "نمای کلی"
"بدون موارد اخیر"
- "بستن"
"تنظیمات استفاده از برنامه"
"پاک کردن همه"
"برنامههای اخیر"
"%1$s، %2$s"
"< ۱ دقیقه"
"%1$s باقیمانده برای امروز"
- "برنامههای پیشنهادی"
+ "پیشنهادهای برنامه"
"همه برنامهها"
"برنامههای پیشبینیشده"
+ "دسترسی آسان به پرکاربردترین برنامهها"
+ "Pixel برنامههایی را که بعداً نیاز خواهید داشت در صفحه اصلی پیشبینی میکند. برای راهاندازی ضربه بزنید."
+ "دریافت پیشنهادهای برنامه در ردیف پایین صفحه اصلی"
+ "بهراحتی در صفحه اصلی به پرکاربردترین برنامهها دسترسی داشته باشید. پیشنهادها براساس روالهایتان تغییر خواهد کرد. برنامههای ردیف پایین در صفحه اصلی به بالا منتقل خواهند شد."
+ "بهراحتی در صفحه اصلی به پرکاربردترین برنامهها دسترسی داشته باشید. پیشنهادها براساس روالهایتان تغییر خواهد کرد. برنامههای ردیف پایین به پوشه جدیدی منتقل خواهند شد."
+ "دریافت پیشنهادهای برنامه"
+ "نه متشکرم"
+ "تنظیمات"
+ "پرکاربردترین برنامهها اینجا ظاهر میشوند و براساس روالها تغییر میکنند"
+ "برای دریافت پیشنهادهای برنامه، برنامهها را به بیرون از ردیف پایین بکشید"
+ "پیشنهادهای برنامه به فضای خالی اضافه شد"
+ "برنامه پیشبینیشده: %1$s"
+ "همرسانی"
+ "نماگرفت"
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index f43433e3a1..d49eb99686 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -22,9 +22,7 @@
"Jaettu näyttö"
"Kiinnitä"
"Vapaamuotoinen"
- "Viimeisimmät"
"Ei viimeaikaisia kohteita"
- "Sulje"
"Sovelluksen käyttöasetukset"
"Poista kaikki"
"Viimeisimmät sovellukset"
@@ -34,4 +32,18 @@
"Sovellusehdotukset"
"Kaikki sovellukset"
"Sovellusennusteet"
+ "Käytetyimpien sovellusten helppo avaaminen"
+ "Pixel ennakoi seuraavaksi tarvitsemasi sovellukset ja näyttää ne kätevästi aloitusnäytöllä. Ota käyttöön napauttamalla."
+ "Näytä sovellusehdotuksia aloitusnäytön alimmaisella rivillä"
+ "Voit avata käytetyimmät sovellukset kätevästi aloitusnäytöltä. Ehdotukset muuttuvat rutiiniesi perusteella. Alimmaisella rivillä olevat sovellukset siirretään aloitusnäytön yläosaan."
+ "Voit avata käytetyimmät sovellukset kätevästi aloitusnäytöltä. Ehdotukset muuttuvat rutiiniesi perusteella. Alimmaisella rivillä olevat sovellukset siirretään uuteen kansioon."
+ "Tilaa sovellusehdotukset"
+ "Ei kiitos"
+ "Asetukset"
+ "Käytetyimmät sovellukset näkyvät täällä ja muuttuvat rutiiniesi perusteella"
+ "Siirrä sovelluksia pois alimmaiselta riviltä, niin voit saada sovellusehdotuksia"
+ "Sovellusehdotuksia lisätty tyhjään kohtaan"
+ "Ennakoitu sovellus: %1$s"
+ "Jaa"
+ "Kuvakaappaus"
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index a9a1cffb6d..b7c27db208 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -22,9 +22,7 @@
"Écran divisé"
"Épingler"
"Forme libre"
- "Aperçu"
"Aucun élément récent"
- "Fermer"
"Paramètres d\'utilisation de l\'application"
"Tout effacer"
"Applications récentes"
@@ -34,4 +32,18 @@
"Suggestions d\'applications"
"Toutes les applications"
"Vos prédictions d\'applications"
+ "Accéder facilement aux applications que vous utilisez le plus"
+ "Le Pixel prédit les applications dont vous aurez besoin ensuite, directement sur votre écran d\'accueil. Touchez pour configurer."
+ "Obtenez des applications suggérées dans la rangée du bas de votre écran d\'accueil"
+ "Accédez facilement aux applications que vous utilisez le plus, directement à l\'écran d\'accueil. Les suggestions changeront en fonction de vos habitudes. Les applications dans la rangée du bas seront déplacées vers votre écran d\'accueil."
+ "Accédez facilement aux applications que vous utilisez le plus, directement à l\'écran d\'accueil. Les suggestions changeront en fonction de vos habitudes. Les applications dans la rangée du bas seront déplacées vers un nouveau dossier."
+ "Obtenir des applications suggérées"
+ "Non merci"
+ "Paramètres"
+ "Les applications les plus utilisées s\'affichent ici et changent en fonction des habitudes"
+ "Sortez des applications de la rangée du bas en les faisant glisser pour obtenir des applications suggérées"
+ "Applications suggérées ajoutées à l\'espace vide"
+ "Application prédite : %1$s"
+ "Partager"
+ "Capture d\'écran"
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index 01dcff202d..b0ea6bfb78 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -22,16 +22,28 @@
"Écran partagé"
"Épingler"
"Format libre"
- "Aperçu"
"Aucun élément récent"
- "Fermer"
"Paramètres de consommation de l\'application"
"Tout effacer"
"Applications récentes"
"%1$s, %2$s"
"< 1 min"
"Encore %1$s aujourd\'hui"
- "Suggestions d\'applications"
+ "Applications suggérées"
"Toutes les applications"
"Applications prévues pour vous"
+ "Accédez facilement à vos applications les plus utilisées"
+ "Pixel prédit les applications dont vous pourriez avoir besoin par la suite et les affiche sur votre écran d\'accueil. Appuyez ici pour configurer ce paramètre."
+ "Retrouvez vos applications suggérées dans la rangée du bas de votre écran d\'accueil"
+ "Accédez facilement aux applications dont vous vous servez le plus, directement depuis l\'écran d\'accueil. Ces suggestions peuvent varier en fonction de vos habitudes d\'utilisation. Les applications de la rangée du bas seront transférées sur votre écran d\'accueil."
+ "Accédez facilement aux applications dont vous vous servez le plus, directement depuis l\'écran d\'accueil. Ces suggestions peuvent varier en fonction de vos habitudes d\'utilisation. Les applications de la rangée du bas seront transférées dans un nouveau dossier."
+ "Activer les applications suggérées"
+ "Non, merci"
+ "Paramètres"
+ "Les applications dont vous vous servez le plus s\'affichent ici (ces suggestions peuvent varier en fonction de vos habitudes d\'utilisation)"
+ "Faites glisser des applications hors de la rangée du bas pour obtenir des applications suggérées"
+ "Vos applications suggérées ont été ajoutées là où il y avait de la place"
+ "Application prédite : %1$s"
+ "Partager"
+ "Faire une capture d\'écran"
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index 356d10d5da..488362f645 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -22,9 +22,7 @@
"Pantalla dividida"
"Fixar"
"Forma libre"
- "Visión xeral"
"Non hai elementos recentes"
- "Pecha a aplicación"
"Configuración do uso de aplicacións"
"Borrar todo"
"Apps recentes"
@@ -34,4 +32,18 @@
"Suxestións de aplicacións"
"Todas as aplicacións"
"As túas aplicacións preditas"
+ "Accede facilmente ás aplicacións que máis utilizas"
+ "O Pixel predí as aplicacións que utilizarás a continuación e móstraas na pantalla de inicio. Toca para configurar."
+ "Recibe suxestións de aplicacións na fila inferior da pantalla de inicio"
+ "Accede facilmente desde a pantalla de inicio ás aplicacións que máis usas. As suxestións irán cambiando en función das túas rutinas. As aplicacións da fila inferior pasarán á pantalla de inicio."
+ "Accede facilmente desde a pantalla de inicio ás aplicacións que máis usas. As suxestións irán cambiando en función das túas rutinas. As aplicacións da fila inferior pasarán a un cartafol novo."
+ "Recibir suxestións de aplicacións"
+ "Non, grazas"
+ "Configuración"
+ "As aplicacións máis usadas aparecen aquí e van cambiando en función das túas rutinas"
+ "Arrastra aplicacións desde a fila inferior para recibir suxestións de aplicacións"
+ "Engadíronse suxestións de aplicacións ao espazo baleiro"
+ "Aplicación predita: %1$s"
+ "Compartir"
+ "Crear captura"
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index 387d509587..0f5a528343 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -22,16 +22,28 @@
"स्क्रीन को दो हिस्सों में बाँटना (स्प्लिट स्क्रीन)"
"पिन करना"
"फ़्रीफ़ॉर्म"
- "खास जानकारी"
"हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है"
- "बंद करें"
"ऐप्लिकेशन इस्तेमाल की सेटिंग"
"सभी ऐप्लिकेशन बंद करें"
"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन"
"%1$s, %2$s"
"<1 मिनट"
"आज %1$s और चलेगा"
- "ऐप्लिकेशन के सुझाव"
+ "सुझाए गए ऐप्लिकेशन"
"सभी ऐप्लिकेशन"
"आपके काम के ऐप्लिकेशन"
+ "सबसे ज़्यादा इस्तेमाल होने वाले ऐप्लिकेशन आसानी से ऐक्सेस करें"
+ "Pixel आपकी होम स्क्रीन पर बताता है कि अब आपको किन ऐप्लिकेशन की ज़रूरत है. सेट अप करने के लिए टैप करें."
+ "अपने होम स्क्रीन की सबसे नीचे वाली पंक्ति में ऐप्लिकेशन के सुझाव पाएं"
+ "सबसे ज़्यादा इस्तेमाल होने वाले ऐप्लिकेशन सीधे होम स्क्रीन पर देखें. ऐप्लिकेशन इस्तेमाल करने के आपके रूटीन के हिसाब से सुझाव बदलते रहते हैं. नीचे की पंक्ति के ऐप्लिकेशन होम स्क्रीन पर आ जाएंगे."
+ "सबसे ज़्यादा इस्तेमाल होने वाले ऐप्लिकेशन, सीधे होम स्क्रीन पर देखें. ऐप्लिकेशन इस्तेमाल करने के आपके रूटीन के हिसाब से सुझाव बदलते रहते हैं. नीचे की पंक्ति के ऐप्लिकेशन एक नए फ़ोल्डर में चले जाएंगे."
+ "ऐप्लिकेशन के बारे में सुझाव पाएं"
+ "रहने दें"
+ "सेटिंग"
+ "सबसे ज़्यादा इस्तेमाल होने वाले ऐप्लिकेशन यहां दिखेंगे. यह ऐप्लिकेशन, आपके इस्तेमाल के रूटीन के हिसाब से बदलते रहते हैं"
+ "नीचे वाली पंक्ति से ऐप्लिकेशन को खींचकर हटाएं, ताकि आप ऐप्लिकेशन के सुझाव पा सकें"
+ "खाली जगह पर ऐप्लिकेशन के सुझाव जोड़े गए"
+ "सुझाया गया ऐप्लिकेशन: %1$s"
+ "शेयर करें"
+ "स्क्रीनशॉट"
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index ab56e57b50..fba88fb7ae 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -22,9 +22,7 @@
"Podijeljeni zaslon"
"Prikvači"
"Slobodni oblik"
- "Pregled"
"Nema nedavnih stavki"
- "Zatvori"
"Postavke upotrebe aplikacija"
"Izbriši sve"
"Nedavne aplikacije"
@@ -34,4 +32,18 @@
"Predložene aplikacije"
"Sve aplikacije"
"Vaše predviđene aplikacije"
+ "Lako pristupite najčešće upotrebljavanim aplikacijama"
+ "Pixel predviđa koje će vam aplikacije trebati sljedeće na početnom zaslonu. Dodirnite da biste ih postavili."
+ "Prikažite predložene aplikacije u donjem retku početnog zaslona"
+ "Lako pristupite najčešće upotrebljavanim aplikacijama s početnog zaslona. Prijedlozi će se mijenjati na temelju vaših rutina. Aplikacije iz donjeg retka pomaknut će se na početni zaslon."
+ "Lako pristupite najčešće upotrebljavanim aplikacijama s početnog zaslona. Prijedlozi će se mijenjati na temelju vaših rutina. Aplikacije iz donjeg retka pomaknut će se u novu mapu."
+ "Nabavite predložene aplikacije"
+ "Ne, hvala"
+ "Postavke"
+ "Ovdje se prikazuju najčešće upotrebljavane aplikacije i mijenjaju se na temelju rutina"
+ "Povucite aplikacije u donjem retku da biste dobili predložene aplikacije"
+ "Predložene aplikacije dodane u prazan prostor"
+ "Predviđena aplikacija: %1$s"
+ "Udio"
+ "Snimka zaslona"
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index dec6ea0158..214c09bc11 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -22,9 +22,7 @@
"Osztott képernyő"
"Rögzítés"
"Szabad forma"
- "Áttekintés"
"Nincsenek mostanában használt elemek"
- "Bezárás"
"Alkalmazáshasználati beállítások"
"Összes törlése"
"Legutóbbi alkalmazások"
@@ -34,4 +32,18 @@
"Alkalmazásjavaslatok"
"Az összes alkalmazás"
"Várható alkalmazások"
+ "Könnyedén hozzáférhet a leggyakrabban használt alkalmazásokhoz"
+ "A Pixel telefon kitalálja, melyik alkalmazásra lesz következőleg szüksége – egyenesen a kezdőképernyőn. Koppintson a beállításhoz."
+ "Alkalmazásjavaslatokat kaphat a kezdőképernyő alsó sorában"
+ "A kezdőképernyőről könnyedén hozzáférhet a leggyakrabban használt alkalmazásokhoz. A javaslatok a rutinjai alapján változni fognak. Az alsó sorban lévő alkalmazások felkerülnek a kezdőképernyőre."
+ "A kezdőképernyőről könnyedén hozzáférhet a leggyakrabban használt alkalmazásokhoz. A javaslatok a rutinjai alapján változni fognak. Az alsó sorban lévő alkalmazások egy új mappába kerülnek."
+ "Alkalmazásjavaslatok kérése"
+ "Köszönöm, nem"
+ "Beállítások"
+ "A leggyakrabban használt alkalmazások jelennek meg itt; a lista a rutinok alapján változhat"
+ "Alkalmazásjavaslatok kéréséhez húzzon ki alkalmazásokat az alsó sorból"
+ "Alkalmazásjavaslatok hozzáadva az üres területhez"
+ "Várható alkalmazás: %1$s"
+ "Megosztás"
+ "Képernyőkép"
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 1656a1444d..6ee036ab78 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -22,9 +22,7 @@
"Տրոհել էկրանը"
"Ամրացնել"
"Կամայական ձև"
- "Ընդհանուր տեղեկություններ"
"Վերջին տարրեր չկան"
- "Փակել"
"Հավելվածի օգտագործման կարգավորումներ"
"Փակել բոլորը"
"Վերջին օգտագործած հավելվածները"
@@ -34,4 +32,18 @@
"Առաջարկվող հավելվածներ"
"Բոլոր հավելվածները"
"Ձեր կանխատեսված հավելվածները"
+ "Արագ բացեք հաճախ օգտագործվող հավելվածները"
+ "Pixel-ը կանխատեսում է, թե որ հավելվածները կարող են ձեզ պետք լինել, և ցուցադրում է դրանք հիմնական էկրանին։ Հպեք՝ կարգավորելու համար։"
+ "Ստացեք հավելվածների առաջարկներ հիմնական էկրանի ներքևում"
+ "Արագ բացեք հաճախ օգտագործվող հավելվածներն անմիջապես հիմնական էկրանից։ Առաջարկները կփոփոխվեն՝ կախված ձեր գործողություններից։ Ներքևում ցուցադրվող հավելվածները կտեղափոխվեն հիմնական էկրանի վերևի մաս։"
+ "Արագ բացեք հաճախ օգտագործվող հավելվածներն անմիջապես հիմնական էկրանից։ Առաջարկները կփոփոխվեն՝ կախված ձեր գործողություններից։ Ներքևում ցուցադրվող հավելվածները կտեղափոխվեն նոր պանակ։"
+ "Ստանալ հավելվածների առաջարկներ"
+ "Ոչ, շնորհակալություն"
+ "Կարգավորումներ"
+ "Հաճախ օգտագործվող հավելվածները ցուցադրվում են այստեղ և փոփոխվում են ըստ ձեր գործողությունների հերթականության։"
+ "Քաշեք հավելվածները ներքևի տողից՝ հավելվածների առաջարկները տեսնելու համար"
+ "Առաջարկվող հավելվածներն ավելացվել են դատարկ տարածքում"
+ "Առաջարկվող հավելված՝ %1$s"
+ "Կիսվել"
+ "Սքրինշոթ անել"
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 6824d16b40..621dc7d5df 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -22,9 +22,7 @@
"Layar terpisah"
"Pasang pin"
"Format bebas"
- "Ringkasan"
"Tidak ada item yang baru dibuka"
- "Tutup"
"Setelan penggunaan aplikasi"
"Hapus semua"
"Aplikasi baru-baru ini"
@@ -34,4 +32,18 @@
"Saran aplikasi"
"Semua aplikasi"
"Aplikasi yang diprediksi"
+ "Mudah mengakses aplikasi yang paling sering digunakan"
+ "Pixel memprediksi aplikasi yang akan diperlukan berikutnya, langsung di Layar utama. Ketuk untuk menyiapkan."
+ "Dapatkan saran aplikasi di baris paling bawah Layar utama"
+ "Mudah mengakses aplikasi yang paling sering digunakan, langsung di Layar utama. Saran akan berubah berdasarkan rutinitas Anda. Aplikasi di baris paling bawah akan berpindah ke atas pada Layar utama."
+ "Mudah mengakses aplikasi yang paling sering digunakan, langsung di Layar utama. Saran akan berubah berdasarkan rutinitas Anda. Aplikasi di baris paling bawah akan berpindah ke folder baru."
+ "Dapatkan saran aplikasi"
+ "Lain kali"
+ "Setelan"
+ "Aplikasi yang paling sering digunakan muncul di sini, dan berubah berdasarkan rutinitas"
+ "Tarik aplikasi dari baris paling bawah untuk mendapatkan saran aplikasi"
+ "Saran aplikasi ditambahkan ke ruang kosong"
+ "Aplikasi yang diprediksi: %1$s"
+ "Bagikan"
+ "Screenshot"
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index f60a2c6802..ebac2f9552 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -22,9 +22,7 @@
"Skipta skjá"
"Festa"
"Frjálst snið"
- "Yfirlit"
"Engin nýleg atriði"
- "Loka"
"Notkunarstillingar forrits"
"Hreinsa allt"
"Nýleg forrit"
@@ -34,4 +32,18 @@
"Tillögur að forritum"
"Öll forrit"
"Spáð forrit"
+ "Hafðu greiðan aðgang að forritunum sem þú notar mest"
+ "Pixel leggur til hvaða forrit þú þarft næst á heimaskjánum sjálfum. Ýttu til að setja upp."
+ "Fáðu tillögur að forritum í neðstu röð heimaskjásins"
+ "Nálgastu forritin sem þú notar mest auðveldlega á heimaskjánum. Tillögurnar breytast í samræmi við rútínurnar þínar. Forrit í neðstu röð færast upp á heimaskjáinn."
+ "Nálgastu forritin sem þú notar mest auðveldlega á heimaskjánum. Tillögurnar breytast í samræmi við rútínurnar þínar. Forrit í neðstu röð færast í nýja möppu."
+ "Fá tillögur að forritum"
+ "Nei, takk"
+ "Áfram"
+ "Mest notuðu forritin birtast hér og breytast í samræmi við rútínur"
+ "Dragðu forrit af neðstu röð til að fá tillögð forrit"
+ "Tillögðum forritum bætt við autt svæði"
+ "Tillaga að forriti: %1$s"
+ "Deila"
+ "Skjámynd"
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 559fdb4b6e..9cb5d24c18 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -22,9 +22,7 @@
"Schermo diviso"
"Blocca"
"Forma libera"
- "Panoramica"
"Nessun elemento recente"
- "Chiudi"
"Impostazioni di utilizzo delle app"
"Cancella tutto"
"App recenti"
@@ -34,4 +32,18 @@
"App suggerite"
"Tutte le app"
"Le app previste"
+ "Accedi facilmente alle app più utilizzate"
+ "Pixel prevede quali app userai e te le mostra sulla schermata Home. Tocca per configurare."
+ "Visualizza app suggerite nella riga inferiore della schermata Home"
+ "Accedi facilmente alle app più utilizzate direttamente dalla schermata Home. I suggerimenti varieranno in base alle tue routine. Le app nella riga inferiore verranno spostate più in alto sulla schermata Home."
+ "Accedi facilmente alle app più utilizzate direttamente dalla schermata Home. I suggerimenti varieranno in base alle tue routine. Le app nella riga inferiore verranno spostate in una nuova cartella."
+ "Visualizza app suggerite"
+ "No, grazie"
+ "Impostazioni"
+ "Le app più utilizzate vengono visualizzate qui e variano in base alle routine"
+ "Trascina le app fuori dalla riga inferiore per visualizzare le app suggerite"
+ "App suggerite aggiunte a uno spazio vuoto"
+ "App prevista: %1$s"
+ "Condividi"
+ "Screenshot"
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 58cab4e0a9..18de9bdbeb 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -22,9 +22,7 @@
"מסך מפוצל"
"הצמדה"
"מצב חופשי"
- "מסכים אחרונים"
"אין פריטים אחרונים"
- "סגירה"
"הגדרות שימוש באפליקציה"
"ניקוי הכול"
"אפליקציות אחרונות"
@@ -34,4 +32,18 @@
"הצעות לאפליקציות"
"כל האפליקציות"
"האפליקציות החזויות שלך"
+ "גישה נוחה לאפליקציות הכי נפוצות ממסך הבית."
+ "ה-Pixel מפעיל חיזוי כדי לדעת מהן האפליקציות הבאות הנדרשות לך ומציג אותן במסך הבית. יש להקיש כדי להגדיר."
+ "קבלת הצעות לאפליקציות בשורה התחתונה של מסך הבית."
+ "גישה נוחה לאפליקציות הכי נפוצות ישירות ממסך הבית. ההצעות ישתנו בהתאם להרגלי השימוש שלך. אפליקציות שמופיעות בשורה התחתונה יעברו למעלה למסך הבית."
+ "גישה נוחה לאפליקציות הכי נפוצות ישירות ממסך הבית. ההצעות ישתנו בהתאם להרגלי השימוש שלך. אפליקציות שמופיעות בשורה התחתונה יעברו למעלה למסך הבית."
+ "קבלת הצעות לאפליקציות"
+ "לא, תודה"
+ "הגדרות"
+ "רוב האפליקציות הכי נפוצות מופיעות כאן ומשתנות בהתאם להרגלי השימוש שלך"
+ "יש לגרור אפליקציות מהשורה התחתונה כדי לקבל הצעות לאפליקציות"
+ "הצעות לאפליקציות נוספו לאזור ריק"
+ "האפליקציות החזויות: %1$s"
+ "שיתוף"
+ "צילום מסך"
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index d3fecde208..47001bf08e 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -22,9 +22,7 @@
"分割画面"
"固定"
"フリーフォーム"
- "概要"
"最近のアイテムはありません"
- "閉じる"
"アプリの使用状況の設定"
"すべてクリア"
"最近使ったアプリ"
@@ -34,4 +32,18 @@
"アプリの候補"
"すべてのアプリ"
"予測されたアプリ"
+ "使用頻度の高いアプリに簡単にアクセス"
+ "Pixel によって、次に必要なアプリが予測され、ホーム画面にすぐに表示されます。タップしてセットアップします。"
+ "ホーム画面の一番下の行でアプリの候補を入手できます"
+ "使用頻度の高いアプリが、ホーム画面にすぐに表示され、簡単にアクセスできるようになります。アプリの候補はルーティンに応じて変わります。ホーム画面で一番下の行にあるアプリが上に移動します。"
+ "使用頻度の高いアプリが、ホーム画面にすぐに表示され、簡単にアクセスできるようになります。アプリの候補はルーティンに応じて変わります。一番下の行にあるアプリが新しいフォルダに移動します。"
+ "アプリの候補を入手"
+ "使用しない"
+ "設定"
+ "使用頻度の高いアプリがここに表示されます(ルーティンに応じて変わります)"
+ "一番下の行からアプリをドラッグしてアプリの候補を入手します"
+ "空いたスペースにアプリの候補が追加されます"
+ "予測されたアプリ: %1$s"
+ "共有"
+ "スクリーンショット"
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index 67b03a754f..37081db5f9 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -22,16 +22,28 @@
"ეკრანის გაყოფა"
"ჩამაგრება"
"თავისუფალი ფორმა"
- "მიმოხილვა"
"ბოლოს გამოყენებული ერთეულები არ არის"
- "დახურვა"
"აპების გამოყენების პარამეტრები"
"ყველას გასუფთავება"
"ბოლოდროინდელი აპები"
"%1$s, %2$s"
"< 1 წუთი"
"დღეს დარჩენილია %1$s"
- "აპების შემოთავაზებები"
+ "აპის შემოთავაზებები"
"ყველა აპი"
"თქვენი პროგნოზირებული აპები"
+ "მარტივად იქონიეთ წვდომა ყველაზე ხშირად გამოყენებულ აპებზე"
+ "Pixel წინასწარმეტყველებს, თუ რომელი აპის გამოყენება დაგჭირდებათ შემდეგ ჯერზე, პირდაპირ მთავარი ეკრანიდან. შეეხეთ დასაყენებლად."
+ "მიიღეთ აპის შეთავაზებები მთავარი ეკრანის ქვედა რიგში"
+ "მარტივად იქონიეთ ყველაზე ხშირად გამოყენებულ აპებზე წვდომა მთავარი ეკრანიდან. შეთავაზებები შეიცვლება თქვენი რუტინების მიხედვით. მოხდება ქვედა რიგში არსებული აპების მთავარ ეკრანზე გადატანა."
+ "მარტივად იქონიეთ ყველაზე ხშირად გამოყენებულ აპებზე წვდომა მთავარი ეკრანიდან. შეთავაზებები შეიცვლება თქვენი რუტინების მიხედვით. მოხდება ქვედა რიგში არსებული აპების ახალ საქაღალდეში გადატანა."
+ "აპის შეთავაზებების მიღება"
+ "არა, გმადლობთ"
+ "პარამეტრები"
+ "ყველაზე ხშირად გამოყენებული აპები აქ ჩანს და ცვალებადობს რუტინების მიხედვით"
+ "გადაიტანეთ აპები ეკრანის ქვედა რიგში, რათა აპის შეთავაზებები მიიღოთ"
+ "აპის შეთავაზებები დამატებულია ცარიელ სივრცეში"
+ "ნაწინასწარმეტყველები აპი: %1$s"
+ "გაზიარება"
+ "ეკრანის ანაბეჭდი"
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index a9fcbedb20..7cd99df4d5 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -22,16 +22,28 @@
"Экранды бөлу"
"Бекіту"
"Еркін форма"
- "Шолу"
"Соңғы элементтер жоқ"
- "Жабу"
"Қолданбаны пайдалану параметрлері"
"Барлығын өшіру"
"Соңғы пайдаланылған қолданбалар"
"%1$s, %2$s"
"< 1 мин"
"Бүгін %1$s қалды"
- "Қолданба ұсыныстары"
+ "Ұсынылған қолданбалар"
"Барлық қолданбалар"
"Ұсынылатын қолданбалар"
+ "Жиі пайдаланылатын қолданбаларға оңай кіру"
+ "Pixel сізге қажет болуы мүмкін қолданбаларды болжап, оларды негізгі экранда көрсетеді. Реттеу үшін түртіңіз."
+ "Негізгі экранның төменгі жолында ұсынылған қолданбаларды алу"
+ "Жиі пайдаланылатын қолданбаларға негізгі экраннан оңай кіріңіз. Ұсыныстар әрекеттер тізімі негізінде өзгереді. Төменгі жолдағы қолданбалар негізгі экраныңызға қарай жоғары жылжиды."
+ "Жиі пайдаланылатын қолданбаларға негізгі экраннан оңай кіріңіз. Ұсыныстар әрекеттер тізімі негізінде өзгереді. Төмендегі қолданбалар жаңа қалтаға жылжиды."
+ "Ұсынылған қолданбаларды көру"
+ "Жоқ, рақмет"
+ "Параметрлер"
+ "Жиі пайдаланылатын қолданбалар осы жерде көрсетіледі және әрекеттер тізімі негізінде өзгереді."
+ "Ұсынылған қолданбаларды алу үшін қолданбаларды төменгі жолдан жылжытыңыз."
+ "Ұсынылған қолданбалар бос орынға қосылды."
+ "Болжалды қолданба: %1$s"
+ "Бөлісу"
+ "Скриншот"
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index c422041e7a..ff44986b4a 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -22,9 +22,7 @@
"មុខងារបំបែកអេក្រង់"
"ដៅ"
"មុខងារទម្រង់សេរី"
- "ទិដ្ឋភាពរួម"
"មិនមានធាតុថ្មីៗទេ"
- "បិទ"
"ការកំណត់ការប្រើប្រាស់កម្មវិធី"
"សម្អាតទាំងអស់"
"កម្មវិធីថ្មីៗ"
@@ -34,4 +32,18 @@
"ការណែនាំកម្មវិធី"
"កម្មវិធីទាំងអស់"
"កម្មវិធីដែលបានព្យាកររបស់អ្នក"
+ "ចូលប្រើកម្មវិធីដែលអ្នកប្រើញឹកញាប់បំផុតបានយ៉ាងងាយស្រួល"
+ "Pixel ព្យាករកម្មវិធីដែលអ្នកនឹងត្រូវការបន្ទាប់ នៅលើអេក្រង់ដើមរបស់អ្នកផ្ទាល់។ ចុចដើម្បីរៀបចំ។"
+ "ទទួលបានការណែនាំកម្មវិធីនៅជួរខាងក្រោមនៃអេក្រង់ដើមរបស់អ្នក"
+ "ចូលប្រើកម្មវិធីដែលអ្នកប្រើញឹកញាប់បំផុតបានយ៉ាងងាយស្រួលនៅលើអេក្រង់ដើមផ្ទាល់។ ការណែនាំនឹងប្រែប្រួលទៅតាមទម្លាប់របស់អ្នក។ កម្មវិធីនៅជួរខាងក្រោមនឹងផ្លាស់ទីឡើងទៅអេក្រង់ដើមរបស់អ្នក។"
+ "ចូលប្រើកម្មវិធីដែលអ្នកប្រើញឹកញាប់បំផុតបានយ៉ាងងាយស្រួលនៅលើអេក្រង់ដើមផ្ទាល់។ ការណែនាំនឹងប្រែប្រួលទៅតាមទម្លាប់របស់អ្នក។ កម្មវិធីនៅជួរខាងក្រោមនឹងផ្លាស់ទីទៅថតថ្មី។"
+ "ទទួលបានការណែនាំកម្មវិធី"
+ "ទេ អរគុណ"
+ "ការកំណត់"
+ "កម្មវិធីដែលប្រើញឹកញាប់បំផុតបង្ហាញនៅទីនេះ និងប្រែប្រួលទៅតាមទម្លាប់"
+ "អូសកម្មវិធីចេញពីជួរខាងក្រោម ដើម្បីទទួលបានការណែនាំកម្មវិធី"
+ "បានបញ្ចូលការណែនាំកម្មវិធីទៅក្នុងកន្លែងទំនេរ"
+ "កម្មវិធីដែលបានព្យាករ៖ %1$s"
+ "ចែករំលែក"
+ "រូបថតអេក្រង់"
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index 52782610b9..c00fd9a3ba 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -22,9 +22,7 @@
"ಪರದೆಯನ್ನು ಬೇರ್ಪಡಿಸಿ"
"ಪಿನ್ ಮಾಡಿ"
"ಮುಕ್ತಸ್ವರೂಪ"
- "ಅವಲೋಕನ"
"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"
- "ಮುಚ್ಚಿ"
"ಆ್ಯಪ್ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳು"
"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"
"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳು"
@@ -34,4 +32,18 @@
"ಆ್ಯಪ್ ಸಲಹೆಗಳು"
"ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು"
"ನಿಮ್ಮ ಸಂಭವನೀಯ ಆ್ಯಪ್ಗಳು"
+ "ನೀವು ಹೆಚ್ಚು ಬಳಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಸುಲಭವಾಗಿ ಪ್ರವೇಶಿಸಿ"
+ "ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿಯೇ ನಿಮಗೆ ಮುಂದೆ ಅಗತ್ಯವಿರುವ ಆ್ಯಪ್ಗಳ ಕುರಿತು Pixel ಮುನ್ಸೂಚನೆ ನೀಡುತ್ತದೆ. ಸೆಟಪ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."
+ "ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ನ ಕೆಳಭಾಗದ ಸಾಲಿನಲ್ಲಿ ಆ್ಯಪ್ ಸಲಹೆಗಳನ್ನು ಪಡೆಯಿರಿ"
+ "ಹೋಮ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿಯೇ ನೀವು ಹೆಚ್ಚು ಬಳಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಸುಲಭವಾಗಿ ಪ್ರವೇಶಿಸಿ. ನಿಮ್ಮ ದಿನಚರಿಯನ್ನು ಆಧರಿಸಿ ಸಲಹೆಗಳು ಬದಲಾಗುತ್ತವೆ. ಕೆಳಭಾಗದ ಸಾಲಿನಲ್ಲಿನ ಆ್ಯಪ್ಗಳು ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಚಲಿಸುತ್ತವೆ."
+ "ಹೋಮ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿಯೇ ನೀವು ಹೆಚ್ಚು ಬಳಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಸುಲಭವಾಗಿ ಪ್ರವೇಶಿಸಿ. ನಿಮ್ಮ ದಿನಚರಿಯನ್ನು ಆಧರಿಸಿ ಸಲಹೆಗಳು ಬದಲಾಗುತ್ತವೆ. ಕೆಳಭಾಗದ ಸಾಲಿನಲ್ಲಿನ ಆ್ಯಪ್ಗಳು ಹೊಸ ಫೋಲ್ಡರ್ಗೆ ಚಲಿಸುತ್ತವೆ."
+ "ಆ್ಯಪ್ ಸಲಹೆಗಳನ್ನು ಪಡೆಯಿರಿ"
+ "ಬೇಡ"
+ "ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು"
+ "ಹೆಚ್ಚು ಬಳಸಿದ ಆ್ಯಪ್ಗಳು ಇಲ್ಲಿ ಕಾಣಿಸುತ್ತವೆ ಮತ್ತು ದಿನಚರಿಯನ್ನು ಆಧರಿಸಿ ಬದಲಾಗುತ್ತದೆ"
+ "ಆ್ಯಪ್ ಸಲಹೆಗಳನ್ನು ಪಡೆಯಲು, ಆ್ಯಪ್ಗಳನ್ನು ಕೆಳಭಾಗದ ಸಾಲಿನಿಂದ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"
+ "ಆ್ಯಪ್ ಸಲಹೆಗಳನ್ನು ಖಾಲಿ ಸ್ಥಳಕ್ಕೆ ಸೇರಿಸಲಾಗಿದೆ"
+ "ಶಿಫಾರಸು ಮಾಡಿದ ಆ್ಯಪ್: %1$s"
+ "ಹಂಚಿಕೊಳ್ಳಿ"
+ "ಸ್ಕ್ರೀನ್ಶಾಟ್"
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 7a8e6a1f9a..26510e9848 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -22,16 +22,28 @@
"화면 분할"
"고정"
"자유 형식"
- "최근 사용"
"최근 항목이 없습니다."
- "닫기"
"앱 사용 설정"
"모두 삭제"
"최근 앱"
"%1$s, %2$s"
"< 1분"
"오늘 %1$s 남음"
- "앱 추천"
+ "앱 제안"
"모든 앱"
"추천 앱"
+ "가장 많이 사용한 앱에 간편하게 액세스"
+ "Pixel에서 다음번에 사용할 앱을 예상하여 홈 화면에 바로 표시해 줍니다. 설정하려면 탭하세요."
+ "홈 화면 하단 행에서 앱 제안을 확인하세요."
+ "홈 화면에서 가장 많이 사용한 앱에 바로 액세스할 수 있습니다. 제안은 루틴에 따라 달라집니다. 하단 행의 앱이 홈 화면으로 이동합니다."
+ "홈 화면에서 가장 많이 사용한 앱에 바로 액세스할 수 있습니다. 제안은 루틴에 따라 달라집니다. 하단 행의 앱이 새로운 폴더로 이동합니다."
+ "앱 제안받기"
+ "나중에"
+ "설정"
+ "가장 많이 사용한 앱이 여기에 표시되며 루틴에 따라 달라짐"
+ "하단 행에서 앱을 드래그하여 앱 제안 받기"
+ "빈 공간에 앱 제안 추가됨"
+ "예상 앱: %1$s"
+ "공유"
+ "스크린샷"
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 4018e57dcc..953ac42095 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -22,16 +22,28 @@
"Экранды бөлүү"
"Кадап коюу"
"Эркин форма режими"
- "Сереп салуу"
"Акыркы колдонмолор жок"
- "Жабуу"
"Колдонмону пайдалануу жөндөөлөрү"
"Баарын тазалоо"
"Акыркы колдонмолор"
"%1$s, %2$s"
"< 1 мүнөт"
"Бүгүн %1$s мүнөт калды"
- "Колдонмо сунуштары"
+ "Сунушталган колдонмолор"
"Бардык колдонмолор"
"Божомолдонгон колдонмолоруңуз"
+ "Көп иштетилген колдонмолорго оңой кириңиз"
+ "Pixel кийинки керектелүүчү колдонмолорду Башкы экраныңызда божомолдоп, сунуштап турат. Жөндөө үчүн таптап коюңуз."
+ "Сунушталган колдонмолорду Башкы экрандын ылдый жагында жайгашкан тилкесинде көрүңүз"
+ "Көп иштетилген колдонмолорго Башкы экрандан оңой кириңиз. Сунуштар тартиптин негизинде өзгөрөт. Төмөндө жайгашкан тилкедеги колдонмолор Башкы экраныңызга көтөрүлөт."
+ "Көп иштетилген колдонмолорго Башкы экрандан оңой кириңиз. Сунуштар тартиптин негизинде өзгөрөт. Ылдый жакта жайгашкан тилкедеги колдонмолор жаңы папкага жылдырылат."
+ "Сунушталган колдонолорду алуу"
+ "Жок, рахмат"
+ "Жөндөөлөр"
+ "Көп иштетилген колдонмолор ушул жерде көрүнүп, тартиптин негизинде өзгөрөт"
+ "Сунушталган колдонмолорду көрүү үчүн ылдый жакта жайгашкан тилкедеги колдонмолорду сүрүп салыңыз"
+ "Сунушталган колдонмолор бош жерге кошулат"
+ "Божомолдонгон колдонмо: %1$s"
+ "Бөлүшүү"
+ "Скриншот"
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index ed1fc373e2..a5d4997ecd 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -22,9 +22,7 @@
"Skaidyti ekraną"
"Prisegti"
"Laisva forma"
- "Apžvalga"
"Nėra jokių naujausių elementų"
- "Uždaryti"
"Programos naudojimo nustatymai"
"Išvalyti viską"
"Naujausios programos"
@@ -34,4 +32,18 @@
"Programų pasiūlymai"
"Visos programos"
"Numatomos programos"
+ "Lengvai pasiekite dažniausiai naudojamas programas"
+ "„Pixel“ numato, kurių programų jums gali reikėti vėliau, ir sudeda jas iškart pagrindiniame ekrane. Palieskite, kad nustatytumėte."
+ "Gaukite programų pasiūlymų apatinėje pagrindinio ekrano eilutėje"
+ "Lengvai pasiekite dažniausiai naudojamas programas iškart pagrindiniame ekrane. Pasiūlymai keisis atsižvelgiant į tai, kaip jas naudojate. Apatinėje eilutėje esančios programos bus perkeltos į pagrindinį ekraną."
+ "Lengvai pasiekite dažniausiai naudojamas programas iškart pagrindiniame ekrane. Pasiūlymai keisis atsižvelgiant į tai, kaip jas naudojate. Apatinėje eilutėje esančios programos bus perkeltos į naują aplanką."
+ "Gauti programų pasiūlymų"
+ "Ne, ačiū"
+ "Nustatymai"
+ "Dažniausiai naudojamos programos rodomos čia ir keičiasi pagal tai, kaip jas naudojate"
+ "Nuvilkę programas į apatinę eilutę gausite programų pasiūlymų"
+ "Programų pasiūlymai pridedami tuščioje vietoje"
+ "Numatoma programa: %1$s"
+ "Bendrinti"
+ "Ekrano kopija"
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 85ce0e017d..8f747ab593 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -22,9 +22,7 @@
"Sadalīt ekrānu"
"Piespraust"
"Brīva forma"
- "Pārskats"
"Nav nesenu vienumu."
- "Aizvērt"
"Lietotņu izmantošanas iestatījumi"
"Notīrīt visu"
"Pēdējās izmantotās lietotnes"
@@ -34,4 +32,18 @@
"Ieteicamās lietotnes"
"Visas lietotnes"
"Jūsu prognozētās lietotnes"
+ "Ērta piekļuve visbiežāk izmantotajām lietotnēm"
+ "Pixel tālruņa sākuma ekrānā tiek prognozēts, kuras lietotnes jūs izmantosiet nākamās. Pieskarieties, lai to iestatītu."
+ "Sākuma ekrāna apakšējā rindā tiks rādītas ieteicamās lietotnes"
+ "Varat sākuma ekrānā ērti piekļūt savām visbiežāk izmantotajām lietotnēm. Ieteikumi mainīsies atkarībā no jūsu paradumiem. Apakšējā rindā esošās lietotnes tiks pārvietotas uz augšu — uz sākuma ekrānu."
+ "Varat sākuma ekrānā ērti piekļūt savām visbiežāk izmantotajām lietotnēm. Ieteikumi mainīsies atkarībā no jūsu paradumiem. Apakšējā rindā esošās lietotnes tiks pārvietotas uz jaunu mapi."
+ "Rādīt ieteicamās lietotnes"
+ "Nē, paldies"
+ "Iestatījumi"
+ "Šeit tiek rādītas visbiežāk izmantotās lietotnes, un tās mainās atkarībā no jūsu paradumiem"
+ "Lai skatītu ieteicamās lietotnes, velciet lietotnes prom no apakšējās rindas"
+ "Ieteicamās lietotnes tika pievienotas tukšajā vietā"
+ "Prognozētā lietotne: %1$s"
+ "Kopīgot"
+ "Izveidot ekrānuzņēmumu"
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 9f11521df3..c085f9e0a8 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -22,11 +22,9 @@
"Поделен екран"
"Прикачување"
"Freeform"
- "Преглед"
"Нема неодамнешни ставки"
- "Затвори"
"Поставки за користење на апликациите"
- "Исчисти ги сите"
+ "Избриши ги сите"
"Неодамнешни апликации"
"%1$s, %2$s"
"< 1 минута"
@@ -34,4 +32,18 @@
"Предлози за апликации"
"Сите апликации"
"Вашите предвидени апликации"
+ "Лесно пристапувајте до најкористените апликации"
+ "Pixel предвидува кои апликации ќе ви требаат следно, директно на почетниот екран. Допрете за поставување."
+ "Добивајте предлози за апликации на долниот ред од почетниот екран"
+ "Лесно пристапувајте до најкористените апликации директно на почетниот екран. Предлозите ќе се менуваат според рутините. Апликациите од последниот ред ќе се поместуваат нагоре до почетниот екран."
+ "Лесно пристапувајте до најкористените апликации директно на почетниот екран. Предлозите ќе се менуваат според рутините. Апликациите од последниот ред ќе се преместуваат во нова папка."
+ "Добивајте предлози за апликации"
+ "Не, фала"
+ "Поставки"
+ "Најкористените апликации се појавуваат тука и се менуваат според рутините"
+ "Отстранете апликации од долниот ред со повлекување за да добивате предлози за апликации"
+ "Предлозите за апликации се додадени во празен простор"
+ "Предвидена апликација: %1$s"
+ "Сподели"
+ "Слика од екранот"
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 2e02e80fa8..ca92aa7362 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -22,9 +22,7 @@
"സ്ക്രീൻ വിഭജിക്കുക"
"പിൻ ചെയ്യുക"
"ഫ്രീഫോം"
- "അവലോകനം"
"സമീപകാല ഇനങ്ങൾ ഒന്നുമില്ല"
- "അവസാനിപ്പിക്കുക"
"ആപ്പ് ഉപയോഗ ക്രമീകരണം"
"എല്ലാം മായ്ക്കുക"
"സമീപകാല ആപ്പുകൾ"
@@ -34,4 +32,32 @@
"ആപ്പ് നിർദ്ദേശങ്ങൾ"
"എല്ലാ ആപ്പുകളും"
"നിങ്ങളുടെ പ്രവചിക്കപ്പെട്ട ആപ്പുകൾ"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index 5de8602022..d3de66c0c3 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -22,16 +22,28 @@
"Дэлгэцийг хуваах"
"Тогтоох"
"Чөлөөтэй хувьсах"
- "Тойм"
"Сүүлийн үеийн зүйл алга"
- "Хаах"
"Апп ашиглалтын тохиргоо"
"Бүгдийг устгах"
"Саяхны аппууд"
"%1$s, %2$s"
"< 1 минут"
"Өнөөдөр %1$s үлдсэн"
- "Аппын зөвлөмж"
+ "Санал болгож буй аппууд"
"Бүх апп"
"Таны таамагласан аппууд"
+ "Хамгийн их ашигладаг аппууддаа хялбархан хандаарай"
+ "Pixel утас танд дараагийн удаа хэрэг болох аппуудыг таамаглаж, таны Үндсэн нүүрэнд харуулна. Тохируулахын тулд товшино уу."
+ "Үндсэн нүүрнийхээ доод мөр дээр санал болгож буй аппуудыг аваарай"
+ "Хамгийн их ашигладаг аппууддаа Үндсэн нүүрээс хялбархан хандаарай. Санал болгож буй аппуудыг таны хэвшлээс хамаарч өөрчилнө. Доод мөр дэх аппуудыг таны Үндсэн нүүр лүү дээш зөөнө."
+ "Хамгийн их ашигладаг аппууддаа Үндсэн нүүрээс хялбархан хандаарай. Санал болгож буй аппуудыг таны хэвшлээс хамаарч өөрчилнө. Доод мөр дэх аппуудыг шинэ фолдер луу зөөнө."
+ "Санал болгож буй аппуудыг авах"
+ "Үгүй, баярлалаа"
+ "Тохиргоо"
+ "Хамгийн их ашигладаг аппуудыг энд харуулах бөгөөд хэвшлээс хамаарч өөрчилдөг"
+ "Санал болгож буй аппуудыг авахын тулд доод мөрөөс аппуудыг чирж гаргаарай"
+ "Санал болгож буй аппуудыг хоосон зайд нэмсэн"
+ "Таамаглаж буй апп: %1$s"
+ "Хуваалцах"
+ "Дэлгэцийн агшин дарах"
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index cccece749c..dbc5058141 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -22,9 +22,7 @@
"विभाजित स्क्रीन"
"पिन करा"
"फ्रीफॉर्म"
- "अवलोकन"
"कोणतेही अलीकडील आयटम नाहीत"
- "बंद"
"अॅप वापर सेटिंग्ज"
"सर्व साफ करा"
"अलीकडील अॅप्स"
@@ -34,4 +32,18 @@
"अॅप सूचना"
"सर्व अॅप्स"
"तुमची पूर्वानुमानीत अॅप्स"
+ "तुमची सर्वाधिक वापरली जाणारी अॅप्स सहजपणे अॅक्सेस करा"
+ "तुमच्या होम स्क्रीनवरच, Pixel तुम्हाला पुढे लागणार असलेल्या अॅप्सचे पूर्वानुमान करते. सेट करण्यासाठी टॅप करा."
+ "तुमच्या होम स्क्रीनच्या तळाच्या पंक्तीवर अॅप सूचना मिळवा"
+ "तुमची सर्वाधिक वापरली जाणारी अॅप्स होम स्क्रीनवरच सहजपणे अॅक्सेस करा. सूचना तुमच्या दिनक्रमांच्या आधारावर बदलतील. तळाच्या पंक्तीवरील अॅप्स तुमच्या होम स्क्रीनवर जातील."
+ "तुमची सर्वाधिक वापरली जाणारी अॅप्स होम स्क्रीनवरच सहजपणे अॅक्सेस करा. सूचना तुमच्या दिनक्रमांच्या आधारावर बदलतील. तळाच्या पंक्तीवरील अॅप्स नवीन फोल्डरवर जातील."
+ "अॅप सूचना मिळवा"
+ "नाही, नको"
+ "सेटिंग्ज"
+ "सर्वाधिक वापरली जाणारी अॅप्स येथे दिसतात आणि दिनक्रमांच्या आधारावर बदलतात"
+ "अॅप सूचना मिळवण्यासाठी तळाच्या पंक्तीवरून अॅप्स ड्रॅग करा"
+ "रिकाम्या जागेवर जोडलेल्या अॅप सूचना"
+ "पूर्वानुमान केलेले अॅप: %1$s"
+ "शेअर करा"
+ "स्क्रीनशॉट"
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index 2542963769..68ad9b4496 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -22,9 +22,7 @@
"Skrin pisah"
"Semat"
"Bentuk bebas"
- "Ikhtisar"
"Tiada item terbaharu"
- "Tutup"
"Tetapan penggunaan apl"
"Kosongkan semua"
"Apl terbaharu"
@@ -34,4 +32,18 @@
"Cadangan apl"
"Semua apl"
"Apl ramalan anda"
+ "Akses apl yang paling kerap anda gunakan dengan mudah"
+ "Pixel meramalkan apl yang anda perlukan seterusnya, terus pada Skrin utama anda. Ketik untuk membuat persediaan."
+ "Dapatkan cadangan apl di baris bawah Skrin utama anda"
+ "Akses apl yang paling kerap anda gunakan dengan mudah pada Skrin utama. Cadangan akan berubah berdasarkan rutin anda. Apl di baris bawah akan beralih ke atas, ke Skrin utama anda."
+ "Akses apl yang paling kerap anda gunakan dengan mudah, terus pada Skrin utama. Cadangan akan berubah berdasarkan rutin anda. Apl di baris bawah akan beralih ke folder baharu."
+ "Dapatkan cadangan apl"
+ "Tidak perlu"
+ "Tetapan"
+ "Apl yang paling kerap digunakan dipaparkan di sini dan berubah berdasarkan rutin"
+ "Seret apl keluar dari baris bawah untuk mendapatkan cadangan apl"
+ "Cadangan apl ditambahkan pada ruang kosong"
+ "Apl yang diramalkan: %1$s"
+ "Kongsi"
+ "Tangkapan skrin"
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 7683e05990..8c7a317494 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -22,9 +22,7 @@
"မျက်နှာပြင် ခွဲ၍ပြသခြင်း"
"ပင်ထိုးခြင်း"
"အလွတ်ပုံစံ"
- "အနှစ်ချုပ်"
"မကြာမီကဖွင့်ထားသည်များ မရှိပါ"
- "ပိတ်ရန်"
"အက်ပ်အသုံးပြုမှု ဆက်တင်များ"
"အားလုံးကို ရှင်းရန်"
"လတ်တလောသုံး အက်ပ်များ"
@@ -34,4 +32,18 @@
"အက်ပ်အကြံပြုချက်များ"
"အက်ပ်အားလုံး"
"သင်၏ ခန့်မှန်းအက်ပ်များ"
+ "အသုံးအများဆုံးအက်ပ်များကို အလွယ်တကူ သုံးခြင်း"
+ "Pixel က သင်၏ \'ပင်မစာမျက်နှာ\' တွင် နောင်တွင်သင်လိုအပ်မည့် အက်ပ်များကို ကြိုတင်မှန်းဆပါသည်။ စနစ်ထည့်သွင်းရန် တို့ပါ။"
+ "သင်၏ \'ပင်မစာမျက်နှာ\' အောက်ခြေအတန်းတွင် အက်ပ်အကြံပြုချက်များ ရယူခြင်း"
+ "အသုံးအများဆုံးအက်ပ်များကို \'ပင်မစာမျက်နှာ\' တွင် အလွယ်တကူ သုံးနိုင်သည်။ သင်၏ ပုံမှန်အစီအစဉ်များပေါ် အခြေခံ၍ အကြံပြုချက်များ ပြောင်းလဲပါမည်။ အောက်ခြေအတန်းရှိ အက်ပ်များကို သင်၏ \'ပင်မစာမျက်နှာ\' သို့ရွှေ့လိုက်မည်။"
+ "အသုံးအများဆုံးအက်ပ်များကို \'ပင်မစာမျက်နှာ\' တွင် အလွယ်တကူ သုံးနိုင်သည်။ သင်၏ ပုံမှန်အစီအစဉ်များပေါ် အခြေခံ၍ အကြံပြုချက်များ ပြောင်းလဲပါမည်။ အောက်ခြေအတန်းရှိ အက်ပ်များကို ဖိုင်တွဲအသစ်သို့ ရွှေ့လိုက်မည်။"
+ "အက်ပ်အကြံပြုချက်များ ရယူရန်"
+ "မလိုပါ"
+ "ဆက်တင်များ"
+ "အသုံးအများဆုံးအက်ပ်များကို ဤနေရာတွင် ပြပြီး ပုံမှန်အစီအစဉ်များပေါ် အခြေခံ၍ ပြောင်းလဲသည်"
+ "အက်ပ်အကြံပြုချက်များ ရယူရန် အောက်ခြေအတန်းရှိ အက်ပ်များကို ဖိဆွဲထုတ်လိုက်ပါ"
+ "အက်ပ်အကြံပြုချက်များကို နေရာလွတ်သို့ ထည့်လိုက်သည်"
+ "ကြိုတင်မှန်းဆထားသော အက်ပ်− %1$s"
+ "မျှဝေရန်"
+ "ဖန်သားပြင်ဓာတ်ပုံ"
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index 01bbb6a75d..5eafdf57e9 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -22,9 +22,7 @@
"Delt skjerm"
"Fest"
"Fritt format"
- "Oversikt"
"Ingen nylige elementer"
- "Lukk"
"Innstillinger for appbruk"
"Fjern alt"
"Nylige apper"
@@ -34,4 +32,18 @@
"Appanbefalinger"
"Alle apper"
"Forslag til apper"
+ "Få enkel tilgang til appene du bruker oftest"
+ "Pixel foreslår de neste appene du trenger, rett på startskjermen. Trykk for å konfigurere."
+ "Få appforslag i den nederste raden på startskjermen"
+ "Få enkel tilgang til appene du bruker oftest, rett fra startskjermen. Forslagene endres basert på rutinene dine. Appene i den nederste raden flyttes opp til startskjermen."
+ "Få enkel tilgang til appene du bruker oftest, rett fra startskjermen. Forslagene endres basert på rutinene dine. Appene i den nederste raden flyttes til en ny mappe."
+ "Få appforslag"
+ "Nei takk"
+ "Innstillinger"
+ "Appene som brukes oftest, vises her og endres basert på rutiner"
+ "Dra appene vekk fra den nederste raden for å få appforslag."
+ "Appforslag er lagt til på et tomt område"
+ "Foreslått app: %1$s"
+ "Del"
+ "Skjermdump"
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 60e9bd5313..e83ee7a62c 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -22,9 +22,7 @@
"स्क्रिन विभाजन गर्नुहोस्"
"पिन गर्नुहोस्"
"फ्रिफर्म"
- "परिदृश्य"
"हालसालैको कुनै पनि वस्तु छैन"
- "बन्द गर्नुहोस्"
"अनुप्रयोगको उपयोगका सेटिङहरू"
"सबै खाली गर्नुहोस्"
"हालसालैका अनुप्रयोगहरू"
@@ -34,4 +32,32 @@
"अनुप्रयोगसम्बन्धी सुझावहरू"
"सबै अनुप्रयोगहरू"
"तपाईंका पूर्वानुमानित अनुप्रयोगहरू"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index 8032567e1c..3e2b937a44 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -22,9 +22,7 @@
"Gesplitst scherm"
"Vastzetten"
"Vrije vorm"
- "Overzicht"
"Geen recente items"
- "Sluiten"
"Instellingen voor app-gebruik"
"Alles wissen"
"Recente apps"
@@ -34,4 +32,18 @@
"App-suggesties"
"Alle apps"
"Je voorspelde apps"
+ "Eenvoudig toegang tot je meestgebruikte apps"
+ "Pixel voorspelt welke apps je als volgende nodig hebt en geeft ze weer op je startscherm. Tik om dit in te stellen."
+ "App-suggesties ontvangen op de onderste rij van je startscherm"
+ "Open je meestgebruikte apps gemakkelijk vanaf het startscherm. De suggesties veranderen op basis van je routines. Apps op de onderste rij worden naar je startscherm verplaatst."
+ "Open je meestgebruikte apps gemakkelijk vanaf het startscherm. De suggesties veranderen op basis van je routines. Apps op de onderste rij worden naar een nieuwe map verplaatst."
+ "App-suggesties ontvangen"
+ "Nee"
+ "Instellingen"
+ "De meestgebruikte apps worden hier weergegeven en kunnen veranderen op basis van je routines"
+ "Sleep apps weg van de onderste rij om app-suggesties te ontvangen"
+ "App-suggesties toegevoegd aan lege ruimte"
+ "Voorspelde app: %1$s"
+ "Delen"
+ "Screenshot"
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 2ebec4e7c7..643c0ca394 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -22,9 +22,7 @@
"ସ୍କ୍ରୀନ୍କୁ ଭାଗ କରନ୍ତୁ"
"ପିନ୍"
"ଫ୍ରିଫର୍ମ"
- "ସଂକ୍ଷିପ୍ତ ବିବରଣ"
"କୌଣସି ସାମ୍ପ୍ରତିକ ଆଇଟମ୍ ନାହିଁ"
- "ବନ୍ଦ କରନ୍ତୁ"
"ଆପ୍ ବ୍ୟବହାର ସେଟିଂସ୍"
"ସବୁ ଖାଲି କରନ୍ତୁ"
"ବର୍ତ୍ତମାନର ଆପ୍"
@@ -34,4 +32,32 @@
"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକ"
"ସମସ୍ତ ଆପ୍ସ"
"ଆପଣ ପୂର୍ବାନୁମାନ କରିଥିବା ଆପ୍ସ"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index 58c0d2afa4..c4d6fcc5b2 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -22,16 +22,28 @@
"ਸਪਲਿਟ ਸਕ੍ਰੀਨ"
"ਪਿੰਨ ਕਰੋ"
"ਫ੍ਰੀਫਾਰਮ"
- "ਰੂਪ-ਰੇਖਾ"
"ਕੋਈ ਹਾਲੀਆ ਆਈਟਮਾਂ ਨਹੀਂ"
- "ਬੰਦ ਕਰੋ"
"ਐਪ ਵਰਤੋਂ ਦੀਆਂ ਸੈਟਿੰਗਾਂ"
"ਸਭ ਕਲੀਅਰ ਕਰੋ"
"ਹਾਲੀਆ ਐਪਾਂ"
"%1$s, %2$s"
"< 1 ਮਿੰਟ"
"ਅੱਜ %1$s ਬਾਕੀ"
- "ਐਪ ਸੰਬੰਧੀ ਸੁਝਾਅ"
+ "ਐਪ ਸੁਝਾਅ"
"ਸਾਰੀਆਂ ਐਪਾਂ"
"ਤੁਹਾਡੀਆਂ ਪੂਰਵ ਅਨੁਮਾਨਿਤ ਐਪਾਂ"
+ "ਆਪਣੀਆਂ ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀਆਂ ਗਈਆਂ ਐਪਾਂ ਤੱਕ ਆਸਾਨੀ ਨਾਲ ਪਹੁੰਚ ਕਰੋ"
+ "Pixel ਅਨੁਮਾਨ ਲਗਾਉਂਦਾ ਹੈ ਕਿ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ, ਅੱਗੇ ਕਿਹੜੀਆਂ ਐਪਾਂ ਦੀ ਲੋੜ ਪਵੇਗੀ। ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"
+ "ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ ਦੀ ਹੇਠਲੀ ਕਤਾਰ \'ਤੇ ਐਪ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਕਰੋ"
+ "ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਆਪਣੀਆਂ ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀਆਂ ਗਈਆਂ ਐਪਾਂ ਤੱਕ ਆਸਾਨੀ ਨਾਲ ਪਹੁੰਚ ਕਰੋ। ਸੁਝਾਅ ਤੁਹਾਡੇ ਨਿਯਮਬੱਧ ਕੰਮਾਂ ਦੇ ਆਧਾਰ \'ਤੇ ਬਦਲਣਗੇ। ਹੇਠਲੀ ਕਤਾਰ ਵਾਲੀਆਂ ਐਪਾਂ ਤੁਹਾਡੀ ਹੋਮ ਸਕ੍ਰੀਨ ਵੱਲ ਉੱਪਰ ਆ ਜਾਣਗੀਆਂ।"
+ "ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਆਪਣੀਆਂ ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀਆਂ ਗਈਆਂ ਐਪਾਂ ਤੱਕ ਆਸਾਨੀ ਨਾਲ ਪਹੁੰਚ ਕਰੋ। ਸੁਝਾਅ ਤੁਹਾਡੇ ਨਿਯਮਬੱਧ ਕੰਮਾਂ ਦੇ ਆਧਾਰ \'ਤੇ ਬਦਲਣਗੇ। ਹੇਠਲੀ ਕਤਾਰ ਵਾਲੀਆਂ ਐਪਾਂ ਇੱਕ ਨਵੇਂ ਫੋਲਡਰ ਵਿੱਚ ਚਲੀਆਂ ਜਾਣਗੀਆਂ।"
+ "ਐਪ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਕਰੋ"
+ "ਨਹੀਂ ਧੰਨਵਾਦ"
+ "ਸੈਟਿੰਗਾਂ"
+ "ਸਭ ਤੋਂ ਵੱਧ ਵਰਤੀਆਂ ਗਈਆਂ ਐਪਾਂ ਇੱਥੇ ਦਿਸਦੀਆਂ ਹਨ, ਅਤੇ ਨਿਯਮਬੱਧ ਕੰਮਾਂ ਦੇ ਆਧਾਰ \'ਤੇ ਬਦਲਦੀਆਂ ਹਨ"
+ "ਐਪ ਸੁਝਾਅ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਐਪਾਂ ਨੂੰ ਹੇਠਲੀ ਕਤਾਰ ਤੋਂ ਪਰੇ ਘਸੀਟੋ"
+ "ਐਪ ਸੁਝਾਅ ਖਾਲੀ ਜਗ੍ਹਾ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ"
+ "ਪੂਰਵ ਅਨੁਮਾਨਿਤ ਐਪ: %1$s"
+ "ਸਾਂਝਾ ਕਰੋ"
+ "ਸਕ੍ਰੀਨਸ਼ਾਟ"
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index d83160dffb..dc2c618d28 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -22,16 +22,28 @@
"Podziel ekran"
"Przypnij"
"Tryb dowolny"
- "Przegląd"
"Brak ostatnich elementów"
- "Zamknij"
"Ustawienia użycia aplikacji"
"Wyczyść wszystko"
"Ostatnie aplikacje"
"%1$s, %2$s"
"> 1 min"
"Na dziś zostało %1$s"
- "Sugerowane aplikacje"
+ "Sugestie aplikacji"
"Wszystkie aplikacje"
"Przewidywane aplikacje"
+ "Korzystaj z najczęściej używanych przez siebie aplikacji w łatwy sposób"
+ "Pixel przewiduje, których aplikacji będziesz potrzebować w następnej kolejności, bezpośrednio na ekranie głównym. Kliknij, by skonfigurować."
+ "Otrzymuj sugestie aplikacji w dolnym wierszu ekranu głównego"
+ "Korzystaj z najczęściej używanych aplikacji na ekranie głównym w łatwy sposób. Sugestie będą się zmieniać na podstawie Twojej rutyny. Aplikacje z dolnych wierszy będą się przenosić w górę do ekranu głównego."
+ "Korzystaj z najczęściej używanych aplikacji na ekranie głównym w łatwy sposób. Sugestie będą się zmieniać na podstawie Twojej rutyny. Aplikacje z dolnych wierszy będą się przenosić do nowego folderu."
+ "Otrzymuj sugestie aplikacji"
+ "Nie"
+ "Ustawienia"
+ "Najczęściej używane aplikacje wyświetlają się tutaj i zmieniają się w zależności od rutyny"
+ "Przeciągnij aplikacje z dolnego wiersza, aby otrzymać sugestie aplikacji"
+ "Sugestie aplikacji dodane w pustym obszarze"
+ "Przewidywana aplikacja: %1$s"
+ "Udostępnij"
+ "Zrzut ekranu"
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index 2fd34d636c..36212d3282 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -22,16 +22,28 @@
"Ecrã dividido"
"Fixar"
"Forma livre"
- "Vista geral"
"Nenhum item recente"
- "Fechar"
"Definições de utilização de aplicações"
"Limpar tudo"
"Aplicações recentes"
"%1$s, %2$s"
"< 1 minuto"
"Resta(m) %1$s hoje."
- "Sugestões de aplicações"
+ "Sugestões de apps"
"Todas as aplicações"
"As suas aplicações previstas"
+ "Aceda facilmente às suas apps mais utilizadas"
+ "O Pixel prevê as apps de que necessitará a seguir, diretamente no ecrã principal. Toque para configurar."
+ "Obtenha sugestões de apps na última fila do ecrã principal."
+ "Aceda facilmente às suas apps mais utilizadas, diretamente no ecrã principal. As sugestões mudam em função das suas rotinas. As apps na última fila passam para o ecrã principal."
+ "Aceda facilmente às suas apps mais utilizadas, diretamente no ecrã principal. As sugestões mudam em função das suas rotinas. As apps na última fila passam para uma nova pasta."
+ "Obter sugestões de apps"
+ "Não, obrigado"
+ "Definições"
+ "As apps mais utilizadas aparecem aqui e mudam em função das rotinas."
+ "Arraste as apps para fora da última fila para obter sugestões de apps."
+ "Sugestões de apps adicionadas ao espaço vazio."
+ "App prevista: %1$s"
+ "Partilhar"
+ "Tirar captura de ecrã"
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 673dfe2e73..46c2b43cc8 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -22,9 +22,7 @@
"Tela dividida"
"Fixar"
"Forma livre"
- "Visão geral"
"Nenhum item recente"
- "Fechar"
"Configurações de uso do app"
"Limpar tudo"
"Apps recentes"
@@ -34,4 +32,18 @@
"Sugestões de apps"
"Todos os apps"
"Suas predições de apps"
+ "Acesse os apps mais usados de forma simples"
+ "O Pixel prevê de quais apps você precisará, diretamente na tela inicial. Toque para configurar."
+ "Receba sugestões de apps na linha inferior da tela inicial"
+ "Acesse os apps mais usados na tela inicial de forma simples. As sugestões mudarão de acordo com sua rotina. Os apps na linha inferior subirão para a tela inicial."
+ "Acesse os apps mais usados na tela inicial de forma simples. As sugestões mudarão de acordo com sua rotina. Os apps na linha inferior serão movidos para uma nova pasta."
+ "Receber sugestões de apps"
+ "Não"
+ "Configurações"
+ "Os apps mais usados aparecem aqui e mudam de acordo com sua rotina"
+ "Arraste apps da linha inferior para receber sugestões de apps"
+ "Sugestões de apps adicionadas a um espaço vazio"
+ "App previsto: %1$s"
+ "Compartilhar"
+ "Capturar tela"
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 2ac783eb0e..73d4dfbc1f 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -22,9 +22,7 @@
"Ecran împărțit"
"Fixați"
"Formă liberă"
- "Recente"
"Niciun element recent"
- "Închideți"
"Setări de utilizare a aplicației"
"Ștergeți tot"
"Aplicații recente"
@@ -34,4 +32,18 @@
"Sugestii de aplicații"
"Toate aplicațiile"
"Aplicațiile estimate"
+ "Accesați cu ușurință cele mai folosite aplicații"
+ "Pixel estimează aplicațiile de care veți avea nevoie în continuare, direct pe ecranul de pornire. Atingeți ca să configurați."
+ "Primiți sugestii de aplicații în rândul de jos al ecranului de pornire"
+ "Accesați cu ușurință cele mai folosite aplicații direct din ecranul de pornire. Sugestiile se vor modifica în funcție de rutine. Aplicațiile din rândul de jos se vor muta în sus pe ecranul de pornire."
+ "Accesați cu ușurință cele mai folosite aplicații, direct din ecranul de pornire. Sugestiile se vor modifica în funcție de rutine. Aplicațiile din rândul de jos se vor muta într-un dosar nou."
+ "Primiți sugestii de aplicații"
+ "Nu, mulțumesc"
+ "Setări"
+ "Cele mai folosite aplicații apar aici și se modifică în funcție de rutine"
+ "Trageți aplicații din rândul de jos pentru a primi sugestii de aplicații"
+ "Sugestiile de aplicații sunt adăugate în spațiile goale"
+ "Aplicația estimată: %1$s"
+ "Distribuiți"
+ "Captură de ecran"
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 5dd89a644b..1db5d08ab0 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -22,9 +22,7 @@
"Разделить экран"
"Блокировать"
"Произвольная форма"
- "Обзор"
"Здесь пока ничего нет."
- "Закрыть"
"Настройки использования приложения"
"Очистить все"
"Недавние приложения"
@@ -34,4 +32,18 @@
"Рекомендуемые приложения"
"Все приложения"
"Ваши рекомендуемые приложения"
+ "Быстрый доступ к часто используемым приложениям"
+ "Устройство Pixel прогнозирует, какие приложения вы будете использовать в ближайшее время, и показывает их на главном экране. Нажмите, чтобы настроить."
+ "Рекомендуемые приложения будут появляться в нижнем ряду на главном экране."
+ "Для вашего удобства на главном экране отображаются часто используемые приложения на основе ваших последних действий. Приложения из нижнего ряда перемещаются на главный экран."
+ "Для вашего удобства на главном экране отображаются часто используемые приложения на основе ваших последних действий. Приложения из нижнего ряда перемещаются в новую папку."
+ "Показывать рекомендуемые приложения"
+ "Отмена"
+ "Настройки"
+ "Здесь отображаются часто используемые приложения на основе ваших последних действий"
+ "Перетащите приложения из нижнего ряда, чтобы получать рекомендации"
+ "Добавьте рекомендуемые приложения на свободный участок"
+ "Рекомендуемое приложение: %1$s"
+ "Поделиться"
+ "Скриншот"
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index f6584c4dca..7233f65f95 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -22,9 +22,7 @@
"බෙදුම් තිරය"
"අමුණන්න"
"Freeform"
- "දළ විශ්ලේෂණය"
"මෑත අයිතම නැත"
- "වසන්න"
"යෙදුම් භාවිත සැකසීම්"
"සියල්ල හිස් කරන්න"
"මෑත යෙදුම්"
@@ -34,4 +32,18 @@
"යෙදුම් යෝජනා"
"සියලු යෙදුම්"
"ඔබේ පුරෝකථන කළ යෙදුම්"
+ "ඔබගේ වැඩිපුරම භාවිත කළ යෙදුම්වලට පහසුවෙන් ප්රවේශ වන්න"
+ "ඔබගේ මුල් තිරයේ සිටම ඔබට ඊළඟට අවශ්ය යෙදුම් Pixel පුරෝකථනය කරයි. පිහිටුවීමට තට්ටු කරන්න."
+ "ඔබගේ මුල් තිරයේ පහළ පේළියේ යෙදුම් යෝජනා ලබා ගන්න"
+ "ඔබගේ වැඩිපුරම භාවිත කරන යෙදුම්වලට මුල් තිරයේ සිටම පහසුවෙන් ප්රවේශ වන්න. ඔබගේ දිනචරියා මත පදනම්ව යෝජනා වෙනස් වනු ඇත. පහළ පේළියේ යෙදුම් ඔබගේ මුල් තිරය දක්වා ගෙන යනු ඇත."
+ "ඔබගේ වැඩිපුරම භාවිත කරන යෙදුම්වලට මුල් තිරයේ සිටම පහසුවෙන් ප්රවේශ වන්න. ඔබගේ දිනචරියා මත පදනම්ව යෝජනා වෙනස් වනු ඇත. පහළ පේළියේ යෙදුම් නව ෆෝල්ඩරයකට ගෙන යනු ඇත."
+ "යෙදුම් යෝජනා ලබා ගන්න"
+ "එපා ස්තුතියි"
+ "සැකසීම්"
+ "වැඩිපුරම භාවිත කළ යෙදුම් මෙහි දිස්වන අතර දිනචරියා මත පදනම්ව වෙනස් වේ"
+ "යෙදුම් යෝජනා ලබා ගැනීමට පහළ පේළියෙන් ඉවතට යෙදුම් ඇදගෙන යන්න"
+ "යෙදුම් යෝජනා හිස් අවකාශයට එක් කර ඇත"
+ "පුරෝකථනය කළ යෙදුම: %1$s"
+ "බෙදා ගන්න"
+ "තිර රුව"
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index 8a9c7365f2..add3b1802f 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -22,9 +22,7 @@
"Rozdeliť obrazovku"
"Pripnúť"
"Voľný režim"
- "Prehľad"
"Žiadne nedávne položky"
- "Zavrieť"
"Nastavenia využívania aplikácie"
"Vymazať všetko"
"Nedávne aplikácie"
@@ -34,4 +32,18 @@
"Návrhy aplikácií"
"Všetky aplikácie"
"Vaše predpovedané aplikácie"
+ "Získajte jednoduchý prístup k najpoužívanejším aplikáciám"
+ "Pixel predpovedá aplikácie, ktoré budete potrebovať, priamo na ploche. Klepnutím prejdete na nastavenie."
+ "Získajte návrhy aplikácií v spodnom riadku plochy"
+ "Získajte jednoduchý prístup k najpoužívanejším aplikáciám priamo na ploche. Návrhy sa budú meniť podľa vašich postupov. Aplikácie v spodnom riadku sa presunú nahor na plochu."
+ "Získajte jednoduchý prístup k najpoužívanejším aplikáciám priamo na ploche. Návrhy sa budú meniť podľa vašich postupov. Aplikácie v spodnom riadku sa presunú do nového priečinka."
+ "Získavať návrhy aplikácií"
+ "Nie, ďakujem"
+ "Nastavenia"
+ "Tu sú zobrazené najpoužívanejšie aplikácie a menia sa podľa postupov"
+ "Ak chcete získať návrhy aplikácií, presuňte aplikácie zo spodného riadka"
+ "Návrhy aplikácie boli pridané na prázdne miesto"
+ "Predpovedaná aplikácia: %1$s"
+ "Zdieľať"
+ "Snímka obrazovky"
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index 15f8f89cc7..dbeffd8191 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -22,16 +22,28 @@
"Razdeljen zaslon"
"Pripni"
"Prosta oblika"
- "Pregled"
"Ni nedavnih elementov"
- "Zapri"
"Nastavitve uporabe aplikacij"
"Počisti vse"
"Nedavne aplikacije"
"%1$s, %2$s"
"< 1 min"
"Danes je ostalo še %1$s"
- "Predlogi za aplikacije"
+ "Predlagane aplikacije"
"Vse aplikacije"
"Predvidene aplikacije"
+ "Preprost dostop do najpogosteje uporabljenih aplikacij"
+ "Pixel že na začetnem zaslonu predvidi, katere aplikacije boste potrebovali v nadaljevanju. Dotaknite se, če želite nastaviti."
+ "Oglejte si predlagane aplikacije v spodnji vrstici začetnega zaslona"
+ "Preprosto dostopajte do najpogosteje uporabljenih aplikacij kar na začetnem zaslonu. Predlogi se spreminjajo na podlagi dejanj, ki jih pogosto izvajate. Aplikacije se iz spodnje vrstice premaknejo na začetni zaslon."
+ "Preprosto dostopajte do najpogosteje uporabljenih aplikacij kar na začetnem zaslonu. Predlogi se spreminjajo na podlagi dejanj, ki jih pogosto izvajate. Aplikacije se iz spodnje vrstice premaknejo v novo mapo."
+ "Prikaži predlagane aplikacije"
+ "Ne, hvala"
+ "Nastavitve"
+ "Tukaj so navedene najpogosteje uporabljene aplikacije in spremembe na podlagi rutin"
+ "Če si želite ogledati predlagane aplikacije, povlecite aplikacije iz spodnje vrstice"
+ "Predlagane aplikacije so bile dodane v prazni prostor"
+ "Predvidena aplikacija: %1$s"
+ "Deli"
+ "Posnetek zaslona"
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index d8f5f28b42..517d9fdfe7 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -22,16 +22,28 @@
"Ekrani i ndarë"
"Gozhdo"
"Formë e lirë"
- "Përmbledhja"
"Nuk ka asnjë artikull të fundit"
- "Mbyll"
"Cilësimet e përdorimit të aplikacionit"
"Pastroji të gjitha"
"Aplikacionet e fundit"
"%1$s, %2$s"
"< 1 minutë"
"%1$s të mbetura sot"
- "Sugjerimet e aplikacioneve"
+ "Aplikacionet e sugjeruara"
"Të gjitha aplikacionet"
"Aplikacionet e tua të parashikuara"
+ "Qasu me lehtësi në aplikacionet e tua të përdorura më shpesh"
+ "Pixel parashikon aplikacionet Pixel që do të të nevojiten më pas, drejtpërdrejt në ekranin tënd bazë. Trokit për ta konfiguruar."
+ "Merr sugjerime rreth aplikacioneve në radhën e poshtme të ekranit tënd bazë"
+ "Qasu me lehtësi në aplikacionet më të përdorura direkt në ekranin bazë. Sugjerimet do të ndryshojnë bazuar në rutinat e tua. Aplikacionet në radhën e poshtme do të zhvendosen lart në ekranin tënd bazë."
+ "Qasu me lehtësi në aplikacionet më të përdorura, direkt në ekranin bazë. Sugjerimet do të ndryshojnë bazuar në rutinat e tua. Aplikacionet në radhën e poshtme do të zhvendosen në një dosje tjetër."
+ "Merr sugjerimet e aplikacioneve"
+ "Jo, faleminderit"
+ "Cilësimet"
+ "Aplikacionet më të përdorura shfaqen këtu dhe ndryshojnë bazuar në rutinat"
+ "Zvarrit aplikacionet jashtë radhës së poshtme për të marrë sugjerime rreth aplikacioneve"
+ "Sugjerimet e aplikacioneve u shtuan në hapësirën bosh"
+ "Aplikacioni i parashikuar: %1$s"
+ "Ndaj"
+ "Pamja e ekranit"
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index b721641446..4babe3b95e 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -22,9 +22,7 @@
"Подељени екран"
"Закачи"
"Слободни облик"
- "Преглед"
"Нема недавних ставки"
- "Затвори"
"Подешавања коришћења апликације"
"Обриши све"
"Недавне апликације"
@@ -34,4 +32,18 @@
"Предлози апликација"
"Све апликације"
"Предвиђене апликације"
+ "Лако приступајте апликацијама које најчешће користите"
+ "Pixel предвиђа које ће вам апликације следеће требати и ставља их на почетни екран. Додирните да бисте подесили."
+ "Добијајте предлоге апликација у доњем реду почетног екрана"
+ "Лако приступајте апликацијама које најчешће користите директно са почетног екрана. Предлози се мењају на основу употребе. Апликације из доњег реда се премештају нагоре на почетни екран."
+ "Лако приступајте апликацијама које најчешће користите директно са почетног екрана. Предлози се мењају на основу употребе. Апликације из доњег реда се премештају у нов директоријум."
+ "Приказуј предлоге апликација"
+ "Не, хвала"
+ "Подешавања"
+ "Овде се приказују најчешће коришћене апликације и мењају се у зависности од употребе"
+ "Превуците апликације из доњег реда да бисте добили предлоге"
+ "Предлози апликација се додају на празно место"
+ "Предвиђамо апликацију: %1$s"
+ "Дели"
+ "Направи снимак екрана"
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index ba7ebcdec7..2fde4c0d7a 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -22,9 +22,7 @@
"Delad skärm"
"Fäst"
"Fritt format"
- "Översikt"
"Listan med de senaste åtgärderna är tom"
- "Stäng"
"Inställningar för appanvändning"
"Rensa alla"
"Senaste apparna"
@@ -34,4 +32,18 @@
"Appförslag"
"Alla appar"
"Föreslagna appar"
+ "Kom enkelt åt de appar du använder mest"
+ "Pixel förutser vilka appar du kan behöva härnäst, direkt på startskärmen. Tryck om du vill konfigurera."
+ "Få appförslag på den nedersta raden på startskärmen"
+ "Kom enkelt åt de appar du använder mest direkt från startskärmen. Förslagen ändras efter dina rutiner. Appar på nedersta raden flyttas upp till startskärmen."
+ "Kom enkelt åt de appar du använder mest direkt från startskärmen. Förslagen ändras efter dina rutiner. Appar på nedersta raden flyttas till en ny mapp."
+ "Få appförslag"
+ "Nej tack"
+ "Inställningar"
+ "De appar som används mest visas här och ändras efter dina rutiner"
+ "Dra appar till den nedersta raden om du vill få appförslag"
+ "Appförslag har lagts till på tom yta"
+ "Appförslag: %1$s"
+ "Dela"
+ "Skärmdump"
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 24db429093..7002e4f7b6 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -22,9 +22,7 @@
"Gawa skrini"
"Bandika"
"Muundo huru"
- "Muhtasari"
"Hakuna vipengee vya hivi karibuni"
- "Funga"
"Mipangilio ya matumizi ya programu"
"Ondoa zote"
"Programu za hivi karibuni"
@@ -34,4 +32,18 @@
"Mapendekezo ya programu"
"Programu zote"
"Programu zako zinazopendekezwa"
+ "Fikia kwa urahisi programu unazotumia zaidi"
+ "Pixel hutabiri programu zinazofuata utakazohitaji, moja kwa moja kwenye Skrini yako ya kwanza. Gusa ili uweke mipangilio."
+ "Pata mapendekezo ya programu kwenye safu mlalo ya chini ya Skrini yako ya kwanza"
+ "Fikia kwa urahisi programu unazotumia sana moja kwa moja kwenye Skrini ya kwanza. Mapendekezo yatabadilika kulingana na ratiba zako. Programu zilizo kwenye safu mlalo ya chini zitahamishiwa kwenye Skrini yako ya kwanza."
+ "Fikia kwa urahisi programu unazotumia zaidi, moja kwa moja kwenye Skrini ya kwanza. Mapendekezo yatabadilika kulingana na ratiba zako. Programu zilizo kwenye safu mlalo ya chini zitahamishiwa kwenye folda mpya."
+ "Pata mapendekezo ya programu"
+ "Hapana, asante"
+ "Mipangilio"
+ "Programu zinazotumiwa zaidi huonekana hapa na hubadilika kulingana na ratiba"
+ "Buruta programu kutoka kwenye safu mlalo ya chini ili upate mapendekezo ya programu"
+ "Mapendekezo ya programu yamewekwa kwenye nafasi isiyo na kitu"
+ "Programu iliyotabiriwa: %1$s"
+ "Shiriki"
+ "Picha ya skrini"
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index 97d51cd35f..bb5d0d0aed 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -22,9 +22,7 @@
"திரைப் பிரிப்பு"
"பின் செய்தல்"
"குறிப்பிட்ட வடிவமில்லாத பயன்முறை"
- "மேலோட்டப் பார்வை"
"சமீபத்தியவை எதுவுமில்லை"
- "மூடும்"
"ஆப்ஸ் உபயோக அமைப்புகள்"
"எல்லாம் அழி"
"சமீபத்திய ஆப்ஸ்"
@@ -34,4 +32,32 @@
"ஆப்ஸ் பரிந்துரைகள்"
"அனைத்து ஆப்ஸும்"
"நீங்கள் கணித்த ஆப்ஸ்"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 24b37f75d4..fe601ffb9c 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -22,16 +22,28 @@
"స్క్రీన్ని విభజించు"
"పిన్ చేయి"
"సంప్రదాయేతర"
- "అవలోకనం"
"ఇటీవలి అంశాలు ఏవీ లేవు"
- "మూసివేయండి"
"యాప్ వినియోగ సెట్టింగ్లు"
"అన్నీ తీసివేయండి"
"ఇటీవలి యాప్లు"
"%1$s, %2$s"
"< 1 నిమిషం"
"నేటికి %1$s మిగిలి ఉంది"
- "యాప్ సూచనలు"
+ "యాప్ సలహాలు"
"అన్ని యాప్లు"
"మీ సూచించబడిన యాప్లు"
+ "మీరు ఎక్కువగా ఉపయోగించే యాప్లను సులభంగా యాక్సెస్ చేయండి"
+ "హోమ్ స్క్రీన్లో మీకు తర్వాత అవసరమయ్యే యాప్లను Pixel సూచిస్తుంది. సెటప్ చేయడానికి ట్యాప్ చేయండి."
+ "మీ హోమ్ స్క్రీన్ దిగువ వరుసలో యాప్ సలహాలను పొందండి"
+ "మీరు ఎక్కువగా ఉపయోగించే యాప్లను నేరుగా హోమ్ స్క్రీన్లోనే సులభంగా యాక్సెస్ చేయండి. మీ రోజువారీ కార్యకలాపాలను బట్టి సూచనలు మారతాయి. దిగువ వరుసలోని యాప్లు మీ హోమ్ స్క్రీన్ పైకి చేరుకుంటాయి."
+ "మీరు ఎక్కువగా ఉపయోగించే యాప్లను నేరుగా హోమ్ స్క్రీన్లోనే సులభంగా యాక్సెస్ చేయండి. మీ రోజువారీ కార్యకలాపాలను బట్టి సూచనలు మారతాయి. దిగువ వరుసలోని యాప్లు కొత్త ఫోల్డర్కు తరలించబడతాయి."
+ "యాప్ సలహాలను పొందండి"
+ "వద్దు"
+ "సెట్టింగ్లు"
+ "ఎక్కువగా ఉపయోగించిన యాప్లు ఇక్కడ కనిపిస్తాయి, అవి రోజువారీ కార్యకలాపాలను బట్టి మారుతూ ఉంటాయి"
+ "యాప్ సలహాలను పొందడానికి దిగువ వరుస నుండి యాప్లను లాగండి"
+ "యాప్ సలహాలు ఖాళీ స్పేస్కు జోడించబడ్డాయి"
+ "సూచించబడిన యాప్: %1$s"
+ "షేర్ చేయండి"
+ "స్క్రీన్షాట్"
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 0f6821bf19..4fbb0bb765 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -22,9 +22,7 @@
"แยกหน้าจอ"
"ตรึง"
"รูปแบบอิสระ"
- "ภาพรวม"
"ไม่มีรายการล่าสุด"
- "ปิด"
"การตั้งค่าการใช้แอป"
"ล้างทั้งหมด"
"แอปล่าสุด"
@@ -34,4 +32,18 @@
"คำแนะนำเกี่ยวกับแอป"
"แอปทั้งหมด"
"แอปที่คาดการณ์ไว้"
+ "เข้าถึงแอปที่ใช้มากที่สุดได้โดยง่าย"
+ "Pixel จะคาดคะเนว่าคุณต้องการใช้แอปใดต่อไป และจะแสดงแอปนั้นในหน้าจอหลัก แตะเพื่อตั้งค่า"
+ "ดูคำแนะนำเกี่ยวกับแอปที่แถวล่างของหน้าจอหลัก"
+ "เข้าถึงแอปที่ใช้มากที่สุดได้โดยง่ายในหน้าจอหลัก คำแนะนำจะเปลี่ยนไปตามการใช้งานประจำ แอปในแถวล่างจะย้ายขึ้นมาอยู่ในหน้าจอหลัก"
+ "เข้าถึงแอปที่ใช้มากที่สุดได้โดยง่ายในหน้าจอหลัก คำแนะนำจะเปลี่ยนไปตามการใช้งานประจำ แอปในแถวล่างจะย้ายไปอยู่ในโฟลเดอร์ใหม่"
+ "ดูคำแนะนำเกี่ยวกับแอป"
+ "ไม่เป็นไร"
+ "การตั้งค่า"
+ "แอปที่ใช้มากที่สุดจะปรากฎที่นี่และจะเปลี่ยนไปตามการใช้งานประจำ"
+ "ลากแอปออกจากแถวล่างเพื่อดูคำแนะนำเกี่ยวกับแอป"
+ "มีการเพิ่มคำแนะนำเกี่ยวกับแอปในพื้นที่ว่าง"
+ "แอปที่คาดว่าจะใช้: %1$s"
+ "แชร์"
+ "ภาพหน้าจอ"
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index 491bac5bd9..4da6db19c1 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -22,9 +22,7 @@
"Hatiin ang screen"
"I-pin"
"Freeform"
- "Overview"
"Walang kamakailang item"
- "Isara"
"Mga setting ng paggamit ng app"
"I-clear lahat"
"Mga kamakailang app"
@@ -34,4 +32,18 @@
"Mga iminumungkahing app"
"Lahat ng app"
"Iyong mga nahulaang app"
+ "Madaling i-access ang mga pinakaginagamit mong app"
+ "Huhulaan ng Pixel ang mga susunod na app na kakailanganin mo, nang direkta sa iyong Home screen. Mag-tap para i-set up."
+ "Makakuha ng mga iminumungkahing app sa ibabang row ng iyong Home screen"
+ "Madaling ma-access ang mga pinakaginagamit mong app nang direkta sa Home screen. Magbabago ang mga suhestyon batay sa iyong mga routine. Mapupunta sa iyong Home screen ang mga app na nasa ibabang row."
+ "Madaling ma-access ang mga pinakaginagamit mong app, direkta sa Home screen. Magbabago ang mga suhestyon batay sa iyong mga routine. Mapupunta sa isang bagong folder ang mga app na nasa ibabang row."
+ "Kumuha ng mga suhestiyon sa app"
+ "Huwag na lang"
+ "Mga Setting"
+ "Ipinapakita ang mga pinakaginagamit na app dito, at nababago ito batay sa mga routine"
+ "I-drag ang mga app mula sa ibabang row para makakuha ng mga iminumungkahing app"
+ "Idinagdag sa bakanteng espasyo ang mga iminumungkahing app"
+ "Hinulaang app: %1$s"
+ "Ibahagi"
+ "Screenshot"
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index ec6d88405c..79250971dd 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -22,16 +22,28 @@
"Bölünmüş ekran"
"Sabitle"
"Serbest çalışma"
- "Genel bakış"
"Yeni öğe yok"
- "Kapat"
"Uygulama kullanım ayarları"
"Tümünü temizle"
"Son uygulamalar"
"%1$s, %2$s"
"< 1 dk."
"Bugün %1$s kaldı"
- "Uygulama önerileri"
+ "Önerilen uygulamalar"
"Tüm uygulamalar"
"Tahmin edilen uygulamalarınız"
+ "En çok kullanılan uygulamalarınıza kolayca erişin"
+ "Pixel, bir sonraki adımda ihtiyaç duyacağınız uygulamaları Ana ekranınızda tahmin eder. Ayarlamak için dokunun."
+ "Önerilen uygulamaları Ana ekranınızın alt satırında alın"
+ "En çok kullanılan uygulamalarınıza Ana ekranda kolayca erişin. Öneriler rutinlerinize dayalı olarak değişir. Alt satırdaki uygulamalar, yukarı taşınarak Ana ekranınıza alınır."
+ "En çok kullanılan uygulamalarınıza Ana ekranda kolayca erişin. Öneriler rutinlerinize dayalı olarak değişir. Alt satırdaki uygulamalar yeni bir klasöre taşınır."
+ "Önerilen uygulamaları al"
+ "Hayır, teşekkürler"
+ "Ayarlar"
+ "En çok kullanılan uygulamalar burada görünür ve rutinlere dayalı olarak değişir"
+ "Önerilen uygulamaları almak için alt satırdaki uygulamaları dışarı sürükleyin"
+ "Önerilen uygulamalar boş alana eklendi"
+ "Tahmin edilen uygulama: %1$s"
+ "Paylaş"
+ "Ekran görüntüsü"
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 77360625db..5f32704ecf 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -22,16 +22,28 @@
"Розділити екран"
"Закріпити"
"Довільна форма"
- "Огляд"
"Немає нещодавніх додатків"
- "Закрити"
"Налаштування використання додатка"
"Очистити все"
"Нещодавні додатки"
"%1$s, %2$s"
"< 1 хв"
"Сьогодні залишилося %1$s"
- "Пропозиції додатків"
+ "Рекомендовані додатки"
"Усі додатки"
"Передбачені додатки"
+ "Легко відкривайте найвикористовуваніші додатки"
+ "Пристрій Pixel передбачає ваші дії, показуючи рекомендовані додатки просто на головному екрані. Натисніть, щоб налаштувати."
+ "Рекомендовані додатки з\'являтимуться в нижньому рядку головного екрана"
+ "З легкістю відкривайте найвикористовуваніші додатки просто з головного екрана. Рекомендації змінюватимуться залежно від ваших дій. Додатки в нижньому рядку буде переміщено на головний екран."
+ "З легкістю відкривайте найвикористовуваніші додатки просто з головного екрана. Рекомендації змінюватимуться залежно від ваших дій. Додатки в нижньому рядку буде переміщено в нову папку."
+ "Показувати рекомендовані додатки"
+ "Ні"
+ "Налаштування"
+ "Тут з\'являються найвикористовуваніші додатки, список яких змінюється залежно від ваших дій"
+ "Щоб побачити рекомендовані додатки, перетягніть наявні з нижнього рядка"
+ "Рекомендовані додатки додано у вільну область"
+ "Передбачений додаток: %1$s"
+ "Поділитися"
+ "Знімок екрана"
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 87b303f2af..8d7c31bbe0 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -22,16 +22,28 @@
"اسپلٹ اسکرین وضع"
"پن کریں"
"فری فارم"
- "مجموعی جائزہ"
"کوئی حالیہ آئٹم نہیں"
- "بند کریں"
"ایپ کے استعمال کی ترتیبات"
"سبھی کو صاف کریں"
"حالیہ ایپس"
"%1$s،%2$s"
"< 1 منٹ"
"آج %1$s بچا ہے"
- "ایپ کی تجاویز"
+ "ایپس کی تجاویز"
"تمام ایپس"
"آپ کی پیشن گوئی کردہ ایپس"
+ "آسانی سے اپنی سب سے زیادہ مستعمل ایپس تک رسائی حاصل کریں"
+ "Pixel پیش گوئی کرتا ہے کہ آپ کو ہوم اسکرین پر ہی، آپ کے اگلے ایپس کی ضرورت ہوگی۔ سیٹ اپ کرنے کیلئے تھپتھپائیں۔"
+ "اپنی ہوم اسکرین کی نچلی قطار پر ایپ کی تجاویز حاصل کریں"
+ "ہوم اسکرین پر آسانی سے اپنی سب سے زیادہ مستعمل ایپس تک رسائی حاصل کریں۔ آپ کے روٹینز کی بنیاد پر تجاویز تبدیل ہوں گی۔ نچلی قطار میں موجود ایپس آپ کی ہوم اسکرین کے اوپر منتقل ہونگیں۔"
+ "ہوم اسکرین پر، آسانی سے اپنی سب سے زیادہ مستعمل ایپس تک رسائی حاصل کریں۔ آپ کے روٹینز کی بنیاد پر تجاویز تبدیل ہوں گی۔ نچلی قطار میں موجود ایپس نئے فولڈر میں منتقل ہونگیں۔"
+ "ایپس کی تجاویز حاصل کریں"
+ "نہیں شکریہ"
+ "ترتیبات"
+ "سب سے زیادہ مستعمل ایپس یہاں ظاہر ہوتی ہیں، اور روٹینز کی بنیاد پر تبدیل ہوتی ہیں"
+ "ایپس کی تجاویز حاصل کرنے کیلئے ایپس کو نچلی قطار سے نیچے گھسیٹیں"
+ "ایپس کی تجاویز کو خالی اسپیس میں شامل کر دیا گیا"
+ "پیشن گوئی کردہ ایپ: %1$s"
+ "اشتراک کریں"
+ "اسکرین شاٹ"
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index 67c8e91c00..8b58836165 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -22,9 +22,7 @@
"Ekranni ikkiga ajratish"
"Mahkamlash"
"Erkin shakl"
- "Nazar"
"Yaqinda ishlatilgan ilovalar yo‘q"
- "Yopish"
"Ilovadan foydalanish sozlamalari"
"Hammasini tozalash"
"Yaqinda ishlatilgan ilovalar"
@@ -34,4 +32,18 @@
"Tavsiya etiladigan ilovalar"
"Barcha ilovalar"
"Taklif qilingan ilovalaringiz"
+ "Faol ishlatiladigan ilovalarga osongina kiring"
+ "Pixel yaqinda qaysi ilovalardan foydalanishingiz mumkinligini bosh ekranda aytadi. Sozlash uchun bosing."
+ "Ilova takliflari bosh ekran pastidagi qatorda chiqadi"
+ "Faol ishlatiladigan ilovalarga bosh ekrandan osongina kira olasiz. Tavsiyalar oxirgi faoliyatingiz asosida almashib boradi. Pastki qatordagi ilovalar bosh ekranga chiqadi."
+ "Faol ishlatiladigan ilovalarga bosh ekrandan osongina kira olasiz. Tavsiyalar oxirgi faoliyatingiz asosida almashib boradi. Pastki qatordagi ilovalar yangi jildga chiqadi."
+ "Ilova takliflarini olish"
+ "Kerak emas"
+ "Sozlamalar"
+ "Faol ishlatiladigan ilovalar bu yerda chiqadi va oxirgi faoliyatingiz asosida almashadi"
+ "Takliflar olish uchun ilovalarni pastki qatordan tashqariga oling"
+ "Tavsiya etilgan ilovalarni ochiq joylarga kiriting"
+ "Taklif etilgan ilova: %1$s"
+ "Ulashish"
+ "Skrinshot"
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index 34c89efcf1..666c5d2750 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -22,9 +22,7 @@
"Chia đôi màn hình"
"Ghim"
"Dạng tự do"
- "Tổng quan"
"Không có mục gần đây nào"
- "Đóng"
"Cài đặt mức sử dụng ứng dụng"
"Xóa tất cả"
"Ứng dụng gần đây"
@@ -34,4 +32,18 @@
"Các ứng dụng đề xuất"
"Tất cả ứng dụng"
"Các ứng dụng gợi ý của bạn"
+ "Dễ dàng truy cập vào các ứng dụng bạn dùng thường xuyên nhất"
+ "Pixel dự đoán các ứng dụng bạn cần dùng tiếp theo ngay trên Màn hình chính. Hãy nhấn để thiết lập."
+ "Xem các ứng dụng đề xuất ở hàng dưới cùng trên Màn hình chính"
+ "Ngay từ Màn hình chính, bạn có thể dễ dàng truy cập vào những ứng dụng mà mình dùng thường xuyên nhất. Các ứng dụng đề xuất sẽ thay đổi dựa trên thói quen của bạn. Các ứng dụng ở hàng dưới cùng sẽ chuyển lên phía trên của Màn hình chính."
+ "Ngay từ Màn hình chính, bạn có thể dễ dàng truy cập vào những ứng dụng mà mình dùng thường xuyên nhất. Các ứng dụng đề xuất sẽ thay đổi dựa trên thói quen của bạn. Các ứng dụng ở hàng dưới cùng sẽ chuyển đến một thư mục mới."
+ "Xem ứng dụng đề xuất"
+ "Không, cảm ơn"
+ "Cài đặt"
+ "Các ứng dụng dùng thường xuyên nhất sẽ hiển thị ở đây và thay đổi dựa trên thói quen"
+ "Kéo ứng dụng ra khỏi hàng dưới cùng để xem ứng dụng đề xuất"
+ "Thêm ứng dụng đề xuất vào không gian trống"
+ "Ứng dụng dự đoán: %1$s"
+ "Chia sẻ"
+ "Chụp ảnh màn hình"
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index 0e83977fa3..eedcacce80 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -22,16 +22,28 @@
"分屏"
"固定"
"自由窗口"
- "概览"
"近期没有任何内容"
- "关闭"
"应用使用设置"
"全部清除"
"最近用过的应用"
"%1$s(%2$s)"
"不到 1 分钟"
"今天还可使用 %1$s"
- "应用推荐"
+ "应用建议"
"所有应用"
"您的预测应用"
+ "轻松访问您最常用的应用"
+ "Pixel 会预测您接下来要使用的应用,并直接在主屏幕上显示这些应用。点按即可设置。"
+ "在主屏幕的最下面一排获取应用建议"
+ "直接在主屏幕上轻松访问您最常用的应用。系统会根据您的日常安排提供不同的建议。最下面一排中的应用会向上移动到主屏幕中。"
+ "直接在主屏幕上轻松访问您最常用的应用。系统会根据您的日常安排提供不同的建议。最下面一排中的应用会移到新文件夹中。"
+ "获取应用建议"
+ "不用了"
+ "设置"
+ "最常用的应用会显示在此处,显示的项目会根据日常安排而发生变化"
+ "将应用从最下面一排拖至别处,以获取应用建议"
+ "应用建议已添加到空白区域"
+ "预测的应用:%1$s"
+ "分享"
+ "屏幕截图"
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index ac7e8e9002..96736b99bb 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -22,9 +22,7 @@
"分割畫面"
"固定"
"自由形式"
- "概覽"
"最近沒有任何項目"
- "關閉"
"應用程式使用情況設定"
"全部清除"
"最近使用的應用程式"
@@ -34,4 +32,18 @@
"應用程式建議"
"所有應用程式"
"您的預測應用程式"
+ "輕鬆存取最常用的應用程式"
+ "Pixel 會在主畫面預測您將會使用的應用程式。輕按即可設定。"
+ "在主畫面的底部應用程式列獲取應用程式建議"
+ "在主畫面輕鬆存取最常用的應用程式。系統會根據您的日常安排變更建議,並會將底部應用程式列的應用程式上移至主畫面。"
+ "在主畫面輕鬆存取最常用的應用程式。系統會根據您的日常安排變更建議,並將底部應用程式列的應用程式移至新資料夾。"
+ "獲取應用程式建議"
+ "不用了,謝謝"
+ "設定"
+ "最常用的應用程式會在這裡顯示,並會根據日常安排變更"
+ "將應用程式從底部應用程式列拖曳出來,即可獲取應用程式建議"
+ "系統會將應用程式建議新增至空白位置"
+ "預測應用程式:%1$s"
+ "分享"
+ "螢幕截圖"
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index 3323bfd57d..a7f564d687 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -22,9 +22,7 @@
"分割畫面"
"固定"
"自由形式"
- "總覽"
"最近沒有任何項目"
- "關閉"
"應用程式使用情況設定"
"全部清除"
"最近使用的應用程式"
@@ -34,4 +32,18 @@
"應用程式建議"
"所有應用程式"
"系統預測你會使用的應用程式"
+ "輕鬆存取最常使用的應用程式"
+ "Pixel 會預測你接下來要使用的應用程式,並將預測結果顯示在主畫面上。輕觸即可進行設定。"
+ "在主畫面的底部取得應用程式建議"
+ "在主畫面上輕鬆存取最常使用的應用程式。應用程式建議會根據日常安排有所不同。系統會將底部列出的應用程式上移到主畫面。"
+ "在主畫面上輕鬆存取最常使用的應用程式。應用程式建議會根據日常安排有所不同。系統會將底部列出的應用程式移到新的資料夾。"
+ "取得應用程式建議"
+ "不用了,謝謝"
+ "設定"
+ "最常使用的應用程式會顯示在這裡,顯示的項目會根據日常安排有所不同"
+ "將應用程式往底部列拖曳即可取得應用程式建議"
+ "應用程式建議已新增到空白位置"
+ "預測的應用程式:%1$s"
+ "分享"
+ "擷取螢幕畫面"
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 0f1d99d7b6..e7cff608ae 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -22,9 +22,7 @@
"Hlukanisa isikrini"
"Phina"
"I-Freeform"
- "Buka konke"
"Azikho izinto zakamuva"
- "Vala"
"Izilungiselelo zokusetshenziswa kohlelo lokusebenza"
"Sula konke"
"Izinhlelo zokusebenza zakamuva"
@@ -34,4 +32,18 @@
"Iziphakamiso zohlelo lokusebenza"
"Zonke izinhlelo zokusebenza"
"Izinhlelo zakho zokusebenza eziqagelwe"
+ "Finyelela ngokushesha kuzinhlelo zakho zokusebenza ezisetshenziswa njalo"
+ "I-Pixel ibikezela izinhlelo zokusebenza ozozidinga ngokulandelayo, khona kusikrini sakho sasekhaya. Thepha ukuze usethe."
+ "Thola iziphakamiso ze-app emgqeni ongezansi wesikrini sakho sasekhaya"
+ "Finyelela kalula izinhlelo zakho zokusebenza ezisetshenziswa kakhulu khona kusikrini sasekhaya. Iziphakamiso zizoshintsha ngokususelwe kwimijikelezo yakho. Izinhlelo zokusebenza ezisemgqeni ongezansi zizoya phezulu kusikrini sakho sasekhaya."
+ "Finyelela kalula izinhlelo zakho zokusebenza ezisetshenziswa njalo, kusikrini sasekhaya. Iziphakamiso zizoshintsha ngokususelwe kwimijikelezo yakho. Izinhlelo zokusebenza ezisemgqeni ongezansi zizoya phezulu kufolda entsha."
+ "Thola iziphakamiso zohlelo lokusebenza"
+ "Cha ngiyabonga"
+ "Izilungiselelo"
+ "Izinhlelo zokusebenza ezisetshenziswa kakhulu zivela lapha, kanye noshintsho olususelwe kwimijikelezo"
+ "Hudula izinhlelo zokusebenza kusuka emgqeni ongezansi ukuthola iziphakamiso zohlelo lokusebenza"
+ "Iziphakamiso zohlelo lokusebenza ezengezwe esikhaleni esingenalutho"
+ "Uhlelo lokusebenza olubikezelwe: %1$s"
+ "Yabelana"
+ "Isithombe-skrini"
diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml
index a688f9a575..2b11ca0fff 100644
--- a/quickstep/res/values/config.xml
+++ b/quickstep/res/values/config.xml
@@ -13,13 +13,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
+
-
- - com.android.launcher3/com.android.quickstep.interaction.GestureSandboxActivity
-
+
com.android.quickstep.logging.StatsLogCompatManager
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 9a61165c40..18dc19c4c0 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -81,7 +81,7 @@
40dp
- 40dp
- 16dp
- 18dp
+ 40dp
+ 16dp
+ 18dp
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index f5552f0cb2..8effded1de 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -61,7 +61,7 @@
Your predicted apps
- Close
+ Close
@@ -103,15 +103,21 @@
That\'s it! Now try swiping from the left edge.
-
- All set
To change the sensitivity of the back gesture, go to Settings
+
+
+ Tutorial: Go Home
+
+ Try swiping upward from the bottom edge of the screen
+
+
+ All set
- Done
+ Done
- Settings
+ Settings
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index bf107fb76e..4915f5fb0d 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -26,39 +26,39 @@
- wrap_content
-
-
-
-
-
-
diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java
index 814b72882b..7de44a3fce 100644
--- a/src/com/android/launcher3/BaseActivity.java
+++ b/src/com/android/launcher3/BaseActivity.java
@@ -40,8 +40,6 @@ import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.logging.StatsLogUtils;
import com.android.launcher3.logging.StatsLogUtils.LogStateProvider;
import com.android.launcher3.logging.UserEventDispatcher;
-import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.ViewCache;
@@ -332,7 +330,6 @@ public abstract class BaseActivity extends Activity implements LogStateProvider,
return;
}
try {
- TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "start: shortcut", packageName);
getSystemService(LauncherApps.class).startShortcut(packageName, id, sourceBounds,
startActivityOptions, user);
} catch (SecurityException | IllegalStateException e) {
diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java
index 2dc783672d..e4f201c174 100644
--- a/src/com/android/launcher3/BaseDraggingActivity.java
+++ b/src/com/android/launcher3/BaseDraggingActivity.java
@@ -41,8 +41,6 @@ import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.model.AppLaunchTracker;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
-import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.touch.ItemClickHandler;
import com.android.launcher3.uioverrides.WallpaperColorInfo;
import com.android.launcher3.util.DefaultDisplay;
@@ -173,7 +171,6 @@ public abstract class BaseDraggingActivity extends BaseActivity
startShortcutIntentSafely(intent, optsBundle, item, sourceContainer);
} else if (user == null || user.equals(Process.myUserHandle())) {
// Could be launching some bookkeeping activity
- TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "start: activity", intent);
startActivity(intent, optsBundle);
AppLaunchTracker.INSTANCE.get(this).onStartApp(intent.getComponent(),
Process.myUserHandle(), sourceContainer);
@@ -184,7 +181,9 @@ public abstract class BaseDraggingActivity extends BaseActivity
sourceContainer);
}
getUserEventDispatcher().logAppLaunch(v, intent, user);
- getStatsLogManager().log(APP_LAUNCH_TAP, item.buildProto(null, null));
+
+ getStatsLogManager().log(APP_LAUNCH_TAP, item == null ? null
+ : item.buildProto(null, null));
return true;
} catch (NullPointerException|ActivityNotFoundException|SecurityException e) {
Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
diff --git a/src/com/android/launcher3/BaseRecyclerView.java b/src/com/android/launcher3/BaseRecyclerView.java
index 9e8441a0dd..8eceec04ec 100644
--- a/src/com/android/launcher3/BaseRecyclerView.java
+++ b/src/com/android/launcher3/BaseRecyclerView.java
@@ -16,17 +16,21 @@
package com.android.launcher3;
+import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED;
+
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityNodeInfo;
import androidx.recyclerview.widget.RecyclerView;
import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.RecyclerViewFastScroller;
@@ -179,12 +183,24 @@ public abstract class BaseRecyclerView extends RecyclerView {
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
- if (TestProtocol.sDebugTracing) {
- Log.d(TestProtocol.NO_SCROLL_END_WIDGETS, "onScrollStateChanged: " + state);
- }
-
if (state == SCROLL_STATE_IDLE) {
AccessibilityManagerCompat.sendScrollFinishedEventToTest(getContext());
}
}
+
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ if (isLayoutSuppressed()) info.setScrollable(false);
+ }
+
+ @Override
+ public void setLayoutFrozen(boolean frozen) {
+ final boolean changing = frozen != isLayoutSuppressed();
+ super.setLayoutFrozen(frozen);
+ if (changing) {
+ ActivityContext.lookupContext(getContext()).getDragLayer()
+ .sendAccessibilityEvent(TYPE_WINDOW_CONTENT_CHANGED);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 93247abe6c..e8e88c45e1 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -29,6 +29,7 @@ import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -70,7 +71,7 @@ import java.text.NumberFormat;
* too aggressive.
*/
public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, OnResumeCallback,
- IconLabelDotView, DraggableView {
+ IconLabelDotView, DraggableView, Reorderable {
private static final int DISPLAY_WORKSPACE = 0;
private static final int DISPLAY_ALL_APPS = 1;
@@ -78,6 +79,8 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
private static final int[] STATE_PRESSED = new int[] {android.R.attr.state_pressed};
+ private final PointF mTranslationForReorder = new PointF(0, 0);
+ private float mScaleForReorder = 1f;
private static final Property DOT_SCALE_PROPERTY
= new Property(Float.TYPE, "dotScale") {
@@ -672,6 +675,30 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
return mIconSize;
}
+ public void setReorderOffset(float x, float y) {
+ mTranslationForReorder.set(x, y);
+ super.setTranslationX(x);
+ super.setTranslationY(y);
+ }
+
+ public void getReorderOffset(PointF offset) {
+ offset.set(mTranslationForReorder);
+ }
+
+ public void setReorderScale(float scale) {
+ mScaleForReorder = scale;
+ super.setScaleX(scale);
+ super.setScaleY(scale);
+ }
+
+ public float getReorderScale() {
+ return mScaleForReorder;
+ }
+
+ public View getView() {
+ return this;
+ }
+
@Override
public int getViewType() {
return DRAGGABLE_ICON;
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 99416c4e2d..71a787f083 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -33,6 +33,7 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -54,7 +55,6 @@ import androidx.core.view.ViewCompat;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate;
import com.android.launcher3.anim.Interpolators;
-import com.android.launcher3.anim.PropertyListBuilder;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DraggableView;
import com.android.launcher3.folder.PreviewBackground;
@@ -66,7 +66,6 @@ import com.android.launcher3.util.ParcelableSparseArray;
import com.android.launcher3.util.Themes;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.views.ActivityContext;
-import com.android.launcher3.widget.LauncherAppWidgetHostView;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -99,6 +98,7 @@ public class CellLayout extends ViewGroup {
// return an (x, y) value from helper functions. Do NOT use them to maintain other state.
@Thunk final int[] mTmpPoint = new int[2];
@Thunk final int[] mTempLocation = new int[2];
+ final PointF mTmpPointF = new PointF();
// Used to visualize / debug the Grid of the CellLayout
private static final boolean VISUALIZE_GRID = false;
@@ -136,7 +136,7 @@ public class CellLayout extends ViewGroup {
private final Paint mDragOutlinePaint = new Paint();
@Thunk final ArrayMap mReorderAnimators = new ArrayMap<>();
- @Thunk final ArrayMap mShakeAnimators = new ArrayMap<>();
+ @Thunk final ArrayMap mShakeAnimators = new ArrayMap<>();
private boolean mItemPlacementDirty = false;
@@ -1868,10 +1868,11 @@ public class CellLayout extends ViewGroup {
boolean skip = mode == ReorderPreviewAnimation.MODE_HINT && solution.intersectingViews
!= null && !solution.intersectingViews.contains(child);
+
LayoutParams lp = (LayoutParams) child.getLayoutParams();
- if (c != null && !skip) {
- ReorderPreviewAnimation rha = new ReorderPreviewAnimation(child, mode, lp.cellX,
- lp.cellY, c.cellX, c.cellY, c.spanX, c.spanY);
+ if (c != null && !skip && (child instanceof Reorderable)) {
+ ReorderPreviewAnimation rha = new ReorderPreviewAnimation((Reorderable) child,
+ mode, lp.cellX, lp.cellY, c.cellX, c.cellY, c.spanX, c.spanY);
rha.animate();
}
}
@@ -1893,7 +1894,7 @@ public class CellLayout extends ViewGroup {
// Class which represents the reorder preview animations. These animations show that an item is
// in a temporary state, and hint at where the item will return to.
class ReorderPreviewAnimation {
- final View child;
+ final Reorderable child;
float finalDeltaX;
float finalDeltaY;
float initDeltaX;
@@ -1913,8 +1914,8 @@ public class CellLayout extends ViewGroup {
float animationProgress = 0;
ValueAnimator a;
- public ReorderPreviewAnimation(View child, int mode, int cellX0, int cellY0, int cellX1,
- int cellY1, int spanX, int spanY) {
+ public ReorderPreviewAnimation(Reorderable child, int mode, int cellX0, int cellY0,
+ int cellX1, int cellY1, int spanX, int spanY) {
regionToCenterPoint(cellX0, cellY0, spanX, spanY, mTmpPoint);
final int x0 = mTmpPoint[0];
final int y0 = mTmpPoint[1];
@@ -1926,63 +1927,60 @@ public class CellLayout extends ViewGroup {
this.child = child;
this.mode = mode;
+ finalDeltaX = 0;
+ finalDeltaY = 0;
+
+ child.getReorderOffset(mTmpPointF);
+ initDeltaX = mTmpPointF.x;
+ initDeltaY = mTmpPointF.y;
+ initScale = child.getReorderScale();
+ finalScale = mChildScale - (CHILD_DIVIDEND / child.getView().getWidth()) * initScale;
- // TODO issue!
- setInitialAnimationValues(false);
- finalScale = (mChildScale - (CHILD_DIVIDEND / child.getWidth())) * initScale;
- finalDeltaX = initDeltaX;
- finalDeltaY = initDeltaY;
int dir = mode == MODE_HINT ? -1 : 1;
if (dX == dY && dX == 0) {
} else {
if (dY == 0) {
- finalDeltaX += - dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude;
+ finalDeltaX = -dir * Math.signum(dX) * mReorderPreviewAnimationMagnitude;
} else if (dX == 0) {
- finalDeltaY += - dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude;
+ finalDeltaY = -dir * Math.signum(dY) * mReorderPreviewAnimationMagnitude;
} else {
double angle = Math.atan( (float) (dY) / dX);
- finalDeltaX += (int) (- dir * Math.signum(dX) *
- Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude));
- finalDeltaY += (int) (- dir * Math.signum(dY) *
- Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude));
+ finalDeltaX = (int) (-dir * Math.signum(dX)
+ * Math.abs(Math.cos(angle) * mReorderPreviewAnimationMagnitude));
+ finalDeltaY = (int) (-dir * Math.signum(dY)
+ * Math.abs(Math.sin(angle) * mReorderPreviewAnimationMagnitude));
}
}
}
- void setInitialAnimationValues(boolean restoreOriginalValues) {
- if (restoreOriginalValues) {
- if (child instanceof LauncherAppWidgetHostView) {
- LauncherAppWidgetHostView lahv = (LauncherAppWidgetHostView) child;
- initScale = lahv.getScaleToFit();
- initDeltaX = lahv.getTranslationForCentering().x;
- initDeltaY = lahv.getTranslationForCentering().y;
- } else {
- initScale = mChildScale;
- initDeltaX = 0;
- initDeltaY = 0;
- }
- } else {
- initScale = child.getScaleX();
- initDeltaX = child.getTranslationX();
- initDeltaY = child.getTranslationY();
- }
+ void setInitialAnimationValuesToBaseline() {
+ initScale = mChildScale;
+ initDeltaX = 0;
+ initDeltaY = 0;
}
void animate() {
- boolean noMovement = (finalDeltaX == initDeltaX) && (finalDeltaY == initDeltaY);
+ boolean noMovement = (finalDeltaX == 0) && (finalDeltaY == 0);
if (mShakeAnimators.containsKey(child)) {
ReorderPreviewAnimation oldAnimation = mShakeAnimators.get(child);
- oldAnimation.cancel();
mShakeAnimators.remove(child);
+
if (noMovement) {
- completeAnimationImmediately();
+ // A previous animation for this item exists, and no new animation will exist.
+ // Finish the old animation smoothly.
+ oldAnimation.finishAnimation();
return;
+ } else {
+ // A previous animation for this item exists, and a new one will exist. Stop
+ // the old animation in its tracks, and proceed with the new one.
+ oldAnimation.cancel();
}
}
if (noMovement) {
return;
}
+
ValueAnimator va = ObjectAnimator.ofFloat(this, ANIMATION_PROGRESS, 0, 1);
a = va;
@@ -1999,7 +1997,7 @@ public class CellLayout extends ViewGroup {
va.addListener(new AnimatorListenerAdapter() {
public void onAnimationRepeat(Animator animation) {
// We make sure to end only after a full period
- setInitialAnimationValues(true);
+ setInitialAnimationValuesToBaseline();
repeating = true;
}
});
@@ -2012,11 +2010,9 @@ public class CellLayout extends ViewGroup {
float r1 = (mode == MODE_HINT && repeating) ? 1.0f : animationProgress;
float x = r1 * finalDeltaX + (1 - r1) * initDeltaX;
float y = r1 * finalDeltaY + (1 - r1) * initDeltaY;
- child.setTranslationX(x);
- child.setTranslationY(y);
+ child.setReorderOffset(x, y);
float s = animationProgress * finalScale + (1 - animationProgress) * initScale;
- child.setScaleX(s);
- child.setScaleY(s);
+ child.setReorderScale(s);
}
private void cancel() {
@@ -2025,27 +2021,27 @@ public class CellLayout extends ViewGroup {
}
}
- @Thunk void completeAnimationImmediately() {
+ /**
+ * Smoothly returns the item to its baseline position / scale
+ */
+ @Thunk void finishAnimation() {
if (a != null) {
a.cancel();
}
- setInitialAnimationValues(true);
- a = new PropertyListBuilder()
- .scale(initScale)
- .translationX(initDeltaX)
- .translationY(initDeltaY)
- .build(child)
- .setDuration(REORDER_ANIMATION_DURATION);
- Launcher.cast(mActivity).getDragController().addFirstFrameAnimationHelper(a);
+ setInitialAnimationValuesToBaseline();
+ ValueAnimator va = ObjectAnimator.ofFloat(this, ANIMATION_PROGRESS,
+ animationProgress, 0);
+ a = va;
a.setInterpolator(DEACCEL_1_5);
+ a.setDuration(REORDER_ANIMATION_DURATION);
a.start();
}
}
private void completeAndClearReorderPreviewAnimations() {
for (ReorderPreviewAnimation a: mShakeAnimators.values()) {
- a.completeAnimationImmediately();
+ a.finishAnimation();
}
mShakeAnimators.clear();
}
diff --git a/src/com/android/launcher3/CheckLongPressHelper.java b/src/com/android/launcher3/CheckLongPressHelper.java
index ef353f9404..ff405ece3e 100644
--- a/src/com/android/launcher3/CheckLongPressHelper.java
+++ b/src/com/android/launcher3/CheckLongPressHelper.java
@@ -113,7 +113,10 @@ public class CheckLongPressHelper {
}
private void triggerLongPress() {
- if ((mView.getParent() != null) && mView.hasWindowFocus() && !mHasPerformedLongPress) {
+ if ((mView.getParent() != null)
+ && mView.hasWindowFocus()
+ && (!mView.isPressed() || mListener == null)
+ && !mHasPerformedLongPress) {
boolean handled;
if (mListener != null) {
handled = mListener.onLongClick(mView);
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index f69940b92e..c4eab8fb49 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -25,6 +25,8 @@ import static com.android.launcher3.AbstractFloatingView.TYPE_SNACKBAR;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.NORMAL;
+import static com.android.launcher3.LauncherState.NO_OFFSET;
+import static com.android.launcher3.LauncherState.NO_SCALE;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.LauncherState.OVERVIEW_PEEK;
import static com.android.launcher3.Utilities.postAsyncCallback;
@@ -85,7 +87,6 @@ import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.DropTarget.DragObject;
-import com.android.launcher3.LauncherState.ScaleAndTranslation;
import com.android.launcher3.LauncherStateManager.StateHandler;
import com.android.launcher3.accessibility.LauncherAccessibilityDelegate;
import com.android.launcher3.allapps.AllAppsContainerView;
@@ -1547,6 +1548,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
mOverlayManager.onActivityDestroyed(this);
mAppTransitionManager.unregisterRemoteAnimations();
mUserChangedCallbackCloseable.close();
+ mAllAppsController.onActivityDestroyed();
}
public LauncherAccessibilityDelegate getAccessibilityDelegate() {
@@ -1674,6 +1676,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
private void processShortcutFromDrop(PendingAddShortcutInfo info) {
Intent intent = new Intent(Intent.ACTION_CREATE_SHORTCUT).setComponent(info.componentName);
setWaitingForResult(PendingRequestArgs.forIntent(REQUEST_CREATE_SHORTCUT, intent, info));
+ TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "start: processShortcutFromDrop");
if (!info.activityInfo.startConfigActivity(this, REQUEST_CREATE_SHORTCUT)) {
handleActivityResult(REQUEST_CREATE_SHORTCUT, RESULT_CANCELED, null);
}
@@ -2696,10 +2699,6 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
return new TouchController[] {getDragController(), new AllAppsSwipeController(this)};
}
- protected ScaleAndTranslation getOverviewScaleAndTranslationForNormalState() {
- return new ScaleAndTranslation(1.1f, 0f, 0f);
- }
-
public void useFadeOutAnimationForLauncherStart(CancellationSignal signal) { }
public void onDragLayerHierarchyChanged() { }
@@ -2722,6 +2721,14 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
return Stream.of(APP_INFO, WIDGETS, INSTALL);
}
+
+ /**
+ * @see LauncherState#getOverviewScaleAndOffset(Launcher)
+ */
+ public float[] getNormalOverviewScaleAndOffset() {
+ return new float[] {NO_SCALE, NO_OFFSET};
+ }
+
public static Launcher getLauncher(Context context) {
return fromContext(context);
}
@@ -2733,6 +2740,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns,
return (T) activityContext;
}
+
/**
* Callback for listening for onResume
*/
diff --git a/src/com/android/launcher3/LauncherAppWidgetHost.java b/src/com/android/launcher3/LauncherAppWidgetHost.java
index 9921f76f0c..7ea68512ee 100644
--- a/src/com/android/launcher3/LauncherAppWidgetHost.java
+++ b/src/com/android/launcher3/LauncherAppWidgetHost.java
@@ -30,6 +30,8 @@ import android.util.SparseArray;
import android.widget.Toast;
import com.android.launcher3.model.WidgetsModel;
+import com.android.launcher3.testing.TestLogging;
+import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.widget.DeferredAppWidgetHostView;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
import com.android.launcher3.widget.PendingAppWidgetHostView;
@@ -298,6 +300,7 @@ public class LauncherAppWidgetHost extends AppWidgetHost {
}
try {
+ TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "start: startConfigActivity");
startAppWidgetConfigureActivityForResult(activity, widgetId, 0, requestCode, null);
} catch (ActivityNotFoundException | SecurityException e) {
Toast.makeText(activity, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java
index 504666a4c2..54d8f0d8bc 100644
--- a/src/com/android/launcher3/LauncherState.java
+++ b/src/com/android/launcher3/LauncherState.java
@@ -90,6 +90,9 @@ public abstract class LauncherState {
protected static final int FLAG_HIDE_BACK_BUTTON = 1 << 8;
protected static final int FLAG_HAS_SYS_UI_SCRIM = 1 << 9;
+ public static final float NO_OFFSET = 0;
+ public static final float NO_SCALE = 1;
+
protected static final PageAlphaProvider DEFAULT_ALPHA_PROVIDER =
new PageAlphaProvider(ACCEL_2) {
@Override
@@ -220,7 +223,7 @@ public abstract class LauncherState {
public abstract int getTransitionDuration(Launcher launcher);
public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) {
- return new ScaleAndTranslation(1, 0, 0);
+ return new ScaleAndTranslation(NO_SCALE, NO_OFFSET, NO_OFFSET);
}
public ScaleAndTranslation getHotseatScaleAndTranslation(Launcher launcher) {
@@ -228,12 +231,18 @@ public abstract class LauncherState {
return getWorkspaceScaleAndTranslation(launcher);
}
- public ScaleAndTranslation getOverviewScaleAndTranslation(Launcher launcher) {
- return launcher.getOverviewScaleAndTranslationForNormalState();
+ /**
+ * Returns an array of two elements.
+ * The first specifies the scale for the overview
+ * The second is the factor ([0, 1], 0 => center-screen; 1 => offscreen) by which overview
+ * should be shifted horizontally.
+ */
+ public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ return launcher.getNormalOverviewScaleAndOffset();
}
public ScaleAndTranslation getQsbScaleAndTranslation(Launcher launcher) {
- return new ScaleAndTranslation(1, 0, 0);
+ return new ScaleAndTranslation(NO_SCALE, NO_OFFSET, NO_OFFSET);
}
public float getOverviewFullscreenProgress() {
@@ -276,7 +285,14 @@ public abstract class LauncherState {
*
* 0 means completely zoomed in, without blurs. 1 is zoomed out, with blurs.
*/
- public float getDepth(Context context) {
+ public final float getDepth(Context context) {
+ if (BaseDraggingActivity.fromContext(context).getDeviceProfile().isMultiWindowMode) {
+ return 0;
+ }
+ return getDepthUnchecked(context);
+ }
+
+ protected float getDepthUnchecked(Context context) {
return 0f;
}
diff --git a/src/com/android/launcher3/Reorderable.java b/src/com/android/launcher3/Reorderable.java
new file mode 100644
index 0000000000..5112eafdac
--- /dev/null
+++ b/src/com/android/launcher3/Reorderable.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3;
+
+import android.graphics.PointF;
+import android.view.View;
+
+public interface Reorderable {
+
+ /**
+ * Set the offset related to reorder hint and "bounce" animations
+ */
+ void setReorderOffset(float x, float y);
+
+ void getReorderOffset(PointF offset);
+
+ /**
+ * Set the scale related to reorder hint and "bounce" animations
+ */
+ void setReorderScale(float scale);
+ float getReorderScale();
+
+ /**
+ * Get the com.android.view related to this object
+ */
+ View getView();
+}
diff --git a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java
index 3ee1293e28..f97eb28dda 100644
--- a/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java
+++ b/src/com/android/launcher3/allapps/AllAppsFastScrollHelper.java
@@ -15,206 +15,90 @@
*/
package com.android.launcher3.allapps;
-import com.android.launcher3.util.Thunk;
+import androidx.recyclerview.widget.LinearSmoothScroller;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
-import java.util.HashSet;
-import java.util.List;
+import com.android.launcher3.allapps.AlphabeticalAppsList.FastScrollSectionInfo;
-import androidx.recyclerview.widget.RecyclerView;
+public class AllAppsFastScrollHelper {
-public class AllAppsFastScrollHelper implements AllAppsGridAdapter.BindViewCallback {
+ private static final int NO_POSITION = -1;
- private static final int INITIAL_TOUCH_SETTLING_DURATION = 100;
- private static final int REPEAT_TOUCH_SETTLING_DURATION = 200;
+ private int mTargetFastScrollPosition = NO_POSITION;
private AllAppsRecyclerView mRv;
- private AlphabeticalAppsList mApps;
+ private ViewHolder mLastSelectedViewHolder;
- // Keeps track of the current and targeted fast scroll section (the section to scroll to after
- // the initial delay)
- int mTargetFastScrollPosition = -1;
- @Thunk String mCurrentFastScrollSection;
- @Thunk String mTargetFastScrollSection;
-
- // The settled states affect the delay before the fast scroll animation is applied
- private boolean mHasFastScrollTouchSettled;
- private boolean mHasFastScrollTouchSettledAtLeastOnce;
-
- // Set of all views animated during fast scroll. We keep track of these ourselves since there
- // is no way to reset a view once it gets scrapped or recycled without other hacks
- private HashSet mTrackedFastScrollViews = new HashSet<>();
-
- // Smooth fast-scroll animation frames
- @Thunk int mFastScrollFrameIndex;
- @Thunk final int[] mFastScrollFrames = new int[10];
-
- /**
- * This runnable runs a single frame of the smooth scroll animation and posts the next frame
- * if necessary.
- */
- @Thunk Runnable mSmoothSnapNextFrameRunnable = new Runnable() {
- @Override
- public void run() {
- if (mFastScrollFrameIndex < mFastScrollFrames.length) {
- mRv.scrollBy(0, mFastScrollFrames[mFastScrollFrameIndex]);
- mFastScrollFrameIndex++;
- mRv.postOnAnimation(mSmoothSnapNextFrameRunnable);
- }
- }
- };
-
- /**
- * This runnable updates the current fast scroll section to the target fastscroll section.
- */
- Runnable mFastScrollToTargetSectionRunnable = new Runnable() {
- @Override
- public void run() {
- // Update to the target section
- mCurrentFastScrollSection = mTargetFastScrollSection;
- mHasFastScrollTouchSettled = true;
- mHasFastScrollTouchSettledAtLeastOnce = true;
- updateTrackedViewsFastScrollFocusState();
- }
- };
-
- public AllAppsFastScrollHelper(AllAppsRecyclerView rv, AlphabeticalAppsList apps) {
+ public AllAppsFastScrollHelper(AllAppsRecyclerView rv) {
mRv = rv;
- mApps = apps;
- }
-
- public void onSetAdapter(AllAppsGridAdapter adapter) {
- adapter.setBindViewCallback(this);
}
/**
* Smooth scrolls the recycler view to the given section.
- *
- * @return whether the fastscroller can scroll to the new section.
*/
- public boolean smoothScrollToSection(int scrollY, int availableScrollHeight,
- AlphabeticalAppsList.FastScrollSectionInfo info) {
- if (mTargetFastScrollPosition != info.fastScrollToItem.position) {
- mTargetFastScrollPosition = info.fastScrollToItem.position;
- smoothSnapToPosition(scrollY, availableScrollHeight, info);
- return true;
+ public void smoothScrollToSection(FastScrollSectionInfo info) {
+ if (mTargetFastScrollPosition == info.fastScrollToItem.position) {
+ return;
}
- return false;
- }
-
- /**
- * Smoothly snaps to a given position. We do this manually by calculating the keyframes
- * ourselves and animating the scroll on the recycler view.
- */
- private void smoothSnapToPosition(int scrollY, int availableScrollHeight,
- AlphabeticalAppsList.FastScrollSectionInfo info) {
- mRv.removeCallbacks(mSmoothSnapNextFrameRunnable);
- mRv.removeCallbacks(mFastScrollToTargetSectionRunnable);
-
- trackAllChildViews();
- if (mHasFastScrollTouchSettled) {
- // In this case, the user has already settled once (and the fast scroll state has
- // animated) and they are just fine-tuning their section from the last section, so
- // we should make it feel fast and update immediately.
- mCurrentFastScrollSection = info.sectionName;
- mTargetFastScrollSection = null;
- updateTrackedViewsFastScrollFocusState();
- } else {
- // Otherwise, the user has scrubbed really far, and we don't want to distract the user
- // with the flashing fast scroll state change animation in addition to the fast scroll
- // section popup, so reset the views to normal, and wait for the touch to settle again
- // before animating the fast scroll state.
- mCurrentFastScrollSection = null;
- mTargetFastScrollSection = info.sectionName;
- mHasFastScrollTouchSettled = false;
- updateTrackedViewsFastScrollFocusState();
-
- // Delay scrolling to a new section until after some duration. If the user has been
- // scrubbing a while and makes multiple big jumps, then reduce the time needed for the
- // fast scroll to settle so it doesn't feel so long.
- mRv.postDelayed(mFastScrollToTargetSectionRunnable,
- mHasFastScrollTouchSettledAtLeastOnce ?
- REPEAT_TOUCH_SETTLING_DURATION :
- INITIAL_TOUCH_SETTLING_DURATION);
- }
-
- // Calculate the full animation from the current scroll position to the final scroll
- // position, and then run the animation for the duration. If we are scrolling to the
- // first fast scroll section, then just scroll to the top of the list itself.
- List fastScrollSections =
- mApps.getFastScrollerSections();
- int newPosition = info.fastScrollToItem.position;
- int newScrollY = fastScrollSections.size() > 0 && fastScrollSections.get(0) == info
- ? 0
- : Math.min(availableScrollHeight, mRv.getCurrentScrollY(newPosition, 0));
- int numFrames = mFastScrollFrames.length;
- int deltaY = newScrollY - scrollY;
- float ySign = Math.signum(deltaY);
- int step = (int) (ySign * Math.ceil((float) Math.abs(deltaY) / numFrames));
- for (int i = 0; i < numFrames; i++) {
- // TODO(winsonc): We can interpolate this as well.
- mFastScrollFrames[i] = (int) (ySign * Math.min(Math.abs(step), Math.abs(deltaY)));
- deltaY -= step;
- }
- mFastScrollFrameIndex = 0;
- mRv.postOnAnimation(mSmoothSnapNextFrameRunnable);
+ mTargetFastScrollPosition = info.fastScrollToItem.position;
+ mRv.getLayoutManager().startSmoothScroll(new MyScroller(mTargetFastScrollPosition));
}
public void onFastScrollCompleted() {
- // TODO(winsonc): Handle the case when the user scrolls and releases before the animation
- // runs
-
- // Stop animating the fast scroll position and state
- mRv.removeCallbacks(mSmoothSnapNextFrameRunnable);
- mRv.removeCallbacks(mFastScrollToTargetSectionRunnable);
-
- // Reset the tracking variables
- mHasFastScrollTouchSettled = false;
- mHasFastScrollTouchSettledAtLeastOnce = false;
- mCurrentFastScrollSection = null;
- mTargetFastScrollSection = null;
- mTargetFastScrollPosition = -1;
-
- updateTrackedViewsFastScrollFocusState();
- mTrackedFastScrollViews.clear();
+ mTargetFastScrollPosition = NO_POSITION;
+ setLastHolderSelected(false);
+ mLastSelectedViewHolder = null;
}
- @Override
- public void onBindView(AllAppsGridAdapter.ViewHolder holder) {
- // Update newly bound views to the current fast scroll state if we are fast scrolling
- if (mCurrentFastScrollSection != null || mTargetFastScrollSection != null) {
- mTrackedFastScrollViews.add(holder);
+
+ private void setLastHolderSelected(boolean isSelected) {
+ if (mLastSelectedViewHolder != null) {
+ mLastSelectedViewHolder.itemView.setActivated(isSelected);
+ mLastSelectedViewHolder.setIsRecyclable(!isSelected);
}
}
- /**
- * Starts tracking all the recycler view's children which are FastScrollFocusableViews.
- */
- private void trackAllChildViews() {
- int childCount = mRv.getChildCount();
- for (int i = 0; i < childCount; i++) {
- RecyclerView.ViewHolder viewHolder = mRv.getChildViewHolder(mRv.getChildAt(i));
- if (viewHolder != null) {
- mTrackedFastScrollViews.add(viewHolder);
- }
- }
- }
+ private class MyScroller extends LinearSmoothScroller {
- /**
- * Updates the fast scroll focus on all the children.
- */
- private void updateTrackedViewsFastScrollFocusState() {
- for (RecyclerView.ViewHolder viewHolder : mTrackedFastScrollViews) {
- int pos = viewHolder.getAdapterPosition();
- boolean isActive = false;
- if (mCurrentFastScrollSection != null
- && pos > RecyclerView.NO_POSITION
- && pos < mApps.getAdapterItems().size()) {
- AlphabeticalAppsList.AdapterItem item = mApps.getAdapterItems().get(pos);
- isActive = item != null &&
- mCurrentFastScrollSection.equals(item.sectionName) &&
- item.position == mTargetFastScrollPosition;
+ private final int mTargetPosition;
+
+ public MyScroller(int targetPosition) {
+ super(mRv.getContext());
+
+ mTargetPosition = targetPosition;
+ setTargetPosition(targetPosition);
+ }
+
+ @Override
+ protected int getVerticalSnapPreference() {
+ return SNAP_TO_START;
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (mTargetPosition != mTargetFastScrollPosition) {
+ // Target changed, before the last scroll can finish
+ return;
+ }
+
+ ViewHolder currentHolder = mRv.findViewHolderForAdapterPosition(mTargetPosition);
+ if (currentHolder == mLastSelectedViewHolder) {
+ return;
+ }
+
+ setLastHolderSelected(false);
+ mLastSelectedViewHolder = currentHolder;
+ setLastHolderSelected(true);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if (mTargetPosition != mTargetFastScrollPosition) {
+ setLastHolderSelected(false);
+ mLastSelectedViewHolder = null;
}
- viewHolder.itemView.setActivated(isActive);
}
}
}
diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
index 4aebec0798..3afa756add 100644
--- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
@@ -71,11 +71,6 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter fastScrollSections =
mApps.getFastScrollerSections();
@@ -236,10 +233,7 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine
lastInfo = info;
}
- // Update the fast scroll
- int scrollY = getCurrentScrollY();
- int availableScrollHeight = getAvailableScrollHeight();
- mFastScrollHelper.smoothScrollToSection(scrollY, availableScrollHeight, lastInfo);
+ mFastScrollHelper.smoothScrollToSection(lastInfo);
return lastInfo.sectionName;
}
@@ -257,7 +251,6 @@ public class AllAppsRecyclerView extends BaseRecyclerView implements LogContaine
mCachedScrollPositions.clear();
}
});
- mFastScrollHelper.onSetAdapter((AllAppsGridAdapter) adapter);
}
@Override
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 68b070617d..071c03d23a 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -1,5 +1,6 @@
package com.android.launcher3.allapps;
+import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.ALL_APPS_CONTENT;
import static com.android.launcher3.LauncherState.ALL_APPS_HEADER_EXTRA;
import static com.android.launcher3.LauncherState.APPS_VIEW_ITEM_MASK;
@@ -17,7 +18,10 @@ import static com.android.launcher3.util.SystemUiController.UI_STATE_ALL_APPS;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
+import android.content.Context;
import android.util.FloatProperty;
+import android.view.View;
+import android.view.ViewGroup;
import android.view.animation.Interpolator;
import com.android.launcher3.DeviceProfile;
@@ -30,8 +34,11 @@ import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.anim.PropertySetter;
import com.android.launcher3.states.StateAnimationConfig;
+import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
import com.android.launcher3.util.Themes;
import com.android.launcher3.views.ScrimView;
+import com.android.systemui.plugins.AllAppsSearchPlugin;
+import com.android.systemui.plugins.PluginListener;
/**
* Handles AllApps view transition.
@@ -43,7 +50,8 @@ import com.android.launcher3.views.ScrimView;
* If release velocity < THRES1, snap according to either top or bottom depending on whether it's
* closer to top or closer to the page indicator.
*/
-public class AllAppsTransitionController implements StateHandler, OnDeviceProfileChangeListener {
+public class AllAppsTransitionController implements StateHandler, OnDeviceProfileChangeListener,
+ PluginListener {
public static final FloatProperty ALL_APPS_PROGRESS =
new FloatProperty("allAppsProgress") {
@@ -79,6 +87,9 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
private float mScrollRangeDelta = 0;
+ private AllAppsSearchPlugin mPlugin;
+ private View mPluginContent;
+
public AllAppsTransitionController(Launcher l) {
mLauncher = l;
mShiftRange = mLauncher.getDeviceProfile().heightPx;
@@ -145,6 +156,7 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
setProgress(state.getVerticalProgress(mLauncher));
setAlphas(state, new StateAnimationConfig(), NO_ANIM_PROPERTY_SETTER);
onProgressAnimationEnd();
+ updatePlugin(state);
}
/**
@@ -178,6 +190,20 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
builder.add(anim);
setAlphas(toState, config, builder);
+
+ updatePlugin(toState);
+ }
+
+ private void updatePlugin(LauncherState toState) {
+ if (mPlugin == null) return;
+ if (toState == ALL_APPS) {
+ // TODO: change this from toggle event to continuous transition event.
+ mPlugin.setEditText(mAppsView.getSearchUiManager().setTextSearchEnabled(true));
+ } else {
+ mAppsView.getSearchUiManager().setTextSearchEnabled(false);
+ mPlugin.setEditText(null);
+ }
+
}
public Animator createSpringAnimation(float... progressValues) {
@@ -196,10 +222,15 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
Interpolator allAppsFade = config.getInterpolator(ANIM_ALL_APPS_FADE, LINEAR);
Interpolator headerFade = config.getInterpolator(ANIM_ALL_APPS_HEADER_FADE, allAppsFade);
- setter.setViewAlpha(mAppsView.getContentView(), hasAllAppsContent ? 1 : 0, allAppsFade);
- setter.setViewAlpha(mAppsView.getScrollBar(), hasAllAppsContent ? 1 : 0, allAppsFade);
- mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, hasAllAppsContent,
- setter, headerFade, allAppsFade);
+
+ if (mPlugin == null) {
+ setter.setViewAlpha(mAppsView.getContentView(), hasAllAppsContent ? 1 : 0, allAppsFade);
+ setter.setViewAlpha(mAppsView.getScrollBar(), hasAllAppsContent ? 1 : 0, allAppsFade);
+ mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra,
+ hasAllAppsContent, setter, headerFade, allAppsFade);
+ } else {
+ setter.setViewAlpha(mPluginContent, hasAllAppsContent ? 1 : 0, allAppsFade);
+ }
mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade);
setter.setInt(mScrimView, ScrimView.DRAG_HANDLE_ALPHA,
@@ -215,6 +246,8 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
public void setupViews(AllAppsContainerView appsView, ScrimView scrimView) {
mAppsView = appsView;
mScrimView = scrimView;
+ PluginManagerWrapper.INSTANCE.get(mLauncher)
+ .addPluginListener(this, AllAppsSearchPlugin.class, false);
}
/**
@@ -238,4 +271,24 @@ public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
mAppsView.reset(false /* animate */);
}
}
+
+ @Override
+ public void onPluginConnected(AllAppsSearchPlugin plugin, Context context) {
+ mPlugin = plugin;
+ mPluginContent = mLauncher.getLayoutInflater().inflate(
+ R.layout.all_apps_content_layout, mAppsView, false);
+ mAppsView.addView(mPluginContent);
+ mPluginContent.setAlpha(0f);
+ mPlugin.setup((ViewGroup) mPluginContent);
+ }
+
+ @Override
+ public void onPluginDisconnected(AllAppsSearchPlugin plugin) {
+ mPlugin = null;
+ mAppsView.removeView(mPluginContent);
+ }
+
+ public void onActivityDestroyed() {
+ PluginManagerWrapper.INSTANCE.get(mLauncher).removePluginListener(this);
+ }
}
diff --git a/src/com/android/launcher3/allapps/DiscoveryBounce.java b/src/com/android/launcher3/allapps/DiscoveryBounce.java
index fc29a30d74..064868208d 100644
--- a/src/com/android/launcher3/allapps/DiscoveryBounce.java
+++ b/src/com/android/launcher3/allapps/DiscoveryBounce.java
@@ -172,8 +172,7 @@ public class DiscoveryBounce extends AbstractFloatingView {
if (withDelay) {
new Handler().postDelayed(() -> showForOverviewIfNeeded(launcher, false), DELAY_MS);
return;
- } else if (Launcher.ACTIVITY_TRACKER.hasPending()
- || AbstractFloatingView.getTopOpenView(launcher) != null) {
+ } else if (AbstractFloatingView.getTopOpenView(launcher) != null) {
// TODO: Move these checks to the top and call this method after invalidate handler.
return;
}
diff --git a/src/com/android/launcher3/allapps/SearchUiManager.java b/src/com/android/launcher3/allapps/SearchUiManager.java
index cf9a0884bd..34bf636cb4 100644
--- a/src/com/android/launcher3/allapps/SearchUiManager.java
+++ b/src/com/android/launcher3/allapps/SearchUiManager.java
@@ -18,6 +18,9 @@ package com.android.launcher3.allapps;
import android.graphics.Rect;
import android.view.KeyEvent;
import android.view.animation.Interpolator;
+import android.widget.EditText;
+
+import androidx.annotation.Nullable;
import com.android.launcher3.anim.PropertySetter;
@@ -52,4 +55,14 @@ public interface SearchUiManager {
*/
void setContentVisibility(int visibleElements, PropertySetter setter,
Interpolator interpolator);
+
+ /**
+ * Called to control how the search UI result should be handled.
+ *
+ * @param isEnabled when {@code true}, the search is all handled inside AOSP
+ * and is not overlayable.
+ * @return the searchbox edit text object
+ */
+ @Nullable
+ EditText setTextSearchEnabled(boolean isEnabled);
}
diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
index 9e3a862263..e72e1a8bc1 100644
--- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
+++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
@@ -33,6 +33,7 @@ import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.animation.Interpolator;
+import android.widget.EditText;
import com.android.launcher3.BaseDraggingActivity;
import com.android.launcher3.DeviceProfile;
@@ -214,4 +215,9 @@ public class AppsSearchContainerLayout extends ExtendedEditText
Interpolator interpolator) {
setter.setViewAlpha(this, (visibleElements & ALL_APPS_HEADER) != 0 ? 1 : 0, interpolator);
}
+
+ @Override
+ public EditText setTextSearchEnabled(boolean isEnabled) {
+ return this;
+ }
}
diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
index 737c97b1bc..1d32d1dfa2 100644
--- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
+++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
@@ -75,9 +75,6 @@ public class AccessibilityManagerCompat {
}
public static void sendScrollFinishedEventToTest(Context context) {
- if (TestProtocol.sDebugTracing) {
- Log.d(TestProtocol.NO_SCROLL_END_WIDGETS, "sendScrollFinishedEventToTest");
- }
final AccessibilityManager accessibilityManager = getAccessibilityManagerForTest(context);
if (accessibilityManager == null) return;
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index bcd91da74e..2b91cb1fa3 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -168,6 +168,7 @@ public final class FeatureFlags {
for (DebugFlag flag : sDebugFlags) {
flag.initialize(context);
}
+ sDebugFlags.sort((f1, f2) -> f1.key.compareToIgnoreCase(f2.key));
}
}
@@ -178,10 +179,20 @@ public final class FeatureFlags {
}
public static void dump(PrintWriter pw) {
- pw.println("FeatureFlags:");
+ pw.println("DeviceFlags:");
synchronized (sDebugFlags) {
for (DebugFlag flag : sDebugFlags) {
- pw.println(" " + flag.key + "=" + flag.get());
+ if (flag instanceof DeviceFlag) {
+ pw.println(" " + flag.toString());
+ }
+ }
+ }
+ pw.println("DebugFlags:");
+ synchronized (sDebugFlags) {
+ for (DebugFlag flag : sDebugFlags) {
+ if (!(flag instanceof DeviceFlag)) {
+ pw.println(" " + flag.toString());
+ }
}
}
}
@@ -202,13 +213,11 @@ public final class FeatureFlags {
@Override
public String toString() {
- return appendProps(new StringBuilder()
- .append(getClass().getSimpleName()).append('{'))
- .append('}').toString();
+ return appendProps(new StringBuilder()).toString();
}
protected StringBuilder appendProps(StringBuilder src) {
- return src.append("key=").append(key).append(", defaultValue=").append(defaultValue);
+ return src.append(key).append(", defaultValue=").append(defaultValue);
}
public void addChangeListener(Context context, Runnable r) { }
@@ -240,8 +249,7 @@ public final class FeatureFlags {
@Override
protected StringBuilder appendProps(StringBuilder src) {
- return super.appendProps(src).append(", mCurrentValue=").append(mCurrentValue)
- .append(", description=").append(description);
+ return super.appendProps(src).append(", mCurrentValue=").append(mCurrentValue);
}
}
diff --git a/src/com/android/launcher3/dragndrop/AddItemActivity.java b/src/com/android/launcher3/dragndrop/AddItemActivity.java
index 6c40b8a287..0df67133ab 100644
--- a/src/com/android/launcher3/dragndrop/AddItemActivity.java
+++ b/src/com/android/launcher3/dragndrop/AddItemActivity.java
@@ -170,16 +170,14 @@ public class AddItemActivity extends BaseActivity implements OnLongClickListener
}
}, null, View.DRAG_FLAG_GLOBAL);
-
- Intent homeIntent = listener.addToIntent(
- new Intent(Intent.ACTION_MAIN)
+ Intent homeIntent = new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_HOME)
.setPackage(getPackageName())
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
-
- Launcher.ACTIVITY_TRACKER.schedule(listener);
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ Launcher.ACTIVITY_TRACKER.runCallbackWhenActivityExists(listener, homeIntent);
startActivity(homeIntent,
- ActivityOptions.makeCustomAnimation(this, 0, android.R.anim.fade_out).toBundle());
+ ActivityOptions.makeCustomAnimation(this, 0, android.R.anim.fade_out)
+ .toBundle());
mFinishOnPause = true;
return false;
}
diff --git a/src/com/android/launcher3/dragndrop/BaseItemDragListener.java b/src/com/android/launcher3/dragndrop/BaseItemDragListener.java
index 9b91a1de67..707fd06519 100644
--- a/src/com/android/launcher3/dragndrop/BaseItemDragListener.java
+++ b/src/com/android/launcher3/dragndrop/BaseItemDragListener.java
@@ -92,7 +92,7 @@ public abstract class BaseItemDragListener implements View.OnDragListener, DragS
postCleanup();
return false;
}
- if (event.getAction() == DragEvent.ACTION_DRAG_STARTED) {
+ if (event.getAction() == DragEvent.ACTION_DRAG_STARTED || !mDragController.isDragging()) {
if (onDragStart(event)) {
return true;
} else {
@@ -161,7 +161,6 @@ public abstract class BaseItemDragListener implements View.OnDragListener, DragS
}
protected void postCleanup() {
- Launcher.ACTIVITY_TRACKER.clearReference(this);
if (mLauncher != null) {
// Remove any drag params from the launcher intent since the drag operation is complete.
Intent newIntent = new Intent(mLauncher.getIntent());
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index b9b33fe14a..12d88df7d9 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -164,6 +164,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
@Thunk final ArrayList mItemsInReadingOrder = new ArrayList();
private AnimatorSet mCurrentAnimator;
+ private boolean mIsAnimatingClosed = false;
protected final Launcher mLauncher;
protected DragController mDragController;
@@ -331,7 +332,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
.map(info -> info.suggestedFolderNames)
.map(folderNames -> (FolderNameInfo[]) folderNames
.getParcelableArrayExtra(FolderInfo.EXTRA_FOLDER_SUGGESTIONS))
- .ifPresent(nameInfos -> showLabelSuggestion(nameInfos, false));
+ .ifPresent(nameInfos -> showLabelSuggestions(nameInfos));
}
mFolderName.setHint("");
mIsEditingName = true;
@@ -457,24 +458,12 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
});
}
- /**
- * Show suggested folder title in FolderEditText, push InputMethodManager suggestions and save
- * the suggestedFolderNames.
- */
- public void showSuggestedTitle(FolderNameInfo[] nameInfos) {
- if (FeatureFlags.FOLDER_NAME_SUGGEST.get()) {
- if (isEmpty(mFolderName.getText().toString())
- && !mInfo.hasOption(FLAG_MANUAL_FOLDER_NAME)) {
- showLabelSuggestion(nameInfos, true);
- }
- }
- }
/**
* Show suggested folder title in FolderEditText if the first suggestion is non-empty, push
- * InputMethodManager suggestions.
+ * rest of the suggestions to InputMethodManager.
*/
- private void showLabelSuggestion(FolderNameInfo[] nameInfos, boolean animate) {
+ private void showLabelSuggestions(FolderNameInfo[] nameInfos) {
if (nameInfos == null) {
return;
}
@@ -494,9 +483,6 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
mFolderName.setText(firstLabel);
}
}
- if (animate) {
- animateOpen(mInfo.contents, 0, true);
- }
mFolderName.showKeyboard();
mFolderName.displayCompletions(
asList(nameInfos).subList(0, nameInfos.length).stream()
@@ -744,15 +730,24 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
}
private void animateClosed() {
+ if (mIsAnimatingClosed) {
+ return;
+ }
if (mCurrentAnimator != null && mCurrentAnimator.isRunning()) {
mCurrentAnimator.cancel();
}
AnimatorSet a = new FolderAnimationManager(this, false /* isOpening */).getAnimator();
a.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mIsAnimatingClosed = true;
+ }
+
@Override
public void onAnimationEnd(Animator animation) {
closeComplete(true);
announceAccessibilityChanges();
+ mIsAnimatingClosed = false;
}
});
startAnimation(a);
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 680c3ba542..96bdc2ad2a 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -16,6 +16,8 @@
package com.android.launcher3.folder;
+import static android.text.TextUtils.isEmpty;
+
import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW;
import static com.android.launcher3.folder.PreviewItemManager.INITIAL_ITEM_ANIMATION_DURATION;
@@ -24,6 +26,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Canvas;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
@@ -47,6 +50,7 @@ import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.OnAlarmListener;
import com.android.launcher3.R;
+import com.android.launcher3.Reorderable;
import com.android.launcher3.Utilities;
import com.android.launcher3.Workspace;
import com.android.launcher3.anim.Interpolators;
@@ -77,7 +81,7 @@ import java.util.function.Predicate;
* An icon that can appear on in the workspace representing an {@link Folder}.
*/
public class FolderIcon extends FrameLayout implements FolderListener, IconLabelDotView,
- DraggableView {
+ DraggableView, Reorderable {
@Thunk ActivityContext mActivity;
@Thunk Folder mFolder;
@@ -117,6 +121,9 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel
private float mDotScale;
private Animator mDotScaleAnim;
+ private final PointF mTranslationForReorder = new PointF(0, 0);
+ private float mScaleForReorder = 1f;
+
private static final Property DOT_SCALE_PROPERTY
= new Property(Float.TYPE, "dotScale") {
@Override
@@ -224,16 +231,6 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel
mBackground.getBounds(outBounds);
}
- @Override
- public int getViewType() {
- return DRAGGABLE_ICON;
- }
-
- @Override
- public void getVisualDragBounds(Rect bounds) {
- getPreviewBounds(bounds);
- }
-
public float getBackgroundStrokeWidth() {
return mBackground.getStrokeWidth();
}
@@ -418,11 +415,33 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel
postDelayed(() -> {
mPreviewItemManager.hidePreviewItem(finalIndex, false);
mFolder.showItem(item);
+ setLabelSuggestion(nameInfos);
invalidate();
- mFolder.showSuggestedTitle(nameInfos);
}, DROP_IN_ANIMATION_DURATION);
}
+ /**
+ * Set the suggested folder name.
+ */
+ public void setLabelSuggestion(FolderNameInfo[] nameInfos) {
+ if (!FeatureFlags.FOLDER_NAME_SUGGEST.get()) {
+ return;
+ }
+ if (!isEmpty(mFolderName.getText().toString())
+ || mInfo.hasOption(FolderInfo.FLAG_MANUAL_FOLDER_NAME)) {
+ return;
+ }
+ if (nameInfos == null || nameInfos[0] == null || isEmpty(nameInfos[0].getLabel())) {
+ return;
+ }
+ mInfo.title = nameInfos[0].getLabel();
+ onTitleChanged(mInfo.title);
+ mFolder.mFolderName.setText(mInfo.title);
+ mFolder.mLauncher.getModelWriter().updateItemInDatabase(mInfo);
+ // TODO: Add logging while folder creation.
+ }
+
+
public void onDrop(DragObject d, boolean itemReturnedOnFailedDrop) {
WorkspaceItemInfo item;
if (d.dragInfo instanceof AppInfo) {
@@ -692,4 +711,39 @@ public class FolderIcon extends FrameLayout implements FolderListener, IconLabel
public void onFolderClose(int currentPage) {
mPreviewItemManager.onFolderClose(currentPage);
}
+
+
+ public void setReorderOffset(float x, float y) {
+ mTranslationForReorder.set(x, y);
+ super.setTranslationX(x);
+ super.setTranslationY(y);
+ }
+
+ public void getReorderOffset(PointF offset) {
+ offset.set(mTranslationForReorder);
+ }
+
+ public void setReorderScale(float scale) {
+ mScaleForReorder = scale;
+ super.setScaleX(scale);
+ super.setScaleY(scale);
+ }
+
+ public float getReorderScale() {
+ return mScaleForReorder;
+ }
+
+ public View getView() {
+ return this;
+ }
+
+ @Override
+ public int getViewType() {
+ return DRAGGABLE_ICON;
+ }
+
+ @Override
+ public void getVisualDragBounds(Rect bounds) {
+ getPreviewBounds(bounds);
+ }
}
diff --git a/src/com/android/launcher3/folder/FolderNameInfo.java b/src/com/android/launcher3/folder/FolderNameInfo.java
index 1287219e72..1841cd92c7 100644
--- a/src/com/android/launcher3/folder/FolderNameInfo.java
+++ b/src/com/android/launcher3/folder/FolderNameInfo.java
@@ -50,6 +50,10 @@ public final class FolderNameInfo implements Parcelable {
return mLabel;
}
+ public double getScore() {
+ return mScore;
+ }
+
/**
* Used to package this object into a {@link Parcel}.
*
diff --git a/src/com/android/launcher3/settings/DeveloperOptionsFragment.java b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java
index 8dc2e611e9..5bf91737c1 100644
--- a/src/com/android/launcher3/settings/DeveloperOptionsFragment.java
+++ b/src/com/android/launcher3/settings/DeveloperOptionsFragment.java
@@ -216,17 +216,27 @@ public class DeveloperOptionsFragment extends PreferenceFragmentCompat {
if (launchSandboxIntent.resolveActivity(context.getPackageManager()) == null) {
return;
}
- PreferenceCategory sandboxCategory = newCategory("Sandbox");
- Preference launchSandboxPreference = new Preference(context);
- launchSandboxPreference.setKey("launchSandbox");
- launchSandboxPreference.setTitle("Launch Gesture Navigation Sandbox");
- launchSandboxPreference.setSummary(
- "This provides tutorials and a place to practice navigation gestures.");
- launchSandboxPreference.setOnPreferenceClickListener(preference -> {
- startActivity(launchSandboxIntent);
+ PreferenceCategory sandboxCategory = newCategory("Gesture Navigation Sandbox");
+ sandboxCategory.setSummary("Learn and practice navigation gestures");
+ Preference launchBackTutorialPreference = new Preference(context);
+ launchBackTutorialPreference.setKey("launchBackTutorial");
+ launchBackTutorialPreference.setTitle("Launch Back Tutorial");
+ launchBackTutorialPreference.setSummary("Learn how to use the Back gesture");
+ launchBackTutorialPreference.setOnPreferenceClickListener(preference -> {
+ startActivity(launchSandboxIntent.putExtra(
+ "tutorial_type", "RIGHT_EDGE_BACK_NAVIGATION"));
return true;
});
- sandboxCategory.addPreference(launchSandboxPreference);
+ sandboxCategory.addPreference(launchBackTutorialPreference);
+ Preference launchHomeTutorialPreference = new Preference(context);
+ launchHomeTutorialPreference.setKey("launchHomeTutorial");
+ launchHomeTutorialPreference.setTitle("Launch Home Tutorial");
+ launchHomeTutorialPreference.setSummary("Learn how to use the Home gesture");
+ launchHomeTutorialPreference.setOnPreferenceClickListener(preference -> {
+ startActivity(launchSandboxIntent.putExtra("tutorial_type", "HOME_NAVIGATION"));
+ return true;
+ });
+ sandboxCategory.addPreference(launchHomeTutorialPreference);
}
private String toName(String action) {
diff --git a/src/com/android/launcher3/states/RotationHelper.java b/src/com/android/launcher3/states/RotationHelper.java
index 2e0521f34c..3640d8bbde 100644
--- a/src/com/android/launcher3/states/RotationHelper.java
+++ b/src/com/android/launcher3/states/RotationHelper.java
@@ -15,47 +15,44 @@
*/
package com.android.launcher3.states;
-import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LOCKED;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
-import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.util.DisplayMetrics.DENSITY_DEVICE_STABLE;
-import static com.android.launcher3.config.FeatureFlags.FLAG_ENABLE_FIXED_ROTATION_TRANSFORM;
-import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
-
import android.app.Activity;
import android.content.ContentResolver;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.os.Handler;
import android.provider.Settings;
+import android.util.Log;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.UiThreadHelper;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Utility class to manage launcher rotation
*/
public class RotationHelper implements OnSharedPreferenceChangeListener {
+ private static final String TAG = "RotationHelper";
+
public static final String ALLOW_ROTATION_PREFERENCE_KEY = "pref_allowRotation";
public static final String FIXED_ROTATION_TRANSFORM_SETTING_NAME = "fixed_rotation_transform";
private final ContentResolver mContentResolver;
+ private boolean mSystemAutoRotateEnabled;
- /**
- * Listener to receive changes when {@link #FIXED_ROTATION_TRANSFORM_SETTING_NAME} flag changes.
- */
- public interface ForcedRotationChangedListener {
- void onForcedRotationChanged(boolean isForcedRotation);
- }
+ private ContentObserver mSystemAutoRotateObserver = new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ updateAutoRotateSetting();
+ }
+ };
public static boolean getAllowRotationDefaultValue() {
// If the device's pixel density was scaled (usually via settings for A11y), use the
@@ -72,12 +69,9 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
private final Activity mActivity;
private final SharedPreferences mSharedPrefs;
- private final SharedPreferences mFeatureFlagsPrefs;
private boolean mIgnoreAutoRotateSettings;
- private boolean mAutoRotateEnabled;
- private boolean mForcedRotation;
- private List mForcedRotationChangedListeners = new ArrayList<>();
+ private boolean mHomeRotationEnabled;
/**
* Rotation request made by
@@ -108,67 +102,35 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
if (!mIgnoreAutoRotateSettings) {
mSharedPrefs = Utilities.getPrefs(mActivity);
mSharedPrefs.registerOnSharedPreferenceChangeListener(this);
- mAutoRotateEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
+ mHomeRotationEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
getAllowRotationDefaultValue());
} else {
mSharedPrefs = null;
}
mContentResolver = activity.getContentResolver();
- mFeatureFlagsPrefs = Utilities.getFeatureFlagsPrefs(mActivity);
- mFeatureFlagsPrefs.registerOnSharedPreferenceChangeListener(this);
- updateForcedRotation(true);
}
- /**
- * @param setValueFromPrefs If true, then {@link #mForcedRotation} will get set to the value
- * from the home developer settings. Otherwise it will not.
- * This is primarily to allow tests to set their own conditions.
- */
- private void updateForcedRotation(boolean setValueFromPrefs) {
- boolean isForcedRotation = mFeatureFlagsPrefs
- .getBoolean(FLAG_ENABLE_FIXED_ROTATION_TRANSFORM, true)
- && !getAllowRotationDefaultValue();
- if (mForcedRotation == isForcedRotation) {
- return;
+ private void updateAutoRotateSetting() {
+ int autoRotateEnabled = 0;
+ try {
+ autoRotateEnabled = Settings.System.getInt(mContentResolver,
+ Settings.System.ACCELEROMETER_ROTATION);
+ } catch (Settings.SettingNotFoundException e) {
+ Log.e(TAG, "autorotate setting not found", e);
}
- if (setValueFromPrefs) {
- mForcedRotation = isForcedRotation;
- }
- UI_HELPER_EXECUTOR.execute(() -> {
- if (mActivity.checkSelfPermission(WRITE_SECURE_SETTINGS) == PERMISSION_GRANTED) {
- Settings.Global.putInt(mContentResolver, FIXED_ROTATION_TRANSFORM_SETTING_NAME,
- mForcedRotation ? 1 : 0);
- }
- });
- for (ForcedRotationChangedListener listener : mForcedRotationChangedListeners) {
- listener.onForcedRotationChanged(mForcedRotation);
- }
- }
- /**
- * will not be called when first registering the listener.
- */
- public void addForcedRotationCallback(ForcedRotationChangedListener listener) {
- mForcedRotationChangedListeners.add(listener);
- }
-
- public void removeForcedRotationCallback(ForcedRotationChangedListener listener) {
- mForcedRotationChangedListeners.remove(listener);
+ mSystemAutoRotateEnabled = autoRotateEnabled == 1;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
- if (FLAG_ENABLE_FIXED_ROTATION_TRANSFORM.equals(s)) {
- updateForcedRotation(true);
- return;
- }
-
- boolean wasRotationEnabled = mAutoRotateEnabled;
- mAutoRotateEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
+ boolean wasRotationEnabled = mHomeRotationEnabled;
+ mHomeRotationEnabled = mSharedPrefs.getBoolean(ALLOW_ROTATION_PREFERENCE_KEY,
getAllowRotationDefaultValue());
- if (mAutoRotateEnabled != wasRotationEnabled) {
+ if (mHomeRotationEnabled != wasRotationEnabled) {
notifyChange();
+ updateAutoRotateSetting();
}
}
@@ -197,10 +159,6 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
public void forceAllowRotationForTesting(boolean allowRotation) {
mIgnoreAutoRotateSettings =
allowRotation || mActivity.getResources().getBoolean(R.bool.allow_rotation);
- // TODO(b/150214193) Tests currently expect launcher to be able to be rotated
- // Modify tests for this new behavior
- mForcedRotation = !allowRotation;
- updateForcedRotation(false);
notifyChange();
}
@@ -208,6 +166,11 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
if (!mInitialized) {
mInitialized = true;
notifyChange();
+
+ mContentResolver.registerContentObserver(
+ Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION),
+ false, mSystemAutoRotateObserver);
+ updateAutoRotateSetting();
}
}
@@ -217,8 +180,7 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
if (mSharedPrefs != null) {
mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
}
- mForcedRotationChangedListeners.clear();
- mFeatureFlagsPrefs.unregisterOnSharedPreferenceChangeListener(this);
+ mContentResolver.unregisterContentObserver(mSystemAutoRotateObserver);
}
}
@@ -228,10 +190,7 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
}
final int activityFlags;
- if (mForcedRotation) {
- // TODO(b/150214193) Properly address this
- activityFlags = SCREEN_ORIENTATION_PORTRAIT;
- } else if (mStateHandlerRequest != REQUEST_NONE) {
+ if (mStateHandlerRequest != REQUEST_NONE) {
activityFlags = mStateHandlerRequest == REQUEST_LOCK ?
SCREEN_ORIENTATION_LOCKED : SCREEN_ORIENTATION_UNSPECIFIED;
} else if (mCurrentTransitionRequest != REQUEST_NONE) {
@@ -240,7 +199,7 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
} else if (mCurrentStateRequest == REQUEST_LOCK) {
activityFlags = SCREEN_ORIENTATION_LOCKED;
} else if (mIgnoreAutoRotateSettings || mCurrentStateRequest == REQUEST_ROTATE
- || mAutoRotateEnabled) {
+ || mHomeRotationEnabled) {
activityFlags = SCREEN_ORIENTATION_UNSPECIFIED;
} else {
// If auto rotation is off, allow rotation on the activity, in case the user is using
@@ -253,11 +212,23 @@ public class RotationHelper implements OnSharedPreferenceChangeListener {
}
}
+ /**
+ * @return how many factors {@param newRotation} is rotated 90 degrees clockwise.
+ * E.g. 1->Rotated by 90 degrees clockwise, 2->Rotated 180 clockwise...
+ * A value of 0 means no rotation has been applied
+ */
+ public static int deltaRotation(int oldRotation, int newRotation) {
+ int delta = newRotation - oldRotation;
+ if (delta < 0) delta += 4;
+ return delta;
+ }
+
@Override
public String toString() {
return String.format("[mStateHandlerRequest=%d, mCurrentStateRequest=%d,"
- + " mLastActivityFlags=%d, mIgnoreAutoRotateSettings=%b, mAutoRotateEnabled=%b]",
+ + " mLastActivityFlags=%d, mIgnoreAutoRotateSettings=%b, mHomeRotationEnabled=%b,"
+ + " mSystemAutoRotateEnabled=%b]",
mStateHandlerRequest, mCurrentStateRequest, mLastActivityFlags,
- mIgnoreAutoRotateSettings, mAutoRotateEnabled);
+ mIgnoreAutoRotateSettings, mHomeRotationEnabled, mSystemAutoRotateEnabled);
}
}
diff --git a/src/com/android/launcher3/states/SpringLoadedState.java b/src/com/android/launcher3/states/SpringLoadedState.java
index 2ba624cc1b..b2ff69afc3 100644
--- a/src/com/android/launcher3/states/SpringLoadedState.java
+++ b/src/com/android/launcher3/states/SpringLoadedState.java
@@ -78,7 +78,7 @@ public class SpringLoadedState extends LauncherState {
}
@Override
- public float getDepth(Context context) {
+ protected float getDepthUnchecked(Context context) {
return 0.5f;
}
diff --git a/src/com/android/launcher3/states/StateAnimationConfig.java b/src/com/android/launcher3/states/StateAnimationConfig.java
index 82cde642fa..8dccbd3207 100644
--- a/src/com/android/launcher3/states/StateAnimationConfig.java
+++ b/src/com/android/launcher3/states/StateAnimationConfig.java
@@ -37,6 +37,7 @@ public class StateAnimationConfig {
PLAY_ATOMIC_OVERVIEW_SCALE,
PLAY_ATOMIC_OVERVIEW_PEEK,
SKIP_OVERVIEW,
+ SKIP_DEPTH_CONTROLLER
})
@Retention(RetentionPolicy.SOURCE)
public @interface AnimationFlags {}
@@ -44,6 +45,7 @@ public class StateAnimationConfig {
public static final int PLAY_ATOMIC_OVERVIEW_SCALE = 1 << 1;
public static final int PLAY_ATOMIC_OVERVIEW_PEEK = 1 << 2;
public static final int SKIP_OVERVIEW = 1 << 3;
+ public static final int SKIP_DEPTH_CONTROLLER = 1 << 4;
public long duration;
public boolean userControlled;
diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/TestProtocol.java
index 015de59db1..82f2eb49b3 100644
--- a/src/com/android/launcher3/testing/TestProtocol.java
+++ b/src/com/android/launcher3/testing/TestProtocol.java
@@ -97,7 +97,5 @@ public final class TestProtocol {
public static final String PERMANENT_DIAG_TAG = "TaplTarget";
- public static final String NO_BACKGROUND_TO_OVERVIEW_TAG = "b/138251824";
public static final String APP_NOT_DISABLED = "b/139891609";
- public static final String NO_SCROLL_END_WIDGETS = "b/152354290";
}
diff --git a/src/com/android/launcher3/touch/HomeRotatedPageHandler.java b/src/com/android/launcher3/touch/HomeRotatedPageHandler.java
new file mode 100644
index 0000000000..710b676880
--- /dev/null
+++ b/src/com/android/launcher3/touch/HomeRotatedPageHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.touch;
+
+import android.graphics.RectF;
+import android.view.Surface;
+
+public class HomeRotatedPageHandler extends PortraitPagedViewHandler {
+ @Override
+ public void offsetTaskRect(RectF rect, float value, int displayRotation, int launcherRotation) {
+ if (launcherRotation == Surface.ROTATION_0) {
+ super.offsetTaskRect(rect, value, displayRotation, launcherRotation);
+ } else if (launcherRotation == Surface.ROTATION_90) {
+ if (displayRotation == Surface.ROTATION_0) {
+ rect.offset(0, value);
+ } else if (displayRotation == Surface.ROTATION_90) {
+ rect.offset(value, 0);
+ } else if (displayRotation == Surface.ROTATION_180) {
+ rect.offset(-value, 0);
+ } else {
+ rect.offset(-value, 0);
+ }
+ } else if (launcherRotation == Surface.ROTATION_270) {
+ if (displayRotation == Surface.ROTATION_0) {
+ rect.offset(0, -value);
+ } else if (displayRotation == Surface.ROTATION_90) {
+ rect.offset(value, 0);
+ } else if (displayRotation == Surface.ROTATION_180) {
+ rect.offset(0, -value);
+ } else {
+ rect.offset(value, 0);
+ }
+ } // TODO (b/149609488) handle 180 case as well
+ }
+}
diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java
index f7091fc3ad..6abca767ae 100644
--- a/src/com/android/launcher3/touch/ItemClickHandler.java
+++ b/src/com/android/launcher3/touch/ItemClickHandler.java
@@ -52,6 +52,8 @@ import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.model.data.PromiseAppInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.pm.InstallSessionHelper;
+import com.android.launcher3.testing.TestLogging;
+import com.android.launcher3.testing.TestProtocol;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.launcher3.views.FloatingIconView;
import com.android.launcher3.widget.PendingAppWidgetHostView;
@@ -240,6 +242,8 @@ public class ItemClickHandler {
private static void startAppShortcutOrInfoActivity(View v, ItemInfo item, Launcher launcher,
@Nullable String sourceContainer) {
+ TestLogging.recordEvent(
+ TestProtocol.SEQUENCE_MAIN, "start: startAppShortcutOrInfoActivity");
Intent intent;
if (item instanceof PromiseAppInfo) {
PromiseAppInfo promiseAppInfo = (PromiseAppInfo) item;
diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
index bab574774a..e290685d5e 100644
--- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
@@ -32,7 +32,6 @@ import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.LauncherState.ScaleAndTranslation;
import com.android.launcher3.PagedView;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.OverScroller;
@@ -77,6 +76,11 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
return displacement > 0;
}
+ @Override
+ public boolean isLayoutNaturalToLauncher() {
+ return false;
+ }
+
@Override
public void adjustFloatingIconStartVelocity(PointF velocity) {
float oldX = velocity.x;
@@ -114,11 +118,6 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
return view.getMeasuredHeight();
}
- @Override
- public int getPrimarySize(Rect rect) {
- return rect.height();
- }
-
@Override
public float getPrimarySize(RectF rect) {
return rect.height();
@@ -129,17 +128,6 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
return view.getWidth();
}
- @Override
- public ScaleAndTranslation getScaleAndTranslation(DeviceProfile dp, View view) {
- float offscreenTranslationY = dp.heightPx - view.getPaddingTop();
- return new ScaleAndTranslation(1f, 0f, offscreenTranslationY);
- }
-
- @Override
- public float getTranslationValue(ScaleAndTranslation scaleAndTranslation) {
- return scaleAndTranslation.translationY;
- }
-
@Override
public FloatProperty getPrimaryViewTranslate() {
return VIEW_TRANSLATE_Y;
@@ -182,7 +170,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
}
@Override
- public void offsetTaskRect(RectF rect, float value, int displayRotation) {
+ public void offsetTaskRect(RectF rect, float value, int displayRotation, int launcherRotation) {
if (displayRotation == Surface.ROTATION_0) {
rect.offset(0, value);
} else if (displayRotation == Surface.ROTATION_90) {
diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java
index 50606ec8ae..b8396e1119 100644
--- a/src/com/android/launcher3/touch/PagedOrientationHandler.java
+++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java
@@ -18,6 +18,7 @@ package com.android.launcher3.touch;
import android.content.res.Resources;
import android.graphics.Canvas;
+import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
@@ -28,7 +29,6 @@ import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.LauncherState;
import com.android.launcher3.PagedView;
import com.android.launcher3.util.OverScroller;
@@ -42,6 +42,7 @@ public interface PagedOrientationHandler {
PagedOrientationHandler PORTRAIT = new PortraitPagedViewHandler();
PagedOrientationHandler LANDSCAPE = new LandscapePagedViewHandler();
PagedOrientationHandler SEASCAPE = new SeascapePagedViewHandler();
+ PagedOrientationHandler HOME_ROTATED = new HomeRotatedPageHandler();
interface Int2DAction {
void call(T target, int x, int y);
@@ -52,16 +53,15 @@ public interface PagedOrientationHandler {
Int2DAction VIEW_SCROLL_BY = View::scrollBy;
Int2DAction VIEW_SCROLL_TO = View::scrollTo;
Float2DAction