diff --git a/res/values/id.xml b/res/values/id.xml
index 67692d8fee..78b8308cc9 100644
--- a/res/values/id.xml
+++ b/res/values/id.xml
@@ -79,6 +79,7 @@
+
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 257f911852..0ce966b99b 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -16,7 +16,6 @@
package com.android.launcher3;
-import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.dragndrop.DraggableView.DRAGGABLE_ICON;
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
import static com.android.launcher3.util.MultiTranslateDelegate.INDEX_REORDER_PREVIEW_OFFSET;
@@ -71,7 +70,6 @@ import com.android.launcher3.dragndrop.DraggableView;
import com.android.launcher3.folder.PreviewBackground;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
-import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.util.CellAndSpan;
import com.android.launcher3.util.GridOccupancy;
import com.android.launcher3.util.MSDLPlayerWrapper;
@@ -791,18 +789,8 @@ public class CellLayout extends ViewGroup {
// Whenever an app is added, if Accessibility service is enabled, focus on that app.
if (mActivity instanceof Launcher) {
- Launcher.cast(mActivity).getStateManager().addStateListener(
- new StateManager.StateListener() {
- @Override
- public void onStateTransitionComplete(LauncherState finalState) {
- if (finalState == NORMAL) {
- child.performAccessibilityAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
- Launcher.cast(mActivity).getStateManager()
- .removeStateListener(this);
- }
- }
- });
+ child.setTag(R.id.perform_a11y_action_on_launcher_state_normal_tag,
+ AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
}
if (markCells) markCellsAsOccupiedForView(child);
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index cfb116147c..94ff44145b 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -53,6 +53,7 @@ import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
@@ -299,6 +300,17 @@ public class Workspace extends PagedView
private final StatsLogManager mStatsLogManager;
private final MSDLPlayerWrapper mMSDLPlayerWrapper;
+
+ private final StateManager.StateListener mAccessibilityDropListener =
+ new StateListener<>() {
+ @Override
+ public void onStateTransitionComplete(LauncherState finalState) {
+ if (finalState == NORMAL) {
+ performAccessibilityActionOnViewTree(Workspace.this);
+ }
+ }
+ };
+
@Nullable
private DragController.DragListener mAccessibilityDragListener;
@@ -1454,11 +1466,13 @@ public class Workspace extends PagedView
super.onAttachedToWindow();
mWallpaperOffset.setWindowToken(getWindowToken());
computeScroll();
+ mLauncher.getStateManager().addStateListener(mAccessibilityDropListener);
}
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
mWallpaperOffset.setWindowToken(null);
+ mLauncher.getStateManager().removeStateListener(mAccessibilityDropListener);
}
@Override
@@ -2239,16 +2253,8 @@ public class Workspace extends PagedView
// the order of operations in this method related to the StateListener below, please
// test that accessibility moves retain focus after accessibility dropping an item.
// Accessibility focus must be requested after launcher is back to a normal state
- mLauncher.getStateManager().addStateListener(new StateListener() {
- @Override
- public void onStateTransitionComplete(LauncherState finalState) {
- if (finalState == NORMAL) {
- cell.performAccessibilityAction(
- AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
- mLauncher.getStateManager().removeStateListener(this);
- }
- }
- });
+ cell.setTag(R.id.perform_a11y_action_on_launcher_state_normal_tag,
+ AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);
}
}
@@ -3580,4 +3586,22 @@ public class Workspace extends PagedView
onEndStateTransition();
}
}
+
+ /**
+ * Recursively check view tag {@link R.id.perform_a11y_action_on_launcher_state_normal_tag} and
+ * call {@link View#performAccessibilityAction(int, Bundle)} on view tree. The tag is cleared
+ * after this call.
+ */
+ private static void performAccessibilityActionOnViewTree(View view) {
+ Object tag = view.getTag(R.id.perform_a11y_action_on_launcher_state_normal_tag);
+ if (tag instanceof Integer) {
+ view.performAccessibilityAction((int) tag, null);
+ view.setTag(R.id.perform_a11y_action_on_launcher_state_normal_tag, null);
+ }
+ if (view instanceof ViewGroup viewgroup) {
+ for (int i = 0; i < viewgroup.getChildCount(); i++) {
+ performAccessibilityActionOnViewTree(viewgroup.getChildAt(i));
+ }
+ }
+ }
}