Merge "Add screenrecord for TaplWorkspaceTest#testAddAndDeletePageAndFling" into main
diff --git a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java
index 22e491f..b329156 100644
--- a/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java
+++ b/quickstep/src/com/android/launcher3/appprediction/PredictionRowView.java
@@ -35,7 +35,6 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.Flags;
-import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.FloatingHeaderRow;
@@ -150,8 +149,7 @@
int totalHeight = iconHeight + iconPadding + textHeight + mVerticalPadding * 2;
// Prediction row height will be 4dp bigger than the regular apps in A-Z list when two line
// is not enabled. Otherwise, the extra height will increase by just the textHeight.
- int extraHeight = (Flags.enableTwolineToggle() &&
- LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(getContext()))
+ int extraHeight = deviceProfile.inv.enableTwoLinesInAllApps
? (textHeight + mTopRowExtraHeight) : mTopRowExtraHeight;
totalHeight += extraHeight;
return getVisibility() == GONE ? 0 : totalHeight + getPaddingTop() + getPaddingBottom();
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java
deleted file mode 100644
index 488cea5..0000000
--- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * Copyright (C) 2022 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.statehandlers;
-
-import static android.view.View.VISIBLE;
-import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY;
-
-import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-
-import android.content.Context;
-import android.os.Debug;
-import android.util.Log;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.launcher3.Launcher;
-import com.android.launcher3.LauncherState;
-import com.android.launcher3.statemanager.BaseState;
-import com.android.launcher3.statemanager.StatefulActivity;
-import com.android.launcher3.uioverrides.QuickstepLauncher;
-import com.android.launcher3.util.DisplayController;
-import com.android.launcher3.views.ActivityContext;
-import com.android.quickstep.GestureState;
-import com.android.quickstep.SystemUiProxy;
-import com.android.quickstep.fallback.RecentsState;
-import com.android.wm.shell.desktopmode.IDesktopTaskListener;
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
-
-import java.io.PrintWriter;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Controls the visibility of the workspace and the resumed / paused state when desktop mode
- * is enabled.
- */
-public class DesktopVisibilityController {
-
- private static final String TAG = "DesktopVisController";
- private static final boolean DEBUG = false;
- private final Set<DesktopVisibilityListener> mDesktopVisibilityListeners = new HashSet<>();
- private final Set<TaskbarDesktopModeListener> mTaskbarDesktopModeListeners = new HashSet<>();
-
- private int mVisibleDesktopTasksCount;
- private boolean mInOverviewState;
- private boolean mBackgroundStateEnabled;
- private boolean mGestureInProgress;
-
- @Nullable
- private DesktopTaskListenerImpl mDesktopTaskListener;
-
- @Nullable
- private Context mContext;
-
- public DesktopVisibilityController(@NonNull Context context) {
- setContext(context);
- }
-
- /** Sets the context and re-registers the System Ui listener */
- private void setContext(@Nullable Context context) {
- unregisterSystemUiListener();
- mContext = context;
- registerSystemUiListener();
- }
-
- /** Register a listener with System UI to receive updates about desktop tasks state */
- private void registerSystemUiListener() {
- if (mContext == null) {
- return;
- }
- if (mDesktopTaskListener != null) {
- return;
- }
- mDesktopTaskListener = new DesktopTaskListenerImpl(this, mContext.getDisplayId());
- SystemUiProxy.INSTANCE.get(mContext).setDesktopTaskListener(mDesktopTaskListener);
- }
-
- /**
- * Clear listener from System UI that was set with {@link #registerSystemUiListener()}
- */
- private void unregisterSystemUiListener() {
- if (mContext == null) {
- return;
- }
- if (mDesktopTaskListener == null) {
- return;
- }
- SystemUiProxy.INSTANCE.get(mContext).setDesktopTaskListener(null);
- mDesktopTaskListener.release();
- mDesktopTaskListener = null;
- }
-
- /**
- * Whether desktop tasks are visible in desktop mode.
- */
- public boolean areDesktopTasksVisible() {
- boolean desktopTasksVisible = mVisibleDesktopTasksCount > 0;
- if (DEBUG) {
- Log.d(TAG, "areDesktopTasksVisible: desktopVisible=" + desktopTasksVisible);
- }
- return desktopTasksVisible;
- }
-
- /**
- * Whether desktop tasks are visible in desktop mode.
- */
- public boolean areDesktopTasksVisibleAndNotInOverview() {
- boolean desktopTasksVisible = mVisibleDesktopTasksCount > 0;
- if (DEBUG) {
- Log.d(TAG, "areDesktopTasksVisible: desktopVisible=" + desktopTasksVisible
- + " overview=" + mInOverviewState);
- }
- return desktopTasksVisible && !mInOverviewState;
- }
-
- /**
- * Number of visible desktop windows in desktop mode.
- */
- public int getVisibleDesktopTasksCount() {
- return mVisibleDesktopTasksCount;
- }
-
- /** Registers a listener for Desktop Mode visibility updates. */
- public void registerDesktopVisibilityListener(DesktopVisibilityListener listener) {
- mDesktopVisibilityListeners.add(listener);
- }
-
- /** Removes a previously registered Desktop Mode visibility listener. */
- public void unregisterDesktopVisibilityListener(DesktopVisibilityListener listener) {
- mDesktopVisibilityListeners.remove(listener);
- }
-
- /** Registers a listener for Taskbar changes in Desktop Mode. */
- public void registerTaskbarDesktopModeListener(TaskbarDesktopModeListener listener) {
- mTaskbarDesktopModeListeners.add(listener);
- }
-
- /** Removes a previously registered listener for Taskbar changes in Desktop Mode. */
- public void unregisterTaskbarDesktopModeListener(TaskbarDesktopModeListener listener) {
- mTaskbarDesktopModeListeners.remove(listener);
- }
-
- /**
- * Sets the number of desktop windows that are visible and updates launcher visibility based on
- * it.
- */
- public void setVisibleDesktopTasksCount(int visibleTasksCount) {
- if (mContext == null) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "setVisibleDesktopTasksCount: visibleTasksCount=" + visibleTasksCount
- + " currentValue=" + mVisibleDesktopTasksCount);
- }
-
- if (visibleTasksCount != mVisibleDesktopTasksCount) {
- final boolean wasVisible = mVisibleDesktopTasksCount > 0;
- final boolean isVisible = visibleTasksCount > 0;
- final boolean wereDesktopTasksVisibleBefore = areDesktopTasksVisibleAndNotInOverview();
- mVisibleDesktopTasksCount = visibleTasksCount;
- final boolean areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview();
- if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
- notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow);
- }
-
- if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()
- && wasVisible != isVisible) {
- // TODO: b/333533253 - Remove after flag rollout
- if (mVisibleDesktopTasksCount > 0) {
- setLauncherViewsVisibility(View.INVISIBLE);
- if (!mInOverviewState) {
- // When desktop tasks are visible & we're not in overview, we want launcher
- // to appear paused, this ensures that taskbar displays.
- markLauncherPaused();
- }
- } else {
- setLauncherViewsVisibility(View.VISIBLE);
- // If desktop tasks aren't visible, ensure that launcher appears resumed to
- // behave normally.
- markLauncherResumed();
- }
- }
- }
- }
-
- public void onLauncherStateChanged(LauncherState state) {
- onLauncherStateChanged(
- state, state == LauncherState.BACKGROUND_APP, state.isRecentsViewVisible);
- }
-
- public void onLauncherStateChanged(RecentsState state) {
- onLauncherStateChanged(
- state, state == RecentsState.BACKGROUND_APP, state.isRecentsViewVisible());
- }
-
- /**
- * Process launcher state change and update launcher view visibility based on desktop state
- */
- public void onLauncherStateChanged(
- BaseState<?> state, boolean isBackgroundAppState, boolean isRecentsViewVisible) {
- if (DEBUG) {
- Log.d(TAG, "onLauncherStateChanged: newState=" + state);
- }
- setBackgroundStateEnabled(isBackgroundAppState);
- // Desktop visibility tracks overview and background state separately
- setOverviewStateEnabled(!isBackgroundAppState && isRecentsViewVisible);
- }
-
- private void setOverviewStateEnabled(boolean overviewStateEnabled) {
- if (mContext == null) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "setOverviewStateEnabled: enabled=" + overviewStateEnabled
- + " currentValue=" + mInOverviewState);
- }
- if (overviewStateEnabled != mInOverviewState) {
- final boolean wereDesktopTasksVisibleBefore = areDesktopTasksVisibleAndNotInOverview();
- mInOverviewState = overviewStateEnabled;
- final boolean areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview();
- if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
- notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow);
- }
- if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) {
- return;
- }
- // TODO: b/333533253 - Clean up after flag rollout
-
- if (mInOverviewState) {
- setLauncherViewsVisibility(View.VISIBLE);
- markLauncherResumed();
- } else if (areDesktopTasksVisibleNow && !mGestureInProgress) {
- // Switching out of overview state and gesture finished.
- // If desktop tasks are still visible, hide launcher again.
- setLauncherViewsVisibility(View.INVISIBLE);
- markLauncherPaused();
- }
- }
- }
-
- private void notifyDesktopVisibilityListeners(boolean areDesktopTasksVisible) {
- if (mContext == null) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "notifyDesktopVisibilityListeners: visible=" + areDesktopTasksVisible);
- }
- for (DesktopVisibilityListener listener : mDesktopVisibilityListeners) {
- listener.onDesktopVisibilityChanged(areDesktopTasksVisible);
- }
- DisplayController.INSTANCE.get(mContext).notifyConfigChange();
- }
-
- private void notifyTaskbarDesktopModeListeners(boolean doesAnyTaskRequireTaskbarRounding) {
- if (DEBUG) {
- Log.d(TAG, "notifyTaskbarDesktopModeListeners: doesAnyTaskRequireTaskbarRounding="
- + doesAnyTaskRequireTaskbarRounding);
- }
- for (TaskbarDesktopModeListener listener : mTaskbarDesktopModeListeners) {
- listener.onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding);
- }
- }
-
- /**
- * TODO: b/333533253 - Remove after flag rollout
- */
- private void setBackgroundStateEnabled(boolean backgroundStateEnabled) {
- if (DEBUG) {
- Log.d(TAG, "setBackgroundStateEnabled: enabled=" + backgroundStateEnabled
- + " currentValue=" + mBackgroundStateEnabled);
- }
- if (backgroundStateEnabled != mBackgroundStateEnabled) {
- mBackgroundStateEnabled = backgroundStateEnabled;
- if (mBackgroundStateEnabled) {
- setLauncherViewsVisibility(View.VISIBLE);
- markLauncherResumed();
- } else if (areDesktopTasksVisibleAndNotInOverview() && !mGestureInProgress) {
- // Switching out of background state. If desktop tasks are visible, pause launcher.
- setLauncherViewsVisibility(View.INVISIBLE);
- markLauncherPaused();
- }
- }
- }
-
- /**
- * Whether recents gesture is currently in progress.
- *
- * TODO: b/333533253 - Remove after flag rollout
- */
- public boolean isRecentsGestureInProgress() {
- return mGestureInProgress;
- }
-
- /**
- * Notify controller that recents gesture has started.
- *
- * TODO: b/333533253 - Remove after flag rollout
- */
- public void setRecentsGestureStart() {
- if (DEBUG) {
- Log.d(TAG, "setRecentsGestureStart");
- }
- setRecentsGestureInProgress(true);
- }
-
- /**
- * Notify controller that recents gesture finished with the given
- * {@link com.android.quickstep.GestureState.GestureEndTarget}
- *
- * TODO: b/333533253 - Remove after flag rollout
- */
- public void setRecentsGestureEnd(@Nullable GestureState.GestureEndTarget endTarget) {
- if (DEBUG) {
- Log.d(TAG, "setRecentsGestureEnd: endTarget=" + endTarget);
- }
- setRecentsGestureInProgress(false);
-
- if (endTarget == null) {
- // Gesture did not result in a new end target. Ensure launchers gets paused again.
- markLauncherPaused();
- }
- }
-
- /**
- * TODO: b/333533253 - Remove after flag rollout
- */
- private void setRecentsGestureInProgress(boolean gestureInProgress) {
- if (gestureInProgress != mGestureInProgress) {
- mGestureInProgress = gestureInProgress;
- }
- }
-
- /**
- * TODO: b/333533253 - Remove after flag rollout
- */
- private void setLauncherViewsVisibility(int visibility) {
- if (mContext == null) {
- return;
- }
- if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "setLauncherViewsVisibility: visibility=" + visibility + " "
- + Debug.getCaller());
- }
- if (!(mContext instanceof ActivityContext activity)) {
- return;
- }
- View dragLayer = activity.getDragLayer();
- if (dragLayer != null) {
- dragLayer.setVisibility(visibility);
- }
- if (!(activity instanceof Launcher launcher)) {
- return;
- }
- View workspaceView = launcher.getWorkspace();
- if (workspaceView != null) {
- workspaceView.setVisibility(visibility);
- }
- if (launcher instanceof QuickstepLauncher ql
- && ql.getTaskbarUIController() != null
- && mVisibleDesktopTasksCount != 0) {
- ql.getTaskbarUIController().onLauncherVisibilityChanged(visibility == VISIBLE);
- }
- }
-
- /**
- * TODO: b/333533253 - Remove after flag rollout
- */
- private void markLauncherPaused() {
- if (mContext == null) {
- return;
- }
- if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "markLauncherPaused " + Debug.getCaller());
- }
- StatefulActivity<LauncherState> activity =
- QuickstepLauncher.ACTIVITY_TRACKER.getCreatedContext();
- if (activity != null) {
- activity.setPaused();
- }
- }
-
- /**
- * TODO: b/333533253 - Remove after flag rollout
- */
- private void markLauncherResumed() {
- if (mContext == null) {
- return;
- }
- if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) {
- return;
- }
- if (DEBUG) {
- Log.d(TAG, "markLauncherResumed " + Debug.getCaller());
- }
- StatefulActivity<LauncherState> activity =
- QuickstepLauncher.ACTIVITY_TRACKER.getCreatedContext();
- // Check activity state before calling setResumed(). Launcher may have been actually
- // paused (eg fullscreen task moved to front).
- // In this case we should not mark the activity as resumed.
- if (activity != null && activity.isResumed()) {
- activity.setResumed();
- }
- }
-
- public void onDestroy() {
- setContext(null);
- }
-
- public void dumpLogs(String prefix, PrintWriter pw) {
- pw.println(prefix + "DesktopVisibilityController:");
-
- pw.println(prefix + "\tmDesktopVisibilityListeners=" + mDesktopVisibilityListeners);
- pw.println(prefix + "\tmVisibleDesktopTasksCount=" + mVisibleDesktopTasksCount);
- pw.println(prefix + "\tmInOverviewState=" + mInOverviewState);
- pw.println(prefix + "\tmBackgroundStateEnabled=" + mBackgroundStateEnabled);
- pw.println(prefix + "\tmGestureInProgress=" + mGestureInProgress);
- pw.println(prefix + "\tmDesktopTaskListener=" + mDesktopTaskListener);
- pw.println(prefix + "\tmContext=" + mContext);
- }
-
- /** A listener for when the user enters/exits Desktop Mode. */
- public interface DesktopVisibilityListener {
- /**
- * Callback for when the user enters or exits Desktop Mode
- *
- * @param visible whether Desktop Mode is now visible
- */
- void onDesktopVisibilityChanged(boolean visible);
- }
-
- /**
- * Wrapper for the IDesktopTaskListener stub to prevent lingering references to the launcher
- * activity via the controller.
- */
- private static class DesktopTaskListenerImpl extends IDesktopTaskListener.Stub {
-
- private DesktopVisibilityController mController;
- private final int mDisplayId;
-
- DesktopTaskListenerImpl(@NonNull DesktopVisibilityController controller, int displayId) {
- mController = controller;
- mDisplayId = displayId;
- }
-
- /**
- * Clears any references to the controller.
- */
- void release() {
- mController = null;
- }
-
- @Override
- public void onTasksVisibilityChanged(int displayId, int visibleTasksCount) {
- MAIN_EXECUTOR.execute(() -> {
- if (mController != null && displayId == mDisplayId) {
- if (DEBUG) {
- Log.d(TAG, "desktop visible tasks count changed=" + visibleTasksCount);
- }
- mController.setVisibleDesktopTasksCount(visibleTasksCount);
- }
- });
- }
-
- @Override
- public void onStashedChanged(int displayId, boolean stashed) {
- Log.w(TAG, "DesktopTaskListenerImpl: onStashedChanged is deprecated");
- }
-
- @Override
- public void onTaskbarCornerRoundingUpdate(boolean doesAnyTaskRequireTaskbarRounding) {
- MAIN_EXECUTOR.execute(() -> {
- if (mController != null && DesktopModeStatus.useRoundedCorners()) {
- Log.d(TAG, "DesktopTaskListenerImpl: doesAnyTaskRequireTaskbarRounding= "
- + doesAnyTaskRequireTaskbarRounding);
- mController.notifyTaskbarDesktopModeListeners(
- doesAnyTaskRequireTaskbarRounding);
- }
- });
- }
-
- public void onEnterDesktopModeTransitionStarted(int transitionDuration) {
-
- }
-
- @Override
- public void onExitDesktopModeTransitionStarted(int transitionDuration) {
-
- }
- }
-
- /** A listener for Taskbar in Desktop Mode. */
- public interface TaskbarDesktopModeListener {
- /**
- * Callback for when task is resized in desktop mode.
- *
- * @param doesAnyTaskRequireTaskbarRounding whether task requires taskbar corner roundness.
- */
- void onTaskbarCornerRoundingUpdate(boolean doesAnyTaskRequireTaskbarRounding);
- }
-}
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
new file mode 100644
index 0000000..5a8302c
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
@@ -0,0 +1,420 @@
+/*
+ * Copyright (C) 2022 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.statehandlers
+
+import android.content.Context
+import android.os.Debug
+import android.util.Log
+import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY
+import com.android.launcher3.LauncherState
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppComponent
+import com.android.launcher3.dagger.LauncherAppSingleton
+import com.android.launcher3.statemanager.BaseState
+import com.android.launcher3.statemanager.StatefulActivity
+import com.android.launcher3.uioverrides.QuickstepLauncher
+import com.android.launcher3.util.DaggerSingletonObject
+import com.android.launcher3.util.DaggerSingletonTracker
+import com.android.launcher3.util.Executors
+import com.android.launcher3.util.window.WindowManagerProxy.DesktopVisibilityListener
+import com.android.quickstep.GestureState.GestureEndTarget
+import com.android.quickstep.SystemUiProxy
+import com.android.quickstep.fallback.RecentsState
+import com.android.wm.shell.desktopmode.IDesktopTaskListener.Stub
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import java.io.PrintWriter
+import java.lang.ref.WeakReference
+import javax.inject.Inject
+
+/**
+ * Controls the visibility of the workspace and the resumed / paused state when desktop mode is
+ * enabled.
+ */
+@LauncherAppSingleton
+class DesktopVisibilityController
+@Inject
+constructor(
+ @ApplicationContext private val context: Context,
+ systemUiProxy: SystemUiProxy,
+ lifecycleTracker: DaggerSingletonTracker,
+) {
+ private val desktopVisibilityListeners: MutableSet<DesktopVisibilityListener> = HashSet()
+ private val taskbarDesktopModeListeners: MutableSet<TaskbarDesktopModeListener> = HashSet()
+
+ /** Number of visible desktop windows in desktop mode. */
+ var visibleDesktopTasksCount: Int = 0
+ /**
+ * Sets the number of desktop windows that are visible and updates launcher visibility based
+ * on it.
+ */
+ set(visibleTasksCount) {
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ ("setVisibleDesktopTasksCount: visibleTasksCount=" +
+ visibleTasksCount +
+ " currentValue=" +
+ field),
+ )
+ }
+
+ if (visibleTasksCount != field) {
+ val wasVisible = field > 0
+ val isVisible = visibleTasksCount > 0
+ val wereDesktopTasksVisibleBefore = areDesktopTasksVisible()
+ field = visibleTasksCount
+ val areDesktopTasksVisibleNow = areDesktopTasksVisible()
+ if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
+ notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow)
+ }
+
+ if (
+ !ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue && wasVisible != isVisible
+ ) {
+ // TODO: b/333533253 - Remove after flag rollout
+ if (field > 0) {
+ if (!inOverviewState) {
+ // When desktop tasks are visible & we're not in overview, we want
+ // launcher
+ // to appear paused, this ensures that taskbar displays.
+ markLauncherPaused()
+ }
+ } else {
+ // If desktop tasks aren't visible, ensure that launcher appears resumed to
+ // behave normally.
+ markLauncherResumed()
+ }
+ }
+ }
+ }
+
+ private var inOverviewState = false
+ private var backgroundStateEnabled = false
+ private var gestureInProgress = false
+
+ private var desktopTaskListener: DesktopTaskListenerImpl?
+
+ init {
+ desktopTaskListener = DesktopTaskListenerImpl(this, context.displayId)
+ systemUiProxy.setDesktopTaskListener(desktopTaskListener)
+
+ lifecycleTracker.addCloseable {
+ desktopTaskListener = null
+ systemUiProxy.setDesktopTaskListener(null)
+ }
+ }
+
+ /** Whether desktop tasks are visible in desktop mode. */
+ fun areDesktopTasksVisible(): Boolean {
+ val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
+ if (DEBUG) {
+ Log.d(TAG, "areDesktopTasksVisible: desktopVisible=$desktopTasksVisible")
+ }
+ return desktopTasksVisible
+ }
+
+ /** Whether desktop tasks are visible in desktop mode. */
+ fun areDesktopTasksVisibleAndNotInOverview(): Boolean {
+ val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ ("areDesktopTasksVisible: desktopVisible=" +
+ desktopTasksVisible +
+ " overview=" +
+ inOverviewState),
+ )
+ }
+ return desktopTasksVisible && !inOverviewState
+ }
+
+ /** Registers a listener for Taskbar changes in Desktop Mode. */
+ fun registerTaskbarDesktopModeListener(listener: TaskbarDesktopModeListener) {
+ taskbarDesktopModeListeners.add(listener)
+ }
+
+ /** Removes a previously registered listener for Taskbar changes in Desktop Mode. */
+ fun unregisterTaskbarDesktopModeListener(listener: TaskbarDesktopModeListener) {
+ taskbarDesktopModeListeners.remove(listener)
+ }
+
+ fun onLauncherStateChanged(state: LauncherState) {
+ onLauncherStateChanged(
+ state,
+ state === LauncherState.BACKGROUND_APP,
+ state.isRecentsViewVisible,
+ )
+ }
+
+ fun onLauncherStateChanged(state: RecentsState) {
+ onLauncherStateChanged(
+ state,
+ state === RecentsState.BACKGROUND_APP,
+ state.isRecentsViewVisible,
+ )
+ }
+
+ /** Process launcher state change and update launcher view visibility based on desktop state */
+ fun onLauncherStateChanged(
+ state: BaseState<*>,
+ isBackgroundAppState: Boolean,
+ isRecentsViewVisible: Boolean,
+ ) {
+ if (DEBUG) {
+ Log.d(TAG, "onLauncherStateChanged: newState=$state")
+ }
+ setBackgroundStateEnabled(isBackgroundAppState)
+ // Desktop visibility tracks overview and background state separately
+ setOverviewStateEnabled(!isBackgroundAppState && isRecentsViewVisible)
+ }
+
+ private fun setOverviewStateEnabled(overviewStateEnabled: Boolean) {
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ ("setOverviewStateEnabled: enabled=" +
+ overviewStateEnabled +
+ " currentValue=" +
+ inOverviewState),
+ )
+ }
+ if (overviewStateEnabled != inOverviewState) {
+ val wereDesktopTasksVisibleBefore = areDesktopTasksVisible()
+ inOverviewState = overviewStateEnabled
+ val areDesktopTasksVisibleNow = areDesktopTasksVisible()
+ if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
+ notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow)
+ }
+
+ if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue) {
+ return
+ }
+
+ // TODO: b/333533253 - Clean up after flag rollout
+ if (inOverviewState) {
+ markLauncherResumed()
+ } else if (areDesktopTasksVisibleNow && !gestureInProgress) {
+ // Switching out of overview state and gesture finished.
+ // If desktop tasks are still visible, hide launcher again.
+ markLauncherPaused()
+ }
+ }
+ }
+
+ /** Registers a listener for Taskbar changes in Desktop Mode. */
+ fun registerDesktopVisibilityListener(listener: DesktopVisibilityListener) {
+ desktopVisibilityListeners.add(listener)
+ }
+
+ /** Removes a previously registered listener for Taskbar changes in Desktop Mode. */
+ fun unregisterDesktopVisibilityListener(listener: DesktopVisibilityListener) {
+ desktopVisibilityListeners.remove(listener)
+ }
+
+ private fun notifyDesktopVisibilityListeners(areDesktopTasksVisible: Boolean) {
+ if (DEBUG) {
+ Log.d(TAG, "notifyDesktopVisibilityListeners: visible=$areDesktopTasksVisible")
+ }
+ for (listener in desktopVisibilityListeners) {
+ listener.onDesktopVisibilityChanged(areDesktopTasksVisible)
+ }
+ }
+
+ private fun notifyTaskbarDesktopModeListeners(doesAnyTaskRequireTaskbarRounding: Boolean) {
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ "notifyTaskbarDesktopModeListeners: doesAnyTaskRequireTaskbarRounding=" +
+ doesAnyTaskRequireTaskbarRounding,
+ )
+ }
+ for (listener in taskbarDesktopModeListeners) {
+ listener.onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding)
+ }
+ }
+
+ /** TODO: b/333533253 - Remove after flag rollout */
+ private fun setBackgroundStateEnabled(backgroundStateEnabled: Boolean) {
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ ("setBackgroundStateEnabled: enabled=" +
+ backgroundStateEnabled +
+ " currentValue=" +
+ this.backgroundStateEnabled),
+ )
+ }
+ if (backgroundStateEnabled != this.backgroundStateEnabled) {
+ this.backgroundStateEnabled = backgroundStateEnabled
+ if (this.backgroundStateEnabled) {
+ markLauncherResumed()
+ } else if (areDesktopTasksVisible() && !gestureInProgress) {
+ // Switching out of background state. If desktop tasks are visible, pause launcher.
+ markLauncherPaused()
+ }
+ }
+ }
+
+ var isRecentsGestureInProgress: Boolean
+ /**
+ * Whether recents gesture is currently in progress.
+ *
+ * TODO: b/333533253 - Remove after flag rollout
+ */
+ get() = gestureInProgress
+ /** TODO: b/333533253 - Remove after flag rollout */
+ private set(gestureInProgress) {
+ if (gestureInProgress != this.gestureInProgress) {
+ this.gestureInProgress = gestureInProgress
+ }
+ }
+
+ /**
+ * Notify controller that recents gesture has started.
+ *
+ * TODO: b/333533253 - Remove after flag rollout
+ */
+ fun setRecentsGestureStart() {
+ if (DEBUG) {
+ Log.d(TAG, "setRecentsGestureStart")
+ }
+ isRecentsGestureInProgress = true
+ }
+
+ /**
+ * Notify controller that recents gesture finished with the given
+ * [com.android.quickstep.GestureState.GestureEndTarget]
+ *
+ * TODO: b/333533253 - Remove after flag rollout
+ */
+ fun setRecentsGestureEnd(endTarget: GestureEndTarget?) {
+ if (DEBUG) {
+ Log.d(TAG, "setRecentsGestureEnd: endTarget=$endTarget")
+ }
+ isRecentsGestureInProgress = false
+
+ if (endTarget == null) {
+ // Gesture did not result in a new end target. Ensure launchers gets paused again.
+ markLauncherPaused()
+ }
+ }
+
+ /** TODO: b/333533253 - Remove after flag rollout */
+ private fun markLauncherPaused() {
+ if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue) {
+ return
+ }
+ if (DEBUG) {
+ Log.d(TAG, "markLauncherPaused " + Debug.getCaller())
+ }
+ val activity: StatefulActivity<LauncherState>? =
+ QuickstepLauncher.ACTIVITY_TRACKER.getCreatedContext()
+ activity?.setPaused()
+ }
+
+ /** TODO: b/333533253 - Remove after flag rollout */
+ private fun markLauncherResumed() {
+ if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue) {
+ return
+ }
+ if (DEBUG) {
+ Log.d(TAG, "markLauncherResumed " + Debug.getCaller())
+ }
+ val activity: StatefulActivity<LauncherState>? =
+ QuickstepLauncher.ACTIVITY_TRACKER.getCreatedContext()
+ // Check activity state before calling setResumed(). Launcher may have been actually
+ // paused (eg fullscreen task moved to front).
+ // In this case we should not mark the activity as resumed.
+ if (activity != null && activity.isResumed) {
+ activity.setResumed()
+ }
+ }
+
+ fun dumpLogs(prefix: String, pw: PrintWriter) {
+ pw.println(prefix + "DesktopVisibilityController:")
+
+ pw.println("$prefix\tdesktopVisibilityListeners=$desktopVisibilityListeners")
+ pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCount")
+ pw.println("$prefix\tinOverviewState=$inOverviewState")
+ pw.println("$prefix\tbackgroundStateEnabled=$backgroundStateEnabled")
+ pw.println("$prefix\tgestureInProgress=$gestureInProgress")
+ pw.println("$prefix\tdesktopTaskListener=$desktopTaskListener")
+ pw.println("$prefix\tcontext=$context")
+ }
+
+ /**
+ * Wrapper for the IDesktopTaskListener stub to prevent lingering references to the launcher
+ * activity via the controller.
+ */
+ private class DesktopTaskListenerImpl(
+ controller: DesktopVisibilityController,
+ private val displayId: Int,
+ ) : Stub() {
+ private val controller = WeakReference(controller)
+
+ override fun onTasksVisibilityChanged(displayId: Int, visibleTasksCount: Int) {
+ if (displayId != this.displayId) return
+ Executors.MAIN_EXECUTOR.execute {
+ controller.get()?.apply {
+ if (DEBUG) {
+ Log.d(TAG, "desktop visible tasks count changed=$visibleTasksCount")
+ }
+ visibleDesktopTasksCount = visibleTasksCount
+ }
+ }
+ }
+
+ override fun onStashedChanged(displayId: Int, stashed: Boolean) {
+ Log.w(TAG, "DesktopTaskListenerImpl: onStashedChanged is deprecated")
+ }
+
+ override fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean) {
+ if (!DesktopModeStatus.useRoundedCorners()) return
+ Executors.MAIN_EXECUTOR.execute {
+ controller.get()?.apply {
+ Log.d(
+ TAG,
+ "DesktopTaskListenerImpl: doesAnyTaskRequireTaskbarRounding= " +
+ doesAnyTaskRequireTaskbarRounding,
+ )
+ notifyTaskbarDesktopModeListeners(doesAnyTaskRequireTaskbarRounding)
+ }
+ }
+ }
+
+ override fun onEnterDesktopModeTransitionStarted(transitionDuration: Int) {}
+
+ override fun onExitDesktopModeTransitionStarted(transitionDuration: Int) {}
+ }
+
+ /** A listener for Taskbar in Desktop Mode. */
+ interface TaskbarDesktopModeListener {
+ /**
+ * Callback for when task is resized in desktop mode.
+ *
+ * @param doesAnyTaskRequireTaskbarRounding whether task requires taskbar corner roundness.
+ */
+ fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean)
+ }
+
+ companion object {
+ @JvmField
+ val INSTANCE = DaggerSingletonObject(LauncherAppComponent::getDesktopVisibilityController)
+
+ private const val TAG = "DesktopVisController"
+ private const val DEBUG = false
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 060173a..ee9c6a1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -237,7 +237,6 @@
@Nullable Context navigationBarPanelContext, DeviceProfile launcherDp,
TaskbarNavButtonController buttonController,
ScopedUnfoldTransitionProgressProvider unfoldTransitionProgressProvider,
- @NonNull DesktopVisibilityController desktopVisibilityController,
boolean isPrimaryDisplay) {
super(windowContext);
mIsPrimaryDisplay = isPrimaryDisplay;
@@ -363,7 +362,7 @@
new KeyboardQuickSwitchController(),
new TaskbarPinningController(this),
bubbleControllersOptional,
- new TaskbarDesktopModeController(desktopVisibilityController));
+ new TaskbarDesktopModeController(DesktopVisibilityController.INSTANCE.get(this)));
mLauncherPrefs = LauncherPrefs.get(this);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 13f9a51..3fa0e8e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -62,7 +62,6 @@
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.contextualeducation.ContextualEduStatsManager;
-import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarNavButtonCallbacks;
import com.android.launcher3.taskbar.unfold.NonDestroyableScopedUnfoldTransitionProgressProvider;
@@ -223,14 +222,11 @@
}
};
- @NonNull private final DesktopVisibilityController mDesktopVisibilityController;
-
@SuppressLint("WrongConstant")
public TaskbarManager(
Context context,
AllAppsActionManager allAppsActionManager,
- TaskbarNavButtonCallbacks navCallbacks,
- @NonNull DesktopVisibilityController desktopVisibilityController) {
+ TaskbarNavButtonCallbacks navCallbacks) {
Display display =
context.getSystemService(DisplayManager.class).getDisplay(context.getDisplayId());
mWindowContext = context.createWindowContext(display,
@@ -240,7 +236,6 @@
mNavigationBarPanelContext = ENABLE_TASKBAR_NAVBAR_UNIFICATION
? context.createWindowContext(display, TYPE_NAVIGATION_BAR_PANEL, null)
: null;
- mDesktopVisibilityController = desktopVisibilityController;
if (enableTaskbarNoRecreate()) {
mWindowManager = mWindowContext.getSystemService(WindowManager.class);
createTaskbarRootLayout(getDefaultDisplayId());
@@ -800,7 +795,7 @@
private TaskbarActivityContext createTaskbarActivityContext(DeviceProfile dp, int displayId) {
TaskbarActivityContext newTaskbar = new TaskbarActivityContext(mWindowContext,
mNavigationBarPanelContext, dp, mDefaultNavButtonController,
- mUnfoldProgressProvider, mDesktopVisibilityController, isDefaultDisplay(displayId));
+ mUnfoldProgressProvider, isDefaultDisplay(displayId));
addTaskbarToMap(displayId, newTaskbar);
return newTaskbar;
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
index b63cf02..3dcf2b4 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
@@ -343,26 +343,38 @@
}
BubbleBarBubble bubbleToSelect = null;
-
+ if (update.addedBubble != null) {
+ mBubbles.put(update.addedBubble.getKey(), update.addedBubble);
+ }
+ if (update.selectedBubbleKey != null) {
+ if (mSelectedBubble == null
+ || !update.selectedBubbleKey.equals(mSelectedBubble.getKey())) {
+ BubbleBarBubble newlySelected = mBubbles.get(update.selectedBubbleKey);
+ if (newlySelected != null) {
+ bubbleToSelect = newlySelected;
+ } else {
+ Log.w(TAG, "trying to select bubble that doesn't exist:"
+ + update.selectedBubbleKey);
+ }
+ }
+ }
if (Flags.enableOptionalBubbleOverflow()
&& update.showOverflowChanged && !update.showOverflow && update.addedBubble != null
&& update.removedBubbles.isEmpty()
&& !mBubbles.isEmpty()) {
// A bubble was added from the overflow (& now it's empty / not showing)
- mBubbles.put(update.addedBubble.getKey(), update.addedBubble);
mBubbleBarViewController.removeOverflowAndAddBubble(update.addedBubble);
} else if (update.addedBubble != null && update.removedBubbles.size() == 1) {
// we're adding and removing a bubble at the same time. handle this as a single update.
RemovedBubble removedBubble = update.removedBubbles.get(0);
BubbleBarBubble bubbleToRemove = mBubbles.remove(removedBubble.getKey());
- mBubbles.put(update.addedBubble.getKey(), update.addedBubble);
boolean showOverflow = update.showOverflowChanged && update.showOverflow;
if (bubbleToRemove != null) {
mBubbleBarViewController.addBubbleAndRemoveBubble(update.addedBubble,
bubbleToRemove, isExpanding, suppressAnimation, showOverflow);
} else {
mBubbleBarViewController.addBubble(update.addedBubble, isExpanding,
- suppressAnimation);
+ suppressAnimation, bubbleToSelect);
Log.w(TAG, "trying to remove bubble that doesn't exist: " + removedBubble.getKey());
}
} else {
@@ -385,9 +397,8 @@
}
}
if (update.addedBubble != null) {
- mBubbles.put(update.addedBubble.getKey(), update.addedBubble);
mBubbleBarViewController.addBubble(update.addedBubble, isExpanding,
- suppressAnimation);
+ suppressAnimation, bubbleToSelect);
}
if (Flags.enableOptionalBubbleOverflow()
&& update.showOverflowChanged
@@ -401,7 +412,7 @@
addBubbleInternally(update.updatedBubble, isExpanding, suppressAnimation);
}
- if (update.addedBubble != null && isCollapsed) {
+ if (update.addedBubble != null && isCollapsed && bubbleToSelect == null) {
// If we're collapsed, the most recently added bubble will be selected.
bubbleToSelect = update.addedBubble;
}
@@ -412,7 +423,7 @@
BubbleBarBubble bubble = update.currentBubbles.get(i);
if (bubble != null) {
addBubbleInternally(bubble, isExpanding, suppressAnimation);
- if (isCollapsed) {
+ if (isCollapsed && bubbleToSelect == null) {
// If we're collapsed, the most recently added bubble will be selected.
bubbleToSelect = bubble;
}
@@ -479,18 +490,6 @@
mBubbleBarViewController.reorderBubbles(newOrder);
}
}
- if (update.selectedBubbleKey != null) {
- if (mSelectedBubble == null
- || !update.selectedBubbleKey.equals(mSelectedBubble.getKey())) {
- BubbleBarBubble newlySelected = mBubbles.get(update.selectedBubbleKey);
- if (newlySelected != null) {
- bubbleToSelect = newlySelected;
- } else {
- Log.w(TAG, "trying to select bubble that doesn't exist:"
- + update.selectedBubbleKey);
- }
- }
- }
if (bubbleToSelect != null) {
setSelectedBubbleInternal(bubbleToSelect);
}
@@ -609,7 +608,8 @@
private void addBubbleInternally(BubbleBarBubble bubble, boolean isExpanding,
boolean suppressAnimation) {
mBubbles.put(bubble.getKey(), bubble);
- mBubbleBarViewController.addBubble(bubble, isExpanding, suppressAnimation);
+ mBubbleBarViewController.addBubble(bubble, isExpanding,
+ suppressAnimation, /* bubbleToSelect = */ null);
}
/** Listener of {@link BubbleBarLocation} updates. */
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index 0d0feff..aa6ad25 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -681,8 +681,18 @@
return mRelativePivotY;
}
- /** Add a new bubble to the bubble bar. */
+ /** Add a new bubble to the bubble bar without updating the selected bubble. */
public void addBubble(BubbleView bubble) {
+ addBubble(bubble, /* bubbleToSelect = */ null);
+ }
+
+ /**
+ * Add a new bubble to the bubble bar and selects the provided bubble.
+ *
+ * @param bubble bubble to add
+ * @param bubbleToSelect if {@code null}, then selected bubble does not change
+ */
+ public void addBubble(BubbleView bubble, @Nullable BubbleView bubbleToSelect) {
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams((int) mIconSize, (int) mIconSize,
Gravity.LEFT);
final int index = bubble.isOverflow() ? getChildCount() : 0;
@@ -718,7 +728,12 @@
invalidate();
}
};
- mBubbleAnimator.animateNewBubble(indexOfChild(mSelectedBubbleView), listener);
+ if (bubbleToSelect != null) {
+ mBubbleAnimator.animateNewBubble(indexOfChild(mSelectedBubbleView),
+ indexOfChild(bubbleToSelect), listener);
+ } else {
+ mBubbleAnimator.animateNewBubble(indexOfChild(mSelectedBubbleView), listener);
+ }
} else {
addView(bubble, index, lp);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index 569dd56..5685093 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -902,9 +902,15 @@
/**
* Adds the provided bubble to the bubble bar.
*/
- public void addBubble(BubbleBarItem b, boolean isExpanding, boolean suppressAnimation) {
+ public void addBubble(BubbleBarItem b,
+ boolean isExpanding,
+ boolean suppressAnimation,
+ @Nullable BubbleBarBubble bubbleToSelect
+ ) {
if (b != null) {
- mBarView.addBubble(b.getView());
+ BubbleView bubbleToSelectView =
+ bubbleToSelect == null ? null : bubbleToSelect.getView();
+ mBarView.addBubble(b.getView(), bubbleToSelectView);
b.getView().setOnClickListener(mBubbleClickListener);
mBubbleDragController.setupBubbleView(b.getView());
b.getView().setController(mBubbleViewController);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java
index fd4cf0e..0abd88c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java
@@ -299,7 +299,7 @@
private final PointF mTouchDownLocation = new PointF();
private final PointF mViewInitialPosition = new PointF();
private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
- private final long mPressToDragTimeout = ViewConfiguration.getLongPressTimeout() / 2;
+ private final long mPressToDragTimeout = ViewConfiguration.getLongPressTimeout();
private State mState = State.IDLE;
private int mTouchSlop = -1;
private BubbleDragAnimator mAnimator;
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt
index 3604167..944e806 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt
@@ -39,9 +39,14 @@
private var state: State = State.Idle
private lateinit var animator: ValueAnimator
- fun animateNewBubble(selectedBubbleIndex: Int, listener: Listener) {
+ @JvmOverloads
+ fun animateNewBubble(
+ selectedBubbleIndex: Int,
+ newlySelectedBubbleIndex: Int? = null,
+ listener: Listener,
+ ) {
animator = createAnimator(listener)
- state = State.AddingBubble(selectedBubbleIndex)
+ state = State.AddingBubble(selectedBubbleIndex, newlySelectedBubbleIndex)
animator.start()
}
@@ -180,16 +185,7 @@
fun getArrowPosition(): Float {
return when (val state = state) {
State.Idle -> 0f
- is State.AddingBubble -> {
- val tx =
- getBubbleTranslationXWhileScalingBubble(
- bubbleIndex = state.selectedBubbleIndex,
- scalingBubbleIndex = 0,
- bubbleScale = animator.animatedFraction,
- )
- tx + iconSize / 2f
- }
-
+ is State.AddingBubble -> getArrowPositionWhenAddingBubble(state)
is State.RemovingBubble -> getArrowPositionWhenRemovingBubble(state)
is State.AddingAndRemoving -> {
// we never remove the selected bubble, so the arrow stays pointing to its center
@@ -205,6 +201,26 @@
}
}
+ private fun getArrowPositionWhenAddingBubble(state: State.AddingBubble): Float {
+ val scale = animator.animatedFraction
+ var tx = getBubbleTranslationXWhileScalingBubble(
+ bubbleIndex = state.selectedBubbleIndex,
+ scalingBubbleIndex = 0,
+ bubbleScale = scale
+ ) + iconSize / 2f
+ if (state.newlySelectedBubbleIndex != null) {
+ val selectedBubbleScale = if (state.newlySelectedBubbleIndex == 0) scale else 1f
+ val finalTx =
+ getBubbleTranslationXWhileScalingBubble(
+ bubbleIndex = state.newlySelectedBubbleIndex,
+ scalingBubbleIndex = 0,
+ bubbleScale = 1f,
+ ) + iconSize * selectedBubbleScale / 2f
+ tx += (finalTx - tx) * animator.animatedFraction
+ }
+ return tx
+ }
+
private fun getArrowPositionWhenRemovingBubble(state: State.RemovingBubble): Float =
if (state.selectedBubbleIndex != state.bubbleIndex || state.removingLastRemainingBubble) {
// if we're not removing the selected bubble or if we're removing the last remaining
@@ -378,7 +394,12 @@
data object Idle : State
/** A new bubble is being added to the bubble bar. */
- data class AddingBubble(val selectedBubbleIndex: Int) : State
+ data class AddingBubble(
+ /** The index of the selected bubble. */
+ val selectedBubbleIndex: Int,
+ /** The index of the newly selected bubble. */
+ val newlySelectedBubbleIndex: Int?,
+ ) : State
/** A bubble is being removed from the bubble bar. */
data class RemovingBubble(
@@ -392,6 +413,7 @@
val removingLastRemainingBubble: Boolean,
) : State
+ // TODO add index where bubble is being added, and index for newly selected bubble
/** A new bubble is being added and an old bubble is being removed from the bubble bar. */
data class AddingAndRemoving(val selectedBubbleIndex: Int, val removedBubbleIndex: Int) :
State
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 6d744c2..70c53fa 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -1018,9 +1018,9 @@
@Override
public void setResumed() {
- DesktopVisibilityController desktopVisibilityController = getDesktopVisibilityController();
+ DesktopVisibilityController desktopVisibilityController =
+ DesktopVisibilityController.INSTANCE.get(this);
if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()
- && desktopVisibilityController != null
&& desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview()
&& !desktopVisibilityController.isRecentsGestureInProgress()) {
// Return early to skip setting activity to appear as resumed
@@ -1187,12 +1187,6 @@
}
@Nullable
- @Override
- public DesktopVisibilityController getDesktopVisibilityController() {
- return mTISBindHelper.getDesktopVisibilityController();
- }
-
- @Nullable
public UnfoldTransitionProgressProvider getUnfoldTransitionProgressProvider() {
return mUnfoldTransitionProgressProvider;
}
@@ -1347,11 +1341,8 @@
@Override
public boolean areDesktopTasksVisible() {
- DesktopVisibilityController desktopVisibilityController = getDesktopVisibilityController();
- if (desktopVisibilityController != null) {
- return desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview();
- }
- return false;
+ return DesktopVisibilityController.INSTANCE.get(this)
+ .areDesktopTasksVisibleAndNotInOverview();
}
@Override
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index 1437a6e..7cab751 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -86,8 +86,8 @@
if (endTarget != null) {
// We were on our way to this state when we got canceled, end there instead.
startState = stateFromGestureEndTarget(endTarget);
- DesktopVisibilityController controller = getDesktopVisibilityController();
- if (controller != null && controller.areDesktopTasksVisibleAndNotInOverview()
+ if (DesktopVisibilityController.INSTANCE.get(activity)
+ .areDesktopTasksVisibleAndNotInOverview()
&& endTarget == LAST_TASK) {
// When we are cancelling the transition and going back to last task, move to
// rest state instead when desktop tasks are visible.
diff --git a/quickstep/src/com/android/quickstep/BaseContainerInterface.java b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
index 2171c47..e2ebaa5 100644
--- a/quickstep/src/com/android/quickstep/BaseContainerInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
@@ -179,13 +179,6 @@
mOnInitBackgroundStateUICallback = callback;
}
- @Nullable
- public DesktopVisibilityController getDesktopVisibilityController() {
- CONTAINER_TYPE container = getCreatedContainer();
-
- return container == null ? null : container.getDesktopVisibilityController();
- }
-
/**
* Called when the gesture ends and the animation starts towards the given target. Used to add
* an optional additional animation with the same duration.
@@ -241,9 +234,8 @@
if (endTarget != null) {
// We were on our way to this state when we got canceled, end there instead.
startState = stateFromGestureEndTarget(endTarget);
- DesktopVisibilityController controller = getDesktopVisibilityController();
- if (controller != null && controller.areDesktopTasksVisibleAndNotInOverview()
- && endTarget == LAST_TASK) {
+ if (DesktopVisibilityController.INSTANCE.get(recentsView.getContext())
+ .areDesktopTasksVisibleAndNotInOverview() && endTarget == LAST_TASK) {
// When we are cancelling the transition and going back to last task, move to
// rest state instead when desktop tasks are visible.
// If a fullscreen task is visible, launcher goes to normal state when the
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index c1e018d..be0a339 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -278,6 +278,10 @@
private void onCancelFinished() {
customizeStatusBarAppearance(false);
+ if (Flags.predictiveBackToHomePolish() && !mLauncher.getWorkspace().isOverlayShown()
+ && !mLauncher.isInState(LauncherState.ALL_APPS)) {
+ setLauncherScale(ScalingWorkspaceRevealAnim.MAX_SIZE);
+ }
finishAnimation();
}
@@ -538,12 +542,10 @@
if (mScrimLayer != null) {
removeScrimLayer();
}
- if (Flags.predictiveBackToHomePolish() && !mLauncher.getWorkspace().isOverlayShown()
+ if (Flags.predictiveBackToHomePolish() && Flags.predictiveBackToHomeBlur()
+ && !mLauncher.getWorkspace().isOverlayShown()
&& !mLauncher.isInState(LauncherState.ALL_APPS)) {
- setLauncherScale(ScalingWorkspaceRevealAnim.MAX_SIZE);
- if (Flags.predictiveBackToHomeBlur()) {
- mLauncher.getDepthController().pauseBlursOnWindows(false);
- }
+ mLauncher.getDepthController().pauseBlursOnWindows(false);
}
mLastBlurRadius = 0;
}
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index 243a577..7af0618 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -39,6 +39,7 @@
import com.android.launcher3.LauncherState;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.states.StateAnimationConfig;
import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.launcher3.util.MSDLPlayerWrapper;
@@ -105,9 +106,8 @@
boolean canUseWorkspaceView = workspaceView != null
&& workspaceView.isAttachedToWindow()
&& workspaceView.getHeight() > 0
- && (mContainer.getDesktopVisibilityController() == null
- || !mContainer.getDesktopVisibilityController()
- .areDesktopTasksVisibleAndNotInOverview());
+ && !DesktopVisibilityController.INSTANCE.get(mContainer)
+ .areDesktopTasksVisibleAndNotInOverview();
mContainer.getRootView().setForceHideBackArrow(true);
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 17c17cc..b34b502 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -65,7 +65,6 @@
import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.desktop.DesktopRecentsTransitionController;
import com.android.launcher3.model.data.ItemInfo;
-import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory;
import com.android.launcher3.statemanager.StateManager.StateHandler;
@@ -558,10 +557,4 @@
public boolean isRecentsViewVisible() {
return getStateManager().getState().isRecentsViewVisible();
}
-
- @Nullable
- @Override
- public DesktopVisibilityController getDesktopVisibilityController() {
- return mTISBindHelper.getDesktopVisibilityController();
- }
}
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index 91d0776..89337e5 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -67,16 +67,13 @@
* running tasks
*/
public RemoteTargetGluer(Context context, BaseContainerInterface sizingStrategy) {
- DesktopVisibilityController desktopVisibilityController =
- sizingStrategy.getDesktopVisibilityController();
- if (desktopVisibilityController != null) {
- int visibleTasksCount = desktopVisibilityController.getVisibleDesktopTasksCount();
- if (visibleTasksCount > 0) {
- // Allocate +1 to account for a new task added to the desktop mode
- int numHandles = visibleTasksCount + 1;
- init(context, sizingStrategy, numHandles, true /* forDesktop */);
- return;
- }
+ int visibleTasksCount = DesktopVisibilityController.INSTANCE.get(context)
+ .getVisibleDesktopTasksCount();
+ if (visibleTasksCount > 0) {
+ // Allocate +1 to account for a new task added to the desktop mode
+ int numHandles = visibleTasksCount + 1;
+ init(context, sizingStrategy, numHandles, true /* forDesktop */);
+ return;
}
// Assume 2 handles needed for split, scale down as needed later on when we actually
diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.kt b/quickstep/src/com/android/quickstep/TaskIconCache.kt
index bb0a304..bf94d41 100644
--- a/quickstep/src/com/android/quickstep/TaskIconCache.kt
+++ b/quickstep/src/com/android/quickstep/TaskIconCache.kt
@@ -25,6 +25,7 @@
import android.util.SparseArray
import androidx.annotation.WorkerThread
import com.android.launcher3.Flags.enableOverviewIconMenu
+import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.R
import com.android.launcher3.Utilities
import com.android.launcher3.icons.BaseIconFactory
@@ -63,15 +64,8 @@
@get:WorkerThread
private val iconFactory: BaseIconFactory
get() =
- _iconFactory
- ?: BaseIconFactory(
- context,
- DisplayController.INSTANCE[context].info.densityDpi,
- context.resources.getDimensionPixelSize(
- R.dimen.task_icon_cache_default_icon_size
- ),
- )
- .also { _iconFactory = it }
+ if (enableRefactorTaskThumbnail()) createIconFactory()
+ else _iconFactory ?: createIconFactory().also { _iconFactory = it }
var taskVisualsChangeListener: TaskVisualsChangeListener? = null
@@ -85,6 +79,22 @@
}
}
+ // TODO(b/387496731): Add ensureActive() calls if they show performance benefit
+ override suspend fun getIcon(task: Task): TaskCacheEntry {
+ task.icon?.let {
+ // Nothing to load, the icon is already loaded
+ return TaskCacheEntry(it, task.titleDescription ?: "", task.title)
+ }
+
+ val entry = getCacheEntry(task)
+ task.icon = entry.icon
+ task.titleDescription = entry.contentDescription
+ task.title = entry.title
+
+ dispatchIconUpdate(task.key.id)
+ return entry
+ }
+
/**
* Asynchronously fetches the icon and other task data.
*
@@ -92,14 +102,11 @@
* @param callback The callback to receive the task after its data has been populated.
* @return A cancelable handle to the request
*/
- override fun getIconInBackground(
- task: Task,
- callback: GetTaskIconCallback,
- ): CancellableTask<*>? {
+ fun getIconInBackground(task: Task, callback: GetTaskIconCallback): CancellableTask<*>? {
Preconditions.assertUIThread()
- if (task.icon != null) {
+ task.icon?.let {
// Nothing to load, the icon is already loaded
- callback.onTaskIconReceived(task.icon, task.titleDescription ?: "", task.title ?: "")
+ callback.onTaskIconReceived(it, task.titleDescription ?: "", task.title ?: "")
return null
}
val request =
@@ -141,10 +148,17 @@
}
@WorkerThread
+ private fun createIconFactory() =
+ BaseIconFactory(
+ context,
+ DisplayController.INSTANCE.get(context).info.densityDpi,
+ context.resources.getDimensionPixelSize(R.dimen.task_icon_cache_default_icon_size),
+ )
+
+ @WorkerThread
private fun getCacheEntry(task: Task): TaskCacheEntry {
- var entry = iconCache.getAndInvalidateIfModified(task.key)
- if (entry != null) {
- return entry
+ iconCache.getAndInvalidateIfModified(task.key)?.let {
+ return it
}
val desc = task.taskDescription
@@ -152,11 +166,10 @@
var activityInfo: ActivityInfo? = null
// Create new cache entry
- entry = TaskCacheEntry()
// Load icon
val icon = getIcon(desc, key.userId)
- entry.icon =
+ val entryIcon =
if (icon != null) {
getBitmapInfo(
BitmapDrawable(context.resources, icon),
@@ -182,21 +195,29 @@
}
}
- // Skip loading the content description if the activity no longer exists
activityInfo =
activityInfo
?: PackageManagerWrapper.getInstance().getActivityInfo(key.component, key.userId)
- if (activityInfo != null) {
- entry.contentDescription =
- getBadgedContentDescription(activityInfo, task.key.userId, task.taskDescription)
- if (enableOverviewIconMenu()) {
- entry.title = Utilities.trim(activityInfo.loadLabel(context.packageManager))
- }
- }
-
- iconCache.put(task.key, entry)
- return entry
+ return when {
+ // Skip loading the content description if the activity no longer exists
+ activityInfo == null -> TaskCacheEntry(entryIcon)
+ enableOverviewIconMenu() ->
+ TaskCacheEntry(
+ entryIcon,
+ getBadgedContentDescription(
+ activityInfo,
+ task.key.userId,
+ task.taskDescription,
+ ),
+ Utilities.trim(activityInfo.loadLabel(context.packageManager)),
+ )
+ else ->
+ TaskCacheEntry(
+ entryIcon,
+ getBadgedContentDescription(activityInfo, task.key.userId, task.taskDescription),
+ )
+ }.also { iconCache.put(task.key, it) }
}
private fun getIcon(desc: ActivityManager.TaskDescription, userId: Int): Bitmap? =
@@ -272,16 +293,16 @@
iconCache.evictAll()
}
- private data class TaskCacheEntry(
- var icon: Drawable? = null,
- var contentDescription: String = "",
- var title: String = "",
+ data class TaskCacheEntry(
+ val icon: Drawable,
+ val contentDescription: String = "",
+ val title: String = "",
)
/** Callback used when retrieving app icons from cache. */
fun interface GetTaskIconCallback {
/** Called when task icon is retrieved. */
- fun onTaskIconReceived(icon: Drawable?, contentDescription: String, title: String)
+ fun onTaskIconReceived(icon: Drawable, contentDescription: String, title: String)
}
fun registerTaskVisualsChangeListener(newListener: TaskVisualsChangeListener?) {
diff --git a/quickstep/src/com/android/quickstep/TaskThumbnailCache.kt b/quickstep/src/com/android/quickstep/TaskThumbnailCache.kt
index 7de4481..7b56213 100644
--- a/quickstep/src/com/android/quickstep/TaskThumbnailCache.kt
+++ b/quickstep/src/com/android/quickstep/TaskThumbnailCache.kt
@@ -17,6 +17,7 @@
import android.content.Context
import androidx.annotation.VisibleForTesting
+import androidx.annotation.WorkerThread
import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.R
import com.android.launcher3.util.CancellableTask
@@ -78,14 +79,61 @@
cache.updateIfAlreadyInCache(taskId, thumbnail)
}
+ // TODO(b/387496731): Add ensureActive() calls if they show performance benefit
+ /**
+ * Retrieves a thumbnail for the provided `task` on the current thread. This should not be
+ * called from the main thread.
+ */
+ @WorkerThread
+ override suspend fun getThumbnail(task: Task): ThumbnailData? {
+ val lowResolution: Boolean = !highResLoadingState.isEnabled
+ // Check task for thumbnail
+ val taskThumbnail: ThumbnailData? = task.thumbnail
+ if (
+ taskThumbnail?.thumbnail != null && (!taskThumbnail.reducedResolution || lowResolution)
+ ) {
+ return taskThumbnail
+ }
+
+ // Check cache for thumbnail
+ val cachedThumbnail: ThumbnailData? = cache.getAndInvalidateIfModified(task.key)
+ if (
+ cachedThumbnail?.thumbnail != null &&
+ (!cachedThumbnail.reducedResolution || lowResolution)
+ ) {
+ return cachedThumbnail
+ }
+
+ // Get thumbnail from system
+ var thumbnailData =
+ ActivityManagerWrapper.getInstance().getTaskThumbnail(task.key.id, lowResolution)
+ if (thumbnailData.thumbnail == null) {
+ thumbnailData = ActivityManagerWrapper.getInstance().takeTaskThumbnail(task.key.id)
+ }
+
+ // Avoid an async timing issue that a low res entry replaces an existing high
+ // res entry in high res enabled state, so we check before putting it to cache
+ if (
+ enableGridOnlyOverview() &&
+ thumbnailData.reducedResolution &&
+ highResLoadingState.isEnabled
+ ) {
+ val newCachedThumbnail = cache.getAndInvalidateIfModified(task.key)
+ if (newCachedThumbnail.thumbnail != null && !newCachedThumbnail.reducedResolution) {
+ return newCachedThumbnail
+ }
+ }
+ cache.put(task.key, thumbnailData)
+ return thumbnailData
+ }
+
/**
* Asynchronously fetches the thumbnail for the given `task`.
*
* @param callback The callback to receive the task after its data has been populated.
- *
* @return a cancelable handle to the request
*/
- override fun getThumbnailInBackground(
+ fun getThumbnailInBackground(
task: Task,
callback: Consumer<ThumbnailData>,
): CancellableTask<ThumbnailData>? {
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 3bfdc21..aea02af 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -424,18 +424,6 @@
return tis.mTaskbarManager;
}
- /**
- * Returns the {@link DesktopVisibilityController}
- * <p>
- * Returns {@code null} if TouchInteractionService is not connected
- */
- @Nullable
- public DesktopVisibilityController getDesktopVisibilityController() {
- TouchInteractionService tis = mTis.get();
- if (tis == null) return null;
- return tis.mDesktopVisibilityController;
- }
-
@VisibleForTesting
public void injectFakeTrackpadForTesting() {
TouchInteractionService tis = mTis.get();
@@ -554,7 +542,6 @@
private NavigationMode mGestureStartNavMode = null;
- private DesktopVisibilityController mDesktopVisibilityController;
private DesktopAppLaunchTransitionManager mDesktopAppLaunchTransitionManager;
@Override
@@ -578,9 +565,7 @@
initInputMonitor("onTrackpadConnected()");
});
- mDesktopVisibilityController = new DesktopVisibilityController(this);
- mTaskbarManager = new TaskbarManager(
- this, mAllAppsActionManager, mNavCallbacks, mDesktopVisibilityController);
+ mTaskbarManager = new TaskbarManager(this, mAllAppsActionManager, mNavCallbacks);
mDesktopAppLaunchTransitionManager =
new DesktopAppLaunchTransitionManager(this, SystemUiProxy.INSTANCE.get(this));
mDesktopAppLaunchTransitionManager.registerTransitions();
@@ -741,7 +726,6 @@
mDesktopAppLaunchTransitionManager.unregisterTransitions();
}
mDesktopAppLaunchTransitionManager = null;
- mDesktopVisibilityController.onDestroy();
LockedUserState.get(this).removeOnUserUnlockedRunnable(mUserUnlockedRunnable);
ScreenOnTracker.INSTANCE.get(this).removeListener(mScreenOnListener);
@@ -1164,7 +1148,7 @@
createdOverviewContainer.getDeviceProfile().dump(this, "", pw);
}
mTaskbarManager.dumpLogs("", pw);
- mDesktopVisibilityController.dumpLogs("", pw);
+ DesktopVisibilityController.INSTANCE.get(this).dumpLogs("", pw);
pw.println("ContextualSearchStateManager:");
ContextualSearchStateManager.INSTANCE.get(this).dump("\t", pw);
SystemUiProxy.INSTANCE.get(this).dump(pw);
diff --git a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
index 20a66dd..549c15b 100644
--- a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
+++ b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
@@ -19,6 +19,7 @@
import com.android.launcher3.dagger.LauncherAppComponent;
import com.android.launcher3.dagger.LauncherBaseAppComponent;
import com.android.launcher3.model.WellbeingModel;
+import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.quickstep.OverviewComponentObserver;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
@@ -43,4 +44,6 @@
RecentsDisplayModel getRecentsDisplayModel();
OverviewComponentObserver getOverviewComponentObserver();
+
+ DesktopVisibilityController getDesktopVisibilityController();
}
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index 9625d29..b76e39a 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -36,6 +36,7 @@
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.desktop.DesktopRecentsTransitionController;
import com.android.launcher3.logging.StatsLogManager;
+import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.statemanager.StateManager.StateListener;
import com.android.launcher3.statemanager.StatefulContainer;
@@ -268,9 +269,7 @@
@Override
public void onStateTransitionComplete(RecentsState finalState) {
- if (mContainer.getDesktopVisibilityController() != null) {
- mContainer.getDesktopVisibilityController().onLauncherStateChanged(finalState);
- }
+ DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
if (!finalState.isRecentsViewVisible()) {
// Clean-up logic that occurs when recents is no longer in use/visible.
reset();
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 9bd7a19..9a38ff6 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -37,7 +37,6 @@
import com.android.launcher3.LauncherAnimationRunner.RemoteAnimationFactory
import com.android.launcher3.R
import com.android.launcher3.compat.AccessibilityManagerCompat
-import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statemanager.StateManager
import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory
import com.android.launcher3.statemanager.StatefulContainer
@@ -310,10 +309,6 @@
return overviewCommandHelper == null || overviewCommandHelper.canStartHomeSafely()
}
- override fun getDesktopVisibilityController(): DesktopVisibilityController? {
- return tisBindHelper.desktopVisibilityController
- }
-
override fun setTaskbarUIController(taskbarUIController: TaskbarUIController?) {
this.taskbarUIController = taskbarUIController
}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java
index 6b61298..f3f73c0 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java
@@ -53,7 +53,7 @@
private final int mTouchSlop;
private final PointF mDownPos = new PointF();
private final PointF mLastPos = new PointF();
- private final long mTimeForTap;
+ private final long mTimeForLongPress;
private int mActivePointerId = INVALID_POINTER_ID;
public BubbleBarInputConsumer(Context context, BubbleControllers bubbleControllers,
@@ -64,7 +64,7 @@
mInputMonitorCompat = inputMonitorCompat;
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
- mTimeForTap = ViewConfiguration.getTapTimeout();
+ mTimeForLongPress = ViewConfiguration.getLongPressTimeout();
}
@Override
@@ -110,7 +110,8 @@
case MotionEvent.ACTION_UP:
boolean swipeUpOnBubbleHandle = mBubbleBarSwipeController != null
&& mBubbleBarSwipeController.isSwipeGesture();
- boolean isWithinTapTime = ev.getEventTime() - ev.getDownTime() <= mTimeForTap;
+ // Anything less than a long-press is a tap
+ boolean isWithinTapTime = ev.getEventTime() - ev.getDownTime() <= mTimeForLongPress;
if (isWithinTapTime && !swipeUpOnBubbleHandle && !mPassedTouchSlop
&& mStashedOrCollapsedOnDown) {
// Taps on the handle / collapsed state should open the bar
diff --git a/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt b/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt
index f950f47..703d631 100644
--- a/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt
+++ b/quickstep/src/com/android/quickstep/recents/data/TasksRepository.kt
@@ -17,6 +17,7 @@
package com.android.quickstep.recents.data
import android.graphics.drawable.Drawable
+import android.graphics.drawable.ShapeDrawable
import android.util.Log
import com.android.launcher3.util.coroutines.DispatcherProvider
import com.android.quickstep.recents.data.TaskVisualsChangedDelegate.TaskIconChangedCallback
@@ -25,16 +26,16 @@
import com.android.quickstep.task.thumbnail.data.TaskThumbnailDataSource
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
-import kotlin.coroutines.resume
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.distinctUntilChangedBy
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
-import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
class TasksRepository(
@@ -112,10 +113,11 @@
taskRequests[taskId] =
Pair(
task.key,
- recentsCoroutineScope.launch(dispatcherProvider.main) {
+ recentsCoroutineScope.launch(dispatcherProvider.background) {
Log.i(TAG, "requestTaskData: $taskId")
- fetchIcon(task)
- fetchThumbnail(task)
+ val thumbnailFetchDeferred = async { fetchThumbnail(task) }
+ val iconFetchDeferred = async { fetchIcon(task) }
+ awaitAll(thumbnailFetchDeferred, iconFetchDeferred)
},
)
}
@@ -150,7 +152,7 @@
task.key,
object : TaskIconChangedCallback {
override fun onTaskIconChanged() {
- recentsCoroutineScope.launch(dispatcherProvider.main) {
+ recentsCoroutineScope.launch(dispatcherProvider.background) {
updateIcon(task.key.id, getIconFromDataSource(task))
}
}
@@ -168,7 +170,7 @@
}
override fun onHighResLoadingStateChanged() {
- recentsCoroutineScope.launch(dispatcherProvider.main) {
+ recentsCoroutineScope.launch(dispatcherProvider.background) {
updateThumbnail(task.key.id, getThumbnailFromDataSource(task))
}
}
@@ -191,34 +193,18 @@
}
private suspend fun getThumbnailFromDataSource(task: Task) =
- withContext(dispatcherProvider.main) {
- suspendCancellableCoroutine { continuation ->
- val cancellableTask =
- taskThumbnailDataSource.getThumbnailInBackground(task) {
- continuation.resume(it)
- }
- continuation.invokeOnCancellation { cancellableTask?.cancel() }
- }
- }
+ withContext(dispatcherProvider.background) { taskThumbnailDataSource.getThumbnail(task) }
private suspend fun getIconFromDataSource(task: Task) =
- withContext(dispatcherProvider.main) {
- suspendCancellableCoroutine { continuation ->
- val cancellableTask =
- taskIconDataSource.getIconInBackground(task) { icon, contentDescription, title
- ->
- icon?.constantState?.let {
- continuation.resume(
- IconData(it.newDrawable().mutate(), contentDescription, title)
- )
- }
- }
- continuation.invokeOnCancellation { cancellableTask?.cancel() }
- }
+ withContext(dispatcherProvider.background) {
+ val iconCacheEntry = taskIconDataSource.getIcon(task)
+ val icon = iconCacheEntry.icon.constantState?.newDrawable()?.mutate() ?: EMPTY_DRAWABLE
+ IconData(icon, iconCacheEntry.contentDescription, iconCacheEntry.title)
}
companion object {
private const val TAG = "TasksRepository"
+ private val EMPTY_DRAWABLE = ShapeDrawable()
}
/** Helper class to support StateFlow emissions when using a Map with a MutableStateFlow. */
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index 9d8fc4f..dd83af6 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -191,6 +191,7 @@
recentsViewData = inject(),
recentTasksRepository = inject(),
getThumbnailPositionUseCase = inject(),
+ dispatcherProvider = inject(),
)
}
GetThumbnailUseCase::class.java -> GetThumbnailUseCase(taskRepository = inject())
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index a952617..b040723 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -89,7 +89,9 @@
override fun onAttachedToWindow() {
super.onAttachedToWindow()
viewAttachedScope =
- CoroutineScope(SupervisorJob() + Dispatchers.Main + CoroutineName("TaskThumbnailView"))
+ CoroutineScope(
+ SupervisorJob() + Dispatchers.Main.immediate + CoroutineName("TaskThumbnailView")
+ )
viewData = RecentsDependencies.get(this)
updateViewDataValues()
viewModel = RecentsDependencies.get(this)
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskIconDataSource.kt b/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskIconDataSource.kt
index ab699c6..c45458c 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskIconDataSource.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskIconDataSource.kt
@@ -16,10 +16,9 @@
package com.android.quickstep.task.thumbnail.data
-import com.android.launcher3.util.CancellableTask
-import com.android.quickstep.TaskIconCache.GetTaskIconCallback
+import com.android.quickstep.TaskIconCache
import com.android.systemui.shared.recents.model.Task
interface TaskIconDataSource {
- fun getIconInBackground(task: Task, callback: GetTaskIconCallback): CancellableTask<*>?
+ suspend fun getIcon(task: Task): TaskIconCache.TaskCacheEntry
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskThumbnailDataSource.kt b/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskThumbnailDataSource.kt
index 986acbe..6e63ea9 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskThumbnailDataSource.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/data/TaskThumbnailDataSource.kt
@@ -16,14 +16,9 @@
package com.android.quickstep.task.thumbnail.data
-import com.android.launcher3.util.CancellableTask
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
-import java.util.function.Consumer
interface TaskThumbnailDataSource {
- fun getThumbnailInBackground(
- task: Task,
- callback: Consumer<ThumbnailData>
- ): CancellableTask<ThumbnailData>?
+ suspend fun getThumbnail(task: Task): ThumbnailData?
}
diff --git a/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt b/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt
index e6c8d27..677875c 100644
--- a/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt
+++ b/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt
@@ -67,13 +67,16 @@
fun init() {
overlayInitializedScope =
- CoroutineScope(SupervisorJob() + Dispatchers.Main + CoroutineName("TaskOverlayHelper"))
+ CoroutineScope(
+ SupervisorJob() + Dispatchers.Main.immediate + CoroutineName("TaskOverlayHelper")
+ )
viewModel =
TaskOverlayViewModel(
task = task,
recentsViewData = RecentsDependencies.get(),
getThumbnailPositionUseCase = RecentsDependencies.get(),
recentTasksRepository = RecentsDependencies.get(),
+ dispatcherProvider = RecentsDependencies.get(),
)
viewModel.overlayState
.onEach {
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt
index 14359db..81a904b 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt
@@ -17,6 +17,7 @@
package com.android.quickstep.task.viewmodel
import android.graphics.Matrix
+import com.android.launcher3.util.coroutines.DispatcherProvider
import com.android.quickstep.recents.data.RecentTasksRepository
import com.android.quickstep.recents.usecase.GetThumbnailPositionUseCase
import com.android.quickstep.recents.usecase.ThumbnailPositionState.MatrixScaling
@@ -27,6 +28,7 @@
import com.android.systemui.shared.recents.model.Task
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
/** View model for TaskOverlay */
@@ -35,11 +37,14 @@
recentsViewData: RecentsViewData,
private val getThumbnailPositionUseCase: GetThumbnailPositionUseCase,
recentTasksRepository: RecentTasksRepository,
+ dispatcherProvider: DispatcherProvider,
) {
val overlayState =
combine(
recentsViewData.overlayEnabled,
- recentsViewData.settledFullyVisibleTaskIds.map { it.contains(task.key.id) },
+ recentsViewData.settledFullyVisibleTaskIds
+ .map { it.contains(task.key.id) }
+ .distinctUntilChanged(),
recentTasksRepository.getThumbnailById(task.key.id),
) { isOverlayEnabled, isFullyVisible, thumbnailData ->
if (isOverlayEnabled && isFullyVisible) {
@@ -52,6 +57,7 @@
}
}
.distinctUntilChanged()
+ .flowOn(dispatcherProvider.background)
fun getThumbnailPositionState(width: Int, height: Int, isRtl: Boolean): ThumbnailPositionState {
val matrix: Matrix
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
index 724fa40..d00a39c 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
@@ -161,7 +161,11 @@
statsLogManager.logger().log(LAUNCHER_LAUNCH_OMNI_FAILED_NOT_AVAILABLE)
return false
}
-
+ if (isFakeLandscape()) {
+ // TODO (b/383421642): Fake landscape is to be removed in 25Q3 and this entire block
+ // can be removed when that happens.
+ return false
+ }
return true
}
@@ -197,6 +201,13 @@
return true
}
+ private fun isFakeLandscape(): Boolean =
+ getRecentsContainerInterface()
+ ?.getCreatedContainer()
+ ?.getOverviewPanel<RecentsView<*, *>>()
+ ?.getPagedOrientationHandler()
+ ?.isLayoutNaturalToLauncher == false
+
private fun isInSplitscreen(): Boolean {
return topTaskTracker.getRunningSplitTaskIds().isNotEmpty()
}
diff --git a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java
index 7fadc7d..4d56c63 100644
--- a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java
+++ b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java
@@ -27,10 +27,8 @@
import android.view.WindowMetrics;
import com.android.internal.policy.SystemBarUtils;
-import com.android.launcher3.dagger.ApplicationContext;
import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.statehandlers.DesktopVisibilityController;
-import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.util.window.CachedDisplayInfo;
import com.android.launcher3.util.window.WindowManagerProxy;
@@ -48,14 +46,13 @@
@LauncherAppSingleton
public class SystemWindowManagerProxy extends WindowManagerProxy {
- private final TISBindHelper mTISBindHelper;
+ private final DesktopVisibilityController mDesktopVisibilityController;
+
@Inject
- public SystemWindowManagerProxy(@ApplicationContext Context context,
- DaggerSingletonTracker lifecycleTracker) {
+ public SystemWindowManagerProxy(DesktopVisibilityController desktopVisibilityController) {
super(true);
- mTISBindHelper = new TISBindHelper(context, binder -> {});
- lifecycleTracker.addCloseable(mTISBindHelper::onDestroy);
+ mDesktopVisibilityController = desktopVisibilityController;
}
@Override
@@ -65,10 +62,18 @@
}
@Override
+ public void registerDesktopVisibilityListener(DesktopVisibilityListener listener) {
+ mDesktopVisibilityController.registerDesktopVisibilityListener(listener);
+ }
+
+ @Override
+ public void unregisterDesktopVisibilityListener(DesktopVisibilityListener listener) {
+ mDesktopVisibilityController.unregisterDesktopVisibilityListener(listener);
+ }
+
+ @Override
public boolean isInDesktopMode() {
- DesktopVisibilityController desktopController =
- mTISBindHelper.getDesktopVisibilityController();
- return desktopController != null && desktopController.areDesktopTasksVisible();
+ return mDesktopVisibilityController.areDesktopTasksVisible();
}
@Override
diff --git a/quickstep/src/com/android/quickstep/util/TISBindHelper.java b/quickstep/src/com/android/quickstep/util/TISBindHelper.java
index b238dec..027dc08 100644
--- a/quickstep/src/com/android/quickstep/util/TISBindHelper.java
+++ b/quickstep/src/com/android/quickstep/util/TISBindHelper.java
@@ -26,7 +26,6 @@
import androidx.annotation.Nullable;
-import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.taskbar.TaskbarManager;
import com.android.quickstep.OverviewCommandHelper;
import com.android.quickstep.TouchInteractionService;
@@ -110,11 +109,6 @@
return mBinder == null ? null : mBinder.getTaskbarManager();
}
- @Nullable
- public DesktopVisibilityController getDesktopVisibilityController() {
- return mBinder == null ? null : mBinder.getDesktopVisibilityController();
- }
-
/**
* Sets flag whether a predictive back-to-home animation is in progress
*/
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index b9f44fe..7a7a7f9 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -168,9 +168,7 @@
@Override
public void onStateTransitionComplete(LauncherState finalState) {
- if (mContainer.getDesktopVisibilityController() != null) {
- mContainer.getDesktopVisibilityController().onLauncherStateChanged(finalState);
- }
+ DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
if (!finalState.isRecentsViewVisible) {
// Clean-up logic that occurs when recents is no longer in use/visible.
@@ -269,34 +267,26 @@
public void onGestureAnimationStart(Task[] runningTasks,
RotationTouchHelper rotationTouchHelper) {
super.onGestureAnimationStart(runningTasks, rotationTouchHelper);
- DesktopVisibilityController desktopVisibilityController =
- mContainer.getDesktopVisibilityController();
- if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()
- && desktopVisibilityController != null) {
+ if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) {
// TODO: b/333533253 - Remove after flag rollout
- desktopVisibilityController.setRecentsGestureStart();
+ DesktopVisibilityController.INSTANCE.get(mContainer).setRecentsGestureStart();
}
}
@Override
public void onGestureAnimationEnd() {
- DesktopVisibilityController desktopVisibilityController =
- mContainer.getDesktopVisibilityController();
+ final DesktopVisibilityController desktopVisibilityController =
+ DesktopVisibilityController.INSTANCE.get(mContainer);
boolean showDesktopApps = false;
- GestureState.GestureEndTarget endTarget = null;
- if (desktopVisibilityController != null) {
- desktopVisibilityController = mContainer.getDesktopVisibilityController();
- endTarget = mCurrentGestureEndTarget;
- if (endTarget == GestureState.GestureEndTarget.LAST_TASK
- && desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview()) {
- // Recents gesture was cancelled and we are returning to the previous task.
- // After super class has handled clean up, show desktop apps on top again
- showDesktopApps = true;
- }
+ GestureState.GestureEndTarget endTarget = mCurrentGestureEndTarget;
+ if (endTarget == GestureState.GestureEndTarget.LAST_TASK
+ && desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview()) {
+ // Recents gesture was cancelled and we are returning to the previous task.
+ // After super class has handled clean up, show desktop apps on top again
+ showDesktopApps = true;
}
super.onGestureAnimationEnd();
- if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()
- && desktopVisibilityController != null) {
+ if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()) {
// TODO: b/333533253 - Remove after flag rollout
desktopVisibilityController.setRecentsGestureEnd(endTarget);
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 7c745a2..ab96474 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -1250,7 +1250,6 @@
@Override
public void onViewRemoved(View child) {
super.onViewRemoved(child);
-
// Clear the task data for the removed child if it was visible unless:
// - It's the initial taskview for entering split screen, we only pretend to dismiss the
// task
@@ -1258,22 +1257,25 @@
if (child instanceof TaskView) {
mTaskViewCount = Math.max(0, --mTaskViewCount);
if (child != mSplitHiddenTaskView && child != mMovingTaskView) {
- TaskView taskView = (TaskView) child;
- for (int i : taskView.getTaskIds()) {
- mHasVisibleTaskData.delete(i);
- }
- if (child instanceof GroupedTaskView) {
- mGroupedTaskViewPool.recycle((GroupedTaskView) taskView);
- } else if (child instanceof DesktopTaskView) {
- mDesktopTaskViewPool.recycle((DesktopTaskView) taskView);
- } else {
- mTaskViewPool.recycle(taskView);
- }
- mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, !hasTaskViews());
+ clearAndRecycleTaskView((TaskView) child);
}
}
}
+ private void clearAndRecycleTaskView(TaskView taskView) {
+ for (int i : taskView.getTaskIds()) {
+ mHasVisibleTaskData.delete(i);
+ }
+ if (taskView instanceof GroupedTaskView) {
+ mGroupedTaskViewPool.recycle((GroupedTaskView) taskView);
+ } else if (taskView instanceof DesktopTaskView) {
+ mDesktopTaskViewPool.recycle((DesktopTaskView) taskView);
+ } else {
+ mTaskViewPool.recycle(taskView);
+ }
+ mActionsView.updateHiddenFlags(HIDDEN_NO_TASKS, !hasTaskViews());
+ }
+
@Override
public void onViewAdded(View child) {
super.onViewAdded(child);
@@ -2664,6 +2666,7 @@
private void onReset() {
if (enableRefactorTaskThumbnail()) {
mRecentsViewModel.onReset();
+ removeAllViews();
}
unloadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
setCurrentPage(0);
@@ -5433,6 +5436,13 @@
mSplitHiddenTaskViewIndex = -1;
if (mSplitHiddenTaskView != null) {
mSplitHiddenTaskView.setThumbnailVisibility(VISIBLE, INVALID_TASK_ID);
+ // mSplitHiddenTaskView is set when split select animation starts. The TaskView is only
+ // removed when when the animation finishes. So in the case of overview being dismissed
+ // during the animation, we should not call clearAndRecycleTaskView() because it has
+ // not been removed yet.
+ if (mSplitHiddenTaskView.getParent() == null) {
+ clearAndRecycleTaskView(mSplitHiddenTaskView);
+ }
mSplitHiddenTaskView = null;
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
index a1d22fe..b1a4808 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java
@@ -29,7 +29,6 @@
import com.android.launcher3.BaseActivity;
import com.android.launcher3.logger.LauncherAtom;
-import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.ScrimView;
@@ -209,9 +208,6 @@
.build());
}
- @Nullable
- DesktopVisibilityController getDesktopVisibilityController();
-
void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController);
@Nullable TaskbarUIController getTaskbarUIController();
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt b/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt
index 87771c6..d92c4d0 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewModelHelper.kt
@@ -44,10 +44,12 @@
// Update recentsViewModel and apply the thumbnailOverride ASAP, before waiting inside
// viewAttachedScope.
recentsViewModel.setRunningTaskShowScreenshot(true)
- recentsCoroutineScope.launch(dispatcherProvider.main) {
+ recentsCoroutineScope.launch(dispatcherProvider.background) {
recentsViewModel.waitForRunningTaskShowScreenshotToUpdate()
recentsViewModel.waitForThumbnailsToUpdate(updatedThumbnails)
- withContext(Dispatchers.Main) { ViewUtils.postFrameDrawn(taskView, onFinishRunnable) }
+ withContext(Dispatchers.Main.immediate) {
+ ViewUtils.postFrameDrawn(taskView, onFinishRunnable)
+ }
}
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarControllerTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarControllerTestUtil.kt
index 6e2f74a..0e066cd 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarControllerTestUtil.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarControllerTestUtil.kt
@@ -17,15 +17,16 @@
package com.android.launcher3.taskbar
import android.content.Context
-import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.ConstantItem
import com.android.launcher3.LauncherPrefs
+import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import com.android.launcher3.util.TestUtil
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
object TaskbarControllerTestUtil {
inline fun runOnMainSync(crossinline runTest: () -> Unit) {
- getInstrumentation().runOnMainSync { runTest() }
+ TestUtil.runOnExecutorSync(MAIN_EXECUTOR) { runTest() }
}
/** Returns a property to read/write the value of a [ConstantItem]. */
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
index 36e8a82..13880f1 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
@@ -85,7 +85,8 @@
@get:Rule(order = 4) val animatorTestRule = AnimatorTestRule(this)
- @get:Rule(order = 5) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+ @get:Rule(order = 5)
+ val taskbarUnitTestRule = TaskbarUnitTestRule(this, context, this::onControllersInitialized)
@InjectController lateinit var taskbarViewController: TaskbarViewController
@InjectController lateinit var recentAppsController: TaskbarRecentAppsController
@@ -94,18 +95,29 @@
private var desktopTaskListener: IDesktopTaskListener? = null
- @Before
- fun ensureRunningAppsShowing() {
+ private var currentControllerInitCallback: () -> Unit = {}
+ set(value) {
+ runOnMainSync { value.invoke() }
+ field = value
+ }
+
+ private fun onControllersInitialized() {
runOnMainSync {
if (!recentAppsController.canShowRunningApps) {
recentAppsController.onDestroy()
recentAppsController.canShowRunningApps = true
recentAppsController.init(taskbarUnitTestRule.activityContext.controllers)
}
- recentsModel.resolvePendingTaskRequests()
+
+ currentControllerInitCallback.invoke()
}
}
+ @Before
+ fun ensureRunningAppsShowing() {
+ runOnMainSync { recentsModel.resolvePendingTaskRequests() }
+ }
+
@Test
@TaskbarMode(PINNED)
fun testTaskbarWithMaxNumIcons_pinned() {
@@ -196,7 +208,7 @@
var initialMaxNumIconViews = maxNumberOfTaskbarIcons
assertThat(initialMaxNumIconViews).isGreaterThan(0)
- runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(false) }
val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
assertThat(maxNumIconViews).isLessThan(initialMaxNumIconViews)
@@ -210,7 +222,7 @@
var initialMaxNumIconViews = maxNumberOfTaskbarIcons
assertThat(initialMaxNumIconViews).isGreaterThan(0)
- runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(false) }
val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
assertThat(maxNumIconViews).isLessThan(initialMaxNumIconViews)
@@ -228,7 +240,7 @@
fun testBubbleBarReducesTaskbarMaxNumIcons_transientBubbleInitiallyStashed() {
var initialMaxNumIconViews = maxNumberOfTaskbarIcons
assertThat(initialMaxNumIconViews).isGreaterThan(0)
- runOnMainSync {
+ currentControllerInitCallback = {
bubbleStashController.stashBubbleBarImmediate()
bubbleBarViewController.setHiddenForBubbles(false)
}
@@ -247,7 +259,7 @@
@Test
@TaskbarMode(TRANSIENT)
fun testStashingBubbleBarMaintainsMaxNumIcons_transient() {
- runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(false) }
val initialNumIcons = currentNumberOfTaskbarIcons
val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
@@ -261,15 +273,13 @@
@Test
@TaskbarMode(PINNED)
fun testHidingBubbleBarIncreasesMaxNumIcons_pinned() {
- runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(false) }
val initialNumIcons = currentNumberOfTaskbarIcons
val initialMaxNumIconViews = addRunningAppsAndVerifyOverflowState(5)
- runOnMainSync {
- bubbleBarViewController.setHiddenForBubbles(true)
- animatorTestRule.advanceTimeBy(150)
- }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(true) }
+ runOnMainSync { animatorTestRule.advanceTimeBy(150) }
val maxNumIconViews = maxNumberOfTaskbarIcons
assertThat(maxNumIconViews).isGreaterThan(initialMaxNumIconViews)
@@ -282,15 +292,13 @@
@Test
@TaskbarMode(TRANSIENT)
fun testHidingBubbleBarIncreasesMaxNumIcons_transient() {
- runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(false) }
val initialNumIcons = currentNumberOfTaskbarIcons
val initialMaxNumIconViews = addRunningAppsAndVerifyOverflowState(5)
- runOnMainSync {
- bubbleBarViewController.setHiddenForBubbles(true)
- animatorTestRule.advanceTimeBy(150)
- }
+ currentControllerInitCallback = { bubbleBarViewController.setHiddenForBubbles(true) }
+ runOnMainSync { animatorTestRule.advanceTimeBy(150) }
val maxNumIconViews = maxNumberOfTaskbarIcons
assertThat(maxNumIconViews).isGreaterThan(initialMaxNumIconViews)
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt
index eae181f..3ca36ec 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt
@@ -44,7 +44,7 @@
)
val listener = TestBubbleAnimatorListener()
InstrumentationRegistry.getInstrumentation().runOnMainSync {
- bubbleAnimator.animateNewBubble(selectedBubbleIndex = 2, listener)
+ bubbleAnimator.animateNewBubble(selectedBubbleIndex = 2, listener = listener)
}
assertThat(bubbleAnimator.isRunning).isTrue()
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
index 2f773b3..46b5659 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
@@ -245,9 +245,11 @@
animator.onStashStateChangingWhileAnimating()
}
- // The physics animation test util posts the cancellation to the looper thread, so we have
- // to wait again and let it finish.
- InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+ // wait for the animation to cancel
+ PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(
+ handleAnimator,
+ DynamicAnimation.TRANSLATION_Y,
+ )
// verify that the hide animation was canceled
assertThat(animatorScheduler.delayedBlock).isNull()
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
index 07b32af..e150568 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
@@ -24,7 +24,6 @@
import android.provider.Settings.Secure.getUriFor
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.LauncherAppState
-import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarControllers
import com.android.launcher3.taskbar.TaskbarManager
@@ -72,6 +71,7 @@
class TaskbarUnitTestRule(
private val testInstance: Any,
private val context: TaskbarWindowSandboxContext,
+ private val controllerInjectionCallback: () -> Unit = {},
) : TestRule {
private val instrumentation = InstrumentationRegistry.getInstrumentation()
@@ -110,11 +110,13 @@
PendingIntent(IIntentSender.Default())
},
object : TaskbarNavButtonCallbacks {},
- DesktopVisibilityController(context),
) {
override fun recreateTaskbar() {
super.recreateTaskbar()
- if (currentActivityContext != null) injectControllers()
+ if (currentActivityContext != null) {
+ injectControllers()
+ controllerInjectionCallback.invoke()
+ }
}
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt
index 0b94dfd..31c5a4c 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarWindowSandboxContext.kt
@@ -23,7 +23,6 @@
import android.view.Display.DEFAULT_DISPLAY
import androidx.test.core.app.ApplicationProvider
import com.android.launcher3.FakeLauncherPrefs
-import com.android.launcher3.LauncherPrefs
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppModule
import com.android.launcher3.dagger.LauncherAppSingleton
@@ -74,8 +73,6 @@
.bindSettingsCache(settingsCacheSandbox.cache)
componentBinder?.invoke(context, builder)
base.initDaggerComponent(builder)
-
- putObject(LauncherPrefs.INSTANCE, FakeLauncherPrefs(context))
}
}
@@ -119,6 +116,9 @@
@LauncherAppSingleton
@Component(modules = [LauncherAppModule::class])
interface TaskbarSandboxComponent : LauncherAppComponent {
+
+ override fun getLauncherPrefs(): FakeLauncherPrefs
+
@Component.Builder
interface Builder : LauncherAppComponent.Builder {
@BindsInstance fun bindSystemUiProxy(proxy: SystemUiProxy): Builder
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt
index 5de876a..f6f158f 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskIconDataSource.kt
@@ -17,11 +17,11 @@
package com.android.quickstep.recents.data
import android.graphics.drawable.Drawable
-import com.android.launcher3.util.CancellableTask
-import com.android.quickstep.TaskIconCache
+import com.android.quickstep.TaskIconCache.TaskCacheEntry
import com.android.quickstep.task.thumbnail.data.TaskIconDataSource
import com.android.systemui.shared.recents.model.Task
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.yield
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@@ -29,28 +29,30 @@
val taskIdToDrawable: MutableMap<Int, Drawable> =
(0..10).associateWith { mockCopyableDrawable() }.toMutableMap()
-
- val taskIdToUpdatingTask: MutableMap<Int, () -> Unit> = mutableMapOf()
- var shouldLoadSynchronously: Boolean = true
+ private val completionPrevented: MutableSet<Int> = mutableSetOf()
/** Retrieves and sets an icon on [task] from [taskIdToDrawable]. */
- override fun getIconInBackground(
- task: Task,
- callback: TaskIconCache.GetTaskIconCallback
- ): CancellableTask<*>? {
- val wrappedCallback = {
- callback.onTaskIconReceived(
- taskIdToDrawable.getValue(task.key.id),
- "content desc ${task.key.id}",
- "title ${task.key.id}"
- )
+ override suspend fun getIcon(task: Task): TaskCacheEntry {
+ while (task.key.id in completionPrevented) {
+ yield()
}
- if (shouldLoadSynchronously) {
- wrappedCallback()
- } else {
- taskIdToUpdatingTask[task.key.id] = wrappedCallback
- }
- return null
+ return TaskCacheEntry(
+ taskIdToDrawable.getValue(task.key.id),
+ "content desc ${task.key.id}",
+ "title ${task.key.id}",
+ )
+ }
+
+ fun preventIconLoad(taskId: Int) {
+ completionPrevented.add(taskId)
+ }
+
+ fun completeLoadingForTask(taskId: Int) {
+ completionPrevented.remove(taskId)
+ }
+
+ fun completeLoading() {
+ completionPrevented.clear()
}
companion object {
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt
index d12c0b0..e10afc4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/FakeTaskThumbnailDataSource.kt
@@ -17,11 +17,10 @@
package com.android.quickstep.recents.data
import android.graphics.Bitmap
-import com.android.launcher3.util.CancellableTask
import com.android.quickstep.task.thumbnail.data.TaskThumbnailDataSource
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
-import java.util.function.Consumer
+import kotlinx.coroutines.yield
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
@@ -29,25 +28,28 @@
val taskIdToBitmap: MutableMap<Int, Bitmap> =
(0..10).associateWith { mock<Bitmap>() }.toMutableMap()
- val taskIdToUpdatingTask: MutableMap<Int, () -> Unit> = mutableMapOf()
- var shouldLoadSynchronously: Boolean = true
+ private val completionPrevented: MutableSet<Int> = mutableSetOf()
+ private val getThumbnailCalls = mutableMapOf<Int, Int>()
/** Retrieves and sets a thumbnail on [task] from [taskIdToBitmap]. */
- override fun getThumbnailInBackground(
- task: Task,
- callback: Consumer<ThumbnailData>
- ): CancellableTask<ThumbnailData>? {
- val thumbnailData = mock<ThumbnailData>()
- whenever(thumbnailData.thumbnail).thenReturn(taskIdToBitmap[task.key.id])
- val wrappedCallback = {
- task.thumbnail = thumbnailData
- callback.accept(thumbnailData)
+ override suspend fun getThumbnail(task: Task): ThumbnailData {
+ getThumbnailCalls[task.key.id] = (getThumbnailCalls[task.key.id] ?: 0) + 1
+
+ while (task.key.id in completionPrevented) {
+ yield()
}
- if (shouldLoadSynchronously) {
- wrappedCallback()
- } else {
- taskIdToUpdatingTask[task.key.id] = wrappedCallback
+ return mock<ThumbnailData>().also {
+ whenever(it.thumbnail).thenReturn(taskIdToBitmap[task.key.id])
}
- return null
+ }
+
+ fun getNumberOfGetThumbnailCalls(taskId: Int): Int = getThumbnailCalls[taskId] ?: 0
+
+ fun preventThumbnailLoad(taskId: Int) {
+ completionPrevented.add(taskId)
+ }
+
+ fun completeLoadingForTask(taskId: Int) {
+ completionPrevented.remove(taskId)
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt
index ee1ec6e..b6cf5bd 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt
@@ -214,7 +214,7 @@
.isEqualTo(bitmap2)
// Prevent new loading of Bitmaps
- taskThumbnailDataSource.shouldLoadSynchronously = false
+ taskThumbnailDataSource.preventThumbnailLoad(2)
systemUnderTest.setVisibleTasks(setOf(2, 3))
assertThat(systemUnderTest.getTaskDataById(2).first()!!.thumbnail!!.thumbnail)
@@ -235,7 +235,7 @@
.assertHasIconDataFromSource(taskIconDataSource)
// Prevent new loading of Drawables
- taskThumbnailDataSource.shouldLoadSynchronously = false
+ taskIconDataSource.preventIconLoad(2)
systemUnderTest.setVisibleTasks(setOf(2, 3))
systemUnderTest
@@ -257,9 +257,6 @@
assertThat(task2.thumbnail!!.thumbnail).isEqualTo(bitmap2)
task2.assertHasIconDataFromSource(taskIconDataSource)
- // Prevent new loading of Bitmaps
- taskThumbnailDataSource.shouldLoadSynchronously = false
- taskIconDataSource.shouldLoadSynchronously = false
systemUnderTest.setVisibleTasks(setOf(0, 1))
val task2AfterVisibleTasksChanged = systemUnderTest.getTaskDataById(2).first()!!
@@ -275,21 +272,22 @@
// Setup fakes
recentsModel.seedTasks(defaultTaskList)
val bitmap2 = taskThumbnailDataSource.taskIdToBitmap[2]
- taskThumbnailDataSource.shouldLoadSynchronously = false
// Setup TasksRepository
systemUnderTest.getAllTaskData(forceRefresh = true)
- systemUnderTest.setVisibleTasks(setOf(1, 2))
- // Assert there is no bitmap in first emission
- assertThat(systemUnderTest.getTaskDataById(2).first()!!.thumbnail).isNull()
+ val task2DataFlow = systemUnderTest.getTaskDataById(2)
+ val task2BitmapValues = mutableListOf<Bitmap?>()
+ testScope.backgroundScope.launch {
+ task2DataFlow.map { it?.thumbnail?.thumbnail }.toList(task2BitmapValues)
+ }
- // Simulate bitmap loading after first emission
- taskThumbnailDataSource.taskIdToUpdatingTask.getValue(2).invoke()
+ // Check for first emission
+ assertThat(task2BitmapValues.single()).isNull()
+ systemUnderTest.setVisibleTasks(setOf(2))
// Check for second emission
- assertThat(systemUnderTest.getTaskDataById(2).first()!!.thumbnail!!.thumbnail)
- .isEqualTo(bitmap2)
+ assertThat(task2BitmapValues).isEqualTo(listOf(null, bitmap2))
}
@Test
@@ -365,7 +363,6 @@
testScope.runTest {
recentsModel.seedTasks(defaultTaskList)
systemUnderTest.getAllTaskData(forceRefresh = true)
- taskThumbnailDataSource.shouldLoadSynchronously = false
val taskDataFlow = systemUnderTest.getTaskDataById(1)
val task1IconValues = mutableListOf<Drawable?>()
@@ -374,14 +371,10 @@
}
systemUnderTest.setVisibleTasks(setOf(1))
- val task1UpdatingTaskOld = taskThumbnailDataSource.taskIdToUpdatingTask[1]
- println(task1UpdatingTaskOld)
+ assertThat(taskThumbnailDataSource.getNumberOfGetThumbnailCalls(1)).isEqualTo(1)
systemUnderTest.setVisibleTasks(setOf(1, 2))
- val task1UpdatingTaskNew = taskThumbnailDataSource.taskIdToUpdatingTask[1]
- println(task1UpdatingTaskNew)
-
- assertThat(task1UpdatingTaskNew).isEqualTo(task1UpdatingTaskOld)
+ assertThat(taskThumbnailDataSource.getNumberOfGetThumbnailCalls(1)).isEqualTo(1)
}
private fun createTaskWithId(taskId: Int) =
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModelTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModelTest.kt
index 2e91f5c..95504af 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModelTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModelTest.kt
@@ -22,6 +22,7 @@
import android.graphics.Color
import android.graphics.Matrix
import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.launcher3.util.TestDispatcherProvider
import com.android.quickstep.recents.data.FakeTasksRepository
import com.android.quickstep.recents.usecase.GetThumbnailPositionUseCase
import com.android.quickstep.recents.usecase.ThumbnailPositionState.MatrixScaling
@@ -33,7 +34,10 @@
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.test.TestScope
+import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,6 +45,7 @@
import org.mockito.kotlin.whenever
/** Test for [TaskOverlayViewModel] */
+@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(AndroidJUnit4::class)
class TaskOverlayViewModelTest {
private val task =
@@ -58,104 +63,123 @@
private val recentsViewData = RecentsViewData()
private val tasksRepository = FakeTasksRepository()
private val mGetThumbnailPositionUseCase = mock<GetThumbnailPositionUseCase>()
+ private val dispatcher = UnconfinedTestDispatcher()
+ private val testScope = TestScope(dispatcher)
private val systemUnderTest =
- TaskOverlayViewModel(task, recentsViewData, mGetThumbnailPositionUseCase, tasksRepository)
+ TaskOverlayViewModel(
+ task,
+ recentsViewData,
+ mGetThumbnailPositionUseCase,
+ tasksRepository,
+ TestDispatcherProvider(dispatcher),
+ )
@Test
- fun initialStateIsDisabled() = runTest {
- assertThat(systemUnderTest.overlayState.first()).isEqualTo(Disabled)
- }
+ fun initialStateIsDisabled() =
+ testScope.runTest { assertThat(systemUnderTest.overlayState.first()).isEqualTo(Disabled) }
@Test
- fun recentsViewOverlayDisabled_Disabled() = runTest {
- recentsViewData.overlayEnabled.value = false
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
+ fun recentsViewOverlayDisabled_Disabled() =
+ testScope.runTest {
+ recentsViewData.overlayEnabled.value = false
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
- assertThat(systemUnderTest.overlayState.first()).isEqualTo(Disabled)
- }
+ assertThat(systemUnderTest.overlayState.first()).isEqualTo(Disabled)
+ }
@Test
- fun taskNotFullyVisible_Disabled() = runTest {
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf()
+ fun taskNotFullyVisible_Disabled() =
+ testScope.runTest {
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf()
- assertThat(systemUnderTest.overlayState.first()).isEqualTo(Disabled)
- }
+ assertThat(systemUnderTest.overlayState.first()).isEqualTo(Disabled)
+ }
@Test
- fun noThumbnail_Enabled() = runTest {
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
- task.isLocked = false
+ fun noThumbnail_Enabled() =
+ testScope.runTest {
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
+ task.isLocked = false
- assertThat(systemUnderTest.overlayState.first())
- .isEqualTo(Enabled(isRealSnapshot = false, thumbnail = null))
- }
+ assertThat(systemUnderTest.overlayState.first())
+ .isEqualTo(Enabled(isRealSnapshot = false, thumbnail = null))
+ }
@Test
- fun withThumbnail_RealSnapshot_NotLocked_Enabled() = runTest {
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
- tasksRepository.seedTasks(listOf(task))
- tasksRepository.seedThumbnailData(mapOf(TASK_ID to thumbnailData))
- tasksRepository.setVisibleTasks(setOf(TASK_ID))
- thumbnailData.isRealSnapshot = true
- task.isLocked = false
+ fun withThumbnail_RealSnapshot_NotLocked_Enabled() =
+ testScope.runTest {
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
+ tasksRepository.seedTasks(listOf(task))
+ tasksRepository.seedThumbnailData(mapOf(TASK_ID to thumbnailData))
+ tasksRepository.setVisibleTasks(setOf(TASK_ID))
+ thumbnailData.isRealSnapshot = true
+ task.isLocked = false
- assertThat(systemUnderTest.overlayState.first())
- .isEqualTo(Enabled(isRealSnapshot = true, thumbnail = thumbnailData.thumbnail))
- }
+ assertThat(systemUnderTest.overlayState.first())
+ .isEqualTo(Enabled(isRealSnapshot = true, thumbnail = thumbnailData.thumbnail))
+ }
@Test
- fun withThumbnail_RealSnapshot_Locked_Enabled() = runTest {
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
- tasksRepository.seedTasks(listOf(task))
- tasksRepository.seedThumbnailData(mapOf(TASK_ID to thumbnailData))
- tasksRepository.setVisibleTasks(setOf(TASK_ID))
- thumbnailData.isRealSnapshot = true
- task.isLocked = true
+ fun withThumbnail_RealSnapshot_Locked_Enabled() =
+ testScope.runTest {
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
+ tasksRepository.seedTasks(listOf(task))
+ tasksRepository.seedThumbnailData(mapOf(TASK_ID to thumbnailData))
+ tasksRepository.setVisibleTasks(setOf(TASK_ID))
+ thumbnailData.isRealSnapshot = true
+ task.isLocked = true
- assertThat(systemUnderTest.overlayState.first())
- .isEqualTo(Enabled(isRealSnapshot = false, thumbnail = thumbnailData.thumbnail))
- }
+ assertThat(systemUnderTest.overlayState.first())
+ .isEqualTo(Enabled(isRealSnapshot = false, thumbnail = thumbnailData.thumbnail))
+ }
@Test
- fun withThumbnail_FakeSnapshot_Enabled() = runTest {
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
- tasksRepository.seedTasks(listOf(task))
- tasksRepository.seedThumbnailData(mapOf(TASK_ID to thumbnailData))
- tasksRepository.setVisibleTasks(setOf(TASK_ID))
- thumbnailData.isRealSnapshot = false
- task.isLocked = false
+ fun withThumbnail_FakeSnapshot_Enabled() =
+ testScope.runTest {
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(TASK_ID)
+ tasksRepository.seedTasks(listOf(task))
+ tasksRepository.seedThumbnailData(mapOf(TASK_ID to thumbnailData))
+ tasksRepository.setVisibleTasks(setOf(TASK_ID))
+ thumbnailData.isRealSnapshot = false
+ task.isLocked = false
- assertThat(systemUnderTest.overlayState.first())
- .isEqualTo(Enabled(isRealSnapshot = false, thumbnail = thumbnailData.thumbnail))
- }
+ assertThat(systemUnderTest.overlayState.first())
+ .isEqualTo(Enabled(isRealSnapshot = false, thumbnail = thumbnailData.thumbnail))
+ }
@Test
- fun getThumbnailMatrix_MissingThumbnail() = runTest {
- val isRtl = true
+ fun getThumbnailMatrix_MissingThumbnail() =
+ testScope.runTest {
+ val isRtl = true
- whenever(mGetThumbnailPositionUseCase.run(TASK_ID, CANVAS_WIDTH, CANVAS_HEIGHT, isRtl))
- .thenReturn(MissingThumbnail)
+ whenever(mGetThumbnailPositionUseCase.run(TASK_ID, CANVAS_WIDTH, CANVAS_HEIGHT, isRtl))
+ .thenReturn(MissingThumbnail)
- assertThat(systemUnderTest.getThumbnailPositionState(CANVAS_WIDTH, CANVAS_HEIGHT, isRtl))
- .isEqualTo(ThumbnailPositionState(Matrix.IDENTITY_MATRIX, isRotated = false))
- }
+ assertThat(
+ systemUnderTest.getThumbnailPositionState(CANVAS_WIDTH, CANVAS_HEIGHT, isRtl)
+ )
+ .isEqualTo(ThumbnailPositionState(Matrix.IDENTITY_MATRIX, isRotated = false))
+ }
@Test
- fun getThumbnailMatrix_MatrixScaling() = runTest {
- val isRtl = true
- val isRotated = true
+ fun getThumbnailMatrix_MatrixScaling() =
+ testScope.runTest {
+ val isRtl = true
+ val isRotated = true
- whenever(mGetThumbnailPositionUseCase.run(TASK_ID, CANVAS_WIDTH, CANVAS_HEIGHT, isRtl))
- .thenReturn(MatrixScaling(MATRIX, isRotated))
+ whenever(mGetThumbnailPositionUseCase.run(TASK_ID, CANVAS_WIDTH, CANVAS_HEIGHT, isRtl))
+ .thenReturn(MatrixScaling(MATRIX, isRotated))
- assertThat(systemUnderTest.getThumbnailPositionState(CANVAS_WIDTH, CANVAS_HEIGHT, isRtl))
- .isEqualTo(ThumbnailPositionState(MATRIX, isRotated))
- }
+ assertThat(
+ systemUnderTest.getThumbnailPositionState(CANVAS_WIDTH, CANVAS_HEIGHT, isRtl)
+ )
+ .isEqualTo(ThumbnailPositionState(MATRIX, isRotated))
+ }
companion object {
const val TASK_ID = 0
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
index 88774be..61971b1 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
@@ -52,6 +52,7 @@
import com.android.quickstep.DeviceConfigWrapper;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TopTaskTracker;
+import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
@@ -82,6 +83,7 @@
private @Mock BaseContainerInterface mMockContainerInterface;
private @Mock RecentsViewContainer mMockRecentsViewContainer;
private @Mock RecentsView mMockRecentsView;
+ private @Mock RecentsPagedOrientationHandler mMockOrientationHandler;
private ContextualSearchInvoker mContextualSearchInvoker;
@Before
@@ -190,6 +192,15 @@
}
@Test
+ public void runContextualSearchInvocationChecksAndLogFailures_isFakeLandscape() {
+ when(mMockRecentsView.getPagedOrientationHandler()).thenReturn(mMockOrientationHandler);
+ when(mMockOrientationHandler.isLayoutNaturalToLauncher()).thenReturn(false);
+ assertFalse("Expect invocation checks to fail in fake landscape.",
+ mContextualSearchInvoker.runContextualSearchInvocationChecksAndLogFailures());
+ verifyNoMoreInteractions(mMockStatsLogManager);
+ }
+
+ @Test
public void invokeContextualSearchUncheckedWithHaptic_cssIsAvailable_commitHapticEnabled() {
try (AutoCloseable flag = overrideSearchHapticCommitFlag(true)) {
assertTrue("Expected invocation unchecked to succeed",
diff --git a/res/layout/launcher.xml b/res/layout/launcher.xml
index 83c8d6c..adf4597 100644
--- a/res/layout/launcher.xml
+++ b/res/layout/launcher.xml
@@ -29,6 +29,7 @@
android:importantForAccessibility="no">
<com.android.launcher3.views.AccessibilityActionsView
+ android:id="@+id/accessibility_action_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/home_screen"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 7499264..fcc442f 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Kon geen programme kry wat by \"<xliff:g id="QUERY">%1$s</xliff:g>\" pas nie"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alle apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Applys"</string>
<string name="notifications_header" msgid="1404149926117359025">"Kennisgewings"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Raak en hou om \'n kortpad te skuif."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dubbeltik en hou om \'n kortpad te skuif of gebruik gepasmaakte handelinge."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Vouer hernoem na <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Vouer: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> items"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Vouer: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> of meer items"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Apppaar: <xliff:g id="APP1">%1$s</xliff:g> en <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Muurpapier en styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Wysig tuisskerm"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 3e64795..d0abd7d 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"ከ«<xliff:g id="QUERY">%1$s</xliff:g>» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም"</string>
<string name="label_application" msgid="8531721983832654978">"መተግበሪያ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"ሁሉም መተግበሪያዎች"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"የመተግበሪያዎች ዝርዝር"</string>
<string name="notifications_header" msgid="1404149926117359025">"ማሳወቂያዎች"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"አቋራጭን ለማንቀሳቀስ ይንኩ እና ይያዙ"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"አቋራጭን ለማንቀሳቀስ ወይም ብጁ እርምጃዎችን ለመጠቀም ሁለቴ መታ ያድርጉ እና ይያዙ።"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"አቃፊ <xliff:g id="NAME">%1$s</xliff:g> ተብሎ ዳግም ተሰይሟል"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"አቃፊ፦ <xliff:g id="NAME">%1$s</xliff:g>፣ <xliff:g id="SIZE">%2$d</xliff:g> ንጥሎች"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"አቃፊ፦ <xliff:g id="NAME">%1$s</xliff:g>፣ <xliff:g id="SIZE">%2$d</xliff:g> ወይም ተጨማሪ ንጥሎች"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"የመተግበሪያ ጥምረት፦ <xliff:g id="APP1">%1$s</xliff:g> እና <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ልጣፍ እና ቅጥ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"መነሻ ማያ ገጽን አርትዕ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index ba14694..78f36dd 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"لم يتم العثور على أي تطبيقات تتطابق مع \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"تطبيق"</string>
<string name="all_apps_label" msgid="5015784846527570951">"جميع التطبيقات"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"قائمة التطبيقات"</string>
<string name="notifications_header" msgid="1404149926117359025">"الإشعارات"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"انقر مع الاستمرار لنقل اختصار"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"انقر مرتين مع تثبيت إصبعك لنقل اختصار أو استخدام الإجراءات المخصّصة."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"تمت إعادة تسمية المجلد إلى <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"المجلد: <xliff:g id="NAME">%1$s</xliff:g>، <xliff:g id="SIZE">%2$d</xliff:g> عنصر"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"المجلد: <xliff:g id="NAME">%1$s</xliff:g>، <xliff:g id="SIZE">%2$d</xliff:g> عنصر أو أكثر"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"استخدام تطبيقين في الوقت نفسه: تطبيق \"<xliff:g id="APP1">%1$s</xliff:g>\" و\"<xliff:g id="APP2">%2$s</xliff:g>\""</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"الخلفية والأسلوب"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"تعديل الشاشة الرئيسية"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 9bdc5cf..f15ef93 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"ৰ সৈতে মিলা কোনো এপ্ বিচাৰি পোৱা নগ\'ল"</string>
<string name="label_application" msgid="8531721983832654978">"এপ্"</string>
<string name="all_apps_label" msgid="5015784846527570951">"আটাইবোৰ এপ্"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"এপৰ সূচী"</string>
<string name="notifications_header" msgid="1404149926117359025">"জাননীসমূহ"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"শ্বৰ্টকাট স্থানান্তৰ কৰিবলৈ দুবাৰ টিপি ধৰি ৰাখক।"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"কোনো শ্বৰ্টকাট স্থানান্তৰ কৰিবলৈ দুবাৰ টিপি ধৰি ৰাখক অথবা কাষ্টম কাৰ্য ব্যৱহাৰ কৰক।"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ফ\'ল্ডাৰৰ নাম সলনি কৰি <xliff:g id="NAME">%1$s</xliff:g> কৰা হৈছে"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ফ’ল্ডাৰ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> টা বস্তু"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ফ’ল্ডাৰ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> টা অথবা তাতকৈ অধিক বস্তু"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"এপ্ পেয়াৰ কৰা: <xliff:g id="APP1">%1$s</xliff:g> আৰু <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ৱালপেপাৰ আৰু শৈলী"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"গৃহ স্ক্ৰীন সম্পাদনা কৰক"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index a86e2a7..a0aef39 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"<xliff:g id="QUERY">%1$s</xliff:g> sorğusuna uyğun tətbiq tapılmadı"</string>
<string name="label_application" msgid="8531721983832654978">"Tətbiq"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Bütün tətbiqlər"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Tətbiq siyahısı"</string>
<string name="notifications_header" msgid="1404149926117359025">"Bildirişlər"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Qısayolu daşımaq üçün toxunub saxlayın."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Qısayolu daşımaq üçün iki dəfə toxunub saxlayın və ya fərdi əməliyyatlardan istifadə edin."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Qovluq adı <xliff:g id="NAME">%1$s</xliff:g> ilə dəyişdirildi"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Qovluq: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> element"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Qovluq: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> və ya daha çox element"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Tətbiq cütü: <xliff:g id="APP1">%1$s</xliff:g> və <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Divar kağızı və üslub"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Əsas ekranı redaktə edin"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 17d8b04..9983552 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nije pronađena nijedna aplikacija za „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
<string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Sve aplikacije"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista aplikacija"</string>
<string name="notifications_header" msgid="1404149926117359025">"Obaveštenja"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Dodirnite i zadržite radi pomeranja prečice."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dvaput dodirnite i zadržite da biste pomerali prečicu ili koristite prilagođene radnje."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder je preimenovan u <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> stavke"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ili više stavki"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Par aplikacija: <xliff:g id="APP1">%1$s</xliff:g> i <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Izmeni početni ekran"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 4c209e9..c11a480 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Праграм, якія адпавядаюць запыту \"<xliff:g id="QUERY">%1$s</xliff:g>\", не знойдзена"</string>
<string name="label_application" msgid="8531721983832654978">"Праграма"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Усе праграмы"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Спіс праграм"</string>
<string name="notifications_header" msgid="1404149926117359025">"Апавяшчэнні"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Націсніце і ўтрымлівайце ярлык для перамяшчэння."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Дакраніцеся двойчы і ўтрымлівайце, каб перамясціць ярлык або выкарыстоўваць спецыяльныя дзеянні."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Папка перайменавана ў <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Папка: <xliff:g id="NAME">%1$s</xliff:g>, элементы: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Папка: <xliff:g id="NAME">%1$s</xliff:g>, элементы: <xliff:g id="SIZE">%2$d</xliff:g> ці больш"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Спалучэнне праграм: <xliff:g id="APP1">%1$s</xliff:g> і <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Шпалеры і стыль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Змяніць Галоўны экран"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 17a9ea3..27830d7 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Няма намерени приложения, съответстващи на „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
<string name="label_application" msgid="8531721983832654978">"Приложение"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Всички приложения"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Списък с приложения"</string>
<string name="notifications_header" msgid="1404149926117359025">"Известия"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Докоснете и задръжте за преместване на пряк път."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Докоснете двукратно и задръжте за преместване на пряк път или използвайте персонализирани действия."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Папката е преименувана на „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Папка: „<xliff:g id="NAME">%1$s</xliff:g>“ – <xliff:g id="SIZE">%2$d</xliff:g> елемента"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Папка: „<xliff:g id="NAME">%1$s</xliff:g>“ – <xliff:g id="SIZE">%2$d</xliff:g> или повече елементи"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Двойка приложения: <xliff:g id="APP1">%1$s</xliff:g> и <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тапет и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Редактиране на началния екран"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 2809d93..f983b96 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" এর সাথে মেলে এমন কোনো অ্যাপ পাওয়া যায়নি"</string>
<string name="label_application" msgid="8531721983832654978">"অ্যাপ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"সব অ্যাপ"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"অ্যাপ তালিকা"</string>
<string name="notifications_header" msgid="1404149926117359025">"বিজ্ঞপ্তি"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"একটি শর্টকাট সরাতে টাচ করে ধরে রাখুন।"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"একটি শর্টকাট সরাতে বা কাস্টম অ্যাকশন ব্যবহার করতে ডবল ট্যাপ করে ধরে রাখুন।"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ফোল্ডারের নাম পাল্টে <xliff:g id="NAME">%1$s</xliff:g> করা হয়েছে"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ফোল্ডার: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g>টি আইটেম"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ফোল্ডার: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g>টি বা তার বেশি আইটেম"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"অ্যাপ পেয়ার: <xliff:g id="APP1">%1$s</xliff:g> ও <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ওয়ালপেপার এবং স্টাইল"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"হোম স্ক্রিন এডিট করুন"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 9aa61f2..79d3614 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nije pronađena nijedna aplikacija za upit \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Sve aplikacije"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista aplikacija"</string>
<string name="notifications_header" msgid="1404149926117359025">"Obavještenja"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Dodirnite i zadržite da pomjerite prečicu."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dvaput dodirnite i zadržite da pomjerite prečicu ili da koristite prilagođene radnje."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Ime foldera je promijenjeno u <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, br. stavki: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ili više stavki"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Par aplikacija: <xliff:g id="APP1">%1$s</xliff:g> i <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadinska slika i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi Početni ekran"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 01dc551..c4c2dbd 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"No s\'ha trobat cap aplicació que coincideixi amb \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplicació"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Totes les aplicacions"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Llista d\'aplicacions"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notificacions"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Fes doble toc i mantén premut per moure una drecera."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Fes doble toc i mantén premut per moure una drecera o per utilitzar accions personalitzades."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"S\'ha canviat el nom de la carpeta a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elements"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> o més elements"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Parella d\'aplicacions: <xliff:g id="APP1">%1$s</xliff:g> i <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estil i fons de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edita la pantalla d\'inici"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index f22a358..8b426f1 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Dotazu „<xliff:g id="QUERY">%1$s</xliff:g>“ neodpovídají žádné aplikace"</string>
<string name="label_application" msgid="8531721983832654978">"Aplikace"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Všechny aplikace"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Seznam aplikací"</string>
<string name="notifications_header" msgid="1404149926117359025">"Oznámení"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Klepnutím a podržením přesunete zkratku."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dvojitým klepnutím a podržením přesunete zkratku, případně použijte vlastní akce."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Složka přejmenována na <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Složka: <xliff:g id="NAME">%1$s</xliff:g>, počet položek: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Složka: <xliff:g id="NAME">%1$s</xliff:g>, počet položek: <xliff:g id="SIZE">%2$d</xliff:g> nebo více"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Dvojice aplikací: <xliff:g id="APP1">%1$s</xliff:g> a <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta a styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upravit plochu"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0973dc5..c6c78c5 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Der blev ikke fundet nogen apps, som matcher \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alle apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Liste over apps"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifikationer"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Hold en genvej nede for at flytte den."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Tryk to gange, og hold en genvej nede for at flytte den eller bruge tilpassede handlinger."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Mappen er omdøbt til <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementer"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> eller flere elementer"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Appsammenknytning: <xliff:g id="APP1">%1$s</xliff:g> og <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Baggrund og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Rediger startskærm"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 510ddb2..19932b3 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Keine Apps für \"<xliff:g id="QUERY">%1$s</xliff:g>\" gefunden"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alle Apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Liste der Apps"</string>
<string name="notifications_header" msgid="1404149926117359025">"Benachrichtigungen"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Zum Verschieben einer Verknüpfung gedrückt halten"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Doppeltippen und halten, um eine Verknüpfung zu bewegen oder benutzerdefinierte Aktionen zu nutzen."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Ordner umbenannt in <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> Elemente"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> oder mehr Elemente"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"App-Paar: <xliff:g id="APP1">%1$s</xliff:g> und <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hintergrund & Stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startbildschirm bearbeiten"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 9aea502..f7b3b2d 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Δεν βρέθηκαν εφαρμογές αντιστοίχισης για \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Εφαρμογή"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Όλες οι εφαρμογές"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Λίστα εφαρμογών"</string>
<string name="notifications_header" msgid="1404149926117359025">"Ειδοποιήσεις"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Πατήστε παρατεταμένα για μετακίνηση συντόμευσης."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Πατήστε δύο φορές παρατεταμένα για μετακίνηση συντόμευσης ή χρήση προσαρμοσμένων ενεργειών."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Ο φάκελος μετονομάστηκε σε <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Φάκελος: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> στοιχεία"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Φάκελος: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ή περισσότερα στοιχεία"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Ζεύγος εφαρμογών: <xliff:g id="APP1">%1$s</xliff:g> και <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ταπετσαρία και στιλ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Επεξεργασία αρχικής οθόνης"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index f9170eb..449de5d 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Apps list"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Touch & hold to move a shortcut."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Double-tap & hold to move a shortcut or use custom actions."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> items"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> or more items"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"App pair: <xliff:g id="APP1">%1$s</xliff:g> and <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index c86d9be..e5d50af 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -125,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> items"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> or more items"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"App pair: <xliff:g id="APP1">%1$s</xliff:g> and <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Home Screen"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index f9170eb..449de5d 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Apps list"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Touch & hold to move a shortcut."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Double-tap & hold to move a shortcut or use custom actions."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> items"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> or more items"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"App pair: <xliff:g id="APP1">%1$s</xliff:g> and <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index f9170eb..449de5d 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Apps list"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Touch & hold to move a shortcut."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Double-tap & hold to move a shortcut or use custom actions."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> items"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> or more items"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"App pair: <xliff:g id="APP1">%1$s</xliff:g> and <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 2024ca7..a2f4c6e 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"No hay apps que coincidan con \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Todas las apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista de apps"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notificaciones"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Mantén presionado para mover un acceso directo."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Presiona dos veces y mantén presionado para mover un acceso directo o usar acciones personalizadas."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"El nombre de la carpeta se cambió a <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementos"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> o más elementos"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Vinculación de apps: <xliff:g id="APP1">%1$s</xliff:g> y <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla principal"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 30d034a..ef612e7 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"No se han encontrado aplicaciones que contengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplicación"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Todas las aplicaciones"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista de aplicaciones"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notificaciones"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Mantén pulsado un acceso directo para moverlo."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Toca dos veces y mantén pulsado un acceso directo para moverlo o usar acciones personalizadas."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Se ha cambiado el nombre de la carpeta a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SIZE">%2$d</xliff:g> elementos)"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SIZE">%2$d</xliff:g> o más elementos)"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Aplicaciones emparejadas: <xliff:g id="APP1">%1$s</xliff:g> y <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index daf6fbe..38384c0 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Päringule „<xliff:g id="QUERY">%1$s</xliff:g>” ei vastanud ükski rakendus"</string>
<string name="label_application" msgid="8531721983832654978">"Rakendus"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Kõik rakendused"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Rakenduste loend"</string>
<string name="notifications_header" msgid="1404149926117359025">"Märguanded"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Otsetee teisaldamiseks puudutage ja hoidke all."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Otsetee teisaldamiseks või kohandatud toimingute kasutamiseks topeltpuudutage ja hoidke all."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Kausta uus nimi: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Kaust: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> üksust"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Kaust: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> või rohkem üksust"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Rakendusepaar: <xliff:g id="APP1">%1$s</xliff:g> ja <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustapilt ja stiil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muuda avaekraani"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 8d14731..ab9cb24 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Ez da aurkitu \"<xliff:g id="QUERY">%1$s</xliff:g>\" bilaketaren emaitzarik"</string>
<string name="label_application" msgid="8531721983832654978">"Aplikazioa"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Aplikazio guztiak"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Aplikazioen zerrenda"</string>
<string name="notifications_header" msgid="1404149926117359025">"Jakinarazpenak"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Eduki sakatuta lasterbide bat mugitzeko."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Sakatu birritan eta eduki sakatuta lasterbide bat mugitzeko edo ekintza pertsonalizatuak erabiltzeko."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Karpetari <xliff:g id="NAME">%1$s</xliff:g> izena eman zaio"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"<xliff:g id="NAME">%1$s</xliff:g> karpeta (<xliff:g id="SIZE">%2$d</xliff:g> elementu)"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"<xliff:g id="NAME">%1$s</xliff:g> karpeta (<xliff:g id="SIZE">%2$d</xliff:g> elementu edo gehiago)"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Aplikazio parea: <xliff:g id="APP1">%1$s</xliff:g> eta <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Horma-papera eta estiloa"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editatu orri nagusia"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 5227a7c..6422a50 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"هیچ برنامهای در مطابقت با «<xliff:g id="QUERY">%1$s</xliff:g>» پیدا نشد"</string>
<string name="label_application" msgid="8531721983832654978">"برنامه"</string>
<string name="all_apps_label" msgid="5015784846527570951">"همه برنامهها"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"فهرست برنامهها"</string>
<string name="notifications_header" msgid="1404149926117359025">"اعلانها"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"برای جابهجا کردن میانبر، لمس کنید و نگه دارید."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"برای جابهجا کردن میانبر یا استفاده از کنشهای سفارشی، دو تکضرب بزنید و نگه دارید."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"نام پوشه به <xliff:g id="NAME">%1$s</xliff:g> تغییر کرد"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"پوشه: <xliff:g id="NAME">%1$s</xliff:g>، <xliff:g id="SIZE">%2$d</xliff:g> مورد"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"پوشه: <xliff:g id="NAME">%1$s</xliff:g>، <xliff:g id="SIZE">%2$d</xliff:g> مورد یا بیشتر"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"جفت برنامه: <xliff:g id="APP1">%1$s</xliff:g> و <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"کاغذدیواری و سبک"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ویرایش «صفحه اصلی»"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 4c27e6a..a442886 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"<xliff:g id="QUERY">%1$s</xliff:g> ei palauttanut sovelluksia."</string>
<string name="label_application" msgid="8531721983832654978">"Sovellus"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Kaikki sovellukset"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Sovellusluettelo"</string>
<string name="notifications_header" msgid="1404149926117359025">"Ilmoitukset"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Kosketa pitkään, niin voit siirtää pikakuvaketta."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Kaksoisnapauta ja paina pitkään, niin voit siirtää pikakuvaketta tai käyttää muokattuja toimintoja."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Kansion nimeksi vaihdettiin <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Kansio: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> kohdetta"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Kansio: <xliff:g id="NAME">%1$s</xliff:g>, ainakin <xliff:g id="SIZE">%2$d</xliff:g> kohdetta"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Sovelluspari: <xliff:g id="APP1">%1$s</xliff:g> ja <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustakuva ja tyyli"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muokkaa aloitusnäyttöä"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index c348ac9..dff43d0 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Aucune appli trouvée correspondant à « <xliff:g id="QUERY">%1$s</xliff:g> »"</string>
<string name="label_application" msgid="8531721983832654978">"Appli"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Toutes les applis"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Liste des applis"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Maintenez le doigt sur un raccourci pour le déplacer."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Touchez deux fois un raccourci et maintenez le doigt dessus pour le déplacer ou utiliser des actions personnalisées."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Nouveau nom du dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> élément(s)"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> éléments ou plus"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Paire d\'applis : <xliff:g id="APP1">%1$s</xliff:g> et <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index c44efa5..1c6f1f9 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Aucune application ne correspond à la requête \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Application"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Toutes les applis"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Liste des applis"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Appuyez de manière prolongée pour déplacer un raccourci."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Appuyez deux fois et maintenez la pression pour déplacer un raccourci ou utiliser les actions personnalisées."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Nouveau nom du dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> éléments"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> éléments ou plus"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Paire d\'applications : <xliff:g id="APP1">%1$s</xliff:g> et <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index e0b0fe6..4394220 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Non se atoparon aplicacións que coincidan con \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplicación"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Todas as aplicacións"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista de aplicacións"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notificacións"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Mantén premido un atallo para movelo."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Toca dúas veces un atallo e manteno premido para movelo ou utiliza accións personalizadas."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"O cartafol cambiou o nome a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Cartafol: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementos"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Cartafol: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementos ou máis"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Emparellamento de aplicacións: <xliff:g id="APP1">%1$s</xliff:g> e <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estilo e fondo de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 5c8c2b1..4a23a7c 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી"</string>
<string name="label_application" msgid="8531721983832654978">"ઍપ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"બધી ઍપ"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ઍપની સૂચિ"</string>
<string name="notifications_header" msgid="1404149926117359025">"નોટિફિકેશન"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"શૉર્ટકટ ખસેડવા ટચ કરીને થોડી વાર દબાવી રાખો."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"શૉર્ટકટ ખસેડવા બે વાર ટૅપ કરીને દબાવી રાખો અથવા કસ્ટમ ક્રિયાઓનો ઉપયોગ કરો."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ફોલ્ડરનું નામ બદલીને <xliff:g id="NAME">%1$s</xliff:g> કર્યું"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ફોલ્ડર: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> આઇટમ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ફોલ્ડર: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> કે વધુ આઇટમ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ઍપની જોડી: <xliff:g id="APP1">%1$s</xliff:g> અને <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"વૉલપેપર અને સ્ટાઇલ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"હોમ સ્ક્રીનમાં ફેરફાર કરો"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 856e6fa..bfe1e2c 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" से मिलता-जुलता कोई ऐप्लिकेशन नहीं मिला"</string>
<string name="label_application" msgid="8531721983832654978">"ऐप्लिकेशन"</string>
<string name="all_apps_label" msgid="5015784846527570951">"सभी ऐप्लिकेशन"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ऐप्लिकेशन की सूची"</string>
<string name="notifications_header" msgid="1404149926117359025">"सूचनाएं"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"किसी शॉर्टकट को एक से दूसरी जगह ले जाने के लिए, उसे दबाकर रखें."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"किसी शॉर्टकट को एक से दूसरी जगह ले जाने के लिए, उस पर दो बार टैप करके दबाकर रखें या पसंद के मुताबिक कार्रवाइयां इस्तेमाल करें."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"फ़ोल्डर का नाम बदलकर <xliff:g id="NAME">%1$s</xliff:g> किया गया"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"फ़ोल्डर: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> आइटम"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"फ़ोल्डर: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> या इससे ज़्यादा आइटम"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"साथ में इस्तेमाल किए जा सकने वाले ऐप्लिकेशन: <xliff:g id="APP1">%1$s</xliff:g> और <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर और स्टाइल"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन में बदलाव करें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 798f156..832203b 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nema aplikacija podudarnih s upitom \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Sve aplikacije"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Popis aplikacija"</string>
<string name="notifications_header" msgid="1404149926117359025">"Obavijesti"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Dodirnite i zadržite da biste premjestili prečac."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dvaput dodirnite i zadržite pritisak da biste premjestili prečac ili upotrijebite prilagođene radnje."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Mapa je preimenovana u <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> stavke"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ili više stavki"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Par aplikacija: <xliff:g id="APP1">%1$s</xliff:g> i <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi početni zaslon"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index e84f223..3c74b4d 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nem található alkalmazás a(z) „<xliff:g id="QUERY">%1$s</xliff:g>” lekérdezésre"</string>
<string name="label_application" msgid="8531721983832654978">"Alkalmazás"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Összes alkalmazás"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Alkalmazások listája"</string>
<string name="notifications_header" msgid="1404149926117359025">"Értesítések"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Tartsa lenyomva a parancsikont az áthelyezéshez."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Parancsikon áthelyezéséhez koppintson duplán, és tartsa nyomva az ujját, vagy használjon egyéni műveleteket."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"A mappa új neve: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elem"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> vagy több elem"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Alkalmazáspár: <xliff:g id="APP1">%1$s</xliff:g> és <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Háttérkép és stílus"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Kezdőképernyő szerkesztése"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 0df104a..da96e70 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"«<xliff:g id="QUERY">%1$s</xliff:g>» հարցմանը համապատասխանող հավելվածներ չեն գտնվել"</string>
<string name="label_application" msgid="8531721983832654978">"Հավելված"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Բոլոր հավելվածները"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Հավելվածների ցանկ"</string>
<string name="notifications_header" msgid="1404149926117359025">"Ծանուցումներ"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Հպեք և պահեք՝ դյուրանցում տեղափոխելու համար։"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Կրկնակի հպեք և պահեք՝ դյուրանցում տեղափոխելու համար, կամ օգտվեք հատուկ գործողություններից։"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Պանակը վերանվանվեց <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Պանակ՝ <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> տարր"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Պանակ՝ <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> կամ ավելի տարրեր"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Հավելվածների զույգ՝ <xliff:g id="APP1">%1$s</xliff:g> և <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Պաստառ և ոճ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Փոփոխել հիմնական էկրանը"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index c473a61..e2429f3 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Tidak ditemukan aplikasi yang cocok dengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplikasi"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Semua aplikasi"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Daftar aplikasi"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notifikasi"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Sentuh lama untuk memindahkan pintasan."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Ketuk dua kali & tahan untuk memindahkan pintasan atau gunakan tindakan khusus."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder diganti namanya menjadi <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> item"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> item atau lebih"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Pasangan aplikasi: <xliff:g id="APP1">%1$s</xliff:g> dan <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper & gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Layar Utama"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 9e0ffac..b028a5b 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Ekki fundust forrit sem samsvara „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
<string name="label_application" msgid="8531721983832654978">"Forrit"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Öll forrit"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Forritalisti"</string>
<string name="notifications_header" msgid="1404149926117359025">"Tilkynningar"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Haltu fingri á flýtileið til að færa hana."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Ýttu tvisvar og haltu fingri á flýtileið til að færa hana eða notaðu sérsniðnar aðgerðir."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Heiti möppu breytt í <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> atriði"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> eða fleiri atriði"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Forritapar: <xliff:g id="APP1">%1$s</xliff:g> og <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Veggfóður og stíll"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Breyta heimaskjá"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 9bba764..5567b8e 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -125,9 +125,11 @@
<string name="folder_renamed" msgid="1794088362165669656">"Nome della cartella sostituito con <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Cartella: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementi"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Cartella: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> o più elementi"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Coppia di app: <xliff:g id="APP1">%1$s</xliff:g> and <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Sfondo e stile"</string>
- <string name="edit_home_screen" msgid="8947858375782098427">"Modifica la schermata Home"</string>
+ <string name="edit_home_screen" msgid="8947858375782098427">"Modifica schermata Home"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Impostazioni schermata Home"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disattivata dall\'amministratore"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Consenti rotazione della schermata Home"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index d2942d9..4b0e42c 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"לא נמצאו אפליקציות התואמות ל-\"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"אפליקציה"</string>
<string name="all_apps_label" msgid="5015784846527570951">"כל האפליקציות"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"רשימת האפליקציות"</string>
<string name="notifications_header" msgid="1404149926117359025">"התראות"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"כדי להעביר קיצור דרך למקום אחר יש לגעת ולא להרפות."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"כדי להעביר קיצור דרך למקום אחר או להשתמש בפעולות מותאמות אישית\' יש ללחוץ פעמיים ולא להרפות."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"שם התיקייה שונה ל-<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"תיקייה: <xliff:g id="NAME">%1$s</xliff:g>, מספר הפריטים: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"תיקייה: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> פריטים או יותר"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"צמד אפליקציות: <xliff:g id="APP1">%1$s</xliff:g> ו-<xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"טפט וסגנון"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"עריכה של מסך הבית"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9c40784..7caa8d3 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"「<xliff:g id="QUERY">%1$s</xliff:g>」に一致するアプリは見つかりませんでした"</string>
<string name="label_application" msgid="8531721983832654978">"アプリ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"すべてのアプリ"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"アプリ一覧"</string>
<string name="notifications_header" msgid="1404149926117359025">"通知"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"長押ししてショートカットを移動してください。"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ショートカットをダブルタップして長押ししながら移動するか、カスタム操作を使用してください。"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"フォルダの名前を「<xliff:g id="NAME">%1$s</xliff:g>」に変更しました"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"フォルダ: <xliff:g id="NAME">%1$s</xliff:g>、<xliff:g id="SIZE">%2$d</xliff:g> 件のアイテム"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"フォルダ: <xliff:g id="NAME">%1$s</xliff:g>、<xliff:g id="SIZE">%2$d</xliff:g> 件以上のアイテム"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"アプリのペア設定: <xliff:g id="APP1">%1$s</xliff:g> と <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"壁紙とスタイル"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ホーム画面を編集"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 05252e1..7d97100 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"„<xliff:g id="QUERY">%1$s</xliff:g>“-ის თანხვედრი აპები არ მოიძებნა"</string>
<string name="label_application" msgid="8531721983832654978">"აპი"</string>
<string name="all_apps_label" msgid="5015784846527570951">"ყველა აპი"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"აპების სია"</string>
<string name="notifications_header" msgid="1404149926117359025">"შეტყობინებები"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"შეხებით აირჩიეთ და გეჭიროთ მალსახმობის გადასაადგილებლად."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ორმაგი შეხებით აირჩიეთ და გეჭიროთ მალსახმობის გადასაადგილებლად ან მორგებული მოქმედებების გამოსაყენებლად."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"საქაღალდეს შეეცვალა სახელი „<xliff:g id="NAME">%1$s</xliff:g>“-ად"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"საქაღალდე: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ერთეული"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"საქაღალდე: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ან მეტი ერთეული"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"აპთა წყვილი: <xliff:g id="APP1">%1$s</xliff:g> და <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ფონი და სტილი"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"მთავარი ეკრანის რედაქტირება"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 56fc008..a22aab0 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сұрауына сәйкес келетін қолданбалар жоқ"</string>
<string name="label_application" msgid="8531721983832654978">"Қолданба"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Барлық қолданба"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Қолданбалар тізімі"</string>
<string name="notifications_header" msgid="1404149926117359025">"Хабарландырулар"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Таңбашаны жылжыту үшін басып тұрыңыз."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Таңбашаны жылжыту үшін екі рет түртіңіз де, ұстап тұрыңыз немесе арнаулы әрекеттерді пайдаланыңыз."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Қалта атауы <xliff:g id="NAME">%1$s</xliff:g> болып өзгертілді"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Қалта: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> элемент бар"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Қалта: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> не одан көп элемент бар"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Қолданбаларды жұптау: <xliff:g id="APP1">%1$s</xliff:g> және <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тұсқағаз және стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Негізгі экранды өзгерту"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 2845d1c..d031e27 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"រកមិនឃើញកម្មវិធីដែលត្រូវគ្នាជាមួយ \"<xliff:g id="QUERY">%1$s</xliff:g>\" ទេ"</string>
<string name="label_application" msgid="8531721983832654978">"កម្មវិធី"</string>
<string name="all_apps_label" msgid="5015784846527570951">"កម្មវិធីទាំងអស់"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"បញ្ជីកម្មវិធី"</string>
<string name="notifications_header" msgid="1404149926117359025">"ការជូនដំណឹង"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ចុចឱ្យជាប់ដើម្បីផ្លាស់ទីផ្លូវកាត់។"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ចុចពីរដង រួចសង្កត់ឱ្យជាប់ ដើម្បីផ្លាស់ទីផ្លូវកាត់ ឬប្រើសកម្មភាពតាមបំណង។"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"បានប្ដូរឈ្មោះថតជា <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ថត៖ <xliff:g id="NAME">%1$s</xliff:g>, ធាតុ <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ថត៖ <xliff:g id="NAME">%1$s</xliff:g>, ធាតុ <xliff:g id="SIZE">%2$d</xliff:g> ឬច្រើនជាងនេះ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"គូកម្មវិធី៖ <xliff:g id="APP1">%1$s</xliff:g> និង <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ផ្ទាំងរូបភាព និងរចនាបថ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"កែអេក្រង់ដើម"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 14f5968..91969b0 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ"</string>
<string name="label_application" msgid="8531721983832654978">"ಆ್ಯಪ್"</string>
<string name="all_apps_label" msgid="5015784846527570951">"ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ಆ್ಯಪ್ಗಳ ಪಟ್ಟಿ"</string>
<string name="notifications_header" msgid="1404149926117359025">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ಶಾರ್ಟ್ಕಟ್ ಸರಿಸಲು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ಶಾರ್ಟ್ಕಟ್ ಸರಿಸಲು ಅಥವಾ ಕಸ್ಟಮ್ ಕ್ರಿಯೆಗಳನ್ನು ಬಳಸಲು ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ಫೋಲ್ಡರ್ ಅನ್ನು <xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಮರುಹೆಸರಿಸಲಾಗಿದೆ"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ಫೋಲ್ಡರ್: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ಐಟಂಗಳು"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ಫೋಲ್ಡರ್: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ಅಥವಾ ಹೆಚ್ಚಿನ ಐಟಂಗಳು"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ಆ್ಯಪ್ ಜೋಡಿ: <xliff:g id="APP1">%1$s</xliff:g> ಮತ್ತು <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ವಾಲ್ಪೇಪರ್ ಮತ್ತು ಶೈಲಿ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 00827ca..86ced7f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\'<xliff:g id="QUERY">%1$s</xliff:g>\'과(와) 일치하는 앱이 없습니다."</string>
<string name="label_application" msgid="8531721983832654978">"앱"</string>
<string name="all_apps_label" msgid="5015784846527570951">"모든 앱"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"앱 목록"</string>
<string name="notifications_header" msgid="1404149926117359025">"알림"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"길게 터치하여 바로가기를 이동하세요."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"두 번 탭한 다음 길게 터치하여 바로가기를 이동하거나 맞춤 작업을 사용하세요."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"폴더 이름 변경: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"폴더: <xliff:g id="NAME">%1$s</xliff:g>, 항목 <xliff:g id="SIZE">%2$d</xliff:g>개"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"폴더: <xliff:g id="NAME">%1$s</xliff:g>, 항목 <xliff:g id="SIZE">%2$d</xliff:g>개 이상"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"앱 페어링: <xliff:g id="APP1">%1$s</xliff:g> 및 <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"배경화면 및 스타일"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"홈 화면 수정"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index bd95a2d..8bc1404 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сурамына дал келген колдонмолор табылган жок"</string>
<string name="label_application" msgid="8531721983832654978">"Колдонмо"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Бардык колдонмолор"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Колдонмолор тизмеси"</string>
<string name="notifications_header" msgid="1404149926117359025">"Билдирмелер"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Ыкчам баскычты жылдыруу үчүн коё бербей басып туруңуз."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Ыкчам баскычты жылдыруу үчүн эки жолу таптап, кармап туруңуз же ыңгайлаштырылган аракеттерди колдонуңуз."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Фолдердин аты <xliff:g id="NAME">%1$s</xliff:g> деп өзгөртүлдү"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"<xliff:g id="NAME">%1$s</xliff:g> папкасындагы объекттер: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"<xliff:g id="NAME">%1$s</xliff:g> папкасындагы объекттер: <xliff:g id="SIZE">%2$d</xliff:g> же андан көбүрөөк"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Эки колдонмону бир маалда пайдалануу: <xliff:g id="APP1">%1$s</xliff:g> жана <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тушкагаз жана стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Башкы экранды түзөтүү"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 9b0971d..a493800 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"ບໍ່ພົບແອັບທີ່ກົງກັບ \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"ແອັບ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"ແອັບທັງໝົດ"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ລາຍຊື່ແອັບ"</string>
<string name="notifications_header" msgid="1404149926117359025">"ການແຈ້ງເຕືອນ"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ແຕະຄ້າງໄວ້ເພື່ອຍ້າຍທາງລັດ."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ແຕະສອງເທື່ອຄ້າງໄວ້ເພື່ອຍ້າຍທາງລັດ ຫຼື ໃຊ້ຄຳສັ່ງກຳນົດເອງ."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ປ່ຽນຊື່ໂຟນເດີເປັນ <xliff:g id="NAME">%1$s</xliff:g> ແລ້ວ"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ໂຟນເດີ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ລາຍການ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ໂຟນເດີ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ຫຼື ລາຍການເພີ່ມເຕີມ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ຈັບຄູ່ແອັບ: <xliff:g id="APP1">%1$s</xliff:g> ແລະ <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ຮູບພື້ນຫຼັງ ແລະ ຮູບແບບ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ແກ້ໄຂໂຮມສະກຣີນ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 4738e26..2583586 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nerasta jokių užklausą „<xliff:g id="QUERY">%1$s</xliff:g>“ atitinkančių programų"</string>
<string name="label_application" msgid="8531721983832654978">"Programa"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Visos programos"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Programų sąrašas"</string>
<string name="notifications_header" msgid="1404149926117359025">"Pranešimai"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Dukart pal. ir palaik., kad perk. spart. klavišą."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dukart palieskite ir palaikykite, kad perkeltumėte spartųjį klavišą ar naudotumėte tinkintus veiksmus."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Aplankas pervardytas kaip „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Aplankas: „<xliff:g id="NAME">%1$s</xliff:g>“, elementų: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Aplankas: „<xliff:g id="NAME">%1$s</xliff:g>“, elementų: <xliff:g id="SIZE">%2$d</xliff:g> ar daugiau"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Programų pora: „<xliff:g id="APP1">%1$s</xliff:g>“ ir „<xliff:g id="APP2">%2$s</xliff:g>“"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ekrano fonas ir stilius"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redaguoti pagrindinį ekraną"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 7e6276d..ccb9459 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Vaicājumam “<xliff:g id="QUERY">%1$s</xliff:g>” neatbilda neviena lietotne"</string>
<string name="label_application" msgid="8531721983832654978">"Lietotne"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Visas lietotnes"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lietotņu saraksts"</string>
<string name="notifications_header" msgid="1404149926117359025">"Paziņojumi"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Lai pārvietotu saīsni, pieskarieties un turiet."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Lai pārvietotu saīsni, uz tās veiciet dubultskārienu un turiet. Varat arī veikt pielāgotas darbības."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Mape pārdēvēta par: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mape <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> vienumi"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mape <xliff:g id="NAME">%1$s</xliff:g>, vienumu skaits mapē: vismaz <xliff:g id="SIZE">%2$d</xliff:g>"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Lietotņu pāris: <xliff:g id="APP1">%1$s</xliff:g> un <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fona tapete un stils"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Rediģēt sākuma ekrānu"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 9e8f464..b7b72f0 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Не се најдени апликации што одговараат на „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
<string name="label_application" msgid="8531721983832654978">"Апликација"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Сите апликации"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Список со апликации"</string>
<string name="notifications_header" msgid="1404149926117359025">"Известувања"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Допрете и задржете за да преместите кратенка."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Допрете двапати и задржете за да преместите кратенка или користете приспособени дејства."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Папката е преименувана во <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Папка: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ставки"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Папка: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> или повеќе ставки"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Пар апликации: <xliff:g id="APP1">%1$s</xliff:g> и <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тапет и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Изменете го почетниот екран"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index a770603..dc533ec 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പുകളൊന്നും കണ്ടെത്തിയില്ല"</string>
<string name="label_application" msgid="8531721983832654978">"ആപ്പ്"</string>
<string name="all_apps_label" msgid="5015784846527570951">"എല്ലാ ആപ്പുകളും"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ആപ്പുകളുടെ ലിസ്റ്റ്"</string>
<string name="notifications_header" msgid="1404149926117359025">"അറിയിപ്പുകൾ"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"കുറുക്കുവഴി നീക്കാൻ സ്പർശിച്ച് പിടിക്കുക."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"കുറുക്കുവഴി നീക്കാൻ ഡബിൾ ടാപ്പ് ചെയ്യൂ, ഹോൾഡ് ചെയ്യൂ അല്ലെങ്കിൽ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കൂ."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ഫോൾഡറിന്റെ പേര് <xliff:g id="NAME">%1$s</xliff:g> എന്നായി മാറ്റി"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ഫോൾഡർ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ഇനങ്ങൾ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ഫോൾഡർ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> അല്ലെങ്കിൽ അതിലധികം ഇനങ്ങൾ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ആപ്പ് ജോടി: <xliff:g id="APP1">%1$s</xliff:g>, <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"വാൾപേപ്പറും സ്റ്റൈലും"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ഹോം സ്ക്രീൻ എഡിറ്റ് ചെയ്യുക"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 5c01ca5..3c5d6c0 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"-д тохирох апп олдсонгүй"</string>
<string name="label_application" msgid="8531721983832654978">"Апп"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Бүх апп"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Аппын жагсаалт"</string>
<string name="notifications_header" msgid="1404149926117359025">"Мэдэгдэл"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Товчлолыг зөөхийн тулд хүрээд, удаан дарна уу."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Товчлолыг зөөх эсвэл захиалгат үйлдлийг ашиглахын тулд хоёр товшоод, удаан дарна уу."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Фолдерын нэр <xliff:g id="NAME">%1$s</xliff:g> болов"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> зүйл"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> эсвэл үүнээс олон зүйл"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Апп хослуулалт: <xliff:g id="APP1">%1$s</xliff:g> болон <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Дэлгэцийн зураг, загвар"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Үндсэн нүүрийг засах"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index ca7d3f9..a60ef67 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत"</string>
<string name="label_application" msgid="8531721983832654978">"ॲप"</string>
<string name="all_apps_label" msgid="5015784846527570951">"सर्व अॅप्स"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"अॅप्स सूची"</string>
<string name="notifications_header" msgid="1404149926117359025">"सूचना"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"शॉर्टकट हलवण्यासाठी स्पर्श करा आणि धरून ठेवा."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"शॉर्टकट हलवण्यासाठी किंवा कस्टम कृती वापरण्यासाठी दोनदा टॅप करा आणि धरून ठेवा."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"फोल्डरचे नाव बदलून <xliff:g id="NAME">%1$s</xliff:g> असे ठेवले"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> आयटम"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> किंवा त्याहून अधिक आयटम"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ॲपची जोडी: <xliff:g id="APP1">%1$s</xliff:g> आणि <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर आणि शैली"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन संपादित करा"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 77563ae..571916d 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Tiada apl yang ditemui sepadan dengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Apl"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Semua apl"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Senarai apl"</string>
<string name="notifications_header" msgid="1404149926117359025">"Pemberitahuan"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Sentuh & tahan untuk menggerakkan pintasan."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Ketik dua kali & tahan untuk menggerakkan pintasan atau menggunakan tindakan tersuai."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folder dinamakan semula kepada <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> item"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> atau lebih banyak item"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Gandingan apl: <xliff:g id="APP1">%1$s</xliff:g> dan <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hiasan latar & gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Skrin Utama"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 720bc7a..3a5c195 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" နှင့်ကိုက်ညီသည့် အပ်ပ်များကို မတွေ့ပါ"</string>
<string name="label_application" msgid="8531721983832654978">"အက်ပ်"</string>
<string name="all_apps_label" msgid="5015784846527570951">"အက်ပ်အားလုံး"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"အက်ပ်စာရင်း"</string>
<string name="notifications_header" msgid="1404149926117359025">"အကြောင်းကြားချက်များ"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ဖြတ်လမ်းလင့်ခ်ကို ရွှေ့ရန် နှစ်ချက်တို့ပြီး ဖိထားပါ။"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ဖြတ်လမ်းလင့်ခ်ကို ရွှေ့ရန် (သို့) စိတ်ကြိုက်လုပ်ဆောင်ချက်များကို သုံးရန် နှစ်ချက်တို့ပြီး ဖိထားပါ။"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ပြောင်းလဲလိုက်သော အကန့်အမည် <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ဖိုင်တွဲ - <xliff:g id="NAME">%1$s</xliff:g>၊ <xliff:g id="SIZE">%2$d</xliff:g> ဖိုင်များ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ဖိုင်တွဲ - <xliff:g id="NAME">%1$s</xliff:g>၊ <xliff:g id="SIZE">%2$d</xliff:g> သို့မဟုတ် နောက်ထပ်ဖိုင်များ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"အက်ပ်တွဲချိတ်ခြင်း- <xliff:g id="APP1">%1$s</xliff:g> နှင့် <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"နောက်ခံနှင့် ပုံစံ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ပင်မစာမျက်နှာ တည်းဖြတ်ရန်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d7804f4..7cec476 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Fant ingen apper som samsvarer med «<xliff:g id="QUERY">%1$s</xliff:g>»"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alle apper"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Appliste"</string>
<string name="notifications_header" msgid="1404149926117359025">"Varsler"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Trykk og hold for å flytte en snarvei."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dobbelttrykk og hold for å flytte en snarvei eller bruke tilpassede handlinger."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Mappen heter nå <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementer"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> eller flere elementer"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Apptilkobling: <xliff:g id="APP1">%1$s</xliff:g> og <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrunn og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Endre startsiden"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index acdd005..97ad23c 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" सँग मिल्दो कुनै एप भेटिएन"</string>
<string name="label_application" msgid="8531721983832654978">"एप"</string>
<string name="all_apps_label" msgid="5015784846527570951">"सबै एप"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"एपहरूको सूची"</string>
<string name="notifications_header" msgid="1404149926117359025">"सूचनाहरू"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"कुनै सर्टकट सार्न डबल ट्याप गरेर छोइराख्नुहोस्।"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"कुनै सर्टकट सार्न वा आफ्नो रोजाइका कारबाही प्रयोग गर्न डबल ट्याप गरेर छोइराख्नुहोस्।"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"फोल्डर <xliff:g id="NAME">%1$s</xliff:g> मा पुनःनामाकरण गरियो।"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> वस्तुहरू"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"फोल्डर: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> वा सोभन्दा बढी वस्तुहरू"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"एप पेयर: <xliff:g id="APP1">%1$s</xliff:g> र <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वालपेपर तथा शैली"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रिन बदल्नुहोस्"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index dee17f0..89afdcc 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Er zijn geen apps gevonden die overeenkomen met \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alle apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lijst met apps"</string>
<string name="notifications_header" msgid="1404149926117359025">"Meldingen"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Tik en houd vast om een snelkoppeling te verplaatsen."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dubbeltik en houd vast om een snelkoppeling te verplaatsen of aangepaste acties te gebruiken."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"De naam van de map is gewijzigd in <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Map: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> items"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Map: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> of meer items"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"App-paar: <xliff:g id="APP1">%1$s</xliff:g> en <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Achtergrond en stijl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startscherm bewerken"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 2652454..1859ba3 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ସହିତ ମେଳ ହେଉଥିବା କୌଣସି ଆପ୍ ମିଳିଲା ନାହିଁ"</string>
<string name="label_application" msgid="8531721983832654978">"ଆପ୍"</string>
<string name="all_apps_label" msgid="5015784846527570951">"ସବୁ ଆପ"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ଆପ୍ସ ତାଲିକା"</string>
<string name="notifications_header" msgid="1404149926117359025">"ବିଜ୍ଞପ୍ତି"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ଏକ ସର୍ଟକଟକୁ ମୁଭ୍ କରିବା ପାଇଁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ।"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ଏକ ସର୍ଟକଟକୁ ମୁଭ୍ କରିବା ପାଇଁ ଦୁଇଥର-ଟାପ୍ କରି ଧରି ରଖନ୍ତୁ କିମ୍ବା କଷ୍ଟମ୍ କାର୍ଯ୍ୟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ଫୋଲ୍ଡରର ନାମ <xliff:g id="NAME">%1$s</xliff:g>କୁ ବଦଳାଗଲା"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ଫୋଲ୍ଡର୍: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ଆଇଟମଗୁଡ଼ିକ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ଫୋଲ୍ଡର୍: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> କିମ୍ବା ଅଧିକ ଆଇଟମ୍"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ଆପ ପେୟାର: <xliff:g id="APP1">%1$s</xliff:g> ଏବଂ <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ୱାଲପେପର ଏବଂ ଷ୍ଟାଇଲ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ହୋମ ସ୍କ୍ରିନକୁ ଏଡିଟ କରନ୍ତୁ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index f2a5e27..48bad2e 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ਨਾਲ ਮੇਲ ਖਾਂਦੀਆਂ ਕੋਈ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ"</string>
<string name="label_application" msgid="8531721983832654978">"ਐਪ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"ਸਾਰੀਆਂ ਐਪਾਂ"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ਐਪਾਂ ਦੀ ਸੂਚੀ"</string>
<string name="notifications_header" msgid="1404149926117359025">"ਸੂਚਨਾਵਾਂ"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ਕਿਸੇ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਲਿਜਾਉਣ ਲਈ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ਕਿਸੇ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਲਿਜਾਉਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ ਜਾਂ ਵਿਉਂਤੀਆਂ ਕਾਰਵਾਈਆਂ ਵਰਤੋ।"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ਫੋਲਡਰ ਨੂੰ <xliff:g id="NAME">%1$s</xliff:g> ਮੁੜ ਨਾਮ ਦਿੱਤਾ ਗਿਆ"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ਫੋਲਡਰ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ਆਈਟਮਾਂ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ਫੋਲਡਰ: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ਜਾਂ ਹੋਰ ਆਈਟਮਾਂ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ਐਪ ਜੋੜਾਬੱਧ: <xliff:g id="APP1">%1$s</xliff:g> ਅਤੇ <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ਵਾਲਪੇਪਰ ਅਤੇ ਸਟਾਈਲ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ਹੋਮ ਸਕ੍ਰੀਨ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7e1e844..2422acb 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nie znaleziono aplikacji pasujących do zapytania „<xliff:g id="QUERY">%1$s</xliff:g>”"</string>
<string name="label_application" msgid="8531721983832654978">"Aplikacja"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Wszystkie aplikacje"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista aplikacji"</string>
<string name="notifications_header" msgid="1404149926117359025">"Powiadomienia"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Naciśnij i przytrzymaj, aby przenieść skrót."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Naciśnij dwukrotnie i przytrzymaj, aby przenieść skrót lub użyć działań niestandardowych."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Nazwa folderu zmieniona na <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elementy"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, liczba elementów: <xliff:g id="SIZE">%2$d</xliff:g> lub więcej"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Para aplikacji: <xliff:g id="APP1">%1$s</xliff:g> oraz <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta i styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edytuj ekran główny"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 368518f..0e62d5f 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -125,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Nome de pasta alterado para <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> itens"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ou mais itens"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Par de apps: <xliff:g id="APP1">%1$s</xliff:g> e <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagem fundo/estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar ecrã principal"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 0a6c3f6..1ec575c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nenhum app encontrado que corresponda a \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Todos os apps"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista de apps"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notificações"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Toque e mantenha a tela pressionada para mover um atalho."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Toque duas vezes e mantenha a tela pressionada para mover um atalho ou usar ações personalizadas."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Pasta renomeada para <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> itens"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ou mais itens"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Par de apps: <xliff:g id="APP1">%1$s</xliff:g> e <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Plano de fundo e estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar tela inicial"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index cf78f2c..1741157 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nu s-a găsit nicio aplicație pentru „<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplicație"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Toate aplicațiile"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Listă de aplicații"</string>
<string name="notifications_header" msgid="1404149926117359025">"Notificări"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Atinge și ține apăsat ca să muți comanda rapidă."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Atinge de două ori și ține apăsat pentru a muta o comandă rapidă sau folosește acțiuni personalizate."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Dosar redenumit <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Dosar: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> elemente"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Dosar: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> sau mai multe elemente"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Pereche de aplicații: <xliff:g id="APP1">%1$s</xliff:g> și <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagine de fundal și stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editează ecranul de pornire"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2fdc42f..0ea1595 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"По запросу \"<xliff:g id="QUERY">%1$s</xliff:g>\" ничего не найдено"</string>
<string name="label_application" msgid="8531721983832654978">"Приложение"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Все приложения"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Список приложений"</string>
<string name="notifications_header" msgid="1404149926117359025">"Уведомления"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Нажмите и удерживайте для переноса ярлыка."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Чтобы использовать специальные действия или перенести ярлык, нажмите на него дважды и удерживайте."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Папка переименована в \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Папка \"<xliff:g id="NAME">%1$s</xliff:g>\" (объектов: <xliff:g id="SIZE">%2$d</xliff:g>)"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Папка \"<xliff:g id="NAME">%1$s</xliff:g>\" (объектов: <xliff:g id="SIZE">%2$d</xliff:g> или больше)"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Одновременное использование двух приложений: <xliff:g id="APP1">%1$s</xliff:g> и <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Обои и стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Изменить главный экран"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 0f6f45a..7d17d94 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" සමග ගැළපෙන යෙදුම් හමු නොවිණි"</string>
<string name="label_application" msgid="8531721983832654978">"යෙදුම"</string>
<string name="all_apps_label" msgid="5015784846527570951">"සියලු යෙදුම්"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"යෙදුම් ලැයිස්තුව"</string>
<string name="notifications_header" msgid="1404149926117359025">"දැනුම්දීම්"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"කෙටි මගක් ගෙන යාමට ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"කෙටි මගක් ගෙන යාමට හෝ අභිරුචි ක්රියා භාවිත කිරීමට දෙවරක් තට්ටු කර අල්ලා ගෙන සිටින්න."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"<xliff:g id="NAME">%1$s</xliff:g> වෙත ෆෝල්ඩරය නැවත නම් කෙරිණි"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ෆෝල්ඩරය: <xliff:g id="NAME">%1$s</xliff:g>, අයිතම <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ෆෝල්ඩර: <xliff:g id="NAME">%1$s</xliff:g>, අයිතම <xliff:g id="SIZE">%2$d</xliff:g>ක් හෝ වැඩි ගණනක්"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"යෙදුම් යුගල: <xliff:g id="APP1">%1$s</xliff:g> සහ <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"වෝල්පේපරය සහ මෝස්තරය"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"මුල් තිරය සංස්කරණය කරන්න"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index ad15a17..1b54613 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nenašli sa žiadne aplikácie zodpovedajúce dopytu <xliff:g id="QUERY">%1$s</xliff:g>"</string>
<string name="label_application" msgid="8531721983832654978">"Aplikácia"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Všetky aplikácie"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Zoznam aplikácií"</string>
<string name="notifications_header" msgid="1404149926117359025">"Upozornenia"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Pridržaním presuňte skratku."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dvojitým klepnutím a pridržaním presuňte odkaz alebo použite vlastné akcie."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Priečinok bol premenovaný na <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Priečinok: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> položky"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Priečinok: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> alebo viac položiek"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Pár aplikácií: <xliff:g id="APP1">%1$s</xliff:g> a <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta a štýl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upraviť plochu"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 25592d0..6983baf 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Ni aplikacij, ki bi ustrezale poizvedbi »<xliff:g id="QUERY">%1$s</xliff:g>«"</string>
<string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Vse aplikacije"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Seznam aplikacij"</string>
<string name="notifications_header" msgid="1404149926117359025">"Obvestila"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Pridržite bližnjico, da jo premaknete."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Dvakrat se dotaknite bližnjice in jo pridržite, da jo premaknete, ali pa uporabite dejanja po meri."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Mapa je preimenovana v <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>, št. elementov: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ali več elementov"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Par aplikacij: <xliff:g id="APP1">%1$s</xliff:g> in <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Zaslonsko ozadje in slog"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Urejanje začetnega zaslona"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 7db0080..0aea763 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Nuk u gjet asnjë aplikacion që përputhet me \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Aplikacioni"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Të gjitha aplikacionet"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Lista e aplikacioneve"</string>
<string name="notifications_header" msgid="1404149926117359025">"Njoftimet"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Prek dhe mbaj shtypur një shkurtore për ta zhvendosur."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Trokit dy herë dhe mbaje shtypur një shkurtore për ta zhvendosur atë ose për të përdorur veprimet e personalizuara."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Dosja u riemërtua në <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Dosja: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> artikuj"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Dosja: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ose më shumë artikuj"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Çifti i aplikacioneve: <xliff:g id="APP1">%1$s</xliff:g> dhe <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imazhi i sfondit dhe stili"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifiko ekranin bazë"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 72caf91..fe3e12f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Није пронађена ниједна апликација за „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
<string name="label_application" msgid="8531721983832654978">"Апликација"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Све апликације"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Листа апликација"</string>
<string name="notifications_header" msgid="1404149926117359025">"Обавештења"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Додирните и задржите ради померања пречице."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Двапут додирните и задржите да бисте померали пречицу или користите прилагођене радње."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Фолдер је преименован у <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ставке"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> или више ставки"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Пар апликација: <xliff:g id="APP1">%1$s</xliff:g> и <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Позадина и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Измени почетни екран"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index ea954b7..e95e361 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Inga appar som matchar <xliff:g id="QUERY">%1$s</xliff:g> hittades"</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alla appar"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Applista"</string>
<string name="notifications_header" msgid="1404149926117359025">"Aviseringar"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Tryck länge för att flytta en genväg."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Tryck snabbt två gånger och håll kvar för att flytta en genväg eller använda anpassade åtgärder."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Mappen har bytt namn till <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Mapp: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> objekt"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Mapp: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> eller fler objekt"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Appar som ska användas tillsammans: <xliff:g id="APP1">%1$s</xliff:g> och <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrund och utseende"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redigera startskärm"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 2a8f423..ef7d18e 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Haikupata programu zozote zinazolingana na \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Programu"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Programu zote"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Orodha ya programu"</string>
<string name="notifications_header" msgid="1404149926117359025">"Arifa"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Gusa na ushikilie ili usogeze njia ya mkato."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Gusa mara mbili na ushikilie ili usogeze njia ya mkato au utumie vitendo maalum."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Folda imebadilishwa jina kuwa <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folda: <xliff:g id="NAME">%1$s</xliff:g>, vipengee <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folda: <xliff:g id="NAME">%1$s</xliff:g>, vipengee <xliff:g id="SIZE">%2$d</xliff:g> au zaidi"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Jozi ya programu: <xliff:g id="APP1">%1$s</xliff:g> na <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Mandhari na mtindo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Badilisha Skrini ya Kwanza"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index aea175a..c10398d 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" உடன் பொருந்தும் ஆப்ஸ் இல்லை"</string>
<string name="label_application" msgid="8531721983832654978">"ஆப்ஸ்"</string>
<string name="all_apps_label" msgid="5015784846527570951">"அனைத்து ஆப்ஸும்"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ஆப்ஸ் பட்டியல்"</string>
<string name="notifications_header" msgid="1404149926117359025">"அறிவிப்புகள்"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"ஷார்ட்கட்டை நகர்த்தத் தொட்டுப் பிடிக்கவும்."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"ஷார்ட்கட்டை நகர்த்த இருமுறை தட்டிப் பிடிக்கவும் அல்லது பிரத்தியேகச் செயல்களைப் பயன்படுத்தவும்."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ஃபோல்டர் <xliff:g id="NAME">%1$s</xliff:g> என மறுபெயரிடப்பட்டது"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ஃபோல்டர்: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ஃபைல்கள்"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ஃபோல்டர்: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> அல்லது அதற்கு அதிகமான ஃபைல்கள்"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ஆப்ஸ் ஜோடி: <xliff:g id="APP1">%1$s</xliff:g> மற்றும் <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"வால்பேப்பர் & ஸ்டைல்"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"முகப்புத் திரையில் மாற்று"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 777be5b..7cf981c 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"కి మ్యాచ్ అయ్యే అప్లికేషన్లేవీ కనుగొనబడలేదు"</string>
<string name="label_application" msgid="8531721983832654978">"యాప్"</string>
<string name="all_apps_label" msgid="5015784846527570951">"అన్ని యాప్లు"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"యాప్ల లిస్ట్"</string>
<string name="notifications_header" msgid="1404149926117359025">"నోటిఫికేషన్లు"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"షార్ట్కట్ను తరలించడానికి తాకి & నొక్కి ఉంచు."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"షార్ట్కట్ను తరలించడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కండి & హోల్డ్ చేయండి."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"ఫోల్డర్ పేరు <xliff:g id="NAME">%1$s</xliff:g>గా మార్చబడింది"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"ఫోల్డర్: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ఐటెమ్లు"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"ఫోల్డర్: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> లేదా అంతకంటే ఎక్కువ ఐటెమ్లు"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"యాప్ పెయిర్: <xliff:g id="APP1">%1$s</xliff:g>, <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"వాల్పేపర్ & స్టయిల్"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"మొదటి స్క్రీన్ను ఎడిట్ చేయండి"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 85e448f..e7f63bb 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"ไม่พบแอปที่ตรงกับ \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"แอป"</string>
<string name="all_apps_label" msgid="5015784846527570951">"แอปทั้งหมด"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"รายชื่อแอป"</string>
<string name="notifications_header" msgid="1404149926117359025">"การแจ้งเตือน"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"แตะค้างไว้เพื่อย้ายทางลัด"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"แตะสองครั้งค้างไว้เพื่อย้ายทางลัดหรือใช้การดำเนินการที่กำหนดเอง"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"เปลี่ยนชื่อโฟลเดอร์เป็น <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"โฟลเดอร์: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> รายการ"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"โฟลเดอร์: <xliff:g id="NAME">%1$s</xliff:g>, อย่างน้อย <xliff:g id="SIZE">%2$d</xliff:g> รายการ"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"คู่แอป: <xliff:g id="APP1">%1$s</xliff:g> และ <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"วอลเปเปอร์และสไตล์"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"แก้ไขหน้าจอหลัก"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index afcef90..758f786 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Walang nahanap na app na tumutugma sa \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Lahat ng app"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Listahan ng mga app"</string>
<string name="notifications_header" msgid="1404149926117359025">"Mga Notification"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Pindutin nang matagal para ilipat ang shortcut."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"I-double tap at pindutin nang matagal para ilipat ang shortcut o gumamit ng mga custom na pagkilos."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Pinalitan ang pangalan ng folder ng <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> (na) item"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> o higit pang item"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Pares ng app: <xliff:g id="APP1">%1$s</xliff:g> at <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper & istilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"I-edit ang Home Screen"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 49c8755..912738e 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ile eşleşen uygulama bulunamadı"</string>
<string name="label_application" msgid="8531721983832654978">"Uygulama"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Tüm uygulamalar"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Uygulama listesi"</string>
<string name="notifications_header" msgid="1404149926117359025">"Bildirimler"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Kısayolu taşımak için dokunup basılı tutun."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Kısayolu taşımak veya özel işlemleri kullanmak için iki kez dokunup basılı tutun."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Klasörün adı <xliff:g id="NAME">%1$s</xliff:g> olarak değiştirildi"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Klasör: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> öğe"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Klasör: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> veya daha fazla öğe"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Uygulama çifti: <xliff:g id="APP1">%1$s</xliff:g> ve <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Duvar kağıdı ve stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Ana ekranı düzenleyin"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 2d0d364..4d810d6 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Немає додатків для запиту \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Додаток"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Усі додатки"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Список додатків"</string>
<string name="notifications_header" msgid="1404149926117359025">"Сповіщення"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Натисніть і втримуйте, щоб перемістити ярлик."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Двічі натисніть і втримуйте ярлик, щоб перемістити його або виконати інші дії."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Папку перейменовано на <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Папка \"<xliff:g id="NAME">%1$s</xliff:g>\", елементів: <xliff:g id="SIZE">%2$d</xliff:g>"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Папка \"<xliff:g id="NAME">%1$s</xliff:g>\", елементів: <xliff:g id="SIZE">%2$d</xliff:g> або більше"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Одночасне використання двох додатків: <xliff:g id="APP1">%1$s</xliff:g> і <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Оформлення й стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Редагувати головний екран"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 73b8ad4..603088b 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" سے مماثل کوئی ایپس نہیں ملیں"</string>
<string name="label_application" msgid="8531721983832654978">"ایپ"</string>
<string name="all_apps_label" msgid="5015784846527570951">"سبھی ایپس"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"ایپس کی فہرست"</string>
<string name="notifications_header" msgid="1404149926117359025">"اطلاعات"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"شارٹ کٹ منتقل کرنے کیلیے ٹچ کریں اور پکڑ کر رکھیں۔"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"شارٹ کٹ کو منتقل کرنے یا حسب ضرورت کارروائیاں استعمال کرنے کے لیے دوبار تھپتھپائیں اور پکڑ کر رکھیں۔"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"فولڈر کا نام تبدیل کر کے <xliff:g id="NAME">%1$s</xliff:g> کر دیا گیا"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"فولڈر: <xliff:g id="NAME">%1$s</xliff:g>، <xliff:g id="SIZE">%2$d</xliff:g> آئٹمز"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"فولڈر: <xliff:g id="NAME">%1$s</xliff:g>، <xliff:g id="SIZE">%2$d</xliff:g> یا مزید آئٹمز"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"ایپس کا جوڑا: <xliff:g id="APP1">%1$s</xliff:g> اور <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"وال پیپر اور طرز"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ہوم اسکرین میں ترمیم کریں"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 6cbec3e..f1892b3 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"“<xliff:g id="QUERY">%1$s</xliff:g>” bilan mos hech qanday ilova topilmadi"</string>
<string name="label_application" msgid="8531721983832654978">"Ilova"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Barcha ilovalar"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Ilovalar roʻyxati"</string>
<string name="notifications_header" msgid="1404149926117359025">"Bildirishnomalar"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Yorliqni bosib turgan holatda suring."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Ikki marta bosing va yorliqni bosib turgan holatda suring yoki maxsus amaldan foydalaning."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Jild nomi <xliff:g id="NAME">%1$s</xliff:g>ga o‘zgartirildi"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Jild: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> fayllar"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Jild: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> va undan ortiq fayllar"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Ilovani juftlash: <xliff:g id="APP1">%1$s</xliff:g> va <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fon rasmi va uslubi"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Bosh ekranni tahrirlash"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index e3523f6..fb401c3 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Không tìm thấy ứng dụng nào phù hợp với \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Ứng dụng"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Tất cả ứng dụng"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Danh sách ứng dụng"</string>
<string name="notifications_header" msgid="1404149926117359025">"Thông báo"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Chạm và giữ để di chuyển một lối tắt."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Nhấn đúp và giữ để di chuyển một lối tắt hoặc sử dụng các thao tác tùy chỉnh."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Đã đổi tên thư mục thành <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> mục"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> mục trở lên"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Cặp ứng dụng: <xliff:g id="APP1">%1$s</xliff:g> và <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hình nền và phong cách"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Chỉnh sửa Màn hình chính"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 1dea916..1833c54 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"未找到与“<xliff:g id="QUERY">%1$s</xliff:g>”相符的应用"</string>
<string name="label_application" msgid="8531721983832654978">"应用"</string>
<string name="all_apps_label" msgid="5015784846527570951">"所有应用"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"应用列表"</string>
<string name="notifications_header" msgid="1404149926117359025">"通知"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"轻触并按住快捷方式即可移动该快捷方式。"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"点按两次并按住快捷方式即可移动该快捷方式或使用自定义操作。"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"已将文件夹重命名为“<xliff:g id="NAME">%1$s</xliff:g>”"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"文件夹:<xliff:g id="NAME">%1$s</xliff:g>,<xliff:g id="SIZE">%2$d</xliff:g> 个项目"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"文件夹:<xliff:g id="NAME">%1$s</xliff:g>,<xliff:g id="SIZE">%2$d</xliff:g> 个或更多项目"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"应用对:“<xliff:g id="APP1">%1$s</xliff:g>”和“<xliff:g id="APP2">%2$s</xliff:g>”"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"壁纸与个性化"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"修改主屏幕"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index ac6671d..7b6778e 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"找不到與「<xliff:g id="QUERY">%1$s</xliff:g>」相符的應用程式"</string>
<string name="label_application" msgid="8531721983832654978">"應用程式"</string>
<string name="all_apps_label" msgid="5015784846527570951">"所有應用程式"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"應用程式清單"</string>
<string name="notifications_header" msgid="1404149926117359025">"通知"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"輕觸並按住即可移動捷徑。"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"㩒兩下之後㩒住,就可以郁捷徑或者用自訂操作。"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"資料夾已重新命名為「<xliff:g id="NAME">%1$s</xliff:g>」"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>,<xliff:g id="SIZE">%2$d</xliff:g> 個項目"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>,<xliff:g id="SIZE">%2$d</xliff:g> 個或以上的項目"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"應用程式配對:<xliff:g id="APP1">%1$s</xliff:g> 和 <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"桌布和樣式"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"編輯主畫面"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 384ffef..67b9810 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"找不到與「<xliff:g id="QUERY">%1$s</xliff:g>」相符的應用程式"</string>
<string name="label_application" msgid="8531721983832654978">"應用程式"</string>
<string name="all_apps_label" msgid="5015784846527570951">"所有應用程式"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"應用程式清單"</string>
<string name="notifications_header" msgid="1404149926117359025">"通知"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"按住即可移動捷徑。"</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"輕觸兩下並按住即可移動捷徑或使用自訂操作。"</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"已將資料夾重新命名為「<xliff:g id="NAME">%1$s</xliff:g>」"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>,<xliff:g id="SIZE">%2$d</xliff:g> 個項目"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>,<xliff:g id="SIZE">%2$d</xliff:g> 個以上的項目"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"應用程式配對:「<xliff:g id="APP1">%1$s</xliff:g>」與「<xliff:g id="APP2">%2$s</xliff:g>」"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"桌布和樣式"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"編輯主畫面"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 3c68231..e6af3f1 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -82,8 +82,7 @@
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Azikho izinhlelo zokusebenza ezitholiwe ezifana ne-\"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
<string name="label_application" msgid="8531721983832654978">"Uhlelo lokusebenza"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Wonke ama-app"</string>
- <!-- no translation found for all_apps_list_label (5106226764073070906) -->
- <skip />
+ <string name="all_apps_list_label" msgid="5106226764073070906">"Uhlu lwama-app"</string>
<string name="notifications_header" msgid="1404149926117359025">"Izaziso"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Thinta uphinde ubambe ukuze uhambise isinqamuleli."</string>
<string name="long_accessible_way_to_add_shortcut" msgid="2199537273817090740">"Thepha kabili uphinde ubambe ukuze uhambise isinqamuleli noma usebenzise izenzo ezingokwezifiso."</string>
@@ -126,6 +125,8 @@
<string name="folder_renamed" msgid="1794088362165669656">"Ifolda iqanjwe kabusha ngo-<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="folder_name_format_exact" msgid="8626242716117004803">"Ifolda: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> izinto"</string>
<string name="folder_name_format_overflow" msgid="4270108890534995199">"Ifolda: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> noma izinto eziningi"</string>
+ <!-- no translation found for unnamed_folder (2420192029474044442) -->
+ <skip />
<string name="app_pair_name_format" msgid="8134106404716224054">"Ama-app abhangqwayo: I-<xliff:g id="APP1">%1$s</xliff:g> ne-<xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Isithombe sangemuva nesitayela"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Hlela Isikrini Sasekhaya"</string>
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index b8fdfe7..da73280 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -161,7 +161,7 @@
};
private final MultiTranslateDelegate mTranslateDelegate = new MultiTranslateDelegate(this);
- private final ActivityContext mActivity;
+ protected final ActivityContext mActivity;
private FastBitmapDrawable mIcon;
private DeviceProfile mDeviceProfile;
private boolean mCenterVertically;
@@ -190,7 +190,6 @@
@ViewDebug.ExportedProperty(category = "launcher")
private DotInfo mDotInfo;
private DotRenderer mDotRenderer;
- private String mCurrentLanguage;
@ViewDebug.ExportedProperty(category = "launcher", deepExport = true)
protected DotRenderer.DrawParams mDotParams;
private Animator mDotScaleAnim;
@@ -302,7 +301,6 @@
mDotParams = new DotRenderer.DrawParams();
- mCurrentLanguage = context.getResources().getConfiguration().locale.getLanguage();
setEllipsize(TruncateAt.END);
setAccessibilityDelegate(mActivity.getAccessibilityDelegate());
setTextAlpha(1f);
@@ -474,13 +472,8 @@
* Only if actual text can be displayed in two line, the {@code true} value will be effective.
*/
protected boolean shouldUseTwoLine() {
- return isCurrentLanguageEnglish() && (mDisplay == DISPLAY_ALL_APPS
- || mDisplay == DISPLAY_PREDICTION_ROW) && (Flags.enableTwolineToggle()
- && LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(getContext()));
- }
-
- protected boolean isCurrentLanguageEnglish() {
- return mCurrentLanguage.equals(Locale.ENGLISH.getLanguage());
+ return mDeviceProfile.inv.enableTwoLinesInAllApps
+ && (mDisplay == DISPLAY_ALL_APPS || mDisplay == DISPLAY_PREDICTION_ROW);
}
@UiThread
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 5387815..9ebae9f 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -24,7 +24,6 @@
import static com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_LANDSCAPE;
import static com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_PORTRAIT;
import static com.android.launcher3.Utilities.dpiFromPx;
-import static com.android.launcher3.Utilities.isEnglishLanguage;
import static com.android.launcher3.Utilities.pxFromSp;
import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ICON_OVERLAP_FACTOR;
import static com.android.launcher3.icons.GraphicsUtils.getShapePath;
@@ -1362,16 +1361,9 @@
if (isVerticalLayout && !mIsResponsiveGrid) {
hideWorkspaceLabelsIfNotEnoughSpace();
}
- if ((Flags.enableTwolineToggle()
- && LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(context))) {
- if (!isEnglishLanguage(context)) {
- // Set toggle preference value to false if not english here as it's possible the
- // preference is stale after language change.
- LauncherPrefs.get(context).put(LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE, false);
- } else {
- // Add extra textHeight to the existing allAppsCellHeight.
- allAppsCellHeightPx += Utilities.calculateTextHeight(allAppsIconTextSizePx);
- }
+ if (inv.enableTwoLinesInAllApps) {
+ // Add extra textHeight to the existing allAppsCellHeight.
+ allAppsCellHeightPx += Utilities.calculateTextHeight(allAppsIconTextSizePx);
}
updateHotseatSizes(iconSizePx);
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 28293d1..5cca990 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -17,6 +17,7 @@
package com.android.launcher3;
import static com.android.launcher3.LauncherPrefs.DB_FILE;
+import static com.android.launcher3.LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE;
import static com.android.launcher3.LauncherPrefs.FIXED_LANDSCAPE_MODE;
import static com.android.launcher3.LauncherPrefs.GRID_NAME;
import static com.android.launcher3.Utilities.dpiFromPx;
@@ -30,6 +31,7 @@
import android.annotation.TargetApi;
import android.content.Context;
+import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
@@ -57,14 +59,15 @@
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.model.DeviceGridState;
import com.android.launcher3.provider.RestoreDbTask;
-import com.android.launcher3.settings.SettingsActivity;
import com.android.launcher3.testing.shared.ResourceUtils;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.Info;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.Partner;
import com.android.launcher3.util.ResourceHelper;
+import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.SafeCloseable;
+import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.util.window.CachedDisplayInfo;
import com.android.launcher3.util.window.WindowManagerProxy;
@@ -123,6 +126,8 @@
private static final String RES_GRID_NUM_COLUMNS = "grid_num_columns";
private static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp";
+ private final RunnableList mCloseActions = new RunnableList();
+
/**
* Number of icons per row and column in the workspace.
*/
@@ -218,12 +223,12 @@
@XmlRes
public int allAppsCellSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
-
+ private String mLocale = "";
+ public boolean enableTwoLinesInAllApps = false;
/**
* Fixed landscape mode is the landscape on the phones.
*/
public boolean isFixedLandscape = false;
- private LauncherPrefChangeListener mLandscapeModePreferenceListener;
public String dbFile;
public int defaultLayoutId;
@@ -247,7 +252,9 @@
private InvariantDeviceProfile(Context context) {
String gridName = getCurrentGridName(context);
initGrid(context, gridName);
- DisplayController.INSTANCE.get(context).setPriorityListener(
+
+ DisplayController dc = DisplayController.INSTANCE.get(context);
+ dc.setPriorityListener(
(displayContext, info, flags) -> {
if ((flags & (CHANGE_DENSITY | CHANGE_SUPPORTED_BOUNDS
| CHANGE_NAVIGATION_MODE | CHANGE_TASKBAR_PINNING
@@ -255,25 +262,28 @@
onConfigChanged(displayContext);
}
});
- if (Flags.oneGridSpecs()) {
- mLandscapeModePreferenceListener = (String preference_name) -> {
- // Here we need both conditions even though they might seem redundant but because
- // the update happens in the executable there can be race conditions and this avoids
- // it.
- if (isFixedLandscape != FIXED_LANDSCAPE_MODE.get(context)
- && SettingsActivity.FIXED_LANDSCAPE_MODE.equals(preference_name)) {
- MAIN_EXECUTOR.execute(() -> {
- Trace.beginSection("InvariantDeviceProfile#setFixedLandscape");
- onConfigChanged(context.getApplicationContext());
- Trace.endSection();
- });
- }
- };
- LauncherPrefs.INSTANCE.get(context).addListener(
- mLandscapeModePreferenceListener,
- FIXED_LANDSCAPE_MODE
- );
- }
+ mCloseActions.add(() -> dc.setPriorityListener(null));
+
+ LauncherPrefChangeListener prefListener = key -> {
+ if (FIXED_LANDSCAPE_MODE.getSharedPrefKey().equals(key)
+ && isFixedLandscape != FIXED_LANDSCAPE_MODE.get(context)) {
+ Trace.beginSection("InvariantDeviceProfile#setFixedLandscape");
+ onConfigChanged(context);
+ Trace.endSection();
+ } else if (ENABLE_TWOLINE_ALLAPPS_TOGGLE.getSharedPrefKey().equals(key)
+ && enableTwoLinesInAllApps != ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(context)) {
+ onConfigChanged(context);
+ }
+ };
+ LauncherPrefs prefs = LauncherPrefs.INSTANCE.get(context);
+ prefs.addListener(prefListener, FIXED_LANDSCAPE_MODE, ENABLE_TWOLINE_ALLAPPS_TOGGLE);
+ mCloseActions.add(() -> prefs.removeListener(prefListener,
+ FIXED_LANDSCAPE_MODE, ENABLE_TWOLINE_ALLAPPS_TOGGLE));
+
+ SimpleBroadcastReceiver localeReceiver = new SimpleBroadcastReceiver(
+ MAIN_EXECUTOR, i -> onConfigChanged(context));
+ localeReceiver.register(context, Intent.ACTION_LOCALE_CHANGED);
+ mCloseActions.add(() -> localeReceiver.unregisterReceiverSafely(context));
}
/**
@@ -341,12 +351,7 @@
@Override
public void close() {
- DisplayController.INSTANCE.executeIfCreated(dc -> dc.setPriorityListener(null));
- if (mLandscapeModePreferenceListener != null) {
- LauncherPrefs.INSTANCE.executeIfCreated(
- lp -> lp.removeListener(mLandscapeModePreferenceListener, FIXED_LANDSCAPE_MODE)
- );
- }
+ mCloseActions.executeAllAndDestroy();
}
public static String getCurrentGridName(Context context) {
@@ -413,6 +418,11 @@
}
private void initGrid(Context context, Info displayInfo, DisplayOption displayOption) {
+ enableTwoLinesInAllApps = Flags.enableTwolineToggle()
+ && Utilities.isEnglishLanguage(context)
+ && ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(context);
+ mLocale = context.getResources().getConfiguration().locale.toString();
+
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
GridOption closestProfile = displayOption.grid;
numRows = closestProfile.numRows;
@@ -564,7 +574,7 @@
private Object[] toModelState() {
return new Object[]{
numColumns, numRows, numSearchContainerColumns, numDatabaseHotseatIcons,
- iconBitmapSize, fillResIconDpi, numDatabaseAllAppsColumns, dbFile};
+ iconBitmapSize, fillResIconDpi, numDatabaseAllAppsColumns, dbFile, mLocale};
}
/** Updates IDP using the provided context. Notifies listeners of change. */
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index b9e4710..f68c8e0 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -415,7 +415,6 @@
private final List<BackPressHandler> mBackPressedHandlers = new ArrayList<>();
private boolean mIsColdStartupAfterReboot;
- private boolean mForceConfigUpdate;
private boolean mIsNaturalScrollingEnabled;
@@ -631,6 +630,10 @@
return new ColdRebootStartupLatencyLogger();
}
+ @NonNull View getAccessibilityActionView() {
+ return findViewById(R.id.accessibility_action_view);
+ }
+
/**
* Provide {@link OnBackAnimationCallback} in below order:
* <ol>
@@ -761,7 +764,7 @@
protected void onHandleConfigurationChanged() {
Trace.beginSection("Launcher#onHandleconfigurationChanged");
try {
- if (!initDeviceProfile(mDeviceProfile.inv) && !mForceConfigUpdate) {
+ if (!initDeviceProfile(mDeviceProfile.inv)) {
return;
}
dispatchDeviceProfileChanged();
@@ -774,7 +777,6 @@
mModel.rebindCallbacks();
updateDisallowBack();
} finally {
- mForceConfigUpdate = false;
Trace.endSection();
}
}
@@ -3159,13 +3161,6 @@
return mAnimationCoordinator;
}
- /**
- * Set to force config update when set to true next time onHandleConfigurationChanged is called.
- */
- public void setForceConfigUpdate(boolean forceConfigUpdate) {
- mForceConfigUpdate = forceConfigUpdate;
- }
-
@Override
public View.OnLongClickListener getAllAppsItemLongClickListener() {
return ItemLongClickListener.INSTANCE_ALL_APPS;
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index a53238d..5989e4c 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -34,8 +34,6 @@
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.LauncherApps;
@@ -70,9 +68,6 @@
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.widget.custom.CustomWidgetManager;
-import java.util.Locale;
-import java.util.Objects;
-
public class LauncherAppState implements SafeCloseable {
public static final String TAG = "LauncherAppState";
@@ -128,22 +123,11 @@
SimpleBroadcastReceiver modelChangeReceiver =
new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, mModel::onBroadcastIntent);
- final Locale oldLocale = mContext.getResources().getConfiguration().locale;
modelChangeReceiver.register(
mContext,
- () -> {
- // if local has changed before receiver is registered on bg thread,
- // mModel needs to reload.
- Locale newLocale = mContext.getResources().getConfiguration().locale;
- if (!Objects.equals(oldLocale, newLocale)) {
- mModel.forceReload();
- }
- },
- Intent.ACTION_LOCALE_CHANGED,
ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
if (BuildConfig.IS_STUDIO_BUILD) {
- mContext.registerReceiver(modelChangeReceiver, new IntentFilter(ACTION_FORCE_ROLOAD),
- RECEIVER_EXPORTED);
+ modelChangeReceiver.register(mContext, RECEIVER_EXPORTED, ACTION_FORCE_ROLOAD);
}
mOnTerminateCallback.add(() -> modelChangeReceiver.unregisterReceiverSafely(mContext));
diff --git a/src/com/android/launcher3/LauncherModel.kt b/src/com/android/launcher3/LauncherModel.kt
index b56df46..185629b 100644
--- a/src/com/android/launcher3/LauncherModel.kt
+++ b/src/com/android/launcher3/LauncherModel.kt
@@ -176,7 +176,6 @@
fun onBroadcastIntent(intent: Intent) {
if (DEBUG_RECEIVER || sDebugTracing) Log.d(TAG, "onReceive intent=$intent")
when (intent.action) {
- Intent.ACTION_LOCALE_CHANGED,
LauncherAppState.ACTION_FORCE_ROLOAD ->
// If we have changed locale we need to clear out the labels in all apps/workspace.
forceReload()
diff --git a/src/com/android/launcher3/LauncherPrefs.kt b/src/com/android/launcher3/LauncherPrefs.kt
index 5b9c2fa..ad592d8 100644
--- a/src/com/android/launcher3/LauncherPrefs.kt
+++ b/src/com/android/launcher3/LauncherPrefs.kt
@@ -23,59 +23,212 @@
import com.android.launcher3.InvariantDeviceProfile.GRID_NAME_PREFS_KEY
import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY
import com.android.launcher3.LauncherFiles.SHARED_PREFERENCES_KEY
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppComponent
+import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.model.DeviceGridState
import com.android.launcher3.pm.InstallSessionHelper
import com.android.launcher3.provider.RestoreDbTask
import com.android.launcher3.provider.RestoreDbTask.FIRST_LOAD_AFTER_RESTORE_KEY
import com.android.launcher3.settings.SettingsActivity
import com.android.launcher3.states.RotationHelper
+import com.android.launcher3.util.DaggerSingletonObject
import com.android.launcher3.util.DisplayController
-import com.android.launcher3.util.MainThreadInitializedObject
-import com.android.launcher3.util.SafeCloseable
import com.android.launcher3.util.Themes
+import javax.inject.Inject
/**
* Manages Launcher [SharedPreferences] through [Item] instances.
*
* TODO(b/262721340): Replace all direct SharedPreference refs with LauncherPrefs / Item methods.
*/
-abstract class LauncherPrefs : SafeCloseable {
+@LauncherAppSingleton
+open class LauncherPrefs
+@Inject
+constructor(@ApplicationContext private val encryptedContext: Context) {
+
+ private val deviceProtectedSharedPrefs: SharedPreferences by lazy {
+ encryptedContext
+ .createDeviceProtectedStorageContext()
+ .getSharedPreferences(BOOT_AWARE_PREFS_KEY, MODE_PRIVATE)
+ }
+
+ open val Item.sharedPrefs: SharedPreferences
+ get() =
+ if (encryptionType == EncryptionType.DEVICE_PROTECTED) deviceProtectedSharedPrefs
+ else encryptedContext.getSharedPreferences(sharedPrefFile, MODE_PRIVATE)
/** Returns the value with type [T] for [item]. */
- abstract fun <T> get(item: ContextualItem<T>): T
+ fun <T> get(item: ContextualItem<T>): T =
+ getInner(item, item.defaultValueFromContext(encryptedContext))
/** Returns the value with type [T] for [item]. */
- abstract fun <T> get(item: ConstantItem<T>): T
+ fun <T> get(item: ConstantItem<T>): T = getInner(item, item.defaultValue)
- /** Stores the values for each item in preferences. */
- abstract fun put(vararg itemsToValues: Pair<Item, Any>)
+ /**
+ * Retrieves the value for an [Item] from [SharedPreferences]. It handles method typing via the
+ * default value type, and will throw an error if the type of the item provided is not a
+ * `String`, `Boolean`, `Float`, `Int`, `Long`, or `Set<String>`.
+ */
+ @Suppress("IMPLICIT_CAST_TO_ANY", "UNCHECKED_CAST")
+ private fun <T> getInner(item: Item, default: T): T {
+ val sp = item.sharedPrefs
- /** Stores the [value] with type [T] for [item] in preferences. */
- abstract fun <T : Any> put(item: Item, value: T)
+ return when (item.type) {
+ String::class.java -> sp.getString(item.sharedPrefKey, default as? String)
+ Boolean::class.java,
+ java.lang.Boolean::class.java -> sp.getBoolean(item.sharedPrefKey, default as Boolean)
+ Int::class.java,
+ java.lang.Integer::class.java -> sp.getInt(item.sharedPrefKey, default as Int)
+ Float::class.java,
+ java.lang.Float::class.java -> sp.getFloat(item.sharedPrefKey, default as Float)
+ Long::class.java,
+ java.lang.Long::class.java -> sp.getLong(item.sharedPrefKey, default as Long)
+ Set::class.java -> sp.getStringSet(item.sharedPrefKey, default as? Set<String>)
+ else ->
+ throw IllegalArgumentException(
+ "item type: ${item.type}" + " is not compatible with sharedPref methods"
+ )
+ }
+ as T
+ }
- /** Synchronous version of [put]. */
- abstract fun putSync(vararg itemsToValues: Pair<Item, Any>)
+ /**
+ * Stores each of the values provided in `SharedPreferences` according to the configuration
+ * contained within the associated items provided. Internally, it uses apply, so the caller
+ * cannot assume that the values that have been put are immediately available for use.
+ *
+ * The forEach loop is necessary here since there is 1 `SharedPreference.Editor` returned from
+ * prepareToPutValue(itemsToValues) for every distinct `SharedPreferences` file present in the
+ * provided item configurations.
+ */
+ fun put(vararg itemsToValues: Pair<Item, Any>): Unit =
+ prepareToPutValues(itemsToValues).forEach { it.apply() }
- /** Registers [listener] for [items]. */
- abstract fun addListener(listener: LauncherPrefChangeListener, vararg items: Item)
+ /** See referenced `put` method above. */
+ fun <T : Any> put(item: Item, value: T): Unit = put(item.to(value))
- /** Unregisters [listener] for [items]. */
- abstract fun removeListener(listener: LauncherPrefChangeListener, vararg items: Item)
+ /**
+ * Synchronously stores all the values provided according to their associated Item
+ * configuration.
+ */
+ fun putSync(vararg itemsToValues: Pair<Item, Any>): Unit =
+ prepareToPutValues(itemsToValues).forEach { it.commit() }
- /** Returns `true` iff all [items] have a value. */
- abstract fun has(vararg items: Item): Boolean
+ /**
+ * Updates the values stored in `SharedPreferences` for each corresponding Item-value pair. If
+ * the item is boot aware, this method updates both the boot aware and the encrypted files. This
+ * is done because: 1) It allows for easy roll-back if the data is already in encrypted prefs
+ * and we need to turn off the boot aware data feature & 2) It simplifies Backup/Restore, which
+ * already points to encrypted storage.
+ *
+ * Returns a list of editors with all transactions added so that the caller can determine to use
+ * .apply() or .commit()
+ */
+ private fun prepareToPutValues(
+ updates: Array<out Pair<Item, Any>>
+ ): List<SharedPreferences.Editor> {
+ val updatesPerPrefFile = updates.groupBy { it.first.sharedPrefs }.toMap()
- /** Removes the value for each item in [items]. */
- abstract fun remove(vararg items: Item)
+ return updatesPerPrefFile.map { (sharedPref, itemList) ->
+ sharedPref.edit().apply { itemList.forEach { (item, value) -> putValue(item, value) } }
+ }
+ }
- /** Synchronous version of [remove]. */
- abstract fun removeSync(vararg items: Item)
+ /**
+ * Handles adding values to `SharedPreferences` regardless of type. This method is especially
+ * helpful for updating `SharedPreferences` values for `List<<Item>Any>` that have multiple
+ * types of Item values.
+ */
+ @Suppress("UNCHECKED_CAST")
+ private fun SharedPreferences.Editor.putValue(
+ item: Item,
+ value: Any?,
+ ): SharedPreferences.Editor =
+ when (item.type) {
+ String::class.java -> putString(item.sharedPrefKey, value as? String)
+ Boolean::class.java,
+ java.lang.Boolean::class.java -> putBoolean(item.sharedPrefKey, value as Boolean)
+ Int::class.java,
+ java.lang.Integer::class.java -> putInt(item.sharedPrefKey, value as Int)
+ Float::class.java,
+ java.lang.Float::class.java -> putFloat(item.sharedPrefKey, value as Float)
+ Long::class.java,
+ java.lang.Long::class.java -> putLong(item.sharedPrefKey, value as Long)
+ Set::class.java -> putStringSet(item.sharedPrefKey, value as? Set<String>)
+ else ->
+ throw IllegalArgumentException(
+ "item type: ${item.type} is not compatible with sharedPref methods"
+ )
+ }
+
+ /**
+ * After calling this method, the listener will be notified of any future updates to the
+ * `SharedPreferences` files associated with the provided list of items. The listener will need
+ * to filter update notifications so they don't activate for non-relevant updates.
+ */
+ fun addListener(listener: LauncherPrefChangeListener, vararg items: Item) {
+ items
+ .map { it.sharedPrefs }
+ .distinct()
+ .forEach { it.registerOnSharedPreferenceChangeListener(listener) }
+ }
+
+ /**
+ * Stops the listener from getting notified of any more updates to any of the
+ * `SharedPreferences` files associated with any of the provided list of [Item].
+ */
+ fun removeListener(listener: LauncherPrefChangeListener, vararg items: Item) {
+ // If a listener is not registered to a SharedPreference, unregistering it does nothing
+ items
+ .map { it.sharedPrefs }
+ .distinct()
+ .forEach { it.unregisterOnSharedPreferenceChangeListener(listener) }
+ }
+
+ /**
+ * Checks if all the provided [Item] have values stored in their corresponding
+ * `SharedPreferences` files.
+ */
+ fun has(vararg items: Item): Boolean {
+ items
+ .groupBy { it.sharedPrefs }
+ .forEach { (prefs, itemsSublist) ->
+ if (!itemsSublist.none { !prefs.contains(it.sharedPrefKey) }) return false
+ }
+ return true
+ }
+
+ /**
+ * Asynchronously removes the [Item]'s value from its corresponding `SharedPreferences` file.
+ */
+ fun remove(vararg items: Item) = prepareToRemove(items).forEach { it.apply() }
+
+ /** Synchronously removes the [Item]'s value from its corresponding `SharedPreferences` file. */
+ fun removeSync(vararg items: Item) = prepareToRemove(items).forEach { it.commit() }
+
+ /**
+ * Removes the key value pairs stored in `SharedPreferences` for each corresponding Item. If the
+ * item is boot aware, this method removes the data from both the boot aware and encrypted
+ * files.
+ *
+ * @return a list of editors with all transactions added so that the caller can determine to use
+ * .apply() or .commit()
+ */
+ private fun prepareToRemove(items: Array<out Item>): List<SharedPreferences.Editor> {
+ val itemsPerFile = items.groupBy { it.sharedPrefs }.toMap()
+
+ return itemsPerFile.map { (prefs, items) ->
+ prefs.edit().also { editor ->
+ items.forEach { item -> editor.remove(item.sharedPrefKey) }
+ }
+ }
+ }
companion object {
@VisibleForTesting const val BOOT_AWARE_PREFS_KEY = "boot_aware_prefs"
- @JvmField
- var INSTANCE = MainThreadInitializedObject<LauncherPrefs> { LauncherPrefsImpl(it) }
+ @JvmField val INSTANCE = DaggerSingletonObject(LauncherAppComponent::getLauncherPrefs)
@JvmStatic fun get(context: Context): LauncherPrefs = INSTANCE.get(context)
@@ -212,214 +365,6 @@
}
}
-private class LauncherPrefsImpl(private val encryptedContext: Context) : LauncherPrefs() {
- private val deviceProtectedStorageContext =
- encryptedContext.createDeviceProtectedStorageContext()
-
- private val bootAwarePrefs
- get() =
- deviceProtectedStorageContext.getSharedPreferences(BOOT_AWARE_PREFS_KEY, MODE_PRIVATE)
-
- private val Item.encryptedPrefs
- get() = encryptedContext.getSharedPreferences(sharedPrefFile, MODE_PRIVATE)
-
- private fun chooseSharedPreferences(item: Item): SharedPreferences =
- if (item.encryptionType == EncryptionType.DEVICE_PROTECTED) bootAwarePrefs
- else item.encryptedPrefs
-
- /** Wrapper around `getInner` for a `ContextualItem` */
- override fun <T> get(item: ContextualItem<T>): T =
- getInner(item, item.defaultValueFromContext(encryptedContext))
-
- /** Wrapper around `getInner` for an `Item` */
- override fun <T> get(item: ConstantItem<T>): T = getInner(item, item.defaultValue)
-
- /**
- * Retrieves the value for an [Item] from [SharedPreferences]. It handles method typing via the
- * default value type, and will throw an error if the type of the item provided is not a
- * `String`, `Boolean`, `Float`, `Int`, `Long`, or `Set<String>`.
- */
- @Suppress("IMPLICIT_CAST_TO_ANY", "UNCHECKED_CAST")
- private fun <T> getInner(item: Item, default: T): T {
- val sp = chooseSharedPreferences(item)
-
- return when (item.type) {
- String::class.java -> sp.getString(item.sharedPrefKey, default as? String)
- Boolean::class.java,
- java.lang.Boolean::class.java -> sp.getBoolean(item.sharedPrefKey, default as Boolean)
- Int::class.java,
- java.lang.Integer::class.java -> sp.getInt(item.sharedPrefKey, default as Int)
- Float::class.java,
- java.lang.Float::class.java -> sp.getFloat(item.sharedPrefKey, default as Float)
- Long::class.java,
- java.lang.Long::class.java -> sp.getLong(item.sharedPrefKey, default as Long)
- Set::class.java -> sp.getStringSet(item.sharedPrefKey, default as? Set<String>)
- else ->
- throw IllegalArgumentException(
- "item type: ${item.type}" + " is not compatible with sharedPref methods"
- )
- }
- as T
- }
-
- /**
- * Stores each of the values provided in `SharedPreferences` according to the configuration
- * contained within the associated items provided. Internally, it uses apply, so the caller
- * cannot assume that the values that have been put are immediately available for use.
- *
- * The forEach loop is necessary here since there is 1 `SharedPreference.Editor` returned from
- * prepareToPutValue(itemsToValues) for every distinct `SharedPreferences` file present in the
- * provided item configurations.
- */
- override fun put(vararg itemsToValues: Pair<Item, Any>): Unit =
- prepareToPutValues(itemsToValues).forEach { it.apply() }
-
- /** See referenced `put` method above. */
- override fun <T : Any> put(item: Item, value: T): Unit = put(item.to(value))
-
- /**
- * Synchronously stores all the values provided according to their associated Item
- * configuration.
- */
- override fun putSync(vararg itemsToValues: Pair<Item, Any>): Unit =
- prepareToPutValues(itemsToValues).forEach { it.commit() }
-
- /**
- * Updates the values stored in `SharedPreferences` for each corresponding Item-value pair. If
- * the item is boot aware, this method updates both the boot aware and the encrypted files. This
- * is done because: 1) It allows for easy roll-back if the data is already in encrypted prefs
- * and we need to turn off the boot aware data feature & 2) It simplifies Backup/Restore, which
- * already points to encrypted storage.
- *
- * Returns a list of editors with all transactions added so that the caller can determine to use
- * .apply() or .commit()
- */
- private fun prepareToPutValues(
- updates: Array<out Pair<Item, Any>>
- ): List<SharedPreferences.Editor> {
- val updatesPerPrefFile =
- updates
- .filter { it.first.encryptionType != EncryptionType.DEVICE_PROTECTED }
- .groupBy { it.first.encryptedPrefs }
- .toMutableMap()
-
- val bootAwareUpdates =
- updates.filter { it.first.encryptionType == EncryptionType.DEVICE_PROTECTED }
- if (bootAwareUpdates.isNotEmpty()) {
- updatesPerPrefFile[bootAwarePrefs] = bootAwareUpdates
- }
-
- return updatesPerPrefFile.map { prefToItemValueList ->
- prefToItemValueList.key.edit().apply {
- prefToItemValueList.value.forEach { itemToValue: Pair<Item, Any> ->
- putValue(itemToValue.first, itemToValue.second)
- }
- }
- }
- }
-
- /**
- * Handles adding values to `SharedPreferences` regardless of type. This method is especially
- * helpful for updating `SharedPreferences` values for `List<<Item>Any>` that have multiple
- * types of Item values.
- */
- @Suppress("UNCHECKED_CAST")
- private fun SharedPreferences.Editor.putValue(
- item: Item,
- value: Any?,
- ): SharedPreferences.Editor =
- when (item.type) {
- String::class.java -> putString(item.sharedPrefKey, value as? String)
- Boolean::class.java,
- java.lang.Boolean::class.java -> putBoolean(item.sharedPrefKey, value as Boolean)
- Int::class.java,
- java.lang.Integer::class.java -> putInt(item.sharedPrefKey, value as Int)
- Float::class.java,
- java.lang.Float::class.java -> putFloat(item.sharedPrefKey, value as Float)
- Long::class.java,
- java.lang.Long::class.java -> putLong(item.sharedPrefKey, value as Long)
- Set::class.java -> putStringSet(item.sharedPrefKey, value as? Set<String>)
- else ->
- throw IllegalArgumentException(
- "item type: ${item.type} is not compatible with sharedPref methods"
- )
- }
-
- /**
- * After calling this method, the listener will be notified of any future updates to the
- * `SharedPreferences` files associated with the provided list of items. The listener will need
- * to filter update notifications so they don't activate for non-relevant updates.
- */
- override fun addListener(listener: LauncherPrefChangeListener, vararg items: Item) {
- items
- .map { chooseSharedPreferences(it) }
- .distinct()
- .forEach { it.registerOnSharedPreferenceChangeListener(listener) }
- }
-
- /**
- * Stops the listener from getting notified of any more updates to any of the
- * `SharedPreferences` files associated with any of the provided list of [Item].
- */
- override fun removeListener(listener: LauncherPrefChangeListener, vararg items: Item) {
- // If a listener is not registered to a SharedPreference, unregistering it does nothing
- items
- .map { chooseSharedPreferences(it) }
- .distinct()
- .forEach { it.unregisterOnSharedPreferenceChangeListener(listener) }
- }
-
- /**
- * Checks if all the provided [Item] have values stored in their corresponding
- * `SharedPreferences` files.
- */
- override fun has(vararg items: Item): Boolean {
- items
- .groupBy { chooseSharedPreferences(it) }
- .forEach { (prefs, itemsSublist) ->
- if (!itemsSublist.none { !prefs.contains(it.sharedPrefKey) }) return false
- }
- return true
- }
-
- /**
- * Asynchronously removes the [Item]'s value from its corresponding `SharedPreferences` file.
- */
- override fun remove(vararg items: Item) = prepareToRemove(items).forEach { it.apply() }
-
- /** Synchronously removes the [Item]'s value from its corresponding `SharedPreferences` file. */
- override fun removeSync(vararg items: Item) = prepareToRemove(items).forEach { it.commit() }
-
- /**
- * Removes the key value pairs stored in `SharedPreferences` for each corresponding Item. If the
- * item is boot aware, this method removes the data from both the boot aware and encrypted
- * files.
- *
- * @return a list of editors with all transactions added so that the caller can determine to use
- * .apply() or .commit()
- */
- private fun prepareToRemove(items: Array<out Item>): List<SharedPreferences.Editor> {
- val itemsPerFile =
- items
- .filter { it.encryptionType != EncryptionType.DEVICE_PROTECTED }
- .groupBy { it.encryptedPrefs }
- .toMutableMap()
-
- val bootAwareUpdates = items.filter { it.encryptionType == EncryptionType.DEVICE_PROTECTED }
- if (bootAwareUpdates.isNotEmpty()) {
- itemsPerFile[bootAwarePrefs] = bootAwareUpdates
- }
-
- return itemsPerFile.map { (prefs, items) ->
- prefs.edit().also { editor ->
- items.forEach { item -> editor.remove(item.sharedPrefKey) }
- }
- }
- }
-
- override fun close() {}
-}
-
abstract class Item {
abstract val sharedPrefKey: String
abstract val isBackedUp: Boolean
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index a064c88..bc751d9 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -70,6 +70,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import androidx.core.view.ViewCompat;
import com.android.app.animation.Interpolators;
import com.android.launcher3.accessibility.AccessibleDragListenerAdapter;
@@ -303,6 +304,8 @@
private final StatsLogManager mStatsLogManager;
private final MSDLPlayerWrapper mMSDLPlayerWrapper;
+ @Nullable
+ private DragController.DragListener mAccessibilityDragListener;
/**
* Used to inflate the Workspace from XML.
@@ -512,6 +515,9 @@
}
}
+ if (mAccessibilityDragListener != null) {
+ mAccessibilityDragListener.onDragStart(dragObject, options);
+ }
if (!mLauncher.isInState(EDIT_MODE)) {
mLauncher.getStateManager().goToState(SPRING_LOADED);
}
@@ -548,6 +554,9 @@
}
});
+ if (mAccessibilityDragListener != null) {
+ mAccessibilityDragListener.onDragEnd();
+ }
mDragInfo = null;
mDragSourceInternal = null;
}
@@ -1656,7 +1665,7 @@
child.setVisibility(INVISIBLE);
if (options.isAccessibleDrag) {
- mDragController.addDragListener(
+ mAccessibilityDragListener =
new AccessibleDragListenerAdapter(this, WorkspaceAccessibilityHelper::new) {
@Override
protected void enableAccessibleDrag(boolean enable,
@@ -1669,7 +1678,7 @@
IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
}
}
- });
+ };
}
beginDragShared(child, this, options);
@@ -3519,8 +3528,15 @@
@Override
protected boolean canAnnouncePageDescription() {
- // b/383247157: Disable disruptive home screen page announcement
- return false;
+ return Float.compare(mOverlayProgress, 0f) == 0;
+ }
+
+ @Override
+ protected void announcePageForAccessibility() {
+ // Talkback focuses on AccessibilityActionView by default, so we need to modify the state
+ // description there in order for the change in page scroll to be announced.
+ ViewCompat.setStateDescription(mLauncher.getAccessibilityActionView(),
+ getCurrentPageDescription());
}
@Override
diff --git a/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java b/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java
index 60bf3ea..e8b7247 100644
--- a/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java
+++ b/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java
@@ -40,8 +40,6 @@
import androidx.recyclerview.widget.RecyclerView;
import com.android.launcher3.BubbleTextView;
-import com.android.launcher3.Flags;
-import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.R;
import com.android.launcher3.allapps.search.SearchAdapterProvider;
import com.android.launcher3.model.data.AppInfo;
@@ -219,9 +217,7 @@
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_ICON:
- int layout = (Flags.enableTwolineToggle()
- && LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(
- mActivityContext.getApplicationContext()))
+ int layout = mActivityContext.getDeviceProfile().inv.enableTwoLinesInAllApps
? R.layout.all_apps_icon_twoline : R.layout.all_apps_icon;
BubbleTextView icon = (BubbleTextView) mLayoutInflater.inflate(
layout, parent, false);
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index 340fb02..72a97a8 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -18,6 +18,7 @@
import android.content.Context;
+import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.contextualeducation.ContextualEduStatsManager;
import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.model.ItemInstallQueue;
@@ -62,6 +63,7 @@
VibratorWrapper getVibratorWrapper();
MSDLPlayerWrapper getMSDLPlayerWrapper();
WindowManagerProxy getWmProxy();
+ LauncherPrefs getLauncherPrefs();
/** Builder for LauncherBaseAppComponent. */
interface Builder {
diff --git a/src/com/android/launcher3/util/DisplayController.java b/src/com/android/launcher3/util/DisplayController.java
index 26912eb..d8a2a3d 100644
--- a/src/com/android/launcher3/util/DisplayController.java
+++ b/src/com/android/launcher3/util/DisplayController.java
@@ -56,6 +56,7 @@
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.util.window.CachedDisplayInfo;
import com.android.launcher3.util.window.WindowManagerProxy;
+import com.android.launcher3.util.window.WindowManagerProxy.DesktopVisibilityListener;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -70,7 +71,8 @@
* Utility class to cache properties of default display to avoid a system RPC on every call.
*/
@SuppressLint("NewApi")
-public class DisplayController implements ComponentCallbacks, SafeCloseable {
+public class DisplayController implements ComponentCallbacks, SafeCloseable,
+ DesktopVisibilityListener {
private static final String TAG = "DisplayController";
private static final boolean DEBUG = false;
@@ -99,7 +101,6 @@
private static final String TARGET_OVERLAY_PACKAGE = "android";
private final Context mContext;
- private final DisplayManager mDM;
// Null for SDK < S
private final Context mWindowContext;
@@ -121,13 +122,12 @@
@VisibleForTesting
protected DisplayController(Context context) {
mContext = context;
- mDM = context.getSystemService(DisplayManager.class);
-
if (enableTaskbarPinning()) {
attachTaskbarPinningSharedPreferenceChangeListener(mContext);
}
- Display display = mDM.getDisplay(DEFAULT_DISPLAY);
+ Display display = context.getSystemService(DisplayManager.class)
+ .getDisplay(DEFAULT_DISPLAY);
mWindowContext = mContext.createWindowContext(display, TYPE_APPLICATION, null);
mWindowContext.registerComponentCallbacks(this);
@@ -137,6 +137,7 @@
WindowManagerProxy wmProxy = WindowManagerProxy.INSTANCE.get(context);
mInfo = new Info(mWindowContext, wmProxy,
wmProxy.estimateInternalDisplayBounds(mWindowContext));
+ wmProxy.registerDesktopVisibilityListener(this);
FileLog.i(TAG, "(CTOR) perDisplayBounds: " + mInfo.mPerDisplayBounds);
}
@@ -215,12 +216,14 @@
LauncherPrefs.get(mContext).removeListener(
mTaskbarPinningPreferenceChangeListener, TASKBAR_PINNING_IN_DESKTOP_MODE);
}
- if (mWindowContext != null) {
- mWindowContext.unregisterComponentCallbacks(this);
- } else {
- // TODO: unregister broadcast receiver
- }
+ mWindowContext.unregisterComponentCallbacks(this);
mReceiver.unregisterReceiverSafely(mContext);
+ WindowManagerProxy.INSTANCE.get(mContext).unregisterDesktopVisibilityListener(this);
+ }
+
+ @Override
+ public void onDesktopVisibilityChanged(boolean visible) {
+ notifyConfigChange();
}
/**
diff --git a/src/com/android/launcher3/util/coroutines/DispatcherProvider.kt b/src/com/android/launcher3/util/coroutines/DispatcherProvider.kt
index 8877535..1f01b07 100644
--- a/src/com/android/launcher3/util/coroutines/DispatcherProvider.kt
+++ b/src/com/android/launcher3/util/coroutines/DispatcherProvider.kt
@@ -33,7 +33,7 @@
override val default: CoroutineDispatcher = Dispatchers.Default
override val background: CoroutineDispatcher = bgDispatcher
- override val main: CoroutineDispatcher = Dispatchers.Main
+ override val main: CoroutineDispatcher = Dispatchers.Main.immediate
override val unconfined: CoroutineDispatcher = Dispatchers.Unconfined
}
diff --git a/src/com/android/launcher3/util/window/WindowManagerProxy.java b/src/com/android/launcher3/util/window/WindowManagerProxy.java
index 1d9751e..e568eed 100644
--- a/src/com/android/launcher3/util/window/WindowManagerProxy.java
+++ b/src/com/android/launcher3/util/window/WindowManagerProxy.java
@@ -485,4 +485,21 @@
return new Rect(cutout.getSafeInsetLeft(), cutout.getSafeInsetTop(),
cutout.getSafeInsetRight(), cutout.getSafeInsetBottom());
}
+
+ /** Registers a listener for Taskbar changes in Desktop Mode. */
+ public void registerDesktopVisibilityListener(DesktopVisibilityListener listener) { }
+
+ /** Removes a previously registered listener for Taskbar changes in Desktop Mode. */
+ public void unregisterDesktopVisibilityListener(DesktopVisibilityListener listener) { }
+
+ /** A listener for when the user enters/exits Desktop Mode. */
+ public interface DesktopVisibilityListener {
+ /**
+ * Callback for when the user enters or exits Desktop Mode
+ *
+ * @param visible whether Desktop Mode is now visible
+ */
+ void onDesktopVisibilityChanged(boolean visible);
+ }
+
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index 8598917..6676766 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -284,7 +284,6 @@
isFixedLandscape: Boolean = false,
) {
setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
- LauncherPrefs.get(testContext).put(LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE, true)
val windowsBounds = perDisplayBoundsCache[displayInfo]!!
val realBounds = windowsBounds[rotation]
whenever(windowManagerProxy.getDisplayInfo(any())).thenReturn(displayInfo)
@@ -310,10 +309,11 @@
val configurationContext = runningContext.createConfigurationContext(config)
context = SandboxContext(configurationContext)
context.initDaggerComponent(
- DaggerAbsDPTestSandboxComponent.builder().bindWMProxy(windowManagerProxy)
+ DaggerAbsDPTestSandboxComponent.builder()
+ .bindWMProxy(windowManagerProxy)
+ .bindLauncherPrefs(launcherPrefs)
)
context.putObject(DisplayController.INSTANCE, displayController)
- context.putObject(LauncherPrefs.INSTANCE, launcherPrefs)
whenever(launcherPrefs.get(LauncherPrefs.TASKBAR_PINNING)).thenReturn(false)
whenever(launcherPrefs.get(LauncherPrefs.TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(true)
@@ -322,6 +322,7 @@
whenever(launcherPrefs.get(LauncherPrefs.DEVICE_TYPE)).thenReturn(-1)
whenever(launcherPrefs.get(LauncherPrefs.WORKSPACE_SIZE)).thenReturn("")
whenever(launcherPrefs.get(LauncherPrefs.DB_FILE)).thenReturn("")
+ whenever(launcherPrefs.get(LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE)).thenReturn(true)
val info = spy(DisplayController.Info(context, windowManagerProxy, perDisplayBoundsCache))
whenever(displayController.info).thenReturn(info)
whenever(info.isTransientTaskbar).thenReturn(isGestureMode)
@@ -375,6 +376,8 @@
interface Builder : LauncherAppComponent.Builder {
@BindsInstance fun bindWMProxy(proxy: MyWmProxy): Builder
+ @BindsInstance fun bindLauncherPrefs(prefs: LauncherPrefs): Builder
+
override fun build(): AbsDPTestSandboxComponent
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt
index 946bbc5..7573d2f 100644
--- a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt
@@ -17,61 +17,24 @@
package com.android.launcher3
import android.content.Context
-import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import android.content.Context.MODE_PRIVATE
+import android.content.SharedPreferences
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppSingleton
+import java.io.File
+import javax.inject.Inject
/** Emulates Launcher preferences for a test environment. */
-class FakeLauncherPrefs(private val context: Context) : LauncherPrefs() {
- private val prefsMap = mutableMapOf<String, Any>()
- private val listeners = mutableSetOf<LauncherPrefChangeListener>()
+@LauncherAppSingleton
+class FakeLauncherPrefs @Inject constructor(@ApplicationContext context: Context) :
+ LauncherPrefs(context) {
- @Suppress("UNCHECKED_CAST")
- override fun <T> get(item: ContextualItem<T>): T {
- return prefsMap.getOrDefault(item.sharedPrefKey, item.defaultValueFromContext(context)) as T
- }
+ private val backingPrefs =
+ context.getSharedPreferences(
+ File.createTempFile("fake-pref", ".xml", context.filesDir),
+ MODE_PRIVATE,
+ )
- @Suppress("UNCHECKED_CAST")
- override fun <T> get(item: ConstantItem<T>): T {
- return prefsMap.getOrDefault(item.sharedPrefKey, item.defaultValue) as T
- }
-
- override fun put(vararg itemsToValues: Pair<Item, Any>) = putSync(*itemsToValues)
-
- override fun <T : Any> put(item: Item, value: T) = putSync(item to value)
-
- override fun putSync(vararg itemsToValues: Pair<Item, Any>) {
- itemsToValues
- .map { (i, v) -> i.sharedPrefKey to v }
- .forEach { (k, v) ->
- prefsMap[k] = v
- notifyChange(k)
- }
- }
-
- override fun addListener(listener: LauncherPrefChangeListener, vararg items: Item) {
- listeners.add(listener)
- }
-
- override fun removeListener(listener: LauncherPrefChangeListener, vararg items: Item) {
- listeners.remove(listener)
- }
-
- override fun has(vararg items: Item) = items.all { it.sharedPrefKey in prefsMap }
-
- override fun remove(vararg items: Item) = removeSync(*items)
-
- override fun removeSync(vararg items: Item) {
- items
- .filter { it.sharedPrefKey in prefsMap }
- .forEach {
- prefsMap.remove(it.sharedPrefKey)
- notifyChange(it.sharedPrefKey)
- }
- }
-
- override fun close() = Unit
-
- private fun notifyChange(key: String) {
- // Mimics SharedPreferencesImpl#notifyListeners main thread dispatching.
- MAIN_EXECUTOR.execute { listeners.forEach { it.onPrefChanged(key) } }
- }
+ override val Item.sharedPrefs: SharedPreferences
+ get() = backingPrefs
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt
index 2463c93..c57c86f 100644
--- a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt
@@ -128,7 +128,7 @@
val listener = LauncherPrefChangeListener { changedKey = it }
launcherPrefs.addListener(listener, TEST_CONSTANT_ITEM)
- launcherPrefs.removeListener(listener)
+ launcherPrefs.removeListener(listener, TEST_CONSTANT_ITEM)
getInstrumentation().runOnMainSync { launcherPrefs.put(TEST_CONSTANT_ITEM, true) }
assertThat(changedKey).isNull()
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/ui/BubbleTextViewTest.java b/tests/multivalentTests/src/com/android/launcher3/ui/BubbleTextViewTest.java
index b933ed2..f51871b 100644
--- a/tests/multivalentTests/src/com/android/launcher3/ui/BubbleTextViewTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/ui/BubbleTextViewTest.java
@@ -20,8 +20,6 @@
import static android.graphics.fonts.FontStyle.FONT_WEIGHT_NORMAL;
import static android.text.style.DynamicDrawableSpan.ALIGN_CENTER;
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-
import static com.android.launcher3.BubbleTextView.DISPLAY_ALL_APPS;
import static com.android.launcher3.BubbleTextView.DISPLAY_PREDICTION_ROW;
import static com.android.launcher3.BubbleTextView.DISPLAY_SEARCH_RESULT;
@@ -44,6 +42,7 @@
import android.graphics.Typeface;
import android.os.Build;
import android.os.UserHandle;
+import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.text.SpannedString;
@@ -64,8 +63,10 @@
import com.android.launcher3.util.ActivityContextWrapper;
import com.android.launcher3.util.FlagOp;
import com.android.launcher3.util.IntArray;
+import com.android.launcher3.util.LauncherModelHelper.SandboxModelContext;
import com.android.launcher3.views.BaseDragLayer;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -111,19 +112,22 @@
private static final float SPACE_MULTIPLIER = 1;
private static final float SPACE_EXTRA = 0;
+ private SandboxModelContext mModelContext;
+
private BubbleTextView mBubbleTextView;
private ItemInfoWithIcon mItemInfoWithIcon;
private Context mContext;
private int mLimitedWidth;
private AppInfo mGmailAppInfo;
- private LauncherPrefs mLauncherPrefs;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
Utilities.enableRunningInTestHarnessForTests();
- mContext = new ActivityContextWrapper(getApplicationContext());
- mLauncherPrefs = LauncherPrefs.get(mContext);
+ mModelContext = new SandboxModelContext();
+ LauncherPrefs.get(mModelContext).put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
+
+ mContext = new ActivityContextWrapper(mModelContext);
mBubbleTextView = new BubbleTextView(mContext);
mBubbleTextView.reset();
@@ -149,10 +153,14 @@
mGmailAppInfo = new AppInfo(componentName, "Gmail", WORK_HANDLE, new Intent());
}
+ @After
+ public void tearDown() {
+ mModelContext.onDestroy();
+ }
+
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testEmptyString_flagOn() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
mItemInfoWithIcon.title = EMPTY_STRING;
mBubbleTextView.setDisplay(DISPLAY_ALL_APPS);
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -165,8 +173,8 @@
}
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testEmptyString_flagOff() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
mItemInfoWithIcon.title = EMPTY_STRING;
mBubbleTextView.setDisplay(DISPLAY_ALL_APPS);
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -179,9 +187,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testStringWithSpaceLongerThanCharLimit_flagOn() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "Battery Stats"
mItemInfoWithIcon.title = TEST_STRING_WITH_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -195,8 +202,8 @@
}
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testStringWithSpaceLongerThanCharLimit_flagOff() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
// test string: "Battery Stats"
mItemInfoWithIcon.title = TEST_STRING_WITH_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -210,9 +217,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testLongStringNoSpaceLongerThanCharLimit_flagOn() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "flutterappflorafy"
mItemInfoWithIcon.title = TEST_LONG_STRING_NO_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -226,8 +232,8 @@
}
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testLongStringNoSpaceLongerThanCharLimit_flagOff() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
// test string: "flutterappflorafy"
mItemInfoWithIcon.title = TEST_LONG_STRING_NO_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -241,9 +247,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testLongStringWithSpaceLongerThanCharLimit_flagOn() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "System UWB Field Test"
mItemInfoWithIcon.title = TEST_LONG_STRING_WITH_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -257,8 +262,8 @@
}
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testLongStringWithSpaceLongerThanCharLimit_flagOff() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
// test string: "System UWB Field Test"
mItemInfoWithIcon.title = TEST_LONG_STRING_WITH_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -272,9 +277,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testLongStringSymbolLongerThanCharLimit_flagOn() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "LEGO®Builder"
mItemInfoWithIcon.title = TEST_LONG_STRING_SYMBOL_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -288,8 +292,8 @@
}
@Test
+ @DisableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testLongStringSymbolLongerThanCharLimit_flagOff() {
- mSetFlagsRule.disableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
// test string: "LEGO®Builder"
mItemInfoWithIcon.title = TEST_LONG_STRING_SYMBOL_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -359,9 +363,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void testEnsurePredictionRowIsTwoLine() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "Battery Stats"
mItemInfoWithIcon.title = TEST_STRING_WITH_SPACE_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.setDisplay(DISPLAY_PREDICTION_ROW);
@@ -375,9 +378,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void modifyTitleToSupportMultiLine_whenLimitedHeight_shouldBeOneLine() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "LEGO®Builder"
mItemInfoWithIcon.title = TEST_LONG_STRING_SYMBOL_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.applyLabel(mItemInfoWithIcon);
@@ -390,9 +392,8 @@
}
@Test
+ @EnableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
public void modifyTitleToSupportMultiLine_whenUnlimitedHeight_shouldBeTwoLine() {
- mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TWOLINE_TOGGLE);
- mLauncherPrefs.put(ENABLE_TWOLINE_ALLAPPS_TOGGLE, true);
// test string: "LEGO®Builder"
mItemInfoWithIcon.title = TEST_LONG_STRING_SYMBOL_LONGER_THAN_CHAR_LIMIT;
mBubbleTextView.setDisplay(DISPLAY_ALL_APPS);
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt
index d0cf610..e6e156f 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt
@@ -43,7 +43,6 @@
import dagger.Component
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue
-import kotlin.math.min
import org.junit.After
import org.junit.Before
import org.junit.Test
@@ -58,6 +57,7 @@
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.mockito.stubbing.Answer
+import kotlin.math.min
/** Unit tests for {@link DisplayController} */
@SmallTest
@@ -97,9 +97,10 @@
@Before
fun setUp() {
context.initDaggerComponent(
- DaggerDisplayControllerTestComponent.builder().bindWMProxy(windowManagerProxy)
+ DaggerDisplayControllerTestComponent.builder()
+ .bindWMProxy(windowManagerProxy)
+ .bindLauncherPrefs(launcherPrefs)
)
- context.putObject(LauncherPrefs.INSTANCE, launcherPrefs)
displayManager = context.spyService(DisplayManager::class.java)
whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false)
@@ -243,6 +244,8 @@
interface Builder : LauncherAppComponent.Builder {
@BindsInstance fun bindWMProxy(proxy: MyWmProxy): Builder
+ @BindsInstance fun bindLauncherPrefs(prefs: LauncherPrefs): Builder
+
override fun build(): DisplayControllerTestComponent
}
}