Skip to content

Commit 86ed436

Browse files
committed
Fix bug 5237737 - ActionBar should fire an accessibility event when
action mode is turned on/off Fire AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED when action modes come and go to give an indication of UI change on the level of a menu or dialog opening/closing. Change-Id: Id36c6153b0722b4b6927c8d36503e8ac57c2d2b2
1 parent 5eb41b0 commit 86ed436

File tree

5 files changed

+28
-3
lines changed

5 files changed

+28
-3
lines changed

core/java/android/inputmethodservice/ExtractEditLayout.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,20 @@
1616

1717
package android.inputmethodservice;
1818

19+
import com.android.internal.view.menu.MenuBuilder;
20+
import com.android.internal.view.menu.MenuPopupHelper;
21+
1922
import android.content.Context;
2023
import android.util.AttributeSet;
2124
import android.view.ActionMode;
2225
import android.view.Menu;
2326
import android.view.MenuInflater;
2427
import android.view.MenuItem;
2528
import android.view.View;
29+
import android.view.accessibility.AccessibilityEvent;
2630
import android.widget.Button;
2731
import android.widget.LinearLayout;
2832

29-
import com.android.internal.view.menu.MenuBuilder;
30-
import com.android.internal.view.menu.MenuPopupHelper;
31-
3233
/**
3334
* ExtractEditLayout provides an ActionMode presentation for the
3435
* limited screen real estate in extract mode.
@@ -56,6 +57,7 @@ public ActionMode startActionModeForChild(View sourceView, ActionMode.Callback c
5657
mExtractActionButton.setVisibility(INVISIBLE);
5758
mEditButton.setVisibility(VISIBLE);
5859
mActionMode = mode;
60+
sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
5961
return mode;
6062
}
6163
return null;
@@ -158,6 +160,8 @@ public void finish() {
158160
mExtractActionButton.setVisibility(VISIBLE);
159161
mEditButton.setVisibility(INVISIBLE);
160162

163+
sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
164+
161165
mActionMode = null;
162166
}
163167

core/java/com/android/internal/app/ActionBarImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import android.view.MenuItem;
4949
import android.view.View;
5050
import android.view.Window;
51+
import android.view.accessibility.AccessibilityEvent;
5152
import android.widget.SpinnerAdapter;
5253

5354
import java.lang.ref.WeakReference;
@@ -397,6 +398,7 @@ public ActionMode startActionMode(ActionMode.Callback callback) {
397398
// TODO animate this
398399
mSplitView.setVisibility(View.VISIBLE);
399400
}
401+
mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
400402
mActionMode = mode;
401403
return mode;
402404
}
@@ -681,6 +683,7 @@ public void finish() {
681683

682684
// Clear out the context mode views after the animation finishes
683685
mContextView.closeMode();
686+
mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
684687

685688
mActionMode = null;
686689

core/java/com/android/internal/view/StandaloneActionMode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import android.view.MenuInflater;
2727
import android.view.MenuItem;
2828
import android.view.View;
29+
import android.view.accessibility.AccessibilityEvent;
2930

3031
import java.lang.ref.WeakReference;
3132

@@ -86,6 +87,7 @@ public void finish() {
8687
}
8788
mFinished = true;
8889

90+
mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
8991
mCallback.onDestroyActionMode(this);
9092
}
9193

core/java/com/android/internal/widget/ActionBarContextView.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import android.view.LayoutInflater;
3535
import android.view.View;
3636
import android.view.ViewGroup;
37+
import android.view.accessibility.AccessibilityEvent;
3738
import android.view.animation.DecelerateInterpolator;
3839
import android.widget.LinearLayout;
3940
import android.widget.TextView;
@@ -455,4 +456,17 @@ public void onAnimationRepeat(Animator animation) {
455456
public boolean shouldDelayChildPressedState() {
456457
return false;
457458
}
459+
460+
@Override
461+
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
462+
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
463+
// Action mode started
464+
event.setSource(this);
465+
event.setClassName(getClass().getName());
466+
event.setPackageName(getContext().getPackageName());
467+
event.setContentDescription(mTitle);
468+
} else {
469+
super.onInitializeAccessibilityEvent(event);
470+
}
471+
}
458472
}

policy/src/com/android/internal/policy/impl/PhoneWindow.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2171,6 +2171,8 @@ public void run() {
21712171
if (mActionModePopup != null) {
21722172
post(mShowActionModePopup);
21732173
}
2174+
mActionModeView.sendAccessibilityEvent(
2175+
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
21742176
} else {
21752177
mActionMode = null;
21762178
}

0 commit comments

Comments
 (0)