From dd027348dd980ee015887786c0b2aefbac515857 Mon Sep 17 00:00:00 2001 From: Thales Lima Date: Fri, 7 Jan 2022 12:54:37 +0000 Subject: [PATCH 1/6] create 6x5 scalable grid for tablets Create more attributes for landscape and fix the space between icons in the hotseat. The dimensions are correct but some size might differ from mocks because of device scaling, qsb position and insets not finalized. Bug: 210118169 Test: visual, using HSV and Window Change-Id: Ie505923dce2e30133eb1e5c9c83c33a2895147f2 --- res/values/attrs.xml | 8 ++++++++ src/com/android/launcher3/CellLayout.java | 16 +++++++++++++--- src/com/android/launcher3/DeviceProfile.java | 3 ++- .../launcher3/InvariantDeviceProfile.java | 13 +++++++++++-- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 5a46e1280e..095cb1aff5 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -185,6 +185,10 @@ + + + + @@ -242,6 +246,8 @@ + + @@ -268,6 +274,8 @@ + + diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index adb1613e9d..11f58e7d87 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -238,9 +238,19 @@ public class CellLayout extends ViewGroup { mActivity = ActivityContext.lookupContext(context); DeviceProfile deviceProfile = mActivity.getDeviceProfile(); - mBorderSpace = mContainerType == FOLDER - ? new Point(deviceProfile.folderCellLayoutBorderSpacePx) - : new Point(deviceProfile.cellLayoutBorderSpacePx); + switch (mContainerType) { + case FOLDER: + mBorderSpace = new Point(deviceProfile.folderCellLayoutBorderSpacePx); + break; + case HOTSEAT: + mBorderSpace = new Point(deviceProfile.hotseatBorderSpace, + deviceProfile.hotseatBorderSpace); + break; + case WORKSPACE: + default: + mBorderSpace = new Point(deviceProfile.cellLayoutBorderSpacePx); + break; + } mCellWidth = mCellHeight = -1; mFixedCellWidth = mFixedCellHeight = -1; diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 2a29f3bde7..be10d52474 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -161,7 +161,7 @@ public class DeviceProfile { public final int hotseatBarSidePaddingStartPx; public final int hotseatBarSidePaddingEndPx; public final int hotseatQsbHeight; - public final int hotseatBorderSpace; + public int hotseatBorderSpace; public final float qsbBottomMarginOriginalPx; public int qsbBottomMarginPx; @@ -716,6 +716,7 @@ public class DeviceProfile { } // Hotseat + hotseatBorderSpace = pxFromDp(inv.hotseatBorderSpaces[mTypeIndex], mMetrics, scale); updateHotseatIconSize(iconSizePx); if (!isVerticalLayout) { diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 2d0d640772..036726d682 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -789,6 +789,11 @@ public class InvariantDeviceProfile { x = a.getFloat(R.styleable.ProfileDisplayOption_minCellWidth, 0); y = a.getFloat(R.styleable.ProfileDisplayOption_minCellHeight, 0); minCellSize[INDEX_DEFAULT] = new PointF(x, y); + + x = a.getFloat(R.styleable.ProfileDisplayOption_minCellWidthLandscape, + minCellSize[INDEX_DEFAULT].x); + y = a.getFloat(R.styleable.ProfileDisplayOption_minCellHeightLandscape, + minCellSize[INDEX_DEFAULT].y); minCellSize[INDEX_LANDSCAPE] = new PointF(x, y); x = a.getFloat(R.styleable.ProfileDisplayOption_minCellWidthTwoPanelPortrait, @@ -891,7 +896,9 @@ public class InvariantDeviceProfile { horizontalMargin[INDEX_DEFAULT] = a.getFloat( R.styleable.ProfileDisplayOption_horizontalMargin, 0); - horizontalMargin[INDEX_LANDSCAPE] = horizontalMargin[INDEX_DEFAULT]; + horizontalMargin[INDEX_LANDSCAPE] = a.getFloat( + R.styleable.ProfileDisplayOption_horizontalMarginLandscape, + horizontalMargin[INDEX_DEFAULT]); horizontalMargin[INDEX_TWO_PANEL_LANDSCAPE] = a.getFloat( R.styleable.ProfileDisplayOption_horizontalMarginTwoPanelLandscape, horizontalMargin[INDEX_DEFAULT]); @@ -901,7 +908,9 @@ public class InvariantDeviceProfile { hotseatBorderSpaces[INDEX_DEFAULT] = a.getFloat( R.styleable.ProfileDisplayOption_hotseatBorderSpace, borderSpace); - hotseatBorderSpaces[INDEX_LANDSCAPE] = hotseatBorderSpaces[INDEX_DEFAULT]; + hotseatBorderSpaces[INDEX_LANDSCAPE] = a.getFloat( + R.styleable.ProfileDisplayOption_hotseatBorderSpaceLandscape, + hotseatBorderSpaces[INDEX_DEFAULT]); hotseatBorderSpaces[INDEX_TWO_PANEL_LANDSCAPE] = a.getFloat( R.styleable.ProfileDisplayOption_hotseatBorderSpaceTwoPanelLandscape, hotseatBorderSpaces[INDEX_DEFAULT]); From 26a1a46b4d61d214d20b8f0b3eb7914cf3dc5af1 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 6 Jan 2022 15:01:24 +0530 Subject: [PATCH 2/6] Remving SurfaceControlCompat Bug: 213421974 Test: Presubmit Change-Id: I1279789b09364b35a454e32417f687c1e055f27a --- quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java | 2 +- quickstep/src/com/android/quickstep/RecentsActivity.java | 2 +- quickstep/src/com/android/quickstep/TaskViewUtils.java | 6 +++--- .../src/com/android/quickstep/util/TransformParams.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 9f1e47f15a..bc06944679 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1410,7 +1410,7 @@ public abstract class AbsSwipeUpHandler, .setContext(mContext) .setTaskId(runningTaskTarget.taskId) .setComponentName(taskInfo.topActivity) - .setLeash(runningTaskTarget.leash.getSurfaceControl()) + .setLeash(runningTaskTarget.leash) .setSourceRectHint( runningTaskTarget.taskInfo.pictureInPictureParams.getSourceRectHint()) .setAppBounds(taskInfo.configuration.windowConfiguration.getBounds()) diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 306e864372..af53bca358 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -419,7 +419,7 @@ public final class RecentsActivity extends StatefulActivity { RemoteAnimationTargets targets = new RemoteAnimationTargets( appTargets, wallpaperTargets, nonAppTargets, MODE_OPENING); for (RemoteAnimationTargetCompat app : targets.apps) { - new Transaction().setAlpha(app.leash.getSurfaceControl(), 1).apply(); + new Transaction().setAlpha(app.leash, 1).apply(); } AnimatorSet anim = new AnimatorSet(); anim.play(controller.getAnimationPlayer()); diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java index 5d9a537165..0a09e34754 100644 --- a/quickstep/src/com/android/quickstep/TaskViewUtils.java +++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java @@ -469,7 +469,7 @@ public final class TaskViewUtils { for (RemoteAnimationTargetCompat appTarget : appTargets) { final int taskId = appTarget.taskInfo != null ? appTarget.taskInfo.taskId : -1; final int mode = appTarget.mode; - final SurfaceControl leash = appTarget.leash.getSurfaceControl(); + final SurfaceControl leash = appTarget.leash; if (leash == null) { continue; } @@ -484,7 +484,7 @@ public final class TaskViewUtils { } for (int i = 0; i < nonAppTargets.length; ++i) { - final SurfaceControl leash = appTargets[i].leash.getSurfaceControl(); + final SurfaceControl leash = appTargets[i].leash; if (nonAppTargets[i].windowType == TYPE_DOCK_DIVIDER && leash != null) { openingTargets.add(leash); } @@ -611,7 +611,7 @@ public final class TaskViewUtils { boolean hasSurfaceToAnimate = false; for (int i = 0; i < nonApps.length; ++i) { final RemoteAnimationTargetCompat targ = nonApps[i]; - final SurfaceControl leash = targ.leash.getSurfaceControl(); + final SurfaceControl leash = targ.leash; if (targ.windowType == TYPE_DOCK_DIVIDER && leash != null) { auxiliarySurfaces.add(leash); hasSurfaceToAnimate = true; diff --git a/quickstep/src/com/android/quickstep/util/TransformParams.java b/quickstep/src/com/android/quickstep/util/TransformParams.java index 03d7a37748..75d6001afd 100644 --- a/quickstep/src/com/android/quickstep/util/TransformParams.java +++ b/quickstep/src/com/android/quickstep/util/TransformParams.java @@ -174,10 +174,10 @@ public class TransformParams { RemoteAnimationTargetCompat app = targets.unfilteredApps[i]; if (app.mode == targets.targetMode) { if (app.activityType == RemoteAnimationTargetCompat.ACTIVITY_TYPE_RECENTS) { - return app.leash.getSurfaceControl(); + return app.leash; } } else { - return app.leash.getSurfaceControl(); + return app.leash; } } return null; From c07fb08a1e51b0901ec3a59aff108f6bc93ad122 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 16 Dec 2021 17:40:38 +0000 Subject: [PATCH 3/6] Make taskbar focusable when folder is open to get IME input - Remove ActivityContext#supportsIme(), as it's always true now - Add OnFolderStateChangedListener, which we register when clicking on a taskbar folder icon to set the window focusable/not. - Also remove Folder.STATE_NONE and instead default to STATE_CLOSED (renamed from STATE_SMALL). TODO: make sure back button is visible above IME (followup CL) Test: Open a folder from taskbar while in an app, no animation jump and can change folder name Bug: 180051157 Change-Id: I7c7847657d462c16677d66b9ffa8b6fe5f164084 --- .../taskbar/TaskbarActivityContext.java | 34 +++++++--- src/com/android/launcher3/folder/Folder.java | 66 ++++++++++++------- .../launcher3/util/UiThreadHelper.java | 3 +- .../launcher3/views/ActivityContext.java | 7 -- 4 files changed, 69 insertions(+), 41 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index b1f027a00d..bef62584ae 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -16,6 +16,7 @@ package com.android.launcher3.taskbar; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; @@ -197,6 +198,7 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ mWindowLayoutParams.packageName = getPackageName(); mWindowLayoutParams.gravity = Gravity.BOTTOM; mWindowLayoutParams.setFitInsetsTypes(0); + mWindowLayoutParams.receiveInsetsIgnoringZOrder = true; mWindowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mWindowLayoutParams.privateFlags = @@ -267,14 +269,6 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ return mViewCache; } - @Override - public boolean supportsIme() { - // Currently we don't support IME because we have FLAG_NOT_FOCUSABLE. We can remove that - // flag when opening a floating view that needs IME (such as Folder), but then that means - // Taskbar will be below IME and thus users can't click the back button. - return false; - } - @Override public View.OnClickListener getItemOnClickListener() { return this::onTaskbarIconClicked; @@ -501,6 +495,19 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ return mTaskbarHeightForIme; } + /** + * Either adds or removes {@link WindowManager.LayoutParams#FLAG_NOT_FOCUSABLE} on the taskbar + * window. + */ + public void setTaskbarWindowFocusableForIme(boolean focusable) { + if (focusable) { + mWindowLayoutParams.flags &= ~FLAG_NOT_FOCUSABLE; + } else { + mWindowLayoutParams.flags |= FLAG_NOT_FOCUSABLE; + } + mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams); + } + protected void onTaskbarIconClicked(View view) { Object tag = view.getTag(); if (tag instanceof Task) { @@ -510,6 +517,17 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ } else if (tag instanceof FolderInfo) { FolderIcon folderIcon = (FolderIcon) view; Folder folder = folderIcon.getFolder(); + + folder.setOnFolderStateChangedListener(newState -> { + if (newState == Folder.STATE_OPEN) { + setTaskbarWindowFocusableForIme(true); + } else if (newState == Folder.STATE_CLOSED) { + // Defer by a frame to ensure we're no longer fullscreen and thus won't jump. + getDragLayer().post(() -> setTaskbarWindowFocusableForIme(false)); + folder.setOnFolderStateChangedListener(null); + } + }); + setTaskbarWindowFullscreen(true); getDragLayer().post(() -> { diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java index daef68226d..1e6342cc8b 100644 --- a/src/com/android/launcher3/folder/Folder.java +++ b/src/com/android/launcher3/folder/Folder.java @@ -57,6 +57,7 @@ import android.view.animation.AnimationUtils; import android.view.inputmethod.EditorInfo; import android.widget.TextView; +import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.core.content.res.ResourcesCompat; @@ -101,6 +102,8 @@ import com.android.launcher3.views.BaseDragLayer; import com.android.launcher3.views.ClipPathView; import com.android.launcher3.widget.PendingAddShortcutInfo; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -130,10 +133,13 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo */ private static final int MIN_CONTENT_DIMEN = 5; - static final int STATE_NONE = -1; - static final int STATE_SMALL = 0; - static final int STATE_ANIMATING = 1; - static final int STATE_OPEN = 2; + public static final int STATE_CLOSED = 0; + public static final int STATE_ANIMATING = 1; + public static final int STATE_OPEN = 2; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({STATE_CLOSED, STATE_ANIMATING, STATE_OPEN}) + public @interface FolderState {} /** * Time for which the scroll hint is shown before automatically changing page. @@ -198,13 +204,12 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo @ViewDebug.ExportedProperty(category = "launcher", mapping = { - @ViewDebug.IntToString(from = STATE_NONE, to = "STATE_NONE"), - @ViewDebug.IntToString(from = STATE_SMALL, to = "STATE_SMALL"), + @ViewDebug.IntToString(from = STATE_CLOSED, to = "STATE_CLOSED"), @ViewDebug.IntToString(from = STATE_ANIMATING, to = "STATE_ANIMATING"), @ViewDebug.IntToString(from = STATE_OPEN, to = "STATE_OPEN"), }) - @Thunk - int mState = STATE_NONE; + private int mState = STATE_CLOSED; + private OnFolderStateChangedListener mOnFolderStateChangedListener; @ViewDebug.ExportedProperty(category = "launcher") private boolean mRearrangeOnClose = false; boolean mItemsInvalidated = false; @@ -277,19 +282,15 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo mPageIndicator = findViewById(R.id.folder_page_indicator); mFolderName = findViewById(R.id.folder_name); mFolderName.setTextSize(TypedValue.COMPLEX_UNIT_PX, dp.folderLabelTextSizePx); - if (mActivityContext.supportsIme()) { - mFolderName.setOnBackKeyListener(this); - mFolderName.setOnFocusChangeListener(this); - mFolderName.setOnEditorActionListener(this); - mFolderName.setSelectAllOnFocus(true); - mFolderName.setInputType(mFolderName.getInputType() - & ~InputType.TYPE_TEXT_FLAG_AUTO_CORRECT - | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS - | InputType.TYPE_TEXT_FLAG_CAP_WORDS); - mFolderName.forceDisableSuggestions(true); - } else { - mFolderName.setEnabled(false); - } + mFolderName.setOnBackKeyListener(this); + mFolderName.setOnFocusChangeListener(this); + mFolderName.setOnEditorActionListener(this); + mFolderName.setSelectAllOnFocus(true); + mFolderName.setInputType(mFolderName.getInputType() + & ~InputType.TYPE_TEXT_FLAG_AUTO_CORRECT + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS + | InputType.TYPE_TEXT_FLAG_CAP_WORDS); + mFolderName.forceDisableSuggestions(true); mFooter = findViewById(R.id.folder_footer); mFooterHeight = getResources().getDimensionPixelSize(R.dimen.folder_label_height); @@ -561,7 +562,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo a.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { - mState = STATE_ANIMATING; + setState(STATE_ANIMATING); mCurrentAnimator = a; } @@ -686,7 +687,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo @Override public void onAnimationEnd(Animator animation) { - mState = STATE_OPEN; + setState(STATE_OPEN); announceAccessibilityChanges(); AccessibilityManagerCompat.sendFolderOpenedEventToTest(getContext()); @@ -862,7 +863,7 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo } mSuppressFolderDeletion = false; clearDragInfo(); - mState = STATE_SMALL; + setState(STATE_CLOSED); mContent.setCurrentPage(0); } @@ -1655,4 +1656,21 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo return windowBottomPx - folderBottomPx; } + + private void setState(@FolderState int newState) { + mState = newState; + if (mOnFolderStateChangedListener != null) { + mOnFolderStateChangedListener.onFolderStateChanged(mState); + } + } + + public void setOnFolderStateChangedListener(@Nullable OnFolderStateChangedListener listener) { + mOnFolderStateChangedListener = listener; + } + + /** Listener that can be registered via {@link Folder#setOnFolderStateChangedListener} */ + public interface OnFolderStateChangedListener { + /** See {@link Folder.FolderState} */ + void onFolderStateChanged(@FolderState int newState); + } } diff --git a/src/com/android/launcher3/util/UiThreadHelper.java b/src/com/android/launcher3/util/UiThreadHelper.java index ac5368c8b4..a1f31fe459 100644 --- a/src/com/android/launcher3/util/UiThreadHelper.java +++ b/src/com/android/launcher3/util/UiThreadHelper.java @@ -28,7 +28,6 @@ import android.os.Message; import android.view.View; import android.view.inputmethod.InputMethodManager; -import com.android.launcher3.BaseActivity; import com.android.launcher3.views.ActivityContext; /** @@ -56,7 +55,7 @@ public class UiThreadHelper { STATS_LOGGER_KEY, Message.obtain( HANDLER.get(root.getContext()), - () -> BaseActivity.fromContext(root.getContext()) + () -> ActivityContext.lookupContext(root.getContext()) .getStatsLogManager() .logger() .log(LAUNCHER_ALLAPPS_KEYBOARD_CLOSED) diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java index e09eff6f94..c0f6316b95 100644 --- a/src/com/android/launcher3/views/ActivityContext.java +++ b/src/com/android/launcher3/views/ActivityContext.java @@ -124,13 +124,6 @@ public interface ActivityContext { return true; } - /** - * Returns whether we can show the IME for elements hosted by this ActivityContext. - */ - default boolean supportsIme() { - return true; - } - /** * Called just before logging the given item. */ From 66971f87e19aa97da512ec42fff88d796310256b Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Mon, 10 Jan 2022 22:30:14 +0000 Subject: [PATCH 4/6] Create new window for Taskbar Nav Buttons when taskbar is focusable Test: Open folder from taskbar, edit name, ensure back button displays above IME and that IME sends input to the taskbar folder name Bug: 205803170 Change-Id: I36f6cfb835aa7da280f15ea4b0aed8923ce8a012 --- .../taskbar/NavbarButtonsViewController.java | 84 ++++++++++++++++++- .../taskbar/TaskbarActivityContext.java | 52 ++++++++---- .../launcher3/taskbar/TaskbarDragLayer.java | 18 ++++ src/com/android/launcher3/Utilities.java | 2 +- 4 files changed, 137 insertions(+), 19 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index a4ecd8b13d..6ae8c9d31e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -36,6 +36,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_N import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; +import static com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo.TOUCHABLE_INSETS_REGION; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; @@ -53,9 +54,11 @@ import android.util.Property; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; +import android.view.View.OnAttachStateChangeListener; import android.view.View.OnClickListener; import android.view.View.OnHoverListener; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ImageView; @@ -65,10 +68,13 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AlphaUpdateListener; import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarButton; import com.android.launcher3.util.MultiValueAlpha; +import com.android.launcher3.util.TouchController; +import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.AnimatedFloat; import com.android.systemui.shared.rotation.FloatingRotationButton; import com.android.systemui.shared.rotation.RotationButton; import com.android.systemui.shared.rotation.RotationButtonController; +import com.android.systemui.shared.system.ViewTreeObserverWrapper; import java.util.ArrayList; import java.util.function.IntPredicate; @@ -95,6 +101,8 @@ public class NavbarButtonsViewController { private static final int MASK_IME_SWITCHER_VISIBLE = FLAG_SWITCHER_SUPPORTED | FLAG_IME_VISIBLE; + private static final String NAV_BUTTONS_SEPARATE_WINDOW_TITLE = "Taskbar Nav Buttons"; + private final ArrayList mPropertyHolders = new ArrayList<>(); private final ArrayList mAllButtons = new ArrayList<>(); private int mState; @@ -130,6 +138,12 @@ public class NavbarButtonsViewController { private View mBackButton; private FloatingRotationButton mFloatingRotationButton; + // Variables for moving nav buttons to a separate window above IME + private boolean mAreNavButtonsInSeparateWindow = false; + private BaseDragLayer mSeparateWindowParent; // Initialized in init. + private final ViewTreeObserverWrapper.OnComputeInsetsListener mSeparateWindowInsetsComputer = + this::onComputeInsetsForSeparateWindow; + public NavbarButtonsViewController(TaskbarActivityContext context, FrameLayout navButtonsView) { mContext = context; mNavButtonsView = navButtonsView; @@ -258,6 +272,21 @@ public class NavbarButtonsViewController { R.id.notifications_button); } + // Initialize things needed to move nav buttons to separate window. + mSeparateWindowParent = new BaseDragLayer(mContext, null, 0) { + @Override + public void recreateControllers() { + mControllers = new TouchController[0]; + } + + @Override + protected boolean canFindActiveController() { + // We don't have any controllers, but we don't want any floating views such as + // folder to intercept, either. This ensures nav buttons can always be pressed. + return false; + } + }; + mSeparateWindowParent.recreateControllers(); } private void initButtons(ViewGroup navContainer, ViewGroup endContainer, @@ -393,7 +422,7 @@ public class NavbarButtonsViewController { /** * Adds the bounds corresponding to all visible buttons to provided region */ - public void addVisibleButtonsRegion(TaskbarDragLayer parent, Region outRegion) { + public void addVisibleButtonsRegion(BaseDragLayer parent, Region outRegion) { int count = mAllButtons.size(); for (int i = 0; i < count; i++) { View button = mAllButtons.get(i); @@ -498,6 +527,59 @@ public class NavbarButtonsViewController { if (mFloatingRotationButton != null) { mFloatingRotationButton.hide(); } + + moveNavButtonsBackToTaskbarWindow(); + } + + /** + * Moves mNavButtonsView from TaskbarDragLayer to a placeholder BaseDragLayer on a new window. + */ + public void moveNavButtonsToNewWindow() { + if (mAreNavButtonsInSeparateWindow) { + return; + } + + mSeparateWindowParent.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + ViewTreeObserverWrapper.addOnComputeInsetsListener( + mSeparateWindowParent.getViewTreeObserver(), mSeparateWindowInsetsComputer); + } + + @Override + public void onViewDetachedFromWindow(View view) { + mSeparateWindowParent.removeOnAttachStateChangeListener(this); + ViewTreeObserverWrapper.removeOnComputeInsetsListener( + mSeparateWindowInsetsComputer); + } + }); + + mAreNavButtonsInSeparateWindow = true; + mContext.getDragLayer().removeView(mNavButtonsView); + mSeparateWindowParent.addView(mNavButtonsView); + WindowManager.LayoutParams windowLayoutParams = mContext.createDefaultWindowLayoutParams(); + windowLayoutParams.setTitle(NAV_BUTTONS_SEPARATE_WINDOW_TITLE); + mContext.addWindowView(mSeparateWindowParent, windowLayoutParams); + + } + + /** + * Moves mNavButtonsView from its temporary window and reattaches it to TaskbarDragLayer. + */ + public void moveNavButtonsBackToTaskbarWindow() { + if (!mAreNavButtonsInSeparateWindow) { + return; + } + + mAreNavButtonsInSeparateWindow = false; + mContext.removeWindowView(mSeparateWindowParent); + mSeparateWindowParent.removeView(mNavButtonsView); + mContext.getDragLayer().addView(mNavButtonsView); + } + + private void onComputeInsetsForSeparateWindow(ViewTreeObserverWrapper.InsetsInfo insetsInfo) { + addVisibleButtonsRegion(mSeparateWindowParent, insetsInfo.touchableRegion); + insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION); } private class RotationButtonListener implements RotationButton.RotationButtonUpdatesCallback { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index bef62584ae..e48b26be76 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -187,22 +187,7 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ public void init(TaskbarSharedState sharedState) { mLastRequestedNonFullscreenHeight = getDefaultTaskbarWindowHeight(); - mWindowLayoutParams = new WindowManager.LayoutParams( - MATCH_PARENT, - mLastRequestedNonFullscreenHeight, - TYPE_NAVIGATION_BAR_PANEL, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - | WindowManager.LayoutParams.FLAG_SLIPPERY, - PixelFormat.TRANSLUCENT); - mWindowLayoutParams.setTitle(WINDOW_TITLE); - mWindowLayoutParams.packageName = getPackageName(); - mWindowLayoutParams.gravity = Gravity.BOTTOM; - mWindowLayoutParams.setFitInsetsTypes(0); - mWindowLayoutParams.receiveInsetsIgnoringZOrder = true; - mWindowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; - mWindowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; - mWindowLayoutParams.privateFlags = - WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; + mWindowLayoutParams = createDefaultWindowLayoutParams(); WindowManagerWrapper wmWrapper = WindowManagerWrapper.getInstance(); wmWrapper.setProvidesInsetsTypes( @@ -223,6 +208,27 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ mWindowManager.addView(mDragLayer, mWindowLayoutParams); } + /** Creates LayoutParams for adding a view directly to WindowManager as a new window */ + public WindowManager.LayoutParams createDefaultWindowLayoutParams() { + WindowManager.LayoutParams windowLayoutParams = new WindowManager.LayoutParams( + MATCH_PARENT, + mLastRequestedNonFullscreenHeight, + TYPE_NAVIGATION_BAR_PANEL, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_SLIPPERY, + PixelFormat.TRANSLUCENT); + windowLayoutParams.setTitle(WINDOW_TITLE); + windowLayoutParams.packageName = getPackageName(); + windowLayoutParams.gravity = Gravity.BOTTOM; + windowLayoutParams.setFitInsetsTypes(0); + windowLayoutParams.receiveInsetsIgnoringZOrder = true; + windowLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; + windowLayoutParams.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + windowLayoutParams.privateFlags = + WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; + return windowLayoutParams; + } + public void onConfigurationChanged(@Config int configChanges) { mControllers.onConfigurationChanged(configChanges); } @@ -497,17 +503,29 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ /** * Either adds or removes {@link WindowManager.LayoutParams#FLAG_NOT_FOCUSABLE} on the taskbar - * window. + * window. If we're now focusable, also move nav buttons to a separate window above IME. */ public void setTaskbarWindowFocusableForIme(boolean focusable) { if (focusable) { mWindowLayoutParams.flags &= ~FLAG_NOT_FOCUSABLE; + mControllers.navbarButtonsViewController.moveNavButtonsToNewWindow(); } else { mWindowLayoutParams.flags |= FLAG_NOT_FOCUSABLE; + mControllers.navbarButtonsViewController.moveNavButtonsBackToTaskbarWindow(); } mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams); } + /** Adds the given view to WindowManager with the provided LayoutParams (creates new window). */ + public void addWindowView(View view, WindowManager.LayoutParams windowLayoutParams) { + mWindowManager.addView(view, windowLayoutParams); + } + + /** Removes the given view from WindowManager. See {@link #addWindowView}. */ + public void removeWindowView(View view) { + mWindowManager.removeViewImmediate(view); + } + protected void onTaskbarIconClicked(View view) { Object tag = view.getTag(); if (tag instanceof Task) { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java index b42a60ceea..df004ef6e4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java @@ -15,17 +15,22 @@ */ package com.android.launcher3.taskbar; +import static android.view.KeyEvent.ACTION_UP; +import static android.view.KeyEvent.KEYCODE_BACK; + import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.R; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.TestProtocol; @@ -187,4 +192,17 @@ public class TaskbarDragLayer extends BaseDragLayer { TestLogging.recordMotionEvent(TestProtocol.SEQUENCE_MAIN, "Touch event", ev); return super.dispatchTouchEvent(ev); } + + /** Called while Taskbar window is focusable, e.g. when pressing back while a folder is open */ + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (event.getAction() == ACTION_UP && event.getKeyCode() == KEYCODE_BACK) { + AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mActivity); + if (topView != null && topView.onBackPressed()) { + // Handled by the floating view. + return true; + } + } + return super.dispatchKeyEvent(event); + } } diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index ac194d2077..5bcc2ad26d 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -228,7 +228,7 @@ public final class Utilities { offsetPoints(coord, v.getLeft(), v.getTop()); scale *= v.getScaleX(); - v = (View) v.getParent(); + v = v.getParent() instanceof View ? (View) v.getParent() : null; } return scale; } From 88c671ee71d5271e33ce6bcb2b53deb54d5e882a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Fri, 14 Jan 2022 04:17:46 +0000 Subject: [PATCH 5/6] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Iec90538bf8dd18fede035d7f548a71b757d2356c --- quickstep/res/values-af/strings.xml | 2 ++ quickstep/res/values-am/strings.xml | 2 ++ quickstep/res/values-ar/strings.xml | 2 ++ quickstep/res/values-as/strings.xml | 2 ++ quickstep/res/values-az/strings.xml | 2 ++ quickstep/res/values-b+sr+Latn/strings.xml | 2 ++ quickstep/res/values-be/strings.xml | 2 ++ quickstep/res/values-bg/strings.xml | 2 ++ quickstep/res/values-bn/strings.xml | 2 ++ quickstep/res/values-bs/strings.xml | 2 ++ quickstep/res/values-ca/strings.xml | 2 ++ quickstep/res/values-cs/strings.xml | 2 ++ quickstep/res/values-da/strings.xml | 2 ++ quickstep/res/values-de/strings.xml | 2 ++ quickstep/res/values-el/strings.xml | 2 ++ quickstep/res/values-en-rAU/strings.xml | 2 ++ quickstep/res/values-en-rCA/strings.xml | 2 ++ quickstep/res/values-en-rGB/strings.xml | 2 ++ quickstep/res/values-en-rIN/strings.xml | 2 ++ quickstep/res/values-en-rXC/strings.xml | 2 ++ quickstep/res/values-es-rUS/strings.xml | 2 ++ quickstep/res/values-es/strings.xml | 2 ++ quickstep/res/values-et/strings.xml | 2 ++ quickstep/res/values-eu/strings.xml | 2 ++ quickstep/res/values-fa/strings.xml | 2 ++ quickstep/res/values-fi/strings.xml | 2 ++ quickstep/res/values-fr-rCA/strings.xml | 2 ++ quickstep/res/values-fr/strings.xml | 2 ++ quickstep/res/values-gl/strings.xml | 2 ++ quickstep/res/values-gu/strings.xml | 2 ++ quickstep/res/values-hi/strings.xml | 2 ++ quickstep/res/values-hr/strings.xml | 2 ++ quickstep/res/values-hu/strings.xml | 2 ++ quickstep/res/values-hy/strings.xml | 2 ++ quickstep/res/values-in/strings.xml | 2 ++ quickstep/res/values-is/strings.xml | 2 ++ quickstep/res/values-it/strings.xml | 2 ++ quickstep/res/values-iw/strings.xml | 2 ++ quickstep/res/values-ja/strings.xml | 2 ++ quickstep/res/values-ka/strings.xml | 2 ++ quickstep/res/values-kk/strings.xml | 2 ++ quickstep/res/values-km/strings.xml | 2 ++ quickstep/res/values-kn/strings.xml | 2 ++ quickstep/res/values-ko/strings.xml | 2 ++ quickstep/res/values-ky/strings.xml | 2 ++ quickstep/res/values-lo/strings.xml | 2 ++ quickstep/res/values-lt/strings.xml | 2 ++ quickstep/res/values-lv/strings.xml | 2 ++ quickstep/res/values-mk/strings.xml | 2 ++ quickstep/res/values-ml/strings.xml | 2 ++ quickstep/res/values-mn/strings.xml | 2 ++ quickstep/res/values-mr/strings.xml | 2 ++ quickstep/res/values-ms/strings.xml | 2 ++ quickstep/res/values-my/strings.xml | 2 ++ quickstep/res/values-nb/strings.xml | 2 ++ quickstep/res/values-ne/strings.xml | 2 ++ quickstep/res/values-nl/strings.xml | 2 ++ quickstep/res/values-or/strings.xml | 2 ++ quickstep/res/values-pa/strings.xml | 2 ++ quickstep/res/values-pl/strings.xml | 2 ++ quickstep/res/values-pt-rPT/strings.xml | 2 ++ quickstep/res/values-pt/strings.xml | 2 ++ quickstep/res/values-ro/strings.xml | 2 ++ quickstep/res/values-ru/strings.xml | 2 ++ quickstep/res/values-si/strings.xml | 2 ++ quickstep/res/values-sk/strings.xml | 2 ++ quickstep/res/values-sl/strings.xml | 2 ++ quickstep/res/values-sq/strings.xml | 2 ++ quickstep/res/values-sr/strings.xml | 2 ++ quickstep/res/values-sv/strings.xml | 2 ++ quickstep/res/values-sw/strings.xml | 2 ++ quickstep/res/values-ta/strings.xml | 2 ++ quickstep/res/values-te/strings.xml | 2 ++ quickstep/res/values-th/strings.xml | 2 ++ quickstep/res/values-tl/strings.xml | 2 ++ quickstep/res/values-tr/strings.xml | 2 ++ quickstep/res/values-uk/strings.xml | 2 ++ quickstep/res/values-ur/strings.xml | 2 ++ quickstep/res/values-uz/strings.xml | 2 ++ quickstep/res/values-vi/strings.xml | 2 ++ quickstep/res/values-zh-rCN/strings.xml | 2 ++ quickstep/res/values-zh-rHK/strings.xml | 2 ++ quickstep/res/values-zh-rTW/strings.xml | 2 ++ quickstep/res/values-zu/strings.xml | 2 ++ 84 files changed, 168 insertions(+) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index 792116fd9c..6b51cb5348 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -25,6 +25,8 @@ "Programgebruikinstellings" "Vee alles uit" "Onlangse programme" + + "%1$s, %2$s" "< 1 minuut" "%1$s oor vandag" diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 76ff87aed1..a9215c46dd 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -25,6 +25,8 @@ "የመተግበሪያ አጠቃቀም ቅንብሮች" "ሁሉንም አጽዳ" "የቅርብ ጊዜ መተግበሪያዎች" + + "%1$s%2$s" "< 1 ደቂቃ" "ዛሬ %1$s ቀርቷል" diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index a853e27a23..c00f8f0312 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -25,6 +25,8 @@ "إعدادات استخدام التطبيق" "محو الكل" "التطبيقات المستخدمة مؤخرًا" + + "%1$s، %2$s" "أقل من دقيقة" "يتبقى اليوم %1$s." diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index 9bfbbc1c7c..1efad70c1d 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -25,6 +25,8 @@ "এপে ব্যৱহাৰ কৰা ডেটাৰ ছেটিং" "আটাইবোৰ মচক" "শেহতীয়া এপসমূহ" + + "%1$s, %2$s" "< ১ মিনিট" "আজি %1$s বাকী আছ" diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index b1e4fb0d97..3349e6e8f3 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -25,6 +25,8 @@ "Tətbiq istifadə ayarları" "Hamısını silin" "Son tətbiqlər" + + "%1$s, %2$s" "< 1 dəq" "Bu gün %1$s qaldı" diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index a5d8870df6..5a2ec1d6ca 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -25,6 +25,8 @@ "Podešavanja korišćenja aplikacije" "Obriši sve" "Nedavne aplikacije" + + "%1$s, %2$s" "< 1 min" "Još %1$s danas" diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index 5cecdd185f..31a532e25d 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -25,6 +25,8 @@ "Налады выкарыстання праграмы" "Ачысціць усё" "Нядаўнія праграмы" + + "%1$s, %2$s" "< 1 хв" "Сёння засталося %1$s" diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index 8be99dcf26..7e86f2d95f 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -25,6 +25,8 @@ "Настройки за използването на приложенията" "Изчистване на всички" "Скорошни приложения" + + "%1$s, %2$s" "< 1 мин" "Оставащо време днес: %1$s" diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 553b062b42..a1adf76f39 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -25,6 +25,8 @@ "অ্যাপ ব্যবহারের সেটিংস" "সবকিছু খালি করুন" "সম্প্রতি ব্যবহৃত অ্যাপ" + + "%1$s, %2$s" "< ১ মি." "আজকে %1$s বাকি আছে" diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 7870538f25..754c73fa4c 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -25,6 +25,8 @@ "Postavke korištenja aplikacije" "Obriši sve" "Nedavne aplikacije" + + "%1$s, %2$s" "< 1 min" "Preostalo vrijeme: %1$s" diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index eb5728c732..a87fc6f257 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -25,6 +25,8 @@ "Configuració d\'ús d\'aplicacions" "Esborra-ho tot" "Aplicacions recents" + + "%1$s; %2$s" "< 1 minut" "temps restant avui: %1$s" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index a885503bcf..3f4aa23ffc 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -25,6 +25,8 @@ "Nastavení využití aplikací" "Vymazat vše" "Poslední aplikace" + + "%1$s, %2$s" "< 1 minuta" "dnes zbývá: %1$s" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index 0c2b720d7c..80ed39f905 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -25,6 +25,8 @@ "Indstillinger for appforbrug" "Ryd alt" "Seneste apps" + + "%1$s, %2$s" "< 1 min" "%1$s tilbage i dag" diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index f2bfd27a6c..1faa1413a3 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -25,6 +25,8 @@ "Einstellungen zur App-Nutzung" "Alle Apps schließen" "Kürzlich geöffnete Apps" + + "%1$s, %2$s" "< 1 Min." "Heute noch %1$s" diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 707ef69faa..d2354cc4e9 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -25,6 +25,8 @@ "Ρυθμίσεις χρήσης εφαρμογής" "Διαγραφή όλων" "Πρόσφατες εφαρμογές" + + "%1$s, %2$s" "< 1 λ." "Απομένουν %1$s σήμερα" diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index e1f1e272e8..f291971669 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -25,6 +25,8 @@ "App usage settings" "Clear all" "Recent apps" + + "%1$s, %2$s" "< 1 minute" "%1$s left today" diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml index e1f1e272e8..f291971669 100644 --- a/quickstep/res/values-en-rCA/strings.xml +++ b/quickstep/res/values-en-rCA/strings.xml @@ -25,6 +25,8 @@ "App usage settings" "Clear all" "Recent apps" + + "%1$s, %2$s" "< 1 minute" "%1$s left today" diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index e1f1e272e8..f291971669 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -25,6 +25,8 @@ "App usage settings" "Clear all" "Recent apps" + + "%1$s, %2$s" "< 1 minute" "%1$s left today" diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index e1f1e272e8..f291971669 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -25,6 +25,8 @@ "App usage settings" "Clear all" "Recent apps" + + "%1$s, %2$s" "< 1 minute" "%1$s left today" diff --git a/quickstep/res/values-en-rXC/strings.xml b/quickstep/res/values-en-rXC/strings.xml index f2b4cd267d..ea81b38c10 100644 --- a/quickstep/res/values-en-rXC/strings.xml +++ b/quickstep/res/values-en-rXC/strings.xml @@ -25,6 +25,8 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‎‎‏‏‎‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‎‏‎App usage settings‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‎‏‎‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‎‏‏‏‎‎‎‏‏‏‏‏‏‏‎Clear all‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‏‏‎Recent apps‎‏‎‎‏‎" + + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎%2$s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‏‏‏‎‏‎‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎< 1 minute‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‎‎‏‎‎‎‏‏‎‎‎‏‎‎‏‏‎%1$s‎‏‎‎‏‏‏‎ left today‎‏‎‎‏‎" diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index 7b62c2d099..43e1092c9c 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -25,6 +25,8 @@ "Configuración de uso de la app" "Borrar todo" "Apps recientes" + + "%1$s (%2$s)" "< 1 minuto" "Tiempo restante: %1$s" diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index 93f66c87cf..7b447242da 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -25,6 +25,8 @@ "Ajustes de uso de la aplicación" "Borrar todo" "Aplicaciones recientes" + + "%1$s (%2$s)" "<1 minuto" "tiempo restante: %1$s" diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 57348257e9..88bbca5caa 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -25,6 +25,8 @@ "Rakenduse kasutuse seaded" "Sule kõik" "Hiljutised rakendused" + + "%1$s %2$s" "< 1 minut" "Tääna jäänud %1$s" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index 84ec586de0..8243af7c9c 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -25,6 +25,8 @@ "Aplikazioen erabileraren ezarpenak" "Garbitu guztiak" "Azken aplikazioak" + + "%1$s (%2$s)" "< 1 min" "%1$s gelditzen dira gaur" diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index ad87c8f35b..9e0a56354c 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -25,6 +25,8 @@ "تنظیمات استفاده از برنامه" "پاک کردن همه" "برنامه‌های اخیر" + + "%1$s، %2$s" "< ۱ دقیقه" "%1$s باقی‌مانده برای امروز" diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index 01cdbf1821..9bb67a1975 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -25,6 +25,8 @@ "Sovelluksen käyttöasetukset" "Poista kaikki" "Viimeisimmät sovellukset" + + "%1$s, %2$s" "< 1 min" "%1$s jäljellä tänään" diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index 65bb0f580b..2e5a8785f8 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -25,6 +25,8 @@ "Paramètres d\'utilisation de l\'application" "Tout effacer" "Applications récentes" + + "%1$s : %2$s" "< 1 min" "Il reste %1$s aujourd\'hui" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 10f11523df..6cfde85035 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -25,6 +25,8 @@ "Paramètres de consommation de l\'application" "Tout effacer" "Applications récentes" + + "%1$s, %2$s" "< 1 min" "Encore %1$s aujourd\'hui" diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index e983361df5..a8360aed6b 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -25,6 +25,8 @@ "Configuración do uso de aplicacións" "Borrar todo" "Apps recentes" + + "%1$s (%2$s)" "<1 min" "Tempo restante hoxe %1$s" diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 7861011aee..ae2625145a 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -25,6 +25,8 @@ "ઍપ વપરાશનું સેટિંગ" "બધું સાફ કરો" "તાજેતરની ઍપ" + + "%1$s, %2$s" "< 1 મિનિટ" "%1$s આજે બાકી" diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index 4802dbb275..885a52dc52 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -25,6 +25,8 @@ "ऐप्लिकेशन इस्तेमाल की सेटिंग" "सभी ऐप्लिकेशन बंद करें" "हाल ही में इस्तेमाल किए गए ऐप्लिकेशन" + + "%1$s, %2$s" "<1 मिनट" "आज %1$s और चलेगा" diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index bb5d3dce61..ac18e423a3 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -25,6 +25,8 @@ "Postavke upotrebe aplikacija" "Izbriši sve" "Nedavne aplikacije" + + "%1$s, %2$s" "< 1 min" "Još %1$s danas" diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index e6aa5cf72d..0fcd367cfb 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -25,6 +25,8 @@ "Alkalmazáshasználati beállítások" "Összes törlése" "Legutóbbi alkalmazások" + + "%1$s, %2$s" "< 1 perc" "Ma még %1$s van hátra" diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index 5cf779a0e3..1148c54976 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -25,6 +25,8 @@ "Հավելվածի օգտագործման կարգավորումներ" "Փակել բոլորը" "Վերջին օգտագործած հավելվածները" + + "%1$s, %2$s" "< 1 ր" "Այսօր մնացել է՝ %1$s" diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index d48383e4db..306fb03534 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -25,6 +25,8 @@ "Setelan penggunaan aplikasi" "Hapus semua" "Aplikasi terbaru" + + "%1$s, %2$s" "< 1 menit" "%1$s tersisa hari ini" diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index 15ee8ab22e..79f04c473f 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -25,6 +25,8 @@ "Notkunarstillingar forrits" "Hreinsa allt" "Nýleg forrit" + + "%1$s, %2$s" "< 1 mín." "%1$s eftir í dag" diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 493fdfb621..f383d5b1fc 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -25,6 +25,8 @@ "Impostazioni di utilizzo delle app" "Cancella tutto" "App recenti" + + "%1$s, %2$s" "< 1 min" "Rimanente oggi: %1$s" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index 15398f7c8e..3ebafa1a71 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -25,6 +25,8 @@ "הגדרות שימוש באפליקציה" "ניקוי הכול" "אפליקציות אחרונות" + + "%1$s, %2$s" "‏< דקה" "הזמן שנותר להיום: %1$s" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index 8b0780fc07..30f1c6ae36 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -25,6 +25,8 @@ "アプリの使用状況の設定" "すべてクリア" "最近使ったアプリ" + + "%1$s%2$s" "1 分未満" "今日はあと %1$sです" diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index c094d6c031..e813238c29 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -25,6 +25,8 @@ "აპების გამოყენების პარამეტრები" "ყველას გასუფთავება" "ბოლოდროინდელი აპები" + + "%1$s, %2$s" "< 1 წუთი" "დღეს დარჩენილია %1$s" diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index 77e4f6a4c5..55142d446e 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -25,6 +25,8 @@ "Қолданбаны пайдалану параметрлері" "Барлығын өшіру" "Соңғы пайдаланылған қолданбалар" + + "%1$s, %2$s" "< 1 мин" "Бүгін %1$s қалды" diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index a9f41d1c38..62bf5547cd 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -25,6 +25,8 @@ "ការកំណត់​ការប្រើប្រាស់​កម្មវិធី" "សម្អាត​ទាំងអស់" "កម្មវិធី​ថ្មីៗ" + + "%1$s, %2$s" "< 1 នាទី" "នៅសល់ %1$s ទៀត​នៅថ្ងៃនេះ" diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index 33f65657ca..9b866e8206 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -25,6 +25,8 @@ "ಆ್ಯಪ್‌ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು" "ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ" "ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು" + + "%1$s, %2$s" "< 1 ನಿ" "ಇಂದು %1$s ಸಮಯ ಉಳಿದಿದೆ" diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index 6e658ae7c1..40226da8e9 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -25,6 +25,8 @@ "앱 사용 설정" "모두 삭제" "최근 앱" + + "%1$s, %2$s" "< 1분" "오늘 %1$s 남음" diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index ac22e8d9a5..609bb8649b 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -25,6 +25,8 @@ "Колдонмону пайдалануу жөндөөлөрү" "Баарын тазалоо" "Акыркы колдонмолор" + + "%1$s, %2$s" "< 1 мүнөт" "Бүгүн %1$s мүнөт калды" diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index 3b726fd9fb..a8e1c40992 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -25,6 +25,8 @@ "ການຕັ້ງຄ່າການນຳໃຊ້ແອັບ" "ລຶບລ້າງທັງໝົດ" "ແອັບຫຼ້າສຸດ" + + "%1$s, %2$s" "< 1 ນາທີ" "ເຫຼືອ %1$s ມື້ນີ້" diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 5ceaff1583..4e86e5fca5 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -25,6 +25,8 @@ "Programos naudojimo nustatymai" "Išvalyti viską" "Naujausios programos" + + "%1$s, %2$s" "< 1 min." "Šiandien liko: %1$s" diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 96e0a4e235..02f1c5a90d 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -25,6 +25,8 @@ "Lietotņu izmantošanas iestatījumi" "Notīrīt visu" "Pēdējās izmantotās lietotnes" + + "%1$s, %2$s" "<1 minūte" "Šodien atlicis: %1$s" diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index b94d06eacc..0e37c73c13 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -25,6 +25,8 @@ "Поставки за користење на апликациите" "Избриши ги сите" "Неодамнешни апликации" + + "%1$s, %2$s" "< 1 минута" "Уште %1$s за денес" diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index aca3b5b1f3..553c59084f 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -25,6 +25,8 @@ "ആപ്പ് ഉപയോഗ ക്രമീകരണം" "എല്ലാം മായ്‌ക്കുക" "സമീപകാല ആപ്പുകൾ" + + "%1$s, %2$s" "< 1 മിനിറ്റ്" "ഇന്ന് %1$s ശേഷിക്കുന്നു" diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 117bc0e6a7..fb19dfc75b 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -25,6 +25,8 @@ "Апп ашиглалтын тохиргоо" "Бүгдийг устгах" "Саяхны аппууд" + + "%1$s, %2$s" "< 1 минут" "Өнөөдөр %1$s үлдсэн" diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index 3e4adf7815..fe8335026a 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -25,6 +25,8 @@ "अ‍ॅप वापर सेटिंग्ज" "सर्व साफ करा" "अलीकडील अ‍ॅप्स" + + "%1$s, %2$s" "१मिहून कमी" "आज %1$sशिल्लक आहे" diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 8ad1c37cf2..c9c33dc3a9 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -25,6 +25,8 @@ "Tetapan penggunaan apl" "Kosongkan semua" "Apl terbaharu" + + "%1$s, %2$s" "< 1 minit" "%1$s lagi hari ini" diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index e528b586e1..803319da62 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -25,6 +25,8 @@ "အက်ပ်အသုံးပြုမှု ဆက်တင်များ" "အားလုံးရှင်းရန်" "လတ်တလောသုံး အက်ပ်များ" + + "%1$s%2$s" "< ၁ မိနစ်" "ယနေ့ %1$s ခု ကျန်သည်" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 537289d536..96d12cf1dc 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -25,6 +25,8 @@ "Innstillinger for appbruk" "Fjern alt" "Nylige apper" + + "%1$s, %2$s" "< 1 minutt" "%1$s gjenstår i dag" diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index 9436610c36..2b0cbdb9ae 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -25,6 +25,8 @@ "एपको उपयोगका सेटिङहरू" "सबै मेटाउनुहोस्" "हालसालैका एपहरू" + + "%1$s, %2$s" "< १ मिनेट" "आज: %1$s बाँकी" diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index 7c5ca0d839..2f63f5e405 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -25,6 +25,8 @@ "Instellingen voor app-gebruik" "Alles wissen" "Recente apps" + + "%1$s, %2$s" "< 1 minuut" "Nog %1$s vandaag" diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index 596a3d1acd..2a6e7a1a96 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -25,6 +25,8 @@ "ଆପ୍‍ ବ୍ୟବହାର ସେଟିଂସ୍‍" "ସବୁ ଖାଲି କରନ୍ତୁ" "ବର୍ତ୍ତମାନର ଆପ୍‌" + + "%1$s %2$s" "< 1 ମିନିଟ୍" "ଆଜି %1$s ବାକି ଅଛି" diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index 9bc92c5b67..9a7e104180 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -25,6 +25,8 @@ "ਐਪ ਵਰਤੋਂ ਦੀਆਂ ਸੈਟਿੰਗਾਂ" "ਸਭ ਕਲੀਅਰ ਕਰੋ" "ਹਾਲੀਆ ਐਪਾਂ" + + "%1$s, %2$s" "< 1 ਮਿੰਟ" "ਅੱਜ %1$s ਬਾਕੀ" diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index 6b4603e4f2..65b97e0048 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -25,6 +25,8 @@ "Ustawienia użycia aplikacji" "Wyczyść wszystko" "Ostatnie aplikacje" + + "%1$s, %2$s" "> 1 min" "Na dziś zostało %1$s" diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index 5b4fa298da..140420061d 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -25,6 +25,8 @@ "Definições de utilização de aplicações" "Limpar tudo" "Apps recentes" + + "%1$s, %2$s" "< 1 minuto" "Resta(m) %1$s hoje." diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index e7ef0d50cd..3be045d777 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -25,6 +25,8 @@ "Configurações de uso do app" "Limpar tudo" "Apps recentes" + + "%1$s, %2$s" "< 1 min" "%1$s restante(s) hoje" diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index 72839cf629..20b90fdd82 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -25,6 +25,8 @@ "Setări de utilizare a aplicației" "Ștergeți tot" "Aplicații recente" + + "%1$s, %2$s" "< 1 minut" "Au mai rămas %1$s astăzi" diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index c894cb6562..8639bfb04c 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -25,6 +25,8 @@ "Настройки использования приложения" "Очистить все" "Недавние приложения" + + "%1$s: %2$s" "< 1 мин." "Осталось сегодня: %1$s" diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index 3b0dd8910c..38d865052d 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -25,6 +25,8 @@ "යෙදුම් භාවිත සැකසීම්" "සියල්ල හිස් කරන්න" "මෑත යෙදුම්" + + "%1$s, %2$s" "< 1 විනාඩියක්" "අද %1$sක් ඉතුරුයි" diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index abde935727..3a9fe99c10 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -25,6 +25,8 @@ "Nastavenia využívania aplikácie" "Vymazať všetko" "Nedávne aplikácie" + + "%1$s, %2$s" "Menej ako 1 minúta" "Dnes ešte zostáva: %1$s" diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index e0aeeab5f8..90a2eb0477 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -25,6 +25,8 @@ "Nastavitve uporabe aplikacij" "Počisti vse" "Nedavne aplikacije" + + "%1$s, %2$s" "< 1 min" "Danes je ostalo še %1$s" diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index cf7dd8bbde..ba7b3d1502 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -25,6 +25,8 @@ "Cilësimet e përdorimit të aplikacionit" "Pastroji të gjitha" "Aplikacionet e fundit" + + "%1$s, %2$s" "< 1 minutë" "%1$s të mbetura sot" diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index c5e63403c4..62de5298dd 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -25,6 +25,8 @@ "Подешавања коришћења апликације" "Обриши све" "Недавне апликације" + + "%1$s, %2$s" "< 1 мин" "Још %1$s данас" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index fc5fc18f4b..38ce4306bb 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -25,6 +25,8 @@ "Inställningar för appanvändning" "Rensa alla" "Senaste apparna" + + "%1$s, %2$s" "< 1 min" "%1$s kvar i dag" diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index 13290f484b..43972a7292 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -25,6 +25,8 @@ "Mipangilio ya matumizi ya programu" "Ondoa zote" "Programu za hivi karibuni" + + "%1$s, %2$s" "< dak 1" "Umebakisha %1$s leo" diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 960d389ee0..5a30cb6d71 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -25,6 +25,8 @@ "ஆப்ஸ் உபயோக அமைப்புகள்" "எல்லாம் அழி" "சமீபத்திய ஆப்ஸ்" + + "%1$s, %2$s" "< 1 நி" "இன்று %1$s மீதமுள்ளது" diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index 6ae0a285d2..d2bc6ad5e4 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -25,6 +25,8 @@ "యాప్ వినియోగ సెట్టింగ్‌లు" "అన్నీ తీసివేయండి" "ఇటీవలి యాప్‌లు" + + "%1$s, %2$s" "< 1 నిమిషం" "నేటికి %1$s మిగిలి ఉంది" diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index bf5e715d5a..53927b59ae 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -25,6 +25,8 @@ "การตั้งค่าการใช้แอป" "ล้างทั้งหมด" "แอปล่าสุด" + + "%1$s %2$s" "<1 นาที" "วันนี้เหลืออีก %1$s" diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index 2a0b5ffa66..e2b9349d8a 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -25,6 +25,8 @@ "Mga setting ng paggamit ng app" "I-clear lahat" "Mga kamakailang app" + + "%1$s, %2$s" "< 1 min" "%1$s na lang ngayon" diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index 6fa71a21e0..0e646d1018 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -25,6 +25,8 @@ "Uygulama kullanım ayarları" "Tümünü temizle" "Son uygulamalar" + + "%1$s, %2$s" "< 1 dk." "Bugün %1$s kaldı" diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index f5048e7181..9c6d121de5 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -25,6 +25,8 @@ "Налаштування використання додатка" "Очистити все" "Нещодавні додатки" + + "%1$s, %2$s" "< 1 хв" "Сьогодні залишилося %1$s" diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 13ca7e4a10..7a9cd98b45 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -25,6 +25,8 @@ "ایپ کے استعمال کی ترتیبات" "سبھی کو صاف کریں" "حالیہ ایپس" + + "%1$s،%2$s" "‏< 1 منٹ" "آج %1$s بچا ہے" diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index 468df49c68..abff7ac8f2 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -25,6 +25,8 @@ "Ilovadan foydalanish sozlamalari" "Hammasini tozalash" "Yaqinda ishlatilgan ilovalar" + + "%1$s, %2$s" "< 1 daqiqa" "Bugun %1$s qoldi" diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index 5999a41248..8bda9bc86e 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -25,6 +25,8 @@ "Cài đặt mức sử dụng ứng dụng" "Xóa tất cả" "Ứng dụng gần đây" + + "%1$s, %2$s" "< 1 phút" "Hôm nay còn %1$s" diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index 04dce2bf0b..00fe7b5699 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -25,6 +25,8 @@ "应用使用设置" "全部清除" "最近用过的应用" + + "%1$s%2$s)" "不到 1 分钟" "今天还可使用 %1$s" diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 1e1690dbda..f13a926a4c 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -25,6 +25,8 @@ "應用程式使用情況設定" "全部清除" "最近使用的應用程式" + + "%1$s%2$s" "少於 1 分鐘" "今天剩餘時間:%1$s" diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index 9e7179c693..27ff971ebf 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -25,6 +25,8 @@ "應用程式使用情況設定" "全部清除" "最近使用的應用程式" + + "%1$s (%2$s)" "< 1 分鐘" "今天還能使用 %1$s" diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 8551ee4614..1683449247 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -25,6 +25,8 @@ "Izilungiselelo zokusetshenziswa kohlelo lokusebenza" "Sula konke" "Izinhlelo zokusebenza zakamuva" + + "%1$s, %2$s" "< 1 iminithi" "%1$s esele namhlanje" From 291d88460b8dd2c75c9fdf454cbc66e1c1ac7f2e Mon Sep 17 00:00:00 2001 From: Schneider Victor-tulias Date: Wed, 12 Jan 2022 14:33:43 -0800 Subject: [PATCH 6/6] Make Taskbar focusable when a popup is open. - Added ArrowPopup#OnPopupClosedCallback to automatically remove Taskbar focus when the popup closes. Fixes: 209917078 Test: opened popup in taskbar and closed it with switch access, touching anywhere on the screen and using the back gesture. went home to check if focus was removed. Change-Id: Ie7aafc9cf0f03fadaa44e77818508e9e1d8db610 --- .../taskbar/TaskbarActivityContext.java | 17 ++++++++++++++--- .../taskbar/TaskbarLauncherStateController.java | 5 +++++ .../taskbar/TaskbarPopupController.java | 9 +++++++++ src/com/android/launcher3/popup/ArrowPopup.java | 11 ++++++----- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index e48b26be76..facdd1ef2e 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -501,19 +501,30 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ return mTaskbarHeightForIme; } + /** + * Either adds or removes {@link WindowManager.LayoutParams#FLAG_NOT_FOCUSABLE} on the taskbar + * window. + */ + public void setTaskbarWindowFocusable(boolean focusable) { + if (focusable) { + mWindowLayoutParams.flags &= ~FLAG_NOT_FOCUSABLE; + } else { + mWindowLayoutParams.flags |= FLAG_NOT_FOCUSABLE; + } + mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams); + } + /** * Either adds or removes {@link WindowManager.LayoutParams#FLAG_NOT_FOCUSABLE} on the taskbar * window. If we're now focusable, also move nav buttons to a separate window above IME. */ public void setTaskbarWindowFocusableForIme(boolean focusable) { if (focusable) { - mWindowLayoutParams.flags &= ~FLAG_NOT_FOCUSABLE; mControllers.navbarButtonsViewController.moveNavButtonsToNewWindow(); } else { - mWindowLayoutParams.flags |= FLAG_NOT_FOCUSABLE; mControllers.navbarButtonsViewController.moveNavButtonsBackToTaskbarWindow(); } - mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams); + setTaskbarWindowFocusable(focusable); } /** Adds the given view to WindowManager with the provided LayoutParams (creates new window). */ diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 7a50d0bf63..a654a561e4 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -27,6 +27,7 @@ import android.animation.ObjectAnimator; import androidx.annotation.NonNull; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseQuickstepLauncher; import com.android.launcher3.LauncherState; import com.android.launcher3.statemanager.StateManager; @@ -256,6 +257,10 @@ import java.util.function.Supplier; if (hasAnyFlag(changedFlags, FLAG_RESUMED | FLAG_RECENTS_ANIMATION_RUNNING)) { boolean goingToLauncher = hasAnyFlag(FLAG_RESUMED | FLAG_RECENTS_ANIMATION_RUNNING); + if (goingToLauncher) { + // Handle closing open popups when going home/overview + AbstractFloatingView.closeAllOpenViews(mControllers.taskbarActivityContext); + } animatorSet.play(mTaskbarBackgroundAlpha.animateToValue(goingToLauncher ? 0 : 1) .setDuration(duration)); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index 2dee50688d..7af9c9dd73 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -154,6 +154,15 @@ public class TaskbarPopupController { .filter(Objects::nonNull) .collect(Collectors.toList())); container.requestFocus(); + + // Make focusable to receive back events + mControllers.taskbarActivityContext.setTaskbarWindowFocusable(true); + container.setOnCloseCallback(() -> { + mControllers.taskbarActivityContext.getDragLayer().post( + () -> mControllers.taskbarActivityContext.setTaskbarWindowFocusable(false)); + container.setOnCloseCallback(null); + }); + return container; } diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index b1a41093f5..f06e5cecd5 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -48,7 +48,7 @@ import android.view.ViewTreeObserver; import android.view.animation.Interpolator; import android.widget.FrameLayout; -import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.InsettableFrameLayout; @@ -120,7 +120,7 @@ public abstract class ArrowPopup private final GradientDrawable mRoundedTop; private final GradientDrawable mRoundedBottom; - private Runnable mOnCloseCallback = () -> { }; + @Nullable private Runnable mOnCloseCallback = null; // The rect string of the view that the arrow is attached to, in screen reference frame. protected int mArrowColor; @@ -766,7 +766,6 @@ public abstract class ArrowPopup } } - protected void animateClose() { if (!mIsOpen) { return; @@ -816,7 +815,9 @@ public abstract class ArrowPopup mDeferContainerRemoval = false; getPopupContainer().removeView(this); getPopupContainer().removeView(mArrow); - mOnCloseCallback.run(); + if (mOnCloseCallback != null) { + mOnCloseCallback.run(); + } if (mColorExtractors != null) { mColorExtractors.forEach(e -> e.setListener(null)); } @@ -825,7 +826,7 @@ public abstract class ArrowPopup /** * Callback to be called when the popup is closed */ - public void setOnCloseCallback(@NonNull Runnable callback) { + public void setOnCloseCallback(@Nullable Runnable callback) { mOnCloseCallback = callback; }