Merge "Dont dispatch a11y events that have no subscribers"
This commit is contained in:
committed by
Android (Google) Code Review
commit
67916b86e9
@@ -18,6 +18,8 @@ package android.os;
|
||||
|
||||
import android.util.ArrayMap;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Takes care of the grunt work of maintaining a list of remote interfaces,
|
||||
* typically for the use of performing callbacks from a
|
||||
@@ -307,6 +309,23 @@ public class RemoteCallbackList<E extends IInterface> {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs {@code action} on each callback, calling
|
||||
* {@link #beginBroadcast()}/{@link #finishBroadcast()} before/after looping
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
public void broadcast(Consumer<E> action) {
|
||||
int itemCount = beginBroadcast();
|
||||
try {
|
||||
for (int i = 0; i < itemCount; i++) {
|
||||
action.accept(getBroadcastItem(i));
|
||||
}
|
||||
} finally {
|
||||
finishBroadcast();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of registered callbacks. Note that the number of registered
|
||||
* callbacks may differ from the value returned by {@link #beginBroadcast()} since
|
||||
|
||||
@@ -40,6 +40,8 @@ import android.util.Log;
|
||||
import android.view.IWindow;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.internal.util.IntPair;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@@ -109,6 +111,8 @@ public final class AccessibilityManager {
|
||||
|
||||
boolean mIsEnabled;
|
||||
|
||||
int mRelevantEventTypes = AccessibilityEvent.TYPES_ALL_MASK;
|
||||
|
||||
boolean mIsTouchExplorationEnabled;
|
||||
|
||||
boolean mIsHighTextContrastEnabled;
|
||||
@@ -203,6 +207,11 @@ public final class AccessibilityManager {
|
||||
public void notifyServicesStateChanged() {
|
||||
mHandler.obtainMessage(MyHandler.MSG_NOTIFY_SERVICES_STATE_CHANGED).sendToTarget();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRelevantEventTypes(int eventTypes) {
|
||||
mRelevantEventTypes = eventTypes;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -362,6 +371,14 @@ public final class AccessibilityManager {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ((event.getEventType() & mRelevantEventTypes) == 0) {
|
||||
if (DEBUG) {
|
||||
Log.i(LOG_TAG, "Not dispatching irrelevant event: " + event
|
||||
+ " that is not among "
|
||||
+ AccessibilityEvent.eventTypeToString(mRelevantEventTypes));
|
||||
}
|
||||
return;
|
||||
}
|
||||
userId = mUserId;
|
||||
}
|
||||
try {
|
||||
@@ -865,8 +882,9 @@ public final class AccessibilityManager {
|
||||
}
|
||||
|
||||
try {
|
||||
final int stateFlags = service.addClient(mClient, mUserId);
|
||||
setStateLocked(stateFlags);
|
||||
final long userStateAndRelevantEvents = service.addClient(mClient, mUserId);
|
||||
setStateLocked(IntPair.first(userStateAndRelevantEvents));
|
||||
mRelevantEventTypes = IntPair.second(userStateAndRelevantEvents);
|
||||
mService = service;
|
||||
} catch (RemoteException re) {
|
||||
Log.e(LOG_TAG, "AccessibilityManagerService is dead", re);
|
||||
|
||||
@@ -38,7 +38,7 @@ interface IAccessibilityManager {
|
||||
|
||||
oneway void sendAccessibilityEvent(in AccessibilityEvent uiEvent, int userId);
|
||||
|
||||
int addClient(IAccessibilityManagerClient client, int userId);
|
||||
long addClient(IAccessibilityManagerClient client, int userId);
|
||||
|
||||
List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId);
|
||||
|
||||
|
||||
@@ -25,5 +25,8 @@ package android.view.accessibility;
|
||||
oneway interface IAccessibilityManagerClient {
|
||||
|
||||
void setState(int stateFlags);
|
||||
|
||||
void notifyServicesStateChanged();
|
||||
|
||||
void setRelevantEventTypes(int eventTypes);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user