From 4dfb35acc147280c15ed14d1d8458309e33f805e Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 18 Oct 2024 04:25:48 +0000 Subject: [PATCH 01/18] Remove user TIS unlocked runnable when a TIS instance is destroyed - If the TIS instance is destroyed, then we should remove any queued user-unlocked runnables to ensure that they do not attempt to run again Flag: EXEMPT bugfix Bug: 373671447 Test: atest NexusLauncherTests (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:a9355d4dba3f0bf93cb1a28eb738c6c05dc43ca9) Merged-In: I8ca3cdfa6f849bce5d347f14038e1ebd6bc6ff06 Change-Id: I8ca3cdfa6f849bce5d347f14038e1ebd6bc6ff06 --- .../com/android/quickstep/TouchInteractionService.java | 9 +++++++-- src/com/android/launcher3/util/LockedUserState.kt | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 41a8a3150f..1481ef2460 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -607,6 +607,9 @@ public class TouchInteractionService extends Service { this::createFallbackSwipeHandler; private final AbsSwipeUpHandler.Factory mRecentsWindowSwipeHandlerFactory = this::createRecentsWindowSwipeHandler; + // This needs to be a member to be queued and potentially removed later if the service is + // destroyed before the user is unlocked + private final Runnable mUserUnlockedRunnable = this::onUserUnlocked; private final ScreenOnTracker.ScreenOnListener mScreenOnListener = this::onScreenOnChanged; @@ -678,8 +681,7 @@ public class TouchInteractionService extends Service { mInputConsumer = InputConsumerController.getRecentsAnimationInputConsumer(); // Call runOnUserUnlocked() before any other callbacks to ensure everything is initialized. - LockedUserState.get(this).runOnUserUnlocked(this::onUserUnlocked); - LockedUserState.get(this).runOnUserUnlocked(mTaskbarManager::onUserUnlocked); + LockedUserState.get(this).runOnUserUnlocked(mUserUnlockedRunnable); mDeviceState.addNavigationModeChangedCallback(this::onNavigationModeChanged); sConnected = true; @@ -746,6 +748,8 @@ public class TouchInteractionService extends Service { mOverviewComponentObserver.setOverviewChangeListener(this::onOverviewTargetChange); onOverviewTargetChange(mOverviewComponentObserver.isHomeAndOverviewSame()); + + mTaskbarManager.onUserUnlocked(); } public OverviewCommandHelper getOverviewCommandHelper() { @@ -836,6 +840,7 @@ public class TouchInteractionService extends Service { mDesktopVisibilityController.onDestroy(); sConnected = false; + LockedUserState.get(this).removeOnUserUnlockedRunnable(mUserUnlockedRunnable); ScreenOnTracker.INSTANCE.get(this).removeListener(mScreenOnListener); super.onDestroy(); } diff --git a/src/com/android/launcher3/util/LockedUserState.kt b/src/com/android/launcher3/util/LockedUserState.kt index 10559f3489..c8d86d4244 100644 --- a/src/com/android/launcher3/util/LockedUserState.kt +++ b/src/com/android/launcher3/util/LockedUserState.kt @@ -88,6 +88,13 @@ class LockedUserState(private val mContext: Context) : SafeCloseable { mUserUnlockedActions.add(action) } + /** + * Removes a previously queued `Runnable` to be run when the user is unlocked. + */ + fun removeOnUserUnlockedRunnable(action: Runnable) { + mUserUnlockedActions.remove(action) + } + companion object { @VisibleForTesting @JvmField From 0583861724cd4c2947f6beba5dbf5da10ecdd978 Mon Sep 17 00:00:00 2001 From: Daniel Chapin Date: Wed, 30 Oct 2024 14:56:05 +0000 Subject: [PATCH 02/18] Revert "Shape screen communication with the Launcher's app (2/2)" Revert submission 29934361-launcher-communication Reason for revert: b/376371559 Reverted changes: /q/submissionid:29934361-launcher-communication (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:cd958b38acb45edc1b38910909743dc38d538d2d) Merged-In: I26b2339fdb4da11312d4587ab31c23880ef0d746 Change-Id: I26b2339fdb4da11312d4587ab31c23880ef0d746 --- .../graphics/GridCustomizationsProvider.java | 133 ++++-------------- src/com/android/launcher3/shapes/AppShape.kt | 19 --- .../launcher3/shapes/AppShapesProvider.kt | 54 ------- 3 files changed, 29 insertions(+), 177 deletions(-) delete mode 100644 src/com/android/launcher3/shapes/AppShape.kt delete mode 100644 src/com/android/launcher3/shapes/AppShapesProvider.kt diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java index bc51a66c1c..259e54307d 100644 --- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java +++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java @@ -36,24 +36,18 @@ import android.os.Messenger; import android.text.TextUtils; import android.util.Log; -import androidx.annotation.NonNull; - import com.android.launcher3.InvariantDeviceProfile; import com.android.launcher3.InvariantDeviceProfile.GridOption; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherPrefs; import com.android.launcher3.model.BgDataModel; -import com.android.launcher3.shapes.AppShape; -import com.android.launcher3.shapes.AppShapesProvider; import com.android.launcher3.util.Executors; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RunnableList; import com.android.systemui.shared.Flags; import java.util.Collections; -import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.WeakHashMap; import java.util.concurrent.ExecutionException; @@ -61,44 +55,31 @@ import java.util.concurrent.ExecutionException; /** * Exposes various launcher grid options and allows the caller to change them. * APIs: - * /shape_options: List of various available shape options, where each has following fields - * shape_key: key of the shape option - * title: translated title of the shape option - * path: path of the shape, assuming drawn on 100x100 view port - * is_default: true if this shape option is currently set to the system - * - * /grid_options: List the various available grid options, where each has following fields - * name: key of the grid option + * /list_options: List the various available grip options, has following columns + * name: name of the grid * rows: number of rows in the grid * cols: number of columns in the grid * preview_count: number of previews available for this grid option. The preview uri * looks like /preview// - * is_default: true if this grid option is currently set to the system + * is_default: true if this grid is currently active * - * /get_preview: Open a file stream for the grid preview + * /preview: Opens a file stream for the grid preview * - * /default_grid: Call update to set the current shape and grid, with values - * shape_key: key of the shape to apply - * name: key of the grid to apply + * /default_grid: Call update to set the current grid, with values + * name: name of the grid to apply */ public class GridCustomizationsProvider extends ContentProvider { private static final String TAG = "GridCustomizationsProvider"; - private static final String KEY_SHAPE_KEY = "shape_key"; - private static final String KEY_TITLE = "title"; - private static final String KEY_PATH = "path"; - // is_default means if a certain option is currently set to the system - private static final String KEY_IS_DEFAULT = "is_default"; - // Key of grid option. We do not change the name to grid_key for backward compatibility - private static final String KEY_GRID_KEY = "name"; + private static final String KEY_NAME = "name"; private static final String KEY_ROWS = "rows"; private static final String KEY_COLS = "cols"; private static final String KEY_PREVIEW_COUNT = "preview_count"; + private static final String KEY_IS_DEFAULT = "is_default"; - private static final String KEY_SHAPE_OPTIONS = "/shape_options"; - private static final String KEY_GRID_OPTIONS = "/grid_options"; - private static final String KEY_SHAPE_GRID = "/default_grid"; + private static final String KEY_LIST_OPTIONS = "/list_options"; + private static final String KEY_DEFAULT_GRID = "/default_grid"; private static final String METHOD_GET_PREVIEW = "get_preview"; @@ -110,9 +91,9 @@ public class GridCustomizationsProvider extends ContentProvider { private static final String KEY_SURFACE_PACKAGE = "surface_package"; private static final String KEY_CALLBACK = "callback"; public static final String KEY_HIDE_BOTTOM_ROW = "hide_bottom_row"; + public static final String KEY_GRID_NAME = "grid_name"; private static final int MESSAGE_ID_UPDATE_PREVIEW = 1337; - private static final int MESSAGE_ID_UPDATE_SHAPE = 2586; private static final int MESSAGE_ID_UPDATE_GRID = 7414; private static final int MESSAGE_ID_UPDATE_COLOR = 856; @@ -128,39 +109,14 @@ public class GridCustomizationsProvider extends ContentProvider { @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { - Context context = getContext(); - String path = uri.getPath(); - if (context == null || path == null) { - return null; - } - switch (path) { - case KEY_SHAPE_OPTIONS: { - if (Flags.newCustomizationPickerUi()) { - MatrixCursor cursor = new MatrixCursor(new String[]{ - KEY_SHAPE_KEY, KEY_TITLE, KEY_PATH, KEY_IS_DEFAULT}); - List shapes = AppShapesProvider.INSTANCE.getShapes(); - for (int i = 0; i < shapes.size(); i++) { - AppShape shape = shapes.get(i); - cursor.newRow() - .add(KEY_SHAPE_KEY, shape.getKey()) - .add(KEY_TITLE, shape.getTitle()) - .add(KEY_PATH, shape.getPath()) - // TODO (b/348664593): We should fetch the currently-set shape - // option from the preferences. - .add(KEY_IS_DEFAULT, i == 0); - } - return cursor; - } else { - return null; - } - } - case KEY_GRID_OPTIONS: { + switch (uri.getPath()) { + case KEY_LIST_OPTIONS: { MatrixCursor cursor = new MatrixCursor(new String[]{ - KEY_GRID_KEY, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, KEY_IS_DEFAULT}); - InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(context); - for (GridOption gridOption : idp.parseAllGridOptions(context)) { + KEY_NAME, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, KEY_IS_DEFAULT}); + InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(getContext()); + for (GridOption gridOption : idp.parseAllGridOptions(getContext())) { cursor.newRow() - .add(KEY_GRID_KEY, gridOption.name) + .add(KEY_NAME, gridOption.name) .add(KEY_ROWS, gridOption.numRows) .add(KEY_COLS, gridOption.numColumns) .add(KEY_PREVIEW_COUNT, 1) @@ -203,22 +159,14 @@ public class GridCustomizationsProvider extends ContentProvider { return 0; } switch (path) { - case KEY_SHAPE_GRID: { - if (Flags.newCustomizationPickerUi()) { - String shapeKey = values.getAsString(KEY_SHAPE_KEY); - Optional optionalShape = AppShapesProvider.INSTANCE.getShapes() - .stream().filter(shape -> shape.getKey().equals(shapeKey)).findFirst(); - String pathToSet = optionalShape.map(AppShape::getPath).orElse(null); - // TODO (b/348664593): Apply shapeName to the system. This needs to be a - // synchronous call. - } - String gridKey = values.getAsString(KEY_GRID_KEY); + case KEY_DEFAULT_GRID: { + String gridName = values.getAsString(KEY_NAME); InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(context); // Verify that this is a valid grid option GridOption match = null; for (GridOption option : idp.parseAllGridOptions(context)) { String name = option.name; - if (name != null && name.equals(gridKey)) { + if (name != null && name.equals(gridName)) { match = option; break; } @@ -227,7 +175,7 @@ public class GridCustomizationsProvider extends ContentProvider { return 0; } - idp.setCurrentGrid(context, gridKey); + idp.setCurrentGrid(context, gridName); if (Flags.newCustomizationPickerUi()) { try { // Wait for device profile to be fully reloaded and applied to the launcher @@ -269,30 +217,20 @@ public class GridCustomizationsProvider extends ContentProvider { } @Override - public Bundle call(@NonNull String method, String arg, Bundle extras) { - Context context = getContext(); - if (context == null) { - return null; - } - - if (context.checkPermission("android.permission.BIND_WALLPAPER", + public Bundle call(String method, String arg, Bundle extras) { + if (getContext().checkPermission("android.permission.BIND_WALLPAPER", Binder.getCallingPid(), Binder.getCallingUid()) != PackageManager.PERMISSION_GRANTED) { return null; } - if (METHOD_GET_PREVIEW.equals(method)) { - return getPreview(extras); - } else { + if (!METHOD_GET_PREVIEW.equals(method)) { return null; } + return getPreview(extras); } private synchronized Bundle getPreview(Bundle request) { - Context context = getContext(); - if (context == null) { - return null; - } RunnableList lifeCycleTracker = new RunnableList(); try { PreviewSurfaceRenderer renderer = new PreviewSurfaceRenderer( @@ -330,9 +268,7 @@ public class GridCustomizationsProvider extends ContentProvider { public final PreviewSurfaceRenderer renderer; public boolean destroyed = false; - PreviewLifecycleObserver( - RunnableList lifeCycleTracker, - PreviewSurfaceRenderer renderer) { + PreviewLifecycleObserver(RunnableList lifeCycleTracker, PreviewSurfaceRenderer renderer) { this.lifeCycleTracker = lifeCycleTracker; this.renderer = renderer; lifeCycleTracker.add(() -> destroyed = true); @@ -348,21 +284,10 @@ public class GridCustomizationsProvider extends ContentProvider { case MESSAGE_ID_UPDATE_PREVIEW: renderer.hideBottomRow(message.getData().getBoolean(KEY_HIDE_BOTTOM_ROW)); break; - case MESSAGE_ID_UPDATE_SHAPE: - if (Flags.newCustomizationPickerUi()) { - String shapeKey = message.getData().getString(KEY_SHAPE_KEY); - Optional optionalShape = AppShapesProvider.INSTANCE.getShapes() - .stream() - .filter(shape -> shape.getKey().equals(shapeKey)) - .findFirst(); - String pathToSet = optionalShape.map(AppShape::getPath).orElse(null); - // TODO (b/348664593): Update launcher preview with the given shape - } - break; case MESSAGE_ID_UPDATE_GRID: - String gridKey = message.getData().getString(KEY_GRID_KEY); - if (!TextUtils.isEmpty(gridKey)) { - renderer.updateGrid(gridKey); + String gridName = message.getData().getString(KEY_GRID_NAME); + if (!TextUtils.isEmpty(gridName)) { + renderer.updateGrid(gridName); } break; case MESSAGE_ID_UPDATE_COLOR: diff --git a/src/com/android/launcher3/shapes/AppShape.kt b/src/com/android/launcher3/shapes/AppShape.kt deleted file mode 100644 index 68200a0a85..0000000000 --- a/src/com/android/launcher3/shapes/AppShape.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2024 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.shapes - -class AppShape(val key: String, val title: String, val path: String) diff --git a/src/com/android/launcher3/shapes/AppShapesProvider.kt b/src/com/android/launcher3/shapes/AppShapesProvider.kt deleted file mode 100644 index 41bac6a150..0000000000 --- a/src/com/android/launcher3/shapes/AppShapesProvider.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2024 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.shapes - -object AppShapesProvider { - - val shapes = - listOf( - AppShape( - "arch", - "arch", - "M100 83.46C100 85.471 100 86.476 99.9 87.321 99.116 93.916 93.916 99.116 87.321 99.9 86.476 100 85.471 100 83.46 100H16.54C14.529 100 13.524 100 12.679 99.9 6.084 99.116.884 93.916.1 87.321 0 86.476 0 85.471 0 83.46L0 50C0 22.386 22.386 0 50 0 77.614 0 100 22.386 100 50V83.46Z", - ), - AppShape( - "4_sided_cookie", - "4 sided cookie", - "M63.605 3C84.733-6.176 106.176 15.268 97 36.395L95.483 39.888C92.681 46.338 92.681 53.662 95.483 60.112L97 63.605C106.176 84.732 84.733 106.176 63.605 97L60.112 95.483C53.662 92.681 46.338 92.681 39.888 95.483L36.395 97C15.267 106.176-6.176 84.732 3 63.605L4.517 60.112C7.319 53.662 7.319 46.338 4.517 39.888L3 36.395C-6.176 15.268 15.267-6.176 36.395 3L39.888 4.517C46.338 7.319 53.662 7.319 60.112 4.517L63.605 3Z", - ), - AppShape( - "seven_sided_cookie", - "7 sided cookie", - "M35.209 4.878C36.326 3.895 36.884 3.404 37.397 3.006 44.82-2.742 55.18-2.742 62.603 3.006 63.116 3.404 63.674 3.895 64.791 4.878 65.164 5.207 65.351 5.371 65.539 5.529 68.167 7.734 71.303 9.248 74.663 9.932 74.902 9.981 75.147 10.025 75.637 10.113 77.1 10.375 77.831 10.506 78.461 10.66 87.573 12.893 94.032 21.011 94.176 30.412 94.186 31.062 94.151 31.805 94.08 33.293 94.057 33.791 94.045 34.04 94.039 34.285 93.958 37.72 94.732 41.121 96.293 44.18 96.404 44.399 96.522 44.618 96.759 45.056 97.467 46.366 97.821 47.021 98.093 47.611 102.032 56.143 99.727 66.266 92.484 72.24 91.983 72.653 91.381 73.089 90.177 73.961 89.774 74.254 89.572 74.4 89.377 74.548 86.647 76.626 84.477 79.353 83.063 82.483 82.962 82.707 82.865 82.936 82.671 83.395 82.091 84.766 81.8 85.451 81.51 86.033 77.31 94.44 67.977 98.945 58.801 96.994 58.166 96.859 57.451 96.659 56.019 96.259 55.54 96.125 55.3 96.058 55.063 95.998 51.74 95.154 48.26 95.154 44.937 95.998 44.699 96.058 44.46 96.125 43.981 96.259 42.549 96.659 41.834 96.859 41.199 96.994 32.023 98.945 22.69 94.44 18.49 86.033 18.2 85.451 17.909 84.766 17.329 83.395 17.135 82.936 17.038 82.707 16.937 82.483 15.523 79.353 13.353 76.626 10.623 74.548 10.428 74.4 10.226 74.254 9.823 73.961 8.619 73.089 8.017 72.653 7.516 72.24.273 66.266-2.032 56.143 1.907 47.611 2.179 47.021 2.533 46.366 3.241 45.056 3.478 44.618 3.596 44.399 3.707 44.18 5.268 41.121 6.042 37.72 5.961 34.285 5.955 34.04 5.943 33.791 5.92 33.293 5.849 31.805 5.814 31.062 5.824 30.412 5.968 21.011 12.427 12.893 21.539 10.66 22.169 10.506 22.9 10.375 24.363 10.113 24.853 10.025 25.098 9.981 25.337 9.932 28.697 9.248 31.833 7.734 34.461 5.529 34.649 5.371 34.836 5.207 35.209 4.878Z", - ), - AppShape( - "sunny", - "sunny", - "M42.846 4.873C46.084-.531 53.916-.531 57.154 4.873L60.796 10.951C62.685 14.103 66.414 15.647 69.978 14.754L76.851 13.032C82.962 11.5 88.5 17.038 86.968 23.149L85.246 30.022C84.353 33.586 85.897 37.315 89.049 39.204L95.127 42.846C100.531 46.084 100.531 53.916 95.127 57.154L89.049 60.796C85.897 62.685 84.353 66.414 85.246 69.978L86.968 76.851C88.5 82.962 82.962 88.5 76.851 86.968L69.978 85.246C66.414 84.353 62.685 85.898 60.796 89.049L57.154 95.127C53.916 100.531 46.084 100.531 42.846 95.127L39.204 89.049C37.315 85.898 33.586 84.353 30.022 85.246L23.149 86.968C17.038 88.5 11.5 82.962 13.032 76.851L14.754 69.978C15.647 66.414 14.103 62.685 10.951 60.796L4.873 57.154C-.531 53.916-.531 46.084 4.873 42.846L10.951 39.204C14.103 37.315 15.647 33.586 14.754 30.022L13.032 23.149C11.5 17.038 17.038 11.5 23.149 13.032L30.022 14.754C33.586 15.647 37.315 14.103 39.204 10.951L42.846 4.873Z", - ), - AppShape( - "circle", - "circle", - "M99.18 50C99.18 77.162 77.162 99.18 50 99.18 22.838 99.18.82 77.162.82 50 .82 22.839 22.838.82 50 .82 77.162.82 99.18 22.839 99.18 50Z", - ), - AppShape( - "square", - "square", - "M99.18 53.689C99.18 67.434 99.18 74.306 97.022 79.758 93.897 87.649 87.649 93.897 79.758 97.022 74.306 99.18 67.434 99.18 53.689 99.18H46.311C32.566 99.18 25.694 99.18 20.242 97.022 12.351 93.897 6.103 87.649 2.978 79.758.82 74.306.82 67.434.82 53.689L.82 46.311C.82 32.566.82 25.694 2.978 20.242 6.103 12.351 12.351 6.103 20.242 2.978 25.694.82 32.566.82 46.311.82L53.689.82C67.434.82 74.306.82 79.758 2.978 87.649 6.103 93.897 12.351 97.022 20.242 99.18 25.694 99.18 32.566 99.18 46.311V53.689Z\n", - ), - ) -} From 4aa8b8c32937581ed829389fbea0c24aaac164ec Mon Sep 17 00:00:00 2001 From: George Lin Date: Fri, 1 Nov 2024 17:37:55 +0000 Subject: [PATCH 03/18] Fix grid entry is missing Test: Manually tested that the entry shows up again Fixes: 376371559 Flag: EXEMPT bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:50d2c82de627d06ef6fa8035d8f61b98783e57ee) Merged-In: I8ecc842b948f0ed0676d3600d9538450012c7e80 Change-Id: I8ecc842b948f0ed0676d3600d9538450012c7e80 --- .../android/launcher3/graphics/GridCustomizationsProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java index a5bcd0f39f..87c2154032 100644 --- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java +++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java @@ -113,7 +113,8 @@ public class GridCustomizationsProvider extends ContentProvider { switch (uri.getPath()) { case KEY_LIST_OPTIONS: { MatrixCursor cursor = new MatrixCursor(new String[]{ - KEY_NAME, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, KEY_IS_DEFAULT}); + KEY_NAME, KEY_GRID_TITLE, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, + KEY_IS_DEFAULT}); InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(getContext()); for (GridOption gridOption : idp.parseAllGridOptions(getContext())) { cursor.newRow() From 5c8eb5aef96e512b7be425a05f12dbd69816caf7 Mon Sep 17 00:00:00 2001 From: "ESWAR MAGATAPALLI (xWF)" Date: Mon, 18 Nov 2024 02:40:15 +0000 Subject: [PATCH 04/18] Revert "Remove redundant a11y announcement upon removal of workspace item." This reverts commit 556db6df04855af915eb2ae01a044e03319493fc. Reason for revert: Droidmonitor created revert due to b/379322118. Will be verifying through ABTD before submission. (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:9707b2cd0d01f833a76bbf01b1026f1fdde510f8) Merged-In: Iece717248c63b3b8dabcdf1c413309d24f51c37f Change-Id: Iece717248c63b3b8dabcdf1c413309d24f51c37f --- src/com/android/launcher3/DeleteDropTarget.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java index 425f277eea..58789fd8f2 100644 --- a/src/com/android/launcher3/DeleteDropTarget.java +++ b/src/com/android/launcher3/DeleteDropTarget.java @@ -130,6 +130,7 @@ public class DeleteDropTarget extends ButtonDropTarget { public void completeDrop(DragObject d) { ItemInfo item = d.dragInfo; if (canRemove(item)) { + onAccessibilityDrop(null, item); mDropTargetHandler.onDeleteComplete(item); } } From 9ff1cb6340ab044260e69a4464b32e44afcb0f8d Mon Sep 17 00:00:00 2001 From: vinayjoglekar Date: Wed, 11 Dec 2024 12:01:41 +0000 Subject: [PATCH 05/18] Fix for split animation While splitting focus task, there is a timing issue of focus task being animated first and then small tiles. This CL fixes that makes animation smooth i.e. animate stage task(focus task) and other small tiles together. Also refactored animationStartProgress and animationEndProgress initialisation by adding "if/else" for readability. Test: Manual.Split focus task.(RTL as well) Fix: 383417963 Flag: com.android.launcher3.enable_large_desktop_windowing_tile (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ff076f85d6e3c9f537ea022ee15b10c7a1e97225) Merged-In: I7b8c651d91168802b930fdeac62e762a2be9dbe9 Change-Id: I7b8c651d91168802b930fdeac62e762a2be9dbe9 --- .../android/quickstep/views/RecentsView.java | 59 +++++++++++-------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index ae906de306..6752775be3 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -3900,25 +3900,40 @@ public abstract class RecentsView< : distanceFromDismissedTask; // Set timings based on if user is initiating splitscreen on the focused task, // or splitting/dismissing some other task. - float animationStartProgress = isSlidingTasks - ? Utilities.boundToRange( - splitTimings.getGridSlideStartOffset() - + (splitTimings.getGridSlideStaggerOffset() - * staggerColumn), - 0f, - dismissTranslationInterpolationEnd) - : Utilities.boundToRange( - INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET - + ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET - * staggerColumn, 0f, dismissTranslationInterpolationEnd); - float animationEndProgress = isSlidingTasks - ? Utilities.boundToRange( - splitTimings.getGridSlideStartOffset() - + (splitTimings.getGridSlideStaggerOffset() * staggerColumn) - + splitTimings.getGridSlideDurationOffset(), - 0f, - dismissTranslationInterpolationEnd) - : dismissTranslationInterpolationEnd; + final float animationStartProgress; + if (isSlidingTasks) { + float slidingStartOffset = splitTimings.getGridSlideStartOffset() + + (splitTimings.getGridSlideStaggerOffset() * staggerColumn); + if (areAllDesktopTasksDismissed) { + animationStartProgress = Utilities.boundToRange( + slidingStartOffset + + splitTimings.getDesktopFadeSplitAnimationEndOffset(), + 0f, + dismissTranslationInterpolationEnd); + } else { + animationStartProgress = Utilities.boundToRange( + slidingStartOffset, + 0f, + dismissTranslationInterpolationEnd); + } + } else { + animationStartProgress = Utilities.boundToRange( + INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET + + ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET + * staggerColumn, 0f, dismissTranslationInterpolationEnd); + } + + final float animationEndProgress; + if (isSlidingTasks && taskView != nextFocusedTaskView) { + animationEndProgress = Utilities.boundToRange( + splitTimings.getGridSlideStartOffset() + + (splitTimings.getGridSlideStaggerOffset() * staggerColumn) + + splitTimings.getGridSlideDurationOffset(), + 0f, + dismissTranslationInterpolationEnd); + } else { + animationEndProgress = dismissTranslationInterpolationEnd; + } Interpolator dismissInterpolator = isSlidingTasks ? EMPHASIZED : LINEAR; @@ -3930,7 +3945,6 @@ public abstract class RecentsView< clampToProgress(LINEAR, animationStartProgress, dismissTranslationInterpolationEnd)); primaryTranslation += dismissedTaskWidth; - animationEndProgress = dismissTranslationInterpolationEnd; float secondaryTranslation = -mTaskGridVerticalDiff; if (!nextFocusedTaskFromTop) { secondaryTranslation -= mTopBottomRowHeightDiff; @@ -3958,11 +3972,6 @@ public abstract class RecentsView< startTranslation = isTaskViewVisible(taskView) ? 0 : finalTranslation + (mIsRtl ? -mLastComputedTaskSize.right : mLastComputedTaskSize.right); - animationStartProgress = Utilities.boundToRange( - animationStartProgress - + splitTimings.getDesktopFadeSplitAnimationEndOffset(), - 0f, - dismissTranslationInterpolationEnd); } Animator dismissAnimator = ObjectAnimator.ofFloat(taskView, taskView.getPrimaryDismissTranslationProperty(), From 1750f73889f1bc07933301804102204bb8462f17 Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Thu, 12 Dec 2024 11:03:56 -0500 Subject: [PATCH 06/18] Update ProtoLogProxy classes to only log to protolog when protolog has been initialized Flag: com.android.launcher3.enable_active_gesture_proto_log Flag: com.android.launcher3.enable_recents_window_proto_log Flag: com.android.launcher3.enable_state_manager_proto_log Fixes: 381846204 Test: ran launcher and checked logs (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7fb1d6d53b2f9d9cb74689844894f36e7addb515) Merged-In: I807326bd6c65b8e51f5302ba58eed841c23216f6 Change-Id: I807326bd6c65b8e51f5302ba58eed841c23216f6 --- .../util/StateManagerProtoLogProxy.java | 11 +- .../util/ActiveGestureProtoLogProxy.java | 109 +++++++++--------- .../util/QuickstepProtoLogGroup.java | 28 ++++- .../util/RecentsWindowProtoLogProxy.java | 9 +- 4 files changed, 93 insertions(+), 64 deletions(-) diff --git a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java index bc989dc5aa..c319cb1378 100644 --- a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java @@ -18,6 +18,7 @@ package com.android.launcher3.util; import static com.android.launcher3.Flags.enableStateManagerProtoLog; import static com.android.quickstep.util.QuickstepProtoLogGroup.LAUNCHER_STATE_MANAGER; +import static com.android.quickstep.util.QuickstepProtoLogGroup.isProtoLogInitialized; import androidx.annotation.NonNull; @@ -30,7 +31,7 @@ public class StateManagerProtoLogProxy { public static void logGoToState( @NonNull Object fromState, @NonNull Object toState, @NonNull String trace) { - if (!enableStateManagerProtoLog()) return; + if (!enableStateManagerProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.goToState: fromState: %s, toState: %s, partial trace:\n%s", fromState, @@ -40,7 +41,7 @@ public class StateManagerProtoLogProxy { public static void logCreateAtomicAnimation( @NonNull Object fromState, @NonNull Object toState, @NonNull String trace) { - if (!enableStateManagerProtoLog()) return; + if (!enableStateManagerProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.createAtomicAnimation: " + "fromState: %s, toState: %s, partial trace:\n%s", fromState, @@ -49,17 +50,17 @@ public class StateManagerProtoLogProxy { } public static void logOnStateTransitionStart(@NonNull Object state) { - if (!enableStateManagerProtoLog()) return; + if (!enableStateManagerProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.onStateTransitionStart: state: %s", state); } public static void logOnStateTransitionEnd(@NonNull Object state) { - if (!enableStateManagerProtoLog()) return; + if (!enableStateManagerProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.onStateTransitionEnd: state: %s", state); } public static void logCancelAnimation(boolean animationOngoing, @NonNull String trace) { - if (!enableStateManagerProtoLog()) return; + if (!enableStateManagerProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.cancelAnimation: animation ongoing: %b, partial trace:\n%s", animationOngoing, diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java index f25f6f4ab7..be1a4e8c3c 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java @@ -37,6 +37,7 @@ import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; import static com.android.quickstep.util.QuickstepProtoLogGroup.ACTIVE_GESTURE_LOG; +import static com.android.quickstep.util.QuickstepProtoLogGroup.isProtoLogInitialized; import android.graphics.Point; import android.graphics.RectF; @@ -62,7 +63,7 @@ public class ActiveGestureProtoLogProxy { public static void logLauncherDestroyed() { ActiveGestureLog.INSTANCE.addLog("Launcher destroyed", LAUNCHER_DESTROYED); - if (!enableActiveGestureProtoLog()) return; + if (isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Launcher destroyed"); } @@ -70,7 +71,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "AbsSwipeUpHandler.onRecentsAnimationCanceled", /* gestureEvent= */ CANCEL_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onRecentsAnimationCanceled"); } @@ -78,7 +79,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "RecentsAnimationCallbacks.onAnimationFinished", ON_FINISH_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onAnimationFinished"); } @@ -86,27 +87,27 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( "AbsSwipeUpHandler.cancelCurrentAnimation", ActiveGestureErrorDetector.GestureEvent.CANCEL_CURRENT_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.cancelCurrentAnimation"); } public static void logAbsSwipeUpHandlerOnTasksAppeared() { ActiveGestureLog.INSTANCE.addLog("AbsSwipeUpHandler.onTasksAppeared: " + "force finish recents animation complete; clearing state callback."); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onTasksAppeared: " + "force finish recents animation complete; clearing state callback."); } public static void logHandOffAnimation() { ActiveGestureLog.INSTANCE.addLog("AbsSwipeUpHandler.handOffAnimation"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.handOffAnimation"); } public static void logFinishRecentsAnimationOnTasksAppeared() { ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimationOnTasksAppeared"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimationOnTasksAppeared"); } @@ -114,14 +115,14 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "RecentsAnimationCallbacks.onAnimationCanceled", /* gestureEvent= */ ON_CANCEL_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationCanceled"); } public static void logRecentsAnimationCallbacksOnTasksAppeared() { ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onTasksAppeared", ActiveGestureErrorDetector.GestureEvent.TASK_APPEARED); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onTasksAppeared"); } @@ -129,39 +130,39 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog( /* event= */ "TaskAnimationManager.startRecentsAnimation", /* gestureEvent= */ START_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation"); } public static void logLaunchingSideTaskFailed() { ActiveGestureLog.INSTANCE.addLog("Unable to launch side task (no recents)"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Unable to launch side task (no recents)"); } public static void logContinueRecentsAnimation() { ActiveGestureLog.INSTANCE.addLog(/* event= */ "continueRecentsAnimation"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "continueRecentsAnimation"); } public static void logCleanUpRecentsAnimationSkipped() { ActiveGestureLog.INSTANCE.addLog( /* event= */ "cleanUpRecentsAnimation skipped due to wrong callbacks"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "cleanUpRecentsAnimation skipped due to wrong callbacks"); } public static void logCleanUpRecentsAnimation() { ActiveGestureLog.INSTANCE.addLog(/* event= */ "cleanUpRecentsAnimation"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "cleanUpRecentsAnimation"); } public static void logOnInputEventUserLocked() { ActiveGestureLog.INSTANCE.addLog( "TIS.onInputEvent: Cannot process input event: user is locked"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent: Cannot process input event: user is locked"); } @@ -171,7 +172,7 @@ public class ActiveGestureProtoLogProxy { + "but a previously-requested recents animation hasn't started. " + "Ignoring all following motion events.", RECENTS_ANIMATION_START_PENDING); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent: A new gesture has been started, " + "but a previously-requested recents animation hasn't started. " + "Ignoring all following motion events."); @@ -180,53 +181,53 @@ public class ActiveGestureProtoLogProxy { public static void logOnInputEventThreeButtonNav() { ActiveGestureLog.INSTANCE.addLog("TIS.onInputEvent: Cannot process input event: " + "using 3-button nav and event is not a trackpad event"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent: Cannot process input event: " + "using 3-button nav and event is not a trackpad event"); } public static void logPreloadRecentsAnimation() { ActiveGestureLog.INSTANCE.addLog("preloadRecentsAnimation"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "preloadRecentsAnimation"); } public static void logRecentTasksMissing() { ActiveGestureLog.INSTANCE.addLog("Null mRecentTasks", RECENT_TASKS_MISSING); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Null mRecentTasks"); } public static void logExecuteHomeCommand() { ActiveGestureLog.INSTANCE.addLog("OverviewCommandHelper.executeCommand(HOME)"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "OverviewCommandHelper.executeCommand(HOME)"); } public static void logFinishRecentsAnimationCallback() { ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation-callback"); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimation-callback"); } public static void logOnScrollerAnimationAborted() { ActiveGestureLog.INSTANCE.addLog("scroller animation aborted", ActiveGestureErrorDetector.GestureEvent.SCROLLER_ANIMATION_ABORTED); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "scroller animation aborted"); } public static void logInputConsumerBecameActive(@NonNull String consumerName) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "%s became active", consumerName)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "%s became active", consumerName); } public static void logTaskLaunchFailed(int launchedTaskId) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Launch failed, task (id=%d) finished mid transition", launchedTaskId)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Launch failed, task (id=%d) finished mid transition", launchedTaskId); } @@ -234,7 +235,7 @@ public class ActiveGestureProtoLogProxy { public static void logOnPageEndTransition(int nextPageIndex) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "onPageEndTransition: current page index updated: %d", nextPageIndex)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onPageEndTransition: current page index updated: %d", nextPageIndex); } @@ -244,7 +245,7 @@ public class ActiveGestureProtoLogProxy { "Quick switch from home fallback case: The TaskView at index %d is missing.", taskIndex), QUICK_SWITCH_FROM_HOME_FALLBACK); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Quick switch from home fallback case: The TaskView at index %d is missing.", taskIndex); @@ -255,7 +256,7 @@ public class ActiveGestureProtoLogProxy { "Quick switch from home failed: TaskViews at indices %d and 0 are missing.", taskIndex), QUICK_SWITCH_FROM_HOME_FAILED); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Quick switch from home failed: TaskViews at indices %d and 0 are missing.", taskIndex); @@ -265,42 +266,42 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "finishRecentsAnimation: %b", toRecents), /* gestureEvent= */ FINISH_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimation: %b", toRecents); } public static void logSetEndTarget(@NonNull String target) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "setEndTarget %s", target), /* gestureEvent= */ SET_END_TARGET); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "setEndTarget %s", target); } public static void logStartHomeIntent(@NonNull String reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "OverviewComponentObserver.startHomeIntent: %s", reason)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "OverviewComponentObserver.startHomeIntent: %s", reason); } public static void logRunningTaskPackage(@NonNull String packageName) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Current running task package name=%s", packageName)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Current running task package name=%s", packageName); } public static void logSysuiStateFlags(@NonNull String stateFlags) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Current SystemUi state flags=%s", stateFlags)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Current SystemUi state flags=%s", stateFlags); } public static void logSetInputConsumer(@NonNull String consumerName, @NonNull String reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "setInputConsumer: %s. reason(s):%s", consumerName, reason)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "setInputConsumer: %s. reason(s):%s", consumerName, reason); } @@ -312,7 +313,7 @@ public class ActiveGestureProtoLogProxy { + "one (%s) was excluded from recents", otherTaskPackage, runningTaskPackage)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Changing active task to %s because the previous task running on top of this " + "one (%s) was excluded from recents", @@ -328,7 +329,7 @@ public class ActiveGestureProtoLogProxy { /* gestureEvent= */ action == ACTION_DOWN ? MOTION_DOWN : MOTION_UP); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent(%d, %d): %s, %s", x, y, actionString, classification); } @@ -341,7 +342,7 @@ public class ActiveGestureProtoLogProxy { classification, pointerCount), MOTION_MOVE); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent: %s, %s, pointerCount: %d", action, classification, pointerCount); } @@ -350,7 +351,7 @@ public class ActiveGestureProtoLogProxy { @NonNull String action, @NonNull String classification) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "onMotionEvent: %s, %s", action, classification)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent: %s, %s", action, classification); } @@ -362,7 +363,7 @@ public class ActiveGestureProtoLogProxy { startNavMode, currentNavMode), NAVIGATION_MODE_SWITCHED); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent: Navigation mode switched mid-gesture (%s -> %s); " + "cancelling gesture.", @@ -373,7 +374,7 @@ public class ActiveGestureProtoLogProxy { public static void logUnknownInputEvent(@NonNull String event) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TIS.onInputEvent: Cannot process input event: received unknown event %s", event)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onInputEvent: Cannot process input event: received unknown event %s", event); } @@ -381,14 +382,14 @@ public class ActiveGestureProtoLogProxy { public static void logFinishRunningRecentsAnimation(boolean toHome) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "finishRunningRecentsAnimation: %b", toHome)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRunningRecentsAnimation: %b", toHome); } public static void logOnRecentsAnimationStartCancelled() { ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onAnimationStart (canceled): 0", /* gestureEvent= */ ON_START_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationStart (canceled): 0"); } @@ -396,7 +397,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "RecentsAnimationCallbacks.onAnimationStart (canceled): %d", appCount), /* gestureEvent= */ ON_START_RECENTS_ANIMATION); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationStart (canceled): %d", appCount); } @@ -406,7 +407,7 @@ public class ActiveGestureProtoLogProxy { "TaskAnimationManager.startRecentsAnimation(%s): " + "Setting mRecentsAnimationStartPending = false", callback)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation(%s): " + "Setting mRecentsAnimationStartPending = false", @@ -418,7 +419,7 @@ public class ActiveGestureProtoLogProxy { "TaskAnimationManager.startRecentsAnimation: " + "Setting mRecentsAnimationStartPending = %b", value)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation: " + "Setting mRecentsAnimationStartPending = %b", @@ -428,28 +429,28 @@ public class ActiveGestureProtoLogProxy { public static void logLaunchingSideTask(int taskId) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Launching side task id=%d", taskId)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Launching side task id=%d", taskId); } public static void logOnInputEventActionDown(@NonNull ActiveGestureLog.CompoundString reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "TIS.onMotionEvent: ").append(reason)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent: %s", reason.toString()); } public static void logStartNewTask(@NonNull ActiveGestureLog.CompoundString tasks) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "Launching task: ").append(tasks)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent: %s", tasks.toString()); } public static void logMotionPauseDetectorEvent(@NonNull ActiveGestureLog.CompoundString event) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "MotionPauseDetector: ").append(event)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "MotionPauseDetector: %s", event.toString()); } @@ -457,7 +458,7 @@ public class ActiveGestureProtoLogProxy { @NonNull ActiveGestureLog.CompoundString reason) { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "handleTaskAppeared check failed: ").append(reason)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "handleTaskAppeared check failed: %s", reason.toString()); } @@ -469,7 +470,7 @@ public class ActiveGestureProtoLogProxy { @NonNull String string, @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) { ActiveGestureLog.INSTANCE.addLog(string, gestureEvent); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "%s", string); } @@ -477,7 +478,7 @@ public class ActiveGestureProtoLogProxy { ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( "onSettledOnEndTarget %s", endTarget), /* gestureEvent= */ ON_SETTLED_ON_END_TARGET); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onSettledOnEndTarget %s", endTarget); } @@ -488,7 +489,7 @@ public class ActiveGestureProtoLogProxy { velocityY, angle), velocityX == 0 && velocityY == 0 ? INVALID_VELOCITY_ON_SWIPE_UP : null); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "calculateEndTarget: velocities=(x=%fdp/ms, y=%fdp/ms), angle=%f", velocityX, @@ -501,7 +502,7 @@ public class ActiveGestureProtoLogProxy { "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s", taskId, packageName)); - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s", taskId, @@ -511,7 +512,7 @@ public class ActiveGestureProtoLogProxy { public static void logCreateTouchRegionForDisplay(int displayRotation, @NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion, int gesturalHeight, int largerGesturalHeight, @NonNull String reason) { - if (!enableActiveGestureProtoLog()) return; + if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "OrientationTouchTransformer.createRegionForDisplay: " + "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, " diff --git a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java index bb02a112d2..2327cfcf1d 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java +++ b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java @@ -16,6 +16,8 @@ package com.android.quickstep.util; +import android.util.Log; + import androidx.annotation.NonNull; import com.android.internal.protolog.ProtoLog; @@ -26,7 +28,7 @@ import java.util.UUID; /** Enums used to interface with the ProtoLog API. */ public enum QuickstepProtoLogGroup implements IProtoLogGroup { - ACTIVE_GESTURE_LOG(true, true, false, "ActiveGestureLog"), + ACTIVE_GESTURE_LOG(true, true, Constants.DEBUG_ACTIVE_GESTURE, "ActiveGestureLog"), RECENTS_WINDOW(true, true, Constants.DEBUG_RECENTS_WINDOW, "RecentsWindow"), LAUNCHER_STATE_MANAGER(true, true, Constants.DEBUG_STATE_MANAGER, "LauncherStateManager"); @@ -35,7 +37,23 @@ public enum QuickstepProtoLogGroup implements IProtoLogGroup { private volatile boolean mLogToLogcat; private final @NonNull String mTag; + public static boolean isProtoLogInitialized() { + if (!Variables.sIsInitialized) { + Log.w(Constants.TAG, + "Attempting to log to ProtoLog before initializing it.", + new IllegalStateException()); + } + return Variables.sIsInitialized; + } + public static void initProtoLog() { + if (Variables.sIsInitialized) { + Log.e(Constants.TAG, + "Attempting to re-initialize ProtoLog.", new IllegalStateException()); + return; + } + Log.i(Constants.TAG, "Initializing ProtoLog."); + Variables.sIsInitialized = true; ProtoLog.init(QuickstepProtoLogGroup.values()); } @@ -95,8 +113,16 @@ public enum QuickstepProtoLogGroup implements IProtoLogGroup { this.mLogToLogcat = logToLogcat; } + private static final class Variables { + + private static boolean sIsInitialized = false; + } + private static final class Constants { + private static final String TAG = "QuickstepProtoLogGroup"; + + private static final boolean DEBUG_ACTIVE_GESTURE = false; private static final boolean DEBUG_RECENTS_WINDOW = false; private static final boolean DEBUG_STATE_MANAGER = true; // b/279059025, b/325463989 diff --git a/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java index f54ad67697..2c9ae33ab6 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java @@ -18,6 +18,7 @@ package com.android.quickstep.util; import static com.android.launcher3.Flags.enableRecentsWindowProtoLog; import static com.android.quickstep.util.QuickstepProtoLogGroup.RECENTS_WINDOW; +import static com.android.quickstep.util.QuickstepProtoLogGroup.isProtoLogInitialized; import androidx.annotation.NonNull; @@ -36,17 +37,17 @@ import com.android.internal.protolog.common.IProtoLogGroup; public class RecentsWindowProtoLogProxy { public static void logOnStateSetStart(@NonNull String stateName) { - if (!enableRecentsWindowProtoLog()) return; + if (!enableRecentsWindowProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, "onStateSetStart: %s", stateName); } public static void logOnStateSetEnd(@NonNull String stateName) { - if (!enableRecentsWindowProtoLog()) return; + if (!enableRecentsWindowProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, "onStateSetEnd: %s", stateName); } public static void logStartRecentsWindow(boolean isShown, boolean windowViewIsNull) { - if (!enableRecentsWindowProtoLog()) return; + if (!enableRecentsWindowProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, "Starting recents window: isShow= %b, windowViewIsNull=%b", isShown, @@ -54,7 +55,7 @@ public class RecentsWindowProtoLogProxy { } public static void logCleanup(boolean isShown) { - if (!enableRecentsWindowProtoLog()) return; + if (!enableRecentsWindowProtoLog() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, "Cleaning up recents window: isShow= %b", isShown); } } From be55d969ff4fd0141433fd83c485b8c71e5bcaa8 Mon Sep 17 00:00:00 2001 From: Charlie Anderson Date: Wed, 11 Dec 2024 22:11:09 +0000 Subject: [PATCH 07/18] Prevent bad grid configuration by making sure RestoreDbTask updates IDP correctly. IPD#reset() was resetting the internal IDP dbFile to the factory default instead of current grid/db This lead to LoaderTask and grid migration creating an empty DB for the wrong grid size, while the restored DB remained unused. Leading to an empty home screen because an empty DB file was used. Bug: 377510898 Flag: EXEMPT bugfix Test: manually testing backup & restore with various grid sizes (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3eec1895edab17b713e8148dcfe763083e99c185) Merged-In: I709201e484afb8f12a4fde21198d2c5793d89ca1 Change-Id: I709201e484afb8f12a4fde21198d2c5793d89ca1 --- .../android/launcher3/InvariantDeviceProfile.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index dddc43f913..aefb2b1594 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -245,10 +245,6 @@ public class InvariantDeviceProfile implements SafeCloseable { @TargetApi(23) private InvariantDeviceProfile(Context context) { String gridName = getCurrentGridName(context); - FileLog.d(TAG, "New InvariantDeviceProfile, before initGrid(): " - + "gridName:" + gridName - + ", LauncherPrefs GRID_NAME:" + LauncherPrefs.get(context).get(GRID_NAME) - + ", LauncherPrefs DB_FILE:" + LauncherPrefs.get(context).get(DB_FILE)); initGrid(context, gridName); DisplayController.INSTANCE.get(context).setPriorityListener( (displayContext, info, flags) -> { @@ -353,6 +349,11 @@ public class InvariantDeviceProfile implements SafeCloseable { } private String initGrid(Context context, String gridName) { + FileLog.d(TAG, "Before initGrid:" + + "gridName:" + gridName + + ", dbFile:" + dbFile + + ", LauncherPrefs GRID_NAME:" + LauncherPrefs.get(context).get(GRID_NAME) + + ", LauncherPrefs DB_FILE:" + LauncherPrefs.get(context).get(DB_FILE)); Info displayInfo = DisplayController.INSTANCE.get(context).getInfo(); List allOptions = getPredefinedDeviceProfiles( context, @@ -378,8 +379,9 @@ public class InvariantDeviceProfile implements SafeCloseable { } initGrid(context, displayInfo, displayOption); - FileLog.d(TAG, "initGrid: " + FileLog.d(TAG, "After initGrid:" + "gridName:" + gridName + + ", dbFile:" + dbFile + ", LauncherPrefs GRID_NAME:" + LauncherPrefs.get(context).get(GRID_NAME) + ", LauncherPrefs DB_FILE:" + LauncherPrefs.get(context).get(DB_FILE)); return displayOption.grid.name; @@ -397,7 +399,7 @@ public class InvariantDeviceProfile implements SafeCloseable { */ @Deprecated public void reset(Context context) { - initGrid(context, getDefaultGridName(context)); + initGrid(context, getCurrentGridName(context)); } @VisibleForTesting From 9dcbbcb143b6e2f17f244c4748e34112deb0a846 Mon Sep 17 00:00:00 2001 From: Fengjiang Li Date: Thu, 12 Dec 2024 15:23:02 -0800 Subject: [PATCH 08/18] [-1] Fix flicker of -1 when swipe up to exit -1 isn't fast enough Fix: 381017761 Flag: NONE - released code Test: manual - record a video (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:b8b16bd2882d7752ffc46c2b55cecd22939a403e) Merged-In: I5bda4a234cdcc8227d4feb9a92a174d07e46f7a2 Change-Id: I5bda4a234cdcc8227d4feb9a92a174d07e46f7a2 --- .../src/com/android/quickstep/LauncherActivityInterface.java | 3 +-- src/com/android/launcher3/Launcher.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java index ef6a09dba8..d193feec65 100644 --- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java +++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java @@ -292,8 +292,7 @@ public final class LauncherActivityInterface extends return; } LauncherOverlayManager om = launcher.getOverlayManager(); - if (!SystemUiProxy.INSTANCE.get(launcher).getHomeVisibilityState().isHomeVisible() - || launcher.isForceInvisible()) { + if (!SystemUiProxy.INSTANCE.get(launcher).getHomeVisibilityState().isHomeVisible()) { om.hideOverlay(false /* animate */); } else { om.hideOverlay(150); diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index cb021c7d0d..0d64d9fb81 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -1677,7 +1677,7 @@ public class Launcher extends StatefulActivity if (FeatureFlags.enableSplitContextually()) { handleSplitAnimationGoingToHome(LAUNCHER_SPLIT_SELECTION_EXIT_HOME); } - mOverlayManager.hideOverlay(isStarted() && !isForceInvisible()); + mOverlayManager.hideOverlay(isStarted()); handleGestureContract(intent); } else if (Intent.ACTION_ALL_APPS.equals(intent.getAction())) { showAllAppsFromIntent(alreadyOnHome); From 59781fe109ec4c29c93eaea6b121f8fe6556da41 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Fri, 3 Jan 2025 19:03:43 +0000 Subject: [PATCH 09/18] Prevent CtS invocation in fake landscape mode Bug: 383421642 Test: manual, atest ContextualSearchInvokerTest Flag: EXEMPT bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:299576a77761e2a9db11ef50d7e0072d079e381c) Merged-In: I71ff453c54ade4583494ae9a6b44560d59b010d8 Change-Id: I71ff453c54ade4583494ae9a6b44560d59b010d8 --- .../quickstep/util/ContextualSearchInvoker.kt | 13 ++++++++++++- .../quickstep/util/ContextualSearchInvokerTest.java | 11 +++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt index 3be8ea6c6b..a24d447f8d 100644 --- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt +++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt @@ -162,7 +162,11 @@ internal constructor( 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 } @@ -198,6 +202,13 @@ internal constructor( return true } + private fun isFakeLandscape(): Boolean = + getRecentsContainerInterface() + ?.getCreatedContainer() + ?.getOverviewPanel>() + ?.getPagedOrientationHandler() + ?.isLayoutNaturalToLauncher == false + private fun isInSplitscreen(): Boolean { return topTaskTracker.getRunningSplitTaskIds().isNotEmpty() } 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 88774be33c..61971b1fc8 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.BaseContainerInterface; 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 @@ public class ContextualSearchInvokerTest { private @Mock BaseContainerInterface mMockContainerInterface; private @Mock RecentsViewContainer mMockRecentsViewContainer; private @Mock RecentsView mMockRecentsView; + private @Mock RecentsPagedOrientationHandler mMockOrientationHandler; private ContextualSearchInvoker mContextualSearchInvoker; @Before @@ -189,6 +191,15 @@ public class ContextualSearchInvokerTest { verify(mMockStatsLogger).log(LAUNCHER_LAUNCH_OMNI_ATTEMPTED_SPLITSCREEN); } + @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)) { From 09fb9c3743efe3e54635a7178c877c25e933f4c3 Mon Sep 17 00:00:00 2001 From: Jordan Silva Date: Tue, 7 Jan 2025 04:51:54 -0800 Subject: [PATCH 10/18] Revert "Dismiss recents when device goes to sleep" This reverts commit aed3b14abc494837bc84b89d86e10aa656eb2a23. Reason for revert: This fix introduced other issues, see b/386304079, b/384731940 Bug: 319365581 Bug: 386304079 Bug: 384731940 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:612b124b758dd99eba40efc6265c9b646fbbcab1) Merged-In: Ib49975208888fe54dd8bfb8dc3815f8825c8b5e8 Change-Id: Ib49975208888fe54dd8bfb8dc3815f8825c8b5e8 --- quickstep/src/com/android/quickstep/RecentsActivity.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 61a150b8b6..8ed674b21d 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -363,14 +363,6 @@ public final class RecentsActivity extends StatefulActivity implem this, LAUNCHER_ACTIVITY_STOPPED_MESSAGE); } - @Override - public void onUiChangedWhileSleeping() { - super.onUiChangedWhileSleeping(); - // Dismiss recents and navigate to home if the device goes to sleep - // while in recents. - startHome(); - } - @Override protected void onResume() { super.onResume(); From fc69516a06f26c9d1de122c25551f5cb1450ab7d Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Dec 2024 15:01:38 -0800 Subject: [PATCH 11/18] Removing TisHelper dependency in taskbar Taskbar should be able to access TouchInteractionService directly Bug: 384896306 Test: Presubmit Flag: EXEMPT bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ddded547bb5556288b81e2d91e151710aab7521d) Merged-In: I2a32d3a7a2b2071645abff72c62635c6575a48a1 Change-Id: I2a32d3a7a2b2071645abff72c62635c6575a48a1 --- .../taskbar/FallbackTaskbarUIController.java | 7 ------- .../taskbar/LauncherTaskbarUIController.java | 7 ------- .../taskbar/TaskbarNavButtonController.java | 7 +++++++ .../launcher3/taskbar/TaskbarUIController.java | 18 +----------------- .../uioverrides/QuickstepLauncher.java | 6 ------ .../com/android/quickstep/RecentsActivity.java | 6 ------ .../quickstep/TouchInteractionService.java | 5 +++++ .../fallback/window/RecentsWindowManager.kt | 4 ---- .../quickstep/views/RecentsViewContainer.java | 4 ---- 9 files changed, 13 insertions(+), 51 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index 6a908ca073..d6327bc3cd 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -28,7 +28,6 @@ import com.android.launcher3.statemanager.StateManager; import com.android.launcher3.statemanager.StatefulContainer; import com.android.quickstep.TopTaskTracker; import com.android.quickstep.fallback.RecentsState; -import com.android.quickstep.util.TISBindHelper; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.RecentsViewContainer; @@ -139,12 +138,6 @@ public class FallbackTaskbarUIController return topTask.isHomeTask() || topTask.isRecentsTask(); } - @Nullable - @Override - protected TISBindHelper getTISBindHelper() { - return mRecentsContainer.getTISBindHelper(); - } - @Override protected String getTaskbarUIControllerName() { return "FallbackTaskbarUIController<" + mRecentsContainer.getClass().getSimpleName() + ">"; diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java index 7d75286312..0d09b486f1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java @@ -49,7 +49,6 @@ import com.android.quickstep.HomeVisibilityState; import com.android.quickstep.RecentsAnimationCallbacks; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.GroupTask; -import com.android.quickstep.util.TISBindHelper; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags; import com.android.wm.shell.shared.bubbles.BubbleBarLocation; @@ -483,12 +482,6 @@ public class LauncherTaskbarUIController extends TaskbarUIController { mTaskbarLauncherStateController.resetIconAlignment(); } - @Nullable - @Override - protected TISBindHelper getTISBindHelper() { - return mLauncher.getTISBindHelper(); - } - @Override public void dumpLogs(String prefix, PrintWriter pw) { super.dumpLogs(prefix, pw); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java index 48818362e9..d1f9be0b91 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java @@ -344,6 +344,10 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa mCallbacks.onToggleOverview(); } + public void hideOverview() { + mCallbacks.onHideOverview(); + } + void sendBackKeyEvent(int action, boolean cancelled) { if (action == mLastSentBackAction) { // There must always be an alternating sequence of ACTION_DOWN and ACTION_UP events @@ -411,5 +415,8 @@ public class TaskbarNavButtonController implements TaskbarControllers.LoggableTa /** Callback invoked when the overview button is pressed. */ default void onToggleOverview() {} + + /** Callback invoken when a visible overview needs to be hidden. */ + default void onHideOverview() { } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java index 8b636dd9b6..f29f95d347 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java @@ -39,10 +39,7 @@ import com.android.launcher3.popup.SystemShortcut; import com.android.launcher3.taskbar.bubbles.BubbleBarController; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.SplitConfigurationOptions; -import com.android.quickstep.OverviewCommandHelper; -import com.android.quickstep.OverviewCommandHelper.CommandType; import com.android.quickstep.util.GroupTask; -import com.android.quickstep.util.TISBindHelper; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskContainer; import com.android.quickstep.views.TaskView; @@ -389,26 +386,13 @@ public class TaskbarUIController implements BubbleBarController.BubbleBarLocatio /** Adjusts the hotseat for the bubble bar. */ public void adjustHotseatForBubbleBar(boolean isBubbleBarVisible) {} - @Nullable - protected TISBindHelper getTISBindHelper() { - return null; - } - /** * Launches the focused task in the Keyboard Quick Switch view through the OverviewCommandHelper *

* Use this helper method when the focused task may be the overview task. */ public void launchKeyboardFocusedTask() { - TISBindHelper tisBindHelper = getTISBindHelper(); - if (tisBindHelper == null) { - return; - } - OverviewCommandHelper overviewCommandHelper = tisBindHelper.getOverviewCommandHelper(); - if (overviewCommandHelper == null) { - return; - } - overviewCommandHelper.addCommand(CommandType.HIDE); + mControllers.navButtonController.hideOverview(); } /** diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 5cb6e8643e..81f27317a4 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -1432,12 +1432,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, return (mTaskbarUIController != null && mTaskbarUIController.hasBubbles()); } - @NonNull - @Override - public TISBindHelper getTISBindHelper() { - return mTISBindHelper; - } - @Override public boolean handleIncorrectSplitTargetSelection() { if (!enableSplitContextually() || !mSplitSelectStateController.isSplitSelectActive()) { diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 8ed674b21d..834cf44d8b 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -546,12 +546,6 @@ public final class RecentsActivity extends StatefulActivity implem return overviewCommandHelper == null || overviewCommandHelper.canStartHomeSafely(); } - @NonNull - @Override - public TISBindHelper getTISBindHelper() { - return mTISBindHelper; - } - @Override public boolean isRecentsViewVisible() { return getStateManager().getState().isRecentsViewVisible(); diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 50d4dab8c0..0bfd52ce92 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -612,6 +612,11 @@ public class TouchInteractionService extends Service { public void onToggleOverview() { mOverviewCommandHelper.addCommand(CommandType.TOGGLE); } + + @Override + public void onHideOverview() { + mOverviewCommandHelper.addCommand(CommandType.HIDE); + } }; private ActivityManagerWrapper mAM; diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt index f4c8c99b3b..da0c517373 100644 --- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt +++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt @@ -321,10 +321,6 @@ class RecentsWindowManager(context: Context) : return taskbarUIController } - override fun getTISBindHelper(): TISBindHelper { - return tisBindHelper - } - fun registerInitListener(onInitListener: Predicate) { this.onInitListener = onInitListener } diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java index b04753b3b8..a1d22fe494 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java +++ b/quickstep/src/com/android/quickstep/views/RecentsViewContainer.java @@ -25,7 +25,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.Window; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.launcher3.BaseActivity; @@ -34,7 +33,6 @@ import com.android.launcher3.statehandlers.DesktopVisibilityController; import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.views.ScrimView; -import com.android.quickstep.util.TISBindHelper; /** * Interface to be implemented by the parent view of RecentsView @@ -217,6 +215,4 @@ public interface RecentsViewContainer extends ActivityContext { void setTaskbarUIController(@Nullable TaskbarUIController taskbarUIController); @Nullable TaskbarUIController getTaskbarUIController(); - - @NonNull TISBindHelper getTISBindHelper(); } From 6988855e557d5aa54d3520314491b57a80a0f0a2 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 18 Dec 2024 14:37:47 -0800 Subject: [PATCH 12/18] Removing state from TISBinder Making OverviewComponentObserver a singleton Bug: 384896306 Bug: 337863494 Test: Presubmit Flag: EXEMPT bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:64dcfcf0c75c3c238735cc1e9100a8b78eae9941) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:bb358e2342bbdf5cce6e0afcc945852b33dde32c) Merged-In: Ic7805ee4f4eef25098ddec4025062135d03c1611 Change-Id: Ic7805ee4f4eef25098ddec4025062135d03c1611 --- .../uioverrides/QuickstepLauncher.java | 23 +++--- .../quickstep/OverviewComponentObserver.java | 80 +++++++++++++------ .../QuickstepTestInformationHandler.java | 22 +---- .../quickstep/TouchInteractionService.java | 41 +++------- .../dagger/QuickstepBaseAppComponent.java | 3 + .../quickstep/interaction/AllSetActivity.java | 14 ++-- .../SwipeUpGestureTutorialController.java | 4 +- .../quickstep/util/ContextualSearchInvoker.kt | 10 +-- .../util/SplitSelectStateController.java | 11 +-- .../SplitWithKeyboardShortcutController.java | 4 +- .../quickstep/LauncherSwipeHandlerV2Test.kt | 2 +- .../quickstep/FallbackRecentsTest.java | 14 +++- 12 files changed, 108 insertions(+), 120 deletions(-) diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 81f27317a4..999b13e2a3 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -169,6 +169,7 @@ import com.android.launcher3.util.TouchController; import com.android.launcher3.widget.LauncherWidgetHolder; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.OverviewComponentObserver; +import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; import com.android.quickstep.RecentsAnimationDeviceState; import com.android.quickstep.RecentsModel; import com.android.quickstep.SystemUiProxy; @@ -224,7 +225,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, SystemProperties.getBoolean("persist.debug.trace_layouts", false); private static final String TRACE_RELAYOUT_CLASS = SystemProperties.get("persist.debug.trace_request_layout_class", null); - public static final boolean GO_LOW_RAM_RECENTS_ENABLED = false; protected static final String RING_APPEAR_ANIMATION_PREFIX = "RingAppearAnimation\t"; @@ -264,7 +264,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, private boolean mIsOverlayVisible; - private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged; + private final OverviewChangeListener mOverviewChangeListener = this::onOverviewTargetChanged; public static QuickstepLauncher getLauncher(Context context) { return fromContext(context); @@ -283,9 +283,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, systemUiProxy, RecentsModel.INSTANCE.get(this), () -> onStateBack()); RecentsAnimationDeviceState deviceState = new RecentsAnimationDeviceState(asContext()); - // TODO(b/337863494): Explore use of the same OverviewComponentObserver across launcher - OverviewComponentObserver overviewComponentObserver = new OverviewComponentObserver( - asContext(), deviceState); if (DesktopModeStatus.canEnterDesktopMode(this)) { mDesktopRecentsTransitionController = new DesktopRecentsTransitionController( getStateManager(), systemUiProxy, getIApplicationThread(), @@ -294,7 +291,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, overviewPanel.init(mActionsView, mSplitSelectStateController, mDesktopRecentsTransitionController); mSplitWithKeyboardShortcutController = new SplitWithKeyboardShortcutController(this, - mSplitSelectStateController, overviewComponentObserver, deviceState); + mSplitSelectStateController, deviceState); mSplitToWorkspaceController = new SplitToWorkspaceController(this, mSplitSelectStateController); mActionsView.updateDimension(getDeviceProfile(), overviewPanel.getLastComputedTaskSize()); @@ -307,8 +304,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, mTISBindHelper = new TISBindHelper(this, this::onTISConnected); mDepthController = new DepthController(this); if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(this)) { - mSplitSelectStateController.initSplitFromDesktopController(this, - overviewComponentObserver); + mSplitSelectStateController.initSplitFromDesktopController(this); } mHotseatPredictionController = new HotseatPredictionController(this); @@ -552,10 +548,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, mUnfoldTransitionProgressProvider.destroy(); } - TISBinder binder = mTISBindHelper.getBinder(); - if (binder != null) { - binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable); - } + OverviewComponentObserver.INSTANCE.get(this) + .removeOverviewChangeListener(mOverviewChangeListener); mTISBindHelper.onDestroy(); if (mLauncherUnfoldAnimationController != null) { @@ -697,6 +691,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, QuickstepOnboardingPrefs.setup(this); View.setTraceLayoutSteps(TRACE_LAYOUTS); View.setTracedRequestLayoutClassClass(TRACE_RELAYOUT_CLASS); + OverviewComponentObserver.INSTANCE.get(this) + .addOverviewChangeListener(mOverviewChangeListener); } @Override @@ -1047,7 +1043,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, } } - private void onOverviewTargetChanged() { + private void onOverviewTargetChanged(boolean isHomeAndOverviewSame) { QuickstepTransitionManager transitionManager = getAppTransitionManager(); if (transitionManager != null) { transitionManager.onOverviewTargetChange(); @@ -1060,7 +1056,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, taskbarManager.setActivity(this); } mTISBindHelper.setPredictiveBackToHomeInProgress(mIsPredictiveBackToHomeInProgress); - binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable); } @Override diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java index 1f6c6717d1..8d3d5a71b3 100644 --- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java +++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java @@ -19,6 +19,7 @@ package com.android.quickstep; import static android.content.Intent.ACTION_PACKAGE_ADDED; import static android.content.Intent.ACTION_PACKAGE_CHANGED; import static android.content.Intent.ACTION_PACKAGE_REMOVED; +import static android.view.Display.DEFAULT_DISPLAY; import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; @@ -41,22 +42,34 @@ import androidx.annotation.UiThread; import com.android.launcher3.Flags; import com.android.launcher3.R; +import com.android.launcher3.dagger.ApplicationContext; +import com.android.launcher3.dagger.LauncherAppComponent; +import com.android.launcher3.dagger.LauncherAppSingleton; +import com.android.launcher3.util.DaggerSingletonObject; +import com.android.launcher3.util.DaggerSingletonTracker; import com.android.launcher3.util.SimpleBroadcastReceiver; import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.systemui.shared.system.PackageManagerWrapper; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.List; import java.util.Objects; -import java.util.function.Consumer; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.inject.Inject; /** * Class to keep track of the current overview component based off user preferences and app updates * and provide callers the relevant classes. */ +@LauncherAppSingleton public final class OverviewComponentObserver { private static final String TAG = "OverviewComponentObserver"; + public static final DaggerSingletonObject INSTANCE = + new DaggerSingletonObject<>(LauncherAppComponent::getOverviewComponentObserver); + // We register broadcast receivers on main thread to avoid missing updates. private final SimpleBroadcastReceiver mUserPreferenceChangeReceiver = new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets); @@ -64,14 +77,16 @@ public final class OverviewComponentObserver { new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets); private final Context mContext; - private final RecentsAnimationDeviceState mDeviceState; + private final RecentsDisplayModel mRecentsDisplayModel; + private final Intent mCurrentHomeIntent; private final Intent mMyHomeIntent; private final Intent mFallbackIntent; private final SparseIntArray mConfigChangesMap = new SparseIntArray(); private final String mSetupWizardPkg; - private Consumer mOverviewChangeListener = b -> { }; + private final List mOverviewChangeListeners = + new CopyOnWriteArrayList<>(); private String mUpdateRegisteredPackage; private BaseContainerInterface mContainerInterface; @@ -80,10 +95,13 @@ public final class OverviewComponentObserver { private boolean mIsDefaultHome; private boolean mIsHomeDisabled; - - public OverviewComponentObserver(Context context, RecentsAnimationDeviceState deviceState) { + @Inject + public OverviewComponentObserver( + @ApplicationContext Context context, + RecentsDisplayModel recentsDisplayModel, + DaggerSingletonTracker lifecycleTracker) { mContext = context; - mDeviceState = deviceState; + mRecentsDisplayModel = recentsDisplayModel; mCurrentHomeIntent = createHomeIntent(); mMyHomeIntent = new Intent(mCurrentHomeIntent).setPackage(mContext.getPackageName()); ResolveInfo info = context.getPackageManager().resolveActivity(mMyHomeIntent, 0); @@ -107,21 +125,27 @@ public final class OverviewComponentObserver { mUserPreferenceChangeReceiver.register(mContext, ACTION_PREFERRED_ACTIVITY_CHANGED); updateOverviewTargets(); + + lifecycleTracker.addCloseable(this::onDestroy); + } + + /** Adds a listener for changes in {@link #isHomeAndOverviewSame()} */ + public void addOverviewChangeListener(OverviewChangeListener overviewChangeListener) { + mOverviewChangeListeners.add(overviewChangeListener); + } + + /** Removes a previously added listener */ + public void removeOverviewChangeListener(OverviewChangeListener overviewChangeListener) { + mOverviewChangeListeners.remove(overviewChangeListener); } /** - * Sets a listener for changes in {@link #isHomeAndOverviewSame()} + * Called to set home enabled/disabled state via systemUI + * @param isHomeDisabled */ - public void setOverviewChangeListener(Consumer overviewChangeListener) { - // TODO(b/337861962): This method should be able to support multiple listeners instead of - // one so that we can reuse the same instance of this class across multiple places - mOverviewChangeListener = overviewChangeListener; - } - - /** Called on {@link TouchInteractionService#onSystemUiFlagsChanged} */ - @UiThread - public void onSystemUiStateChanged() { - if (mDeviceState.isHomeDisabled() != mIsHomeDisabled) { + public void setHomeDisabled(boolean isHomeDisabled) { + if (isHomeDisabled != mIsHomeDisabled) { + mIsHomeDisabled = isHomeDisabled; updateOverviewTargets(); } } @@ -145,7 +169,6 @@ public final class OverviewComponentObserver { defaultHome = null; } - mIsHomeDisabled = mDeviceState.isHomeDisabled(); mIsDefaultHome = Objects.equals(mMyHomeIntent.getComponent(), defaultHome); // Set assistant visibility to 0 from launcher's perspective, ensures any elements that @@ -203,13 +226,13 @@ public final class OverviewComponentObserver { ACTION_PACKAGE_CHANGED, ACTION_PACKAGE_REMOVED); } } - mOverviewChangeListener.accept(mIsHomeAndOverviewSame); + mOverviewChangeListeners.forEach(l -> l.onOverviewTargetChange(mIsHomeAndOverviewSame)); } /** * Clean up any registered receivers. */ - public void onDestroy() { + private void onDestroy() { mUserPreferenceChangeReceiver.unregisterReceiverSafely(mContext); unregisterOtherHomeAppUpdateReceiver(); } @@ -293,11 +316,7 @@ public final class OverviewComponentObserver { */ public static void startHomeIntentSafely(@NonNull Context context, @Nullable Bundle options, @NonNull String reason) { - RecentsAnimationDeviceState deviceState = new RecentsAnimationDeviceState(context); - OverviewComponentObserver observer = new OverviewComponentObserver(context, deviceState); - Intent intent = observer.getHomeIntent(); - observer.onDestroy(); - deviceState.destroy(); + Intent intent = OverviewComponentObserver.INSTANCE.get(context).getHomeIntent(); startHomeIntentSafely(context, intent, options, reason); } @@ -317,6 +336,17 @@ public final class OverviewComponentObserver { } } + /** + * Interface for listening to overview changes + */ + public interface OverviewChangeListener { + + /** + * Called when the overview target changes + */ + void onOverviewTargetChange(boolean isHomeAndOverviewSame); + } + private static Intent createHomeIntent() { return new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java index 2828a84f5e..f91f696a15 100644 --- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java +++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java @@ -204,27 +204,13 @@ public class QuickstepTestInformationHandler extends TestInformationHandler { @Override protected WindowInsets getWindowInsets() { - RecentsAnimationDeviceState rads = new RecentsAnimationDeviceState(mContext); - OverviewComponentObserver observer = new OverviewComponentObserver(mContext, rads); - try { - RecentsViewContainer container = observer.getContainerInterface().getCreatedContainer(); - - return container == null ? null : container.getRootView().getRootWindowInsets(); - } finally { - observer.onDestroy(); - rads.destroy(); - } + RecentsViewContainer container = getRecentsViewContainer(); + return container == null ? null : container.getRootView().getRootWindowInsets(); } private RecentsViewContainer getRecentsViewContainer() { - RecentsAnimationDeviceState rads = new RecentsAnimationDeviceState(mContext); - OverviewComponentObserver observer = new OverviewComponentObserver(mContext, rads); - try { - return observer.getContainerInterface().getCreatedContainer(); - } finally { - observer.onDestroy(); - rads.destroy(); - } + return OverviewComponentObserver.INSTANCE.get(mContext) + .getContainerInterface().getCreatedContainer(); } @Override diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 0bfd52ce92..c8e53ab7af 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -90,6 +90,7 @@ import com.android.launcher3.util.ScreenOnTracker; import com.android.launcher3.util.TraceHelper; import com.android.quickstep.OverviewCommandHelper.CommandType; import com.android.quickstep.fallback.window.RecentsWindowManager; +import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler; import com.android.quickstep.inputconsumers.BubbleBarInputConsumer; import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer; @@ -103,7 +104,6 @@ import com.android.quickstep.views.RecentsViewContainer; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.statusbar.phone.BarTransitions; -import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver; import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.InputMonitorCompat; @@ -124,7 +124,6 @@ import com.android.wm.shell.startingsurface.IStartingWindow; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.ref.WeakReference; -import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; @@ -150,8 +149,6 @@ public class TouchInteractionService extends Service { private final WeakReference mTis; - private final Set mOnOverviewTargetChangeListeners = new HashSet<>(); - private TISBinder(TouchInteractionService tis) { mTis = new WeakReference<>(tis); } @@ -498,28 +495,11 @@ public class TouchInteractionService extends Service { tis -> tis.mDeviceState.setGestureBlockingTaskId(taskId)); } - /** Registers a listener to be run on Overview Target updates. */ - public void registerOverviewTargetChangeListener(@NonNull Runnable listener) { - mOnOverviewTargetChangeListeners.add(listener); - } - - /** Unregisters an OverviewTargetChange listener. */ - public void unregisterOverviewTargetChangeListener(@NonNull Runnable listener) { - mOnOverviewTargetChangeListeners.remove(listener); - } - - protected void onOverviewTargetChange() { - Set listeners = new HashSet<>(mOnOverviewTargetChangeListeners); - for (Runnable listener : listeners) { - listener.run(); - } - } - /** Refreshes the current overview target. */ public void refreshOverviewTarget() { executeForTouchInteractionService(tis -> { tis.mAllAppsActionManager.onDestroy(); - tis.onOverviewTargetChange(tis.mOverviewComponentObserver.isHomeAndOverviewSame()); + tis.onOverviewTargetChanged(tis.mOverviewComponentObserver.isHomeAndOverviewSame()); }); } } @@ -601,6 +581,7 @@ public class TouchInteractionService extends Service { private final Runnable mUserUnlockedRunnable = this::onUserUnlocked; private final ScreenOnTracker.ScreenOnListener mScreenOnListener = this::onScreenOnChanged; + private final OverviewChangeListener mOverviewChangeListener = this::onOverviewTargetChanged; private final TaskbarNavButtonCallbacks mNavCallbacks = new TaskbarNavButtonCallbacks() { @Override @@ -619,7 +600,6 @@ public class TouchInteractionService extends Service { } }; - private ActivityManagerWrapper mAM; private OverviewCommandHelper mOverviewCommandHelper; private OverviewComponentObserver mOverviewComponentObserver; private InputConsumerController mInputConsumer; @@ -655,7 +635,6 @@ public class TouchInteractionService extends Service { // Initialize anything here that is needed in direct boot mode. // Everything else should be initialized in onUserUnlocked() below. mMainChoreographer = Choreographer.getInstance(); - mAM = ActivityManagerWrapper.getInstance(); mDeviceState = new RecentsAnimationDeviceState(this, true); mRotationTouchHelper = mDeviceState.getRotationTouchHelper(); mAllAppsActionManager = new AllAppsActionManager( @@ -728,7 +707,7 @@ public class TouchInteractionService extends Service { Log.d(TAG, "onUserUnlocked: userId=" + getUserId() + " instance=" + System.identityHashCode(this)); mTaskAnimationManager = new TaskAnimationManager(this, mRecentsWindowManager); - mOverviewComponentObserver = new OverviewComponentObserver(this, mDeviceState); + mOverviewComponentObserver = OverviewComponentObserver.INSTANCE.get(this); mOverviewCommandHelper = new OverviewCommandHelper(this, mOverviewComponentObserver, mTaskAnimationManager); mResetGestureInputConsumer = new ResetGestureInputConsumer( @@ -744,8 +723,8 @@ public class TouchInteractionService extends Service { // new ModelPreload().start(this); resetHomeBounceSeenOnQuickstepEnabledFirstTime(); - mOverviewComponentObserver.setOverviewChangeListener(this::onOverviewTargetChange); - onOverviewTargetChange(mOverviewComponentObserver.isHomeAndOverviewSame()); + mOverviewComponentObserver.addOverviewChangeListener(mOverviewChangeListener); + onOverviewTargetChanged(mOverviewComponentObserver.isHomeAndOverviewSame()); mTaskbarManager.onUserUnlocked(); } @@ -770,7 +749,7 @@ public class TouchInteractionService extends Service { } } - private void onOverviewTargetChange(boolean isHomeAndOverviewSame) { + private void onOverviewTargetChanged(boolean isHomeAndOverviewSame) { mAllAppsActionManager.setHomeAndOverviewSame(isHomeAndOverviewSame); RecentsViewContainer newOverviewContainer = mOverviewComponentObserver.getContainerInterface().getCreatedContainer(); @@ -782,7 +761,6 @@ public class TouchInteractionService extends Service { mTaskbarManager.setRecentsViewContainer(newOverviewContainer); } } - mTISBinder.onOverviewTargetChange(); } private PendingIntent createAllAppsPendingIntent() { @@ -801,7 +779,7 @@ public class TouchInteractionService extends Service { if (LockedUserState.get(this).isUserUnlocked()) { long systemUiStateFlags = mDeviceState.getSystemUiStateFlags(); SystemUiProxy.INSTANCE.get(this).setLastSystemUiStateFlags(systemUiStateFlags); - mOverviewComponentObserver.onSystemUiStateChanged(); + mOverviewComponentObserver.setHomeDisabled(mDeviceState.isHomeDisabled()); mTaskbarManager.onSystemUiFlagsChanged(systemUiStateFlags); mTaskAnimationManager.onSystemUiFlagsChanged(lastSysUIFlags, systemUiStateFlags); } @@ -822,7 +800,8 @@ public class TouchInteractionService extends Service { sIsInitialized = false; if (LockedUserState.get(this).isUserUnlocked()) { mInputConsumer.unregisterInputConsumer(); - mOverviewComponentObserver.onDestroy(); + mOverviewComponentObserver.setHomeDisabled(false); + mOverviewComponentObserver.removeOverviewChangeListener(mOverviewChangeListener); } disposeEventHandlers("TouchInteractionService onDestroy()"); mDeviceState.destroy(); diff --git a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java index b2670e835c..aae9ebe33a 100644 --- a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java +++ b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java @@ -19,6 +19,7 @@ package com.android.quickstep.dagger; import com.android.launcher3.dagger.LauncherAppComponent; import com.android.launcher3.dagger.LauncherBaseAppComponent; import com.android.launcher3.model.WellbeingModel; +import com.android.quickstep.OverviewComponentObserver; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.util.AsyncClockEventDelegate; @@ -37,4 +38,6 @@ public interface QuickstepBaseAppComponent extends LauncherBaseAppComponent { AsyncClockEventDelegate getAsyncClockEventDelegate(); SystemUiProxy getSystemUiProxy(); + + OverviewComponentObserver getOverviewComponentObserver(); } diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java index 99c2c1c52b..4995e77564 100644 --- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java +++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java @@ -70,6 +70,8 @@ import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.taskbar.TaskbarManager; import com.android.launcher3.util.Executors; import com.android.quickstep.GestureState; +import com.android.quickstep.OverviewComponentObserver; +import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; import com.android.quickstep.TouchInteractionService.TISBinder; import com.android.quickstep.util.LottieAnimationColorUtils; import com.android.quickstep.util.TISBindHelper; @@ -121,7 +123,7 @@ public class AllSetActivity extends Activity { private TextView mHintView; - private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged; + private final OverviewChangeListener mOverviewChangeListener = this::onOverviewTargetChange; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -197,6 +199,9 @@ public class AllSetActivity extends Activity { setUpBackgroundAnimation(getDP().isTablet); getIDP().addOnChangeListener(mOnIDPChangeListener); + + OverviewComponentObserver.INSTANCE.get(this) + .addOverviewChangeListener(mOverviewChangeListener); } private InvariantDeviceProfile getIDP() { @@ -286,7 +291,6 @@ public class AllSetActivity extends Activity { private void onTISConnected(TISBinder binder) { setSetupUIVisible(isResumed()); binder.setSwipeUpProxy(isResumed() ? this::createSwipeUpProxy : null); - binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable); binder.preloadOverviewForSUWAllSet(); TaskbarManager taskbarManager = binder.getTaskbarManager(); if (taskbarManager != null) { @@ -294,11 +298,10 @@ public class AllSetActivity extends Activity { } } - private void onOverviewTargetChanged() { + private void onOverviewTargetChange(boolean isHomeAndOverviewSame) { TISBinder binder = mTISBindHelper.getBinder(); if (binder != null) { binder.preloadOverviewForSUWAllSet(); - binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable); } } @@ -318,7 +321,6 @@ public class AllSetActivity extends Activity { if (binder != null) { setSetupUIVisible(false); binder.setSwipeUpProxy(null); - binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable); } } @@ -346,6 +348,8 @@ public class AllSetActivity extends Activity { if (!isChangingConfigurations()) { dispatchLauncherAnimStartEnd(); } + OverviewComponentObserver.INSTANCE.get(this) + .removeOverviewChangeListener(mOverviewChangeListener); } private AnimatedFloat createSwipeUpProxy(GestureState state) { diff --git a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java index e462706c98..1c4e7a7eb7 100644 --- a/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/SwipeUpGestureTutorialController.java @@ -86,10 +86,8 @@ abstract class SwipeUpGestureTutorialController extends TutorialController { SwipeUpGestureTutorialController(TutorialFragment tutorialFragment, TutorialType tutorialType) { super(tutorialFragment, tutorialType); RecentsAnimationDeviceState deviceState = new RecentsAnimationDeviceState(mContext); - OverviewComponentObserver observer = new OverviewComponentObserver(mContext, deviceState); mTaskViewSwipeUpAnimation = new ViewSwipeUpAnimation(mContext, deviceState, - new GestureState(observer, -1)); - observer.onDestroy(); + new GestureState(OverviewComponentObserver.INSTANCE.get(mContext), -1)); deviceState.destroy(); DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(mContext) diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt index a24d447f8d..d00a39cd8c 100644 --- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt +++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt @@ -34,7 +34,6 @@ import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUN import com.android.quickstep.BaseContainerInterface import com.android.quickstep.DeviceConfigWrapper import com.android.quickstep.OverviewComponentObserver -import com.android.quickstep.RecentsAnimationDeviceState import com.android.quickstep.SystemUiProxy import com.android.quickstep.TopTaskTracker import com.android.quickstep.views.RecentsView @@ -223,14 +222,7 @@ internal constructor( @VisibleForTesting fun getRecentsContainerInterface(): BaseContainerInterface<*, *>? { - val rads = RecentsAnimationDeviceState(context) - val observer = OverviewComponentObserver(context, rads) - try { - return observer.containerInterface - } finally { - observer.onDestroy() - rads.destroy() - } + return OverviewComponentObserver.INSTANCE.get(context).containerInterface } /** diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java index 1eb91ae047..c524286c3e 100644 --- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java @@ -583,10 +583,8 @@ public class SplitSelectStateController { /** * Init {@code SplitFromDesktopController} */ - public void initSplitFromDesktopController(QuickstepLauncher launcher, - OverviewComponentObserver overviewComponentObserver) { - initSplitFromDesktopController( - new SplitFromDesktopController(launcher, overviewComponentObserver)); + public void initSplitFromDesktopController(QuickstepLauncher launcher) { + initSplitFromDesktopController(new SplitFromDesktopController(launcher)); } @VisibleForTesting @@ -853,10 +851,9 @@ public class SplitSelectStateController { private DesktopSplitSelectListenerImpl mSplitSelectListener; private Drawable mAppIcon; - public SplitFromDesktopController(QuickstepLauncher launcher, - OverviewComponentObserver overviewComponentObserver) { + public SplitFromDesktopController(QuickstepLauncher launcher) { mLauncher = launcher; - mOverviewComponentObserver = overviewComponentObserver; + mOverviewComponentObserver = OverviewComponentObserver.INSTANCE.get(launcher); mSplitPlaceholderSize = mLauncher.getResources().getDimensionPixelSize( R.dimen.split_placeholder_size); mSplitPlaceholderInset = mLauncher.getResources().getDimensionPixelSize( diff --git a/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java b/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java index 744c08cc3c..0ba408399e 100644 --- a/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java +++ b/quickstep/src/com/android/quickstep/util/SplitWithKeyboardShortcutController.java @@ -63,12 +63,11 @@ public class SplitWithKeyboardShortcutController { public SplitWithKeyboardShortcutController(QuickstepLauncher launcher, SplitSelectStateController controller, - OverviewComponentObserver overviewComponentObserver, RecentsAnimationDeviceState deviceState) { mLauncher = launcher; mController = controller; mDeviceState = deviceState; - mOverviewComponentObserver = overviewComponentObserver; + mOverviewComponentObserver = OverviewComponentObserver.INSTANCE.get(launcher); mSplitPlaceholderSize = mLauncher.getResources().getDimensionPixelSize( R.dimen.split_placeholder_size); @@ -106,7 +105,6 @@ public class SplitWithKeyboardShortcutController { } public void onDestroy() { - mOverviewComponentObserver.onDestroy(); mDeviceState.destroy(); } diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt index 32b5b859ae..36c2f2381c 100644 --- a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt +++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt @@ -68,7 +68,7 @@ class LauncherSwipeHandlerV2Test { ) val deviceState = mock(RecentsAnimationDeviceState::class.java) whenever(deviceState.rotationTouchHelper).thenReturn(mock(RotationTouchHelper::class.java)) - gestureState = spy(GestureState(OverviewComponentObserver(sandboxContext, deviceState), 0)) + gestureState = spy(GestureState(OverviewComponentObserver.INSTANCE.get(sandboxContext), 0)) underTest = LauncherSwipeHandlerV2( diff --git a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java index 695211ba32..5bb2fad38b 100644 --- a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java +++ b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java @@ -64,6 +64,7 @@ import com.android.launcher3.util.rule.ScreenRecordRule; import com.android.launcher3.util.rule.TestIsolationRule; import com.android.launcher3.util.rule.TestStabilityRule; import com.android.launcher3.util.rule.ViewCaptureRule; +import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.RecentsViewContainer; @@ -330,7 +331,7 @@ public class FallbackRecentsTest { return recentsViewContainer.getOverviewPanel().getTaskViewCount(); } - private class OverviewUpdateHandler { + private class OverviewUpdateHandler implements OverviewChangeListener { final RecentsAnimationDeviceState mRads; final OverviewComponentObserver mObserver; @@ -339,19 +340,24 @@ public class FallbackRecentsTest { OverviewUpdateHandler() { Context ctx = getInstrumentation().getTargetContext(); mRads = new RecentsAnimationDeviceState(ctx); - mObserver = new OverviewComponentObserver(ctx, mRads); + mObserver = OverviewComponentObserver.INSTANCE.get(ctx); mChangeCounter = new CountDownLatch(1); if (mObserver.getHomeIntent().getComponent() .getPackageName().equals(mOtherLauncherActivity.packageName)) { // Home already same mChangeCounter.countDown(); } else { - mObserver.setOverviewChangeListener(b -> mChangeCounter.countDown()); + mObserver.addOverviewChangeListener(this); } } + @Override + public void onOverviewTargetChange(boolean isHomeAndOverviewSame) { + mChangeCounter.countDown(); + } + void destroy() { - mObserver.onDestroy(); + mObserver.removeOverviewChangeListener(this); mRads.destroy(); } } From fb11cee3a2097b708c3d940b2f8ccea785f01257 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 13 Jan 2025 14:54:17 -0800 Subject: [PATCH 13/18] Fixing constructor error due to merge conflict Bug: 337863494 Bug: 384896306 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:0556a5218536c187ea046f07173735cc80dbdf0c) Merged-In: Ic282797a81a403b97716dc28608365f1aa8f2709 Change-Id: Ic282797a81a403b97716dc28608365f1aa8f2709 --- .../src/com/android/quickstep/OverviewComponentObserver.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java index 8d3d5a71b3..e3da9f55f9 100644 --- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java +++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java @@ -77,7 +77,6 @@ public final class OverviewComponentObserver { new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets); private final Context mContext; - private final RecentsDisplayModel mRecentsDisplayModel; private final Intent mCurrentHomeIntent; private final Intent mMyHomeIntent; @@ -98,10 +97,8 @@ public final class OverviewComponentObserver { @Inject public OverviewComponentObserver( @ApplicationContext Context context, - RecentsDisplayModel recentsDisplayModel, DaggerSingletonTracker lifecycleTracker) { mContext = context; - mRecentsDisplayModel = recentsDisplayModel; mCurrentHomeIntent = createHomeIntent(); mMyHomeIntent = new Intent(mCurrentHomeIntent).setPackage(mContext.getPackageName()); ResolveInfo info = context.getPackageManager().resolveActivity(mMyHomeIntent, 0); From 47666fbf7bd4a3a35cfd3e15d6ec1088a3757d45 Mon Sep 17 00:00:00 2001 From: Fengjiang Li Date: Wed, 15 Jan 2025 14:54:54 -0800 Subject: [PATCH 14/18] [Leak] Clear all of TaskbarView's FolderIcons' listeners upon activity onDestroy Fix: 390200556 Test: manual Flag: NONE - released code (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:90e83779f2d1a7c432448b10523d1fea13cb2938) Merged-In: I4f6fd2fb0b263169bd5e59e90b321cedfc22f4de Change-Id: I4f6fd2fb0b263169bd5e59e90b321cedfc22f4de --- .../src/com/android/launcher3/taskbar/TaskbarView.java | 10 ++++++++++ .../launcher3/taskbar/TaskbarViewController.java | 1 + 2 files changed, 11 insertions(+) diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index 130b9b7401..b51409ce8a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -396,6 +396,16 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar view.setTag(null); } + /** Loop through all {@link FolderIcon} as child views and clear listeners to avoid leak. */ + public void removeFolderIconListeners() { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + if (getChildAt(i) instanceof FolderIcon fi) { + fi.removeListeners(); + } + } + } + /** Inflates/binds the hotseat items and recent tasks to the view. */ protected void updateItems(ItemInfo[] hotseatItemInfos, List recentTasks) { // Filter out unsupported items. diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index 4acf2fe378..2ffa00fda6 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -307,6 +307,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar if (enableTaskbarPinning()) { mTaskbarView.removeOnLayoutChangeListener(mTaskbarViewLayoutChangeListener); } + mTaskbarView.removeFolderIconListeners(); LauncherAppState.getInstance(mActivity).getModel().removeCallbacks(mModelCallbacks); mActivity.removeOnDeviceProfileChangeListener(mDeviceProfileChangeListener); } From e0fad6499a24cee849706d68a3a653806f6c8fbf Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 21 Jan 2025 12:55:18 -0800 Subject: [PATCH 15/18] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Bug: 391337100 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:399b7debd860abbbb47d442c6cbaa30c39c904b6) Merged-In: I7d6dd13217d83df7991eabb3c0398d582b65c6a0 Change-Id: I7d6dd13217d83df7991eabb3c0398d582b65c6a0 --- quickstep/res/values-af/strings.xml | 6 +++--- quickstep/res/values-cs/strings.xml | 2 +- quickstep/res/values-da/strings.xml | 4 ++-- quickstep/res/values-es/strings.xml | 2 +- quickstep/res/values-eu/strings.xml | 4 ++-- quickstep/res/values-fr-rCA/strings.xml | 6 +++--- quickstep/res/values-fr/strings.xml | 6 +++--- quickstep/res/values-iw/strings.xml | 4 ++-- quickstep/res/values-ja/strings.xml | 4 ++-- quickstep/res/values-nb/strings.xml | 2 +- quickstep/res/values-sv/strings.xml | 6 +++--- quickstep/res/values-zh-rTW/strings.xml | 6 +++--- 12 files changed, 26 insertions(+), 26 deletions(-) diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index 22125d7271..365916e5ba 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -46,7 +46,7 @@ "Programvoorstelle is in leë spasie bygevoeg" "Programvoorstelle is geaktiveer" "Programvoorstelle is gedeaktiveer" - "Voorspelde program: %1$s" + "Voorspelde app: %1$s" "Draai jou toestel" "Draai asseblief jou toestel om die tutoriaal oor gebaarnavigasie te voltooi" "Maak seker dat jy van die rand heel regs of heel links af swiep" @@ -104,10 +104,10 @@ "Kanselleer" "Verlaat verdeeldeskermkeuse" "Kies nog ’n app as jy verdeelde skerm wil gebruik" - "Jou organisasie laat nie hierdie program toe nie" + "Jou organisasie laat nie hierdie app toe nie" "Legstukke word nie tans ondersteun nie; kies asseblief ’n ander app" "Slaan navigasietutoriaal oor?" - "Jy kan dit later in die %1$s-program kry" + "Jy kan dit later in die %1$s-app kry" "Kanselleer" "Slaan oor" "Draai skerm" diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index de550d1827..af9cf388e1 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -138,7 +138,7 @@ "Panel a bubliny jsou skryty" "Navigační panel" "Vždy zobrazovat panel aplikací" - "Změnit režim navigace" + "Změnit navigační režim" "Rozdělovač panelu aplikací" "Přetečení panelu aplikací" "Přesunout doleva nahoru" diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index b022172309..ea9c31766e 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -23,7 +23,7 @@ "Frit format" "Computertilstand" "Flyt til ekstern skærm" - "Computer" + "Computertilstand" "Ingen nye elementer" "Indstillinger for appforbrug" "Ryd alt" @@ -144,7 +144,7 @@ "Flyt til toppen eller venstre side" "Flyt til bunden eller højre side" "{count,plural, =1{yderligere app}one{yderligere app}other{yderligere apps}}" - "Computer" + "Computertilstand" "%1$s og %2$s" "Boble" "Overløb" diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index 8355a88ca6..bde0c19238 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -143,7 +143,7 @@ "Barra de tareas ampliada" "Mover arriba/a la izquierda" "Mover abajo/a la derecha" - "{count,plural, =1{aplicación más}other{aplicaciones más}}" + "{count,plural, =1{app más}other{apps más}}" "Ordenador" "%1$s y %2$s" "Burbuja" diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index de19f15ab6..ac28a565ef 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -55,7 +55,7 @@ "Ikasi duzu atzera egiteko keinua. Jarraian, lortu aplikazioz aldatzeko argibideak." "Ikasi duzu atzera egiteko keinua" "Ziurtatu hatza ez duzula pasatzen pantailaren behealdetik gertuegi" - "Keinuaren sentikortasuna aldatzeko, joan ezarpenetara" + "Keinuaren sentikortasuna aldatzeko, joan Ezarpenak atalera" "Pasatu hatza atzera egiteko" "Aurreko pantailara itzultzeko, pasatu hatza pantailaren ezkerreko edo eskuineko ertzetik erdialdera." "Aurreko pantailara itzultzeko, pasatu bi hatz pantailaren ezkerreko edo eskuineko ertzetik erdialdera." @@ -75,7 +75,7 @@ "Ziurtatu hatza pantailaren beheko ertzetik gora pasatzen duzula" "Eduki sakatuta leihoa luzaroago hatza jaso aurretik" "Ziurtatu hatza zuzen pasatzen duzula gora; ondoren, gelditu" - "Ikasi duzu keinuak erabiltzen. Keinuak desaktibatzeko, joan ezarpenetara." + "Ikasi duzu keinuak erabiltzen. Keinuak desaktibatzeko, joan Ezarpenak atalera." "Ikasi duzu aplikazioz aldatzeko keinua" "Pasatu hatza aplikazioa aldatzeko" "Aplikazio batetik bestera joateko, pasatu hatza pantailaren behealdetik gora, eduki pantaila sakatuta eta altxatu hatza." diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index a5ae3df3df..2c296ca99a 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Épingler" "Forme libre" - "Ordinateur de bureau" + "Bureau" "Passer à un écran externe" - "Ordinateur de bureau" + "Bureau" "Aucun élément récent" "Paramètres d\'utilisation de l\'appli" "Tout effacer" @@ -144,7 +144,7 @@ "Déplacer vers le coin supérieur gauche de l\'écran" "Déplacer vers le coin inférieur droit de l\'écran" "{count,plural, =1{autre appli}one{autre appli}other{autres applis}}" - "Ordinateur de bureau" + "Bureau" "%1$s et %2$s" "Bulle" "Bulle à développer" diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 6d2fba2266..ebea8d3b9a 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Épingler" "Format libre" - "Ordinateur" + "Mode ordinateur" "Déplacer vers l\'écran externe" - "Ordinateur" + "Mode ordinateur" "Aucun élément récent" "Paramètres de consommation de l\'application" "Tout effacer" @@ -144,7 +144,7 @@ "Déplacer en haut ou à gauche" "Déplacer en bas ou à droite" "{count,plural, =1{autre application}one{autre application}other{autres applications}}" - "Ordinateur" + "Mode ordinateur" "%1$s et %2$s" "Bulle" "Dépassement" diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index ad264216ac..acd187840e 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -91,7 +91,7 @@ "מדריך %1$d/%2$d" "הכול מוכן!" "כדי לחזור לדף הבית, צריך להחליק למעלה" - "כדי לעבור אל מסך הבית צריך להקיש על הלחצן הראשי" + "כדי לעבור אל מסך הבית צריך ללחוץ על הכפתור הראשי" "הכול מוכן ואפשר להתחיל להשתמש ב%1$s" "מכשיר" "הגדרות הניווט במערכת" @@ -99,7 +99,7 @@ "צילום מסך" "פיצול" "שמירת צמד אפליקציות" - "צריך להקיש על אפליקציה אחרת כדי להשתמש במסך מפוצל" + "צריך ללחוץ על אפליקציה אחרת כדי להשתמש במסך מפוצל" "כדי להשתמש במסך מפוצל צריך לבחור אפליקציה אחרת" "ביטול" "יציאה מתצוגת מסך מפוצל" diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index a25b2bfd8c..8ce977d672 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -23,7 +23,7 @@ "フリーフォーム" "デスクトップ" "外部ディスプレイに移動する" - "パソコン" + "デスクトップ" "最近のアイテムはありません" "アプリの使用状況の設定" "すべてクリア" @@ -144,7 +144,7 @@ "上 / 左に移動" "下 / 右に移動" "{count,plural, =1{個のその他のアプリ}other{個のその他のアプリ}}" - "パソコン" + "デスクトップ" "%1$s%2$s" "ふきだし" "オーバーフロー" diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index 077bc0ae09..bf81994156 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -144,7 +144,7 @@ "Flytt til øverst/venstre" "Flytt til nederst/høyre" "{count,plural, =1{app til}other{apper til}}" - "Datamaskin" + "Skrivebord" "%1$s og %2$s" "Boble" "Overflyt" diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 089d1b56a9..aae3ccee61 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "Fäst" "Fritt format" - "Dator" + "Skrivbordsläge" "Flytta till extern skärm" - "Dator" + "Skrivbordsläge" "Listan är tom" "Inställningar för appanvändning" "Rensa alla" @@ -144,7 +144,7 @@ "Flytta högst upp/till vänster" "Flytta längst ned/till höger" "{count,plural, =1{app till}other{appar till}}" - "Dator" + "Skrivbordsläge" "%1$s och %2$s" "Bubbla" "Fler alternativ" diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index fd132d2a85..8e06e561d6 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -21,9 +21,9 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "固定" "自由形式" - "桌面" + "電腦模式" "移至外接螢幕" - "電腦" + "電腦模式" "最近沒有任何項目" "應用程式使用情況設定" "全部清除" @@ -144,7 +144,7 @@ "移到上方/左側" "移到底部/右側" "{count,plural, =1{個其他應用程式}other{個其他應用程式}}" - "電腦" + "電腦模式" "「%1$s」和「%2$s」" "泡泡" "溢位" From f22de1b0b654106077d01124dfee12d189a9feab Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 21 Jan 2025 12:55:40 -0800 Subject: [PATCH 16/18] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Bug: 391337100 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ccb7c4d26baf13960615c1f447ed9b80ae2e4e31) Merged-In: Ib01195ca78be6438daa05f648e52675bf9241ced Change-Id: Ib01195ca78be6438daa05f648e52675bf9241ced --- go/quickstep/res/values-af/strings.xml | 6 +++--- go/quickstep/res/values-fa/strings.xml | 2 +- go/quickstep/res/values-iw/strings.xml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/quickstep/res/values-af/strings.xml b/go/quickstep/res/values-af/strings.xml index 501d297a8d..f4ce476582 100644 --- a/go/quickstep/res/values-af/strings.xml +++ b/go/quickstep/res/values-af/strings.xml @@ -1,7 +1,7 @@ - "Deel program" + "Deel app" "Luister" "Vertaal" "Lens" @@ -9,12 +9,12 @@ "KANSELLEER" "INSTELLINGS" "Vertaal of luister na teks op skerm" - "Inligting soos teks op jou skerm, webadresse en skermskote kan met Google gedeel word.\n\nGaan na ""Instellings > Programme > Verstekprogramme > Digitale Assistent-program"" om te verander watter inligting jy deel." + "Inligting soos teks op jou skerm, webadresse en skermskote kan met Google gedeel word.\n\nGaan na ""Instellings > Apps > Verstekapps > Digitale Assistent-app"" om te verander watter inligting jy deel." "Kies \'n assistent om hierdie kenmerk te gebruik" "Kies \'n digitalebystandprogram in Instellings om na teks op jou skerm te luister of dit te vertaal" "Verander jou assistent om hierdie kenmerk te gebruik" "Verander jou digitalebystandprogram in Instellings om na teks op jou skerm te luister of dit te vertaal" "Tik hier om na teks op hierdie skerm te luister" "Tik hier om teks op hierdie skerm te vertaal" - "Hierdie program kan nie gedeel word nie" + "Hierdie app kan nie gedeel word nie" diff --git a/go/quickstep/res/values-fa/strings.xml b/go/quickstep/res/values-fa/strings.xml index 8453d4e3e2..f0e4a57712 100644 --- a/go/quickstep/res/values-fa/strings.xml +++ b/go/quickstep/res/values-fa/strings.xml @@ -5,7 +5,7 @@ "گوش دادن" "ترجمه" "لنز" - "متوجه‌ام" + "متوجهم" "لغو" "تنظیمات" "ترجمه نوشتار روی صفحه‌نمایش یا گوش دادن به آن" diff --git a/go/quickstep/res/values-iw/strings.xml b/go/quickstep/res/values-iw/strings.xml index ddb8ddd9a9..db661066e0 100644 --- a/go/quickstep/res/values-iw/strings.xml +++ b/go/quickstep/res/values-iw/strings.xml @@ -14,7 +14,7 @@ "כדי להאזין לטקסט שבמסך או לתרגם אותו, צריך לבחור אפליקציית עוזר דיגיטלי ב\'הגדרות\'" "צריך לשנות את העוזר הדיגיטלי כדי להשתמש בתכונה הזו" "כדי להאזין לטקסט שבמסך או לתרגם אותו, צריך לשנות את אפליקציית העוזר הדיגיטלי ב\'הגדרות\'" - "צריך להקיש כאן כדי להאזין לטקסט שבמסך הזה" - "צריך להקיש כאן כדי לתרגם את הטקסט שבמסך הזה" + "צריך ללחוץ כאן כדי להאזין לטקסט שבמסך הזה" + "צריך ללחוץ כאן כדי לתרגם את הטקסט שבמסך הזה" "אי אפשר לשתף את האפליקציה הזו" From 9bdbf3f1ffe54762b51bc2f904be50e9ef3518f2 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 21 Jan 2025 12:56:06 -0800 Subject: [PATCH 17/18] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Bug: 391337100 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:56c00017dba8362a0bac6eba16065010afe8207b) Merged-In: I56538c0a63fec05dd87df2afa0760fddfcab55dd Change-Id: I56538c0a63fec05dd87df2afa0760fddfcab55dd --- res/values-af/strings.xml | 6 ++---- res/values-am/strings.xml | 6 ++---- res/values-ar/strings.xml | 8 +++----- res/values-as/strings.xml | 6 ++---- res/values-az/strings.xml | 6 ++---- res/values-b+sr+Latn/strings.xml | 6 ++---- res/values-be/strings.xml | 6 ++---- res/values-bg/strings.xml | 6 ++---- res/values-bn/strings.xml | 6 ++---- res/values-bs/strings.xml | 6 ++---- res/values-ca/strings.xml | 6 ++---- res/values-cs/strings.xml | 6 ++---- res/values-da/strings.xml | 6 ++---- res/values-de/strings.xml | 6 ++---- res/values-el/strings.xml | 6 ++---- res/values-en-rAU/strings.xml | 6 ++---- res/values-en-rGB/strings.xml | 6 ++---- res/values-en-rIN/strings.xml | 6 ++---- res/values-es-rUS/strings.xml | 6 ++---- res/values-es/strings.xml | 6 ++---- res/values-et/strings.xml | 6 ++---- res/values-eu/strings.xml | 6 ++---- res/values-fa/strings.xml | 10 ++++------ res/values-fi/strings.xml | 6 ++---- res/values-fr-rCA/strings.xml | 6 ++---- res/values-fr/strings.xml | 6 ++---- res/values-gl/strings.xml | 6 ++---- res/values-gu/strings.xml | 6 ++---- res/values-hi/strings.xml | 6 ++---- res/values-hr/strings.xml | 6 ++---- res/values-hu/strings.xml | 6 ++---- res/values-hy/strings.xml | 8 +++----- res/values-in/strings.xml | 6 ++---- res/values-is/strings.xml | 6 ++---- res/values-it/strings.xml | 8 +++----- res/values-iw/strings.xml | 16 +++++++--------- res/values-ja/strings.xml | 6 ++---- res/values-ka/strings.xml | 6 ++---- res/values-kk/strings.xml | 6 ++---- res/values-km/strings.xml | 6 ++---- res/values-kn/strings.xml | 6 ++---- res/values-ko/strings.xml | 6 ++---- res/values-ky/strings.xml | 6 ++---- res/values-lo/strings.xml | 6 ++---- res/values-lt/strings.xml | 6 ++---- res/values-lv/strings.xml | 6 ++---- res/values-mk/strings.xml | 8 +++----- res/values-ml/strings.xml | 6 ++---- res/values-mn/strings.xml | 6 ++---- res/values-mr/strings.xml | 6 ++---- res/values-ms/strings.xml | 6 ++---- res/values-my/strings.xml | 6 ++---- res/values-nb/strings.xml | 6 ++---- res/values-ne/strings.xml | 6 ++---- res/values-nl/strings.xml | 6 ++---- res/values-or/strings.xml | 6 ++---- res/values-pa/strings.xml | 6 ++---- res/values-pl/strings.xml | 6 ++---- res/values-pt-rPT/strings.xml | 6 ++---- res/values-pt/strings.xml | 8 +++----- res/values-ro/strings.xml | 6 ++---- res/values-ru/strings.xml | 6 ++---- res/values-si/strings.xml | 6 ++---- res/values-sk/strings.xml | 6 ++---- res/values-sl/strings.xml | 6 ++---- res/values-sq/strings.xml | 6 ++---- res/values-sr/strings.xml | 6 ++---- res/values-sv/strings.xml | 6 ++---- res/values-sw/strings.xml | 6 ++---- res/values-ta/strings.xml | 6 ++---- res/values-te/strings.xml | 6 ++---- res/values-th/strings.xml | 6 ++---- res/values-tl/strings.xml | 6 ++---- res/values-tr/strings.xml | 6 ++---- res/values-uk/strings.xml | 6 ++---- res/values-ur/strings.xml | 6 ++---- res/values-uz/strings.xml | 6 ++---- res/values-vi/strings.xml | 6 ++---- res/values-zh-rCN/strings.xml | 6 ++---- res/values-zh-rHK/strings.xml | 6 ++---- res/values-zh-rTW/strings.xml | 6 ++---- res/values-zu/strings.xml | 6 ++---- 82 files changed, 176 insertions(+), 340 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 716f5dcec0..4dd5e1dcd0 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -68,10 +68,8 @@ "Werk" "Gesprekke" "Neem notas" - - - - + "Wys Voeg By-knoppie" + "Versteek Voeg By-knoppie" "Voeg by" "Voeg %1$s-legstuk by" "Wys almal" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 1f7f5f7604..c40ef69e3a 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -68,10 +68,8 @@ "ሥራ" "ውይይቶች" "የማስታወሻ አያያዝ" - - - - + "የማከል አዝራርን አሳይ" + "የማከል አዝራርን ደብቅ" "አክል" "ምግብር %1$sን አክል" "ሁሉንም አሳይ" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index bbdfebddaa..98c4f3ee39 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -46,7 +46,7 @@ "‏العرض %1$d الطول %2$d" "أداة %1$s" "‏التطبيق المصغّرة \"%1$s\"، بعرض ‎%2$d وارتفاع ‎%3$d" - "انقر مع الاستمرار على التطبيق المصغّر لنقله إلى الشاشة الرئيسية" + "يُرجى النقر مع الاستمرار على التطبيق المصغّر لنقله إلى الشاشة الرئيسية" "إضافة إلى الشاشة الرئيسية" "تمت إضافة الأداة %1$s إلى الشاشة الرئيسية." "اقتراحات" @@ -68,10 +68,8 @@ "تطبيقات العمل" "المحادثات" "تدوين الملاحظات" - - - - + "إظهار زر الإضافة" + "إخفاء زر الإضافة" "إضافة" "إضافة التطبيق المصغّر \"%1$s\"" "عرض الكل" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 44cb92f14c..acce0d2d7a 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -68,10 +68,8 @@ "কৰ্মস্থান" "বাৰ্তালাপ" "টোকা গ্ৰহণ কৰা" - - - - + "যোগ দিয়ক বুটামটো দেখুৱাওক" + "যোগ দিয়ক বুটামটো লুকুৱাওক" "যোগ দিয়ক" "%1$s ৱিজেট যোগ দিয়ক" "আটাইবোৰ দেখুৱাওক" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index f2bf5f75a5..8eda4262bf 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -68,10 +68,8 @@ "İş" "Söhbətlər" "Qeydgötürmə" - - - - + "Əlavə edin düyməsini göstərin" + "Əlavə edin düyməsini gizlədin" "Əlavə edin" "%1$s vidcet əlavə edin" "Hamısını göstər" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 53b1a0242a..33941ff253 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -68,10 +68,8 @@ "Posao" "Konverzacije" "Pravljenje beležaka" - - - - + "Prikažite dugme za dodavanje" + "Sakrijte dugme za dodavanje" "Dodaj" "Dodajte vidžet %1$s" "Prikaži sve" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 586a44a199..d395006f53 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -68,10 +68,8 @@ "Працоўныя" "Размовы" "Стварэнне нататак" - - - - + "Паказаць кнопку \"Дадаць\"" + "Схаваць кнопку \"Дадаць\"" "Дадаць" "Дадаць віджэт \"%1$s\"" "Паказаць усе" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index ea53cef015..cf298c3263 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -68,10 +68,8 @@ "Служебни" "Разговори" "Водене на бележки" - - - - + "Показване на бутона за добавяне" + "Скриване на бутона за добавяне" "Добавяне" "Добавяне на приспособлението „%1$s“" "Вижте всички" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 3e71dc83eb..f2654bba95 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -68,10 +68,8 @@ "অফিস" "কথোপকথন" "নোট নেওয়া" - - - - + "যোগ করার বোতাম দেখুন" + "যোগ করার বোতাম লুকান" "যোগ করুন" "%1$s উইজেট যোগ করুন" "সব দেখুন" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 5173061f8f..3277e22bfd 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -68,10 +68,8 @@ "Posao" "Razgovori" "Pisanje bilješki" - - - - + "Prikazivanje dugmeta za dodavanje" + "Sakrivanje dugmeta za dodavanje" "Dodajte" "Dodavanje vidžeta %1$s" "Prikaži sve" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 722658164e..f8f8e286cc 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -68,10 +68,8 @@ "Treball" "Converses" "Presa de notes" - - - - + "Mostra el botó Afegeix" + "Amaga el botó Afegeix" "Afegeix" "Afegeix el widget %1$s" "Mostra-ho tot" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 51fb1797d3..5fa91540ba 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -68,10 +68,8 @@ "Práce" "Konverzace" "Psaní poznámek" - - - - + "Zobrazit tlačítko přidání" + "Skrýt tlačítko přidání" "Přidat" "Přidat widget %1$s" "Zobrazit vše" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 4b4664a2c0..16e3473636 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -68,10 +68,8 @@ "Arbejde" "Samtaler" "Notetagning" - - - - + "Vis knappen Tilføj" + "Skjul knappen Tilføj" "Tilføj" "Tilføj %1$s-widget" "Vis alle" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 4fe0def6b1..cb6482194a 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -68,10 +68,8 @@ "Geschäftlich" "Unterhaltungen" "Notizen" - - - - + "Schaltfläche „Hinzufügen“ anzeigen" + "Schaltfläche „Hinzufügen“ ausblenden" "Hinzufügen" "Widget „%1$s“ hinzufügen" "Alle anzeigen" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index 3a6d8497e1..672ba05925 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -68,10 +68,8 @@ "Εργασίας" "Συζητήσεις" "Δημιουργία σημειώσεων" - - - - + "Εμφάνιση κουμπιού προσθήκης" + "Απόκρυψη κουμπιού προσθήκης" "Προσθήκη" "Προσθήκη του γραφικού στοιχείου %1$s" "Εμφάνιση όλων" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index fb5466b90d..a4f88ded2b 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -68,10 +68,8 @@ "Work" "Conversations" "Note-taking" - - - - + "Show add button" + "Hide add button" "Add" "Add %1$s widget" "Show all" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index fb5466b90d..a4f88ded2b 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -68,10 +68,8 @@ "Work" "Conversations" "Note-taking" - - - - + "Show add button" + "Hide add button" "Add" "Add %1$s widget" "Show all" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index fb5466b90d..a4f88ded2b 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -68,10 +68,8 @@ "Work" "Conversations" "Note-taking" - - - - + "Show add button" + "Hide add button" "Add" "Add %1$s widget" "Show all" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index c522d08fec..0344113ce0 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -68,10 +68,8 @@ "Trabajo" "Conversaciones" "Tomar notas" - - - - + "Mostrar botón Agregar" + "Ocultar botón Agregar" "Agregar" "Agregar widget %1$s" "Mostrar todos" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index fd11b09166..fc34acf35a 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -68,10 +68,8 @@ "Trabajo" "Conversaciones" "Toma de notas" - - - - + "Mostrar el botón Añadir" + "Ocultar el botón Añadir" "Añadir" "Añadir widget %1$s" "Mostrar todo" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 0bc557f253..5fc3b82c02 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -68,10 +68,8 @@ "Töö" "Vestlused" "Märkmete tegemine" - - - - + "Kuva lisamisnupp" + "Peida lisamisnupp" "Lisa" "Lisa vidin %1$s" "Kuva kõik" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 4e69c3dc5f..99f127a745 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -68,10 +68,8 @@ "Lanekoak" "Elkarrizketak" "Oharrak idazteko" - - - - + "Erakutsi gehitzeko botoia" + "Ezkutatu gehitzeko botoia" "Gehitu" "Gehitu %1$s widgeta" "Erakutsi guztiak" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index a772f0c225..aa6f378de6 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -68,10 +68,8 @@ "ابزاره‌های کاری" "مکالمه‌ها" "یادداشت‌برداری" - - - - + "نشان دادن دکمه افزودن" + "پنهان کردن دکمه افزودن" "افزودن" "افزودن ابزاره %1$s" "نمایش همه" @@ -189,13 +187,13 @@ "کاری" "نمایه کاری" "برنامه‌های کاری نشان‌دار هستند و سرپرست فناوری اطلاعات می‌تواند آن‌ها را ببیند" - "متوجه‌ام" + "متوجهم" "برنامه‌های کاری موقتاً متوقف شده‌اند." "از برنامه‌های کاری‌تان اعلان دریافت نخواهید کرد" "برنامه‌های کاری نمی‌توانند برای شما اعلان ارسال کنند، از باتری استفاده کنند، یا به مکانتان دسترسی داشته باشند" "از برنامه‌های کاری‌تان تماس تلفنی، پیام نوشتاری، یا اعلان دریافت نخواهید کرد" "برنامه‌های کاری نشان‌دار هستند و سرپرست فناوری اطلاعات می‌تواند آن‌ها را ببیند." - "متوجه‌ام" + "متوجهم" "توقف موقت برنامه‌های کاری" "ازسرگیری" "برنامه زمانی برنامه‌های کاری" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 7c7045fcbe..6beb593879 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -68,10 +68,8 @@ "Työ" "Keskustelut" "Muistiinpanojen tekeminen" - - - - + "Näytä lisää-painike" + "Piilota Lisää-painike" "Lisää" "Lisää widget: %1$s" "Näytä kaikki" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 8209d3a2f0..696d8af851 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -68,10 +68,8 @@ "Professionnels" "Conversations" "Prise de note" - - - - + "Afficher le bouton Ajouter" + "Masquer le bouton Ajouter" "Ajouter" "Ajoutez le widget %1$s" "Tout afficher" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f2517ff328..c870afae7e 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -68,10 +68,8 @@ "Professionnels" "Conversations" "Prise de notes" - - - - + "Afficher le bouton \"Ajouter\"" + "Masquer le bouton \"Ajouter\"" "Ajouter" "Ajoutez un widget %1$s" "Tout afficher" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 8945603285..5bcf2fdc2f 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -68,10 +68,8 @@ "Widgets do traballo" "Conversas" "Toma de notas" - - - - + "Mostrar o botón de engadir" + "Ocultar o botón de engadir" "Engadir" "Engadir o widget %1$s" "Mostrar todo" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 0f3f265beb..1480ea96c7 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -68,10 +68,8 @@ "ઑફિસ" "વાતચીતો" "નોંધ લેવી" - - - - + "\'ઉમેરો\' બટન બતાવો" + "\'ઉમેરો\' બટન છુપાવો" "ઉમેરો" "%1$s વિજેટ ઉમેરો" "બધા બતાવો" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 28a29caba4..32a2a96445 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -68,10 +68,8 @@ "वर्क विजेट" "बातचीत" "नोट बनाने से जुड़े विजेट" - - - - + "\'जोड़ें\' बटन दिखाएं" + "\'जोड़ें\' बटन छिपाएं" "जोड़ें" "%1$s विजेट जोड़ें" "सभी दिखाएं" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 79726e4351..726efe8834 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -68,10 +68,8 @@ "Posao" "Razgovori" "Pisanje bilježaka" - - - - + "Prikaži gumb za dodavanje" + "Sakrij gumb za dodavanje" "Dodaj" "Dodaj widget %1$s" "Prikaži sve" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 154cac00ae..b85d3df9df 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -68,10 +68,8 @@ "Munka" "Beszélgetések" "Jegyzetelés" - - - - + "Hozzáadás gomb megjelenítése" + "Hozzáadás gomb elrejtése" "Hozzáadás" "%1$s modul hozzáadása" "Az összes megjelenítése" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 85a1f28cf4..36e89b4fe5 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -68,10 +68,8 @@ "Աշխատանքային" "Զրույցներ" "Նշումների ստեղծում" - - - - + "Ցույց տալ «Ավելացնել» կոճակը" + "Թաքցնել «Ավելացնել» կոճակը" "Ավելացնել" "Ավելացնել %1$s վիջեթը" "Բոլորը" @@ -141,7 +139,7 @@ "Ծանուցումների կետիկները ցուցադրելու համար միացրեք ծանուցումները %1$s-ի համար" "Փոխել կարգավորումները" "Ցուցադրել ծանուցումների կետիկները" - "Մշակողի ընտրանքներ" + "Ծրագրավորողի ընտրանքներ" "Ավելացնել պատկերակները հիմնական էկրանին" "Նոր հավելվածների համար" "Անհայտ է" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 27079dd2bf..0d5a819295 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -68,10 +68,8 @@ "Kerja" "Percakapan" "Pembuatan catatan" - - - - + "Tampilkan tombol tambahkan" + "Sembunyikan tombol tambahkan" "Tambahkan" "Tambahkan widget %1$s" "Tampilkan semua" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 067388151f..8f3c604cc5 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -68,10 +68,8 @@ "Vinna" "Samtöl" "Glósugerð" - - - - + "Sýna hnapp til að bæta við" + "Fela hnapp til að bæta við" "Bæta við" "Bæta græjunni %1$s við" "Sýna allt" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 97441a0503..c7fd68f202 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -68,10 +68,8 @@ "Lavoro" "Conversazioni" "Aggiunta di note" - - - - + "Mostra pulsante Aggiungi" + "Nascondi pulsante Aggiungi" "Aggiungi" "Aggiungi widget %1$s" "Mostra tutto" @@ -127,7 +125,7 @@ "Cartella: %1$s, %2$d o più elementi" "Coppia di app: %1$s and %2$s" "Sfondo e stile" - "Modifica la schermata Home" + "Modifica schermata Home" "Impostazioni schermata Home" "Disattivata dall\'amministratore" "Consenti rotazione della schermata Home" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index adf1ad4cf2..6dfbe68432 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -68,16 +68,14 @@ "ווידג\'טים לעבודה" "שיחות" "כתיבת הערות" - - - - + "הצגת כפתור ההוספה" + "הסתרת כפתור ההוספה" "הוספה" "הוספת הווידג\'ט %1$s" "הצגת הכול" "הצגת כל הווידג\'טים" "כל הווידג\'טים מוצגים" - "אפשר לשנות את הגדרות הווידג\'ט בהקשה" + "אפשר לשנות את הגדרות הווידג\'ט בלחיצה" "שינוי הגדרות הווידג\'ט" "חיפוש אפליקציות" "טעינת אפליקציות מתבצעת…" @@ -110,7 +108,7 @@ "מאפשרת לאפליקציה לשנות את ההגדרות וקיצורי הדרך בדף הבית." "לא ניתן לטעון את הווידג\'ט" "הגדרות הווידג\'ט" - "צריך להקיש כדי לסיים את תהליך ההגדרה" + "צריך ללחוץ כדי לסיים את תהליך ההגדרה" "זוהי אפליקציית מערכת ולא ניתן להסיר את התקנתה." "עריכת השם" "%1$s מושבתת" @@ -119,8 +117,8 @@ "‏מסך הבית %1$d מתוך %2$d" "מסך הבית חדש" "תיקייה פתוחה, %1$d על %2$d" - "יש להקיש כדי לסגור את התיקייה" - "יש להקיש כדי לשמור שינוי שם" + "יש ללחוץ כדי לסגור את התיקייה" + "יש ללחוץ כדי לשמור שינוי שם" "התיקייה נסגרה" "שם התיקייה שונה ל-%1$s" "תיקייה: %1$s, מספר הפריטים: %2$d" @@ -202,7 +200,7 @@ "סינון" "הפעולה נכשלה: %1$s" "מרחב פרטי" - "יש להקיש כדי להגדיר או לפתוח" + "יש ללחוץ כדי להגדיר או לפתוח" "פרטי" "הגדרות המרחב הפרטי" "פרטי, פתוח." diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 7045661e82..9b012c5fc0 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -68,10 +68,8 @@ "仕事用" "会話" "メモ" - - - - + "追加ボタンを表示する" + "追加ボタンを非表示にする" "追加" "%1$sウィジェットを追加" "すべて表示" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 30aa835505..955d65fb1d 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -68,10 +68,8 @@ "სამსახური" "მიმოწერები" "ჩანიშვნა" - - - - + "დამატების ღილაკის ჩვენება" + "დამატების ღილაკის დამალვა" "დამატება" "%1$s ვიჯეტის დამატება" "ყველას ჩვენება" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 2317944de1..c50d007145 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -68,10 +68,8 @@ "Жұмыс виджеттері" "Әңгімелер" "Ескертпе жазу" - - - - + "Қосу түймесін көрсету" + "Қосу түймесін жасыру" "Қосу" "Виджет (%1$s) қосу" "Барлығын көру" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index cfc29322ce..7a73e69601 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -68,10 +68,8 @@ "ការងារ" "ការសន្ទនា" "ការកត់ត្រា" - - - - + "បង្ហាញប៊ូតុង \"បញ្ចូល\"" + "លាក់ប៊ូតុង \"បញ្ចូល\"" "បញ្ចូល" "បញ្ចូលធាតុ​ក្រាហ្វិក %1$s" "បង្ហាញ​ទាំងអស់" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index a1daac08fe..8c988bf0ef 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -68,10 +68,8 @@ "ಕೆಲಸ" "ಸಂಭಾಷಣೆಗಳು" "ಟಿಪ್ಪಣಿ ತೆಗೆದುಕೊಳ್ಳುವುದು" - - - - + "ಸೇರಿಸಿ ಬಟನ್ ಅನ್ನು ತೋರಿಸಿ" + "ಸೇರಿಸಿ ಬಟನ್ ಅನ್ನು ಮರೆಮಾಡಿ" "ಸೇರಿಸಿ" "%1$s ವಿಜೆಟ್ ಸೇರಿಸಿ" "ಎಲ್ಲಾ ತೋರಿಸಿ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index db40d207dd..9f7217bab3 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -68,10 +68,8 @@ "직장 위젯" "대화" "메모" - - - - + "추가 버튼 표시" + "추가 버튼 숨기기" "추가" "%1$s 위젯 추가" "모두 표시" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index eb46e1665d..b7ce9d73ac 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -68,10 +68,8 @@ "Жумуш" "Сүйлөшүүлөр" "Эскертме жазуу" - - - - + "Кошуу баскычын көрсөтүү" + "Кошуу баскычын жашыруу" "Кошуу" "%1$s виджетин кошуу" "Баарын көрсөтүү" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 89bb218c9c..33fff3de96 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -68,10 +68,8 @@ "ວຽກ" "ການສົນທະນາ" "ການຈົດບັນທຶກ" - - - - + "ສະແດງປຸ່ມເພີ່ມ" + "ເຊື່ອງປຸ່ມເພີ່ມ" "ເພີ່ມ" "ເພີ່ມວິດເຈັດ %1$s" "ສະແດງທັງໝົດ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 839c876d20..0d0f5dba20 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -68,10 +68,8 @@ "Darbas" "Pokalbiai" "Užrašų kūrimas" - - - - + "Rodyti mygtuką „Pridėti“" + "Slėpti mygtuką „Pridėti“" "Pridėti" "Pridėti valdiklį: %1$s" "Rodyti viską" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 8620b7b4d6..c86c6bb996 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -68,10 +68,8 @@ "Darba" "Sarunas" "Piezīmju pierakstīšana" - - - - + "Rādīt pogu Pievienot" + "Paslēpt pogu Pievienot" "Pievienot" "Pievienot logrīku %1$s" "Rādīt visus" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 2685c60b1f..cb5f15a263 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -68,10 +68,8 @@ "Работни" "Разговори" "Фаќање белешки" - - - - + "Прикажи го копчето за додавање" + "Скриј го копчето за додавање" "Додај" "Додај го виџетот %1$s" "Прикажи ги сите" @@ -203,7 +201,7 @@ "Не успеа: %1$s" "Приватен простор" "Допрете за да поставите или отворите" - "Приватен простор" + "Приватен" "Поставки за „Приватен простор“" "Приватно, отклучено." "Приватно, заклучено." diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index b9da88041c..2c8258502e 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -68,10 +68,8 @@ "ജോലി" "സംഭാഷണങ്ങൾ" "കുറിപ്പ് രേഖപ്പെടുത്തൽ" - - - - + "\'ചേർക്കുക ബട്ടൺ\' കാണിക്കുക" + "\'ചേർക്കുക ബട്ടൺ\' മറയ്ക്കുക" "ചേർക്കുക" "%1$s വിജറ്റ് ചേർക്കുക" "എല്ലാം കാണിക്കൂ" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 8197832a94..434a731d2a 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -68,10 +68,8 @@ "Ажил" "Харилцан яриа" "Тэмдэглэл хөтлөх" - - - - + "Нэмэх товчийг харуулах" + "Нэмэх товчийг нуух" "Нэмэх" "%1$s виджетийг нэмэх" "Бүгдийг харуул" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 52813531f2..c872cc6938 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -68,10 +68,8 @@ "ऑफिस" "संभाषणे" "टिपा घेणे" - - - - + "जोडा बटण दाखवा" + "जोडा बटण लपवा" "जोडा" "%1$s विजेट जोडा" "सर्व दाखवा" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 5592cd5cff..f5dca938d7 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -68,10 +68,8 @@ "Kerja" "Perbualan" "Pengambilan nota" - - - - + "Tunjukkan butang tambah" + "Sembunyikan butang tambah" "Tambah" "Tambahkan widget %1$s" "Tunjukkan semua" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index c7bb07516d..24f443565e 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -68,10 +68,8 @@ "အလုပ်" "စကားဝိုင်းများ" "မှတ်စုလိုက်ခြင်း" - - - - + "ထည့်ရန်ခလုတ် ပြပါ" + "ထည့်ရန်ခလုတ် ဖျောက်ပါ" "ထည့်ရန်" "%1$s ဝိဂျက်ထည့်ရန်" "အားလုံးပြပါ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index c9b8de084b..a79740dc93 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -68,10 +68,8 @@ "Jobb" "Samtaler" "Notatskriving" - - - - + "Vis Legg til-knappen" + "Skjul Legg til-knappen" "Legg til" "Legg til %1$s-modulen" "Vis alle" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index a966f9eb21..f35b94399b 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -68,10 +68,8 @@ "कामसम्बन्धी" "वार्तालापहरू" "नोट लेख्ने कार्य" - - - - + "\"हाल्नुहोस्\" नामक बटन देखाउनुहोस्" + "\"हाल्नुहोस्\" नामक बटन लुकाउनुहोस्" "हाल्नुहोस्" "%1$s विजेट हाल्नुहोस्" "सबै देखाउनुहोस्" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 1c819fc70f..508397632e 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -68,10 +68,8 @@ "Werk" "Gesprekken" "Aantekeningen maken" - - - - + "Knop Toevoegen tonen" + "Knop Toevoegen verbergen" "Toevoegen" "Widget %1$s toevoegen" "Alles tonen" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index 14c9617536..a26a7c50d5 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -68,10 +68,8 @@ "ୱାର୍କ" "ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ" "ନୋଟ-ଟେକିଂ" - - - - + "\'ଯୋଗ କରନ୍ତୁ\' ବଟନକୁ ଦେଖାନ୍ତୁ" + "\'ଯୋଗ କରନ୍ତୁ\' ବଟନକୁ ଲୁଚାନ୍ତୁ" "ଯୋଗ କରନ୍ତୁ" "%1$s ୱିଜେଟ ଯୋଗ କରନ୍ତୁ" "ସବୁ ଦେଖାନ୍ତୁ" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 2882620b2a..feda5b57bc 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -68,10 +68,8 @@ "ਕੰਮ" "ਗੱਲਾਂਬਾਤਾਂ" "ਨੋਟ ਬਣਾਉਣਾ" - - - - + "\'ਸ਼ਾਮਲ ਕਰੋ\' ਬਟਨ ਦਿਖਾਓ" + "\'ਸ਼ਾਮਲ ਕਰੋ\' ਬਟਨ ਲੁਕਾਓ" "ਸ਼ਾਮਲ ਕਰੋ" "%1$s ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ" "ਸਭ ਦਿਖਾਓ" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index ae4ff2fe13..bf1299d997 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -68,10 +68,8 @@ "Służbowe" "Rozmowy" "Notatki" - - - - + "Pokaż przycisk Dodaj" + "Ukryj przycisk Dodaj" "Dodaj" "Dodaj widżet %1$s" "Pokaż wszystko" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index cd3f2a6932..17af43755f 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -68,10 +68,8 @@ "Trabalho" "Conversas" "Tomar notas" - - - - + "Mostrar botão para adicionar" + "Ocultar botão para adicionar" "Adicionar" "Adicione o widget %1$s" "Mostrar tudo" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index f40c5b3164..10132c96b6 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -46,7 +46,7 @@ "%1$d de largura por %2$d de altura" "Widget %1$s" "Widget %1$s: %2$d de largura por %3$d de altura" - "Toque no widget e o pressione para definir a posição dele na tela inicial" + "Toque no widget e o pressione para definir a posição dele na tela inicial" "Adicionar à tela inicial" "Widget %1$s adicionado à tela inicial" "Sugestões" @@ -68,10 +68,8 @@ "Trabalho" "Conversas" "Anotações" - - - - + "Mostrar botão de adição" + "Ocultar botão de adição" "Adicionar" "Adicionar o widget %1$s" "Mostrar tudo" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 5a98b55f35..5763edbd2c 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -68,10 +68,8 @@ "Serviciu" "Conversații" "Luare de notițe" - - - - + "Afișează butonul de adăugare" + "Ascunde butonul de adăugare" "Adaugă" "Adaugă widgetul %1$s" "Afișează tot" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 2437f29604..d9f0b4044e 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -68,10 +68,8 @@ "Рабочие виджеты" "Разговоры" "Создание заметок" - - - - + "Показать кнопку добавления виджета" + "Скрыть кнопку добавления виджета" "Добавить" "Добавить виджет \"%1$s\"" "Показать все" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 2277d244c5..756d6fe334 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -68,10 +68,8 @@ "කාර්යාලය" "සංවාද" "සටහන් කර ගැනීම" - - - - + "එක් කිරීමේ බොත්තම පෙන්වන්න" + "එක් කිරීමේ බොත්තම සඟවන්න" "එක් කරන්න" "%1$s විජට්ටුව එක් කරන්න" "සියල්ල පෙන්වන්න" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 37e2a7ed37..5fc0c416bb 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -68,10 +68,8 @@ "Pracovné" "Konverzácie" "Zapisovanie poznámok" - - - - + "Zobraziť tlačidlo Pridať" + "Skryť tlačidlo Pridať" "Pridať" "Pridať miniaplikáciu %1$s" "Zobraziť všetko" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 6072e9f619..5ab0106379 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -68,10 +68,8 @@ "Služba" "Pogovori" "Ustvarjanje zapiskov" - - - - + "Pokaži gumb za dodajanje" + "Skrij gumb za dodajanje" "Dodaj" "Dodajanje pripomočka »%1$s«" "Pokaži vse" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 995db0ff3f..ab42407f54 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -68,10 +68,8 @@ "Puna" "Bisedat" "Mbajtja e shënimeve" - - - - + "Shfaq butonin e shtimit" + "Fshih butonin e shtimit" "Shto" "Shto miniaplikacionin %1$s" "Shfaq të gjitha" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index ee69f343cd..2b2fac8fbe 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -68,10 +68,8 @@ "Посао" "Конверзације" "Прављење бележака" - - - - + "Прикажите дугме за додавање" + "Сакријте дугме за додавање" "Додај" "Додајте виџет %1$s" "Прикажи све" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 0aeac3b19b..74e35acfb9 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -68,10 +68,8 @@ "Arbete" "Konversationer" "Anteckna" - - - - + "Visa knappen Lägg till" + "Dölj knappen Lägg till" "Lägg till" "Lägg till widgeten %1$s" "Visa alla" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 674e8f92ea..d696410e54 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -68,10 +68,8 @@ "Kazini" "Mazungumzo" "Kuandika madokezo" - - - - + "Onyesha kitufe cha kuweka" + "Ficha kitufe cha kuweka" "Weka" "Weka wijeti ya %1$s" "Onyesha zote" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 62876076b4..0b942520bd 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -68,10 +68,8 @@ "பணி" "உரையாடல்கள்" "குறிப்பெடுத்தல்" - - - - + "சேர்ப்பதற்கான பட்டனைக் காட்டும்" + "சேர்ப்பதற்கான பட்டனை மறைக்கும்" "சேர்" "%1$s விட்ஜெட்டைச் சேர்க்கும்" "எல்லாம் காட்டு" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index ba7bf2c165..bf9df6aec3 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -68,10 +68,8 @@ "ఆఫీస్" "సంభాషణలు" "నోట్-టేకింగ్" - - - - + "యాడ్‌ చేసే (జోడించే) బటన్‌ను చూపండి" + "యాడ్‌ చేసే (జోడించే) బటన్‌ను దాచండి" "జోడించండి" "%1$s విడ్జెట్‌ను జోడించండి" "అన్నీ చూడండి" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 0338163cc2..08944eda88 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -68,10 +68,8 @@ "งาน" "การสนทนา" "การจดบันทึก" - - - - + "แสดงปุ่มเพิ่ม" + "ซ่อนปุ่มเพิ่ม" "เพิ่ม" "เพิ่มวิดเจ็ต %1$s" "แสดงทั้งหมด" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 4bd5c58c88..b504adc5e1 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -68,10 +68,8 @@ "Trabaho" "Mga Pag-uusap" "Pagtatala" - - - - + "Ipakita ang button na magdagdag" + "I-hide ang button na magdagdag" "Idagdag" "Idagdag ang widget na %1$s" "Ipakita lahat" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index c11a5cdfbe..094b597c33 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -68,10 +68,8 @@ "İş" "Görüşmeler" "Not alma" - - - - + "Ekle düğmesini göster" + "Ekle düğmesini gizle" "Ekle" "%1$s widget\'ı ekle" "Tümünü göster" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index da56b6c9e8..f90998d851 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -68,10 +68,8 @@ "Робочі" "Розмови" "Створення нотаток" - - - - + "Показати кнопку \"Додати\"" + "Сховати кнопку \"Додати\"" "Додати" "Додати віджет \"%1$s\"" "Показати всі" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index f978e2ec80..1a906025ad 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -68,10 +68,8 @@ "دفتری ویجیٹس" "گفتگوئیں" "نوٹ لکھنا" - - - - + "شامل کریں بٹن دکھائیں" + "شامل کریں بٹن چھپائیں" "شامل کریں" "%1$s ویجیٹ شامل کریں" "سبھی دکھائیں" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 371eece072..62fede8bb2 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -68,10 +68,8 @@ "Ish" "Suhbatlar" "Qayd olish" - - - - + "Qoʻshish tugmasini koʻrsatish" + "Qoʻshish tugmasini berkitish" "Chiqarish" "%1$s vidjetini chiqarish" "Hammasi" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 94fef7e418..8e5f75c4b1 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -68,10 +68,8 @@ "Công việc" "Cuộc trò chuyện" "Ghi chú" - - - - + "Hiện nút thêm" + "Ẩn nút thêm" "Thêm" "Thêm tiện ích %1$s" "Hiện tất cả" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 6492e2b740..edc56466d8 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -68,10 +68,8 @@ "工作" "对话" "记事" - - - - + "显示“添加”按钮" + "隐藏“添加”按钮" "添加" "添加“%1$s”微件" "全部显示" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index d60bc6d578..7f4ac599a6 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -68,10 +68,8 @@ "工作" "對話" "做筆記" - - - - + "顯示新增按鈕" + "隱藏新增按鈕" "新增" "加%1$s小工具" "顯示全部" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 618fb9080a..f527a2a0a8 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -68,10 +68,8 @@ "工作" "對話" "做筆記" - - - - + "顯示新增按鈕" + "隱藏新增按鈕" "新增" "新增「%1$s」小工具" "全部顯示" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 2b102b0ea9..3c3a75c8e3 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -68,10 +68,8 @@ "Umsebenzi" "Izingxoxo" "Ukuthatha amanothi" - - - - + "Bonisa inkinobho yokwengeza" + "Fihla inkinobho yokwengeza" "Engeza" "Engeza iwijethi ye-%1$s" "Bonisa konke" From a315410ea3a4f31c2f94464736442d716cb8b4ad Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Wed, 29 Jan 2025 14:25:44 -0800 Subject: [PATCH 18/18] Fixing leaks in LauncherPreview > Do not add listeners when binding FolderIcon for preview > Cleaning up preview object when the caller is no longer holding on to the communication channel for preview. Bug: 393086035 Flag: EXEMPT bugfix Test: Verified manually (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:986d7cb9c09a22915c922cf8e72c03ce36883742) Merged-In: I4b758e6ce103c5201ef05ab824dd4e02f98c40b6 Change-Id: I4b758e6ce103c5201ef05ab824dd4e02f98c40b6 --- .../android/launcher3/folder/FolderIcon.java | 8 ++-- .../graphics/GridCustomizationsProvider.java | 46 +++++++++++++++++-- .../graphics/PreviewSurfaceRenderer.java | 15 +++--- 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index de1bcc34db..9ff647526d 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -177,12 +177,16 @@ public class FolderIcon extends FrameLayout implements FolderListener, FloatingI FolderIcon icon = inflateIcon(resId, activityContext, group, folderInfo); folder.setFolderIcon(icon); folder.bind(folderInfo); + icon.setFolder(folder); + folderInfo.addListener(icon); return icon; } /** - * Builds a FolderIcon to be added to the Launcher + * Builds a FolderIcon to be added to the activity. + * This method doesn't add any listeners to the FolderInfo, and hence any changes to the info + * will not be reflected in the folder. */ public static FolderIcon inflateIcon(int resId, ActivityContext activity, @Nullable ViewGroup group, FolderInfo folderInfo) { @@ -228,8 +232,6 @@ public class FolderIcon extends FrameLayout implements FolderListener, FloatingI icon.mPreviewVerifier.setFolderInfo(folderInfo); icon.updatePreviewItems(false); - folderInfo.addListener(icon); - return icon; } diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java index 7367f2e998..836ae98bcf 100644 --- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java +++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java @@ -51,11 +51,12 @@ import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RunnableList; import com.android.systemui.shared.Flags; +import java.lang.ref.WeakReference; import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; /** @@ -121,7 +122,7 @@ public class GridCustomizationsProvider extends ContentProvider { // Set of all active previews used to track duplicate memory allocations private final Set mActivePreviews = - Collections.newSetFromMap(new WeakHashMap<>()); + Collections.newSetFromMap(new ConcurrentHashMap<>()); @Override public boolean onCreate() { @@ -317,8 +318,15 @@ public class GridCustomizationsProvider extends ContentProvider { Bundle result = new Bundle(); result.putParcelable(KEY_SURFACE_PACKAGE, renderer.getSurfacePackage()); - Messenger messenger = - new Messenger(new Handler(UI_HELPER_EXECUTOR.getLooper(), observer)); + mActivePreviews.add(observer); + lifeCycleTracker.add(() -> mActivePreviews.remove(observer)); + + // Wrap the callback in a weak reference. This ensures that the callback is not kept + // alive due to the Messenger's IBinder + Messenger messenger = new Messenger(new Handler( + UI_HELPER_EXECUTOR.getLooper(), + new WeakCallbackWrapper(observer))); + Message msg = Message.obtain(); msg.replyTo = messenger; result.putParcelable(KEY_CALLBACK, msg); @@ -400,4 +408,34 @@ public class GridCustomizationsProvider extends ContentProvider { && plo.renderer.getDisplayId() == renderer.getDisplayId(); } } + + /** + * A WeakReference wrapper around Handler.Callback to avoid passing hard-reference over IPC + * when using a Messenger + */ + private static class WeakCallbackWrapper implements Handler.Callback { + + private final WeakReference mActual; + private final Message mCleanupMessage; + + WeakCallbackWrapper(Handler.Callback actual) { + mActual = new WeakReference<>(actual); + mCleanupMessage = new Message(); + } + + @Override + public boolean handleMessage(Message message) { + Handler.Callback actual = mActual.get(); + return actual != null && actual.handleMessage(message); + } + + @Override + protected void finalize() throws Throwable { + super.finalize(); + Handler.Callback actual = mActual.get(); + if (actual != null) { + actual.handleMessage(mCleanupMessage); + } + } + } } diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java index 3000b252d4..a7cf1a7876 100644 --- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java +++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java @@ -105,7 +105,6 @@ public class PreviewSurfaceRenderer { private final SurfaceControlViewHost mSurfaceControlViewHost; private boolean mDestroyed = false; - private LauncherPreviewRenderer mRenderer; private boolean mHideQsb; @Nullable private FrameLayout mViewRoot = null; @@ -224,9 +223,8 @@ public class PreviewSurfaceRenderer { * @param hide True to hide and false to show. */ public void hideBottomRow(boolean hide) { - if (mRenderer != null) { - mRenderer.hideBottomRow(hide); - } + mHideQsb = hide; + loadAsync(); } /** @@ -368,15 +366,16 @@ public class PreviewSurfaceRenderer { if (mDestroyed) { return; } + LauncherPreviewRenderer renderer; if (Flags.newCustomizationPickerUi()) { - mRenderer = new LauncherPreviewRenderer(inflationContext, idp, mPreviewColorOverride, + renderer = new LauncherPreviewRenderer(inflationContext, idp, mPreviewColorOverride, mWallpaperColors, launcherWidgetSpanInfo); } else { - mRenderer = new LauncherPreviewRenderer(inflationContext, idp, + renderer = new LauncherPreviewRenderer(inflationContext, idp, mWallpaperColors, launcherWidgetSpanInfo); } - mRenderer.hideBottomRow(mHideQsb); - View view = mRenderer.getRenderedView(dataModel, widgetProviderInfoMap); + renderer.hideBottomRow(mHideQsb); + View view = renderer.getRenderedView(dataModel, widgetProviderInfoMap); // This aspect scales the view to fit in the surface and centers it final float scale = Math.min(mWidth / (float) view.getMeasuredWidth(), mHeight / (float) view.getMeasuredHeight());