Merge "Dont dispatch a11y events that have no subscribers"

This commit is contained in:
TreeHugger Robot
2017-03-14 04:35:34 +00:00
committed by Android (Google) Code Review
9 changed files with 164 additions and 28 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -25,5 +25,8 @@ package android.view.accessibility;
oneway interface IAccessibilityManagerClient {
void setState(int stateFlags);
void notifyServicesStateChanged();
void setRelevantEventTypes(int eventTypes);
}