Bubble's change could notify to A11y framework
The virtual display of the activity became private and A11y framework won't track the windows of the private virtual display. Then the change of bubbles using the activityView could not be notified to A11y framework. Due to the bubbles created from system ui, we made the private virtual display created from system ui could track its windows. This is the short term solution, and only phases in rvc-dev branch. We plan to track all private virtual displays as the long term solution at master branch, but need to avoid this issue happened again, b/148760652. Bug: 156685691 Test: a11y CTS & unit tests Change-Id: I7a7e3d6040ce05f5d3769c14d34f906d8042c473
This commit is contained in:
@@ -51,6 +51,7 @@ import android.content.DialogInterface.OnClickListener;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManagerInternal;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.database.ContentObserver;
|
||||
@@ -2934,11 +2935,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
|
||||
public class AccessibilityDisplayListener implements DisplayManager.DisplayListener {
|
||||
private final DisplayManager mDisplayManager;
|
||||
private final ArrayList<Display> mDisplaysList = new ArrayList<>();
|
||||
private int mSystemUiUid = 0;
|
||||
|
||||
AccessibilityDisplayListener(Context context, MainHandler handler) {
|
||||
mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
|
||||
mDisplayManager.registerDisplayListener(this, handler);
|
||||
initializeDisplayList();
|
||||
|
||||
final PackageManagerInternal pm =
|
||||
LocalServices.getService(PackageManagerInternal.class);
|
||||
if (pm != null) {
|
||||
mSystemUiUid = pm.getPackageUid(pm.getSystemUiServiceComponent().getPackageName(),
|
||||
PackageManager.MATCH_SYSTEM_ONLY, mCurrentUserId);
|
||||
}
|
||||
}
|
||||
|
||||
ArrayList<Display> getValidDisplayList() {
|
||||
@@ -3034,8 +3043,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
|
||||
}
|
||||
// Private virtual displays are created by the ap and is not allowed to access by other
|
||||
// aps. We assume we could ignore them.
|
||||
// The exceptional case is for bubbles. Because the bubbles use the activityView, and
|
||||
// the virtual display of the activityView is private, so if the owner UID of the
|
||||
// private virtual display is the one of system ui which creates the virtual display of
|
||||
// bubbles, then this private virtual display should track the windows.
|
||||
if (display.getType() == Display.TYPE_VIRTUAL
|
||||
&& (display.getFlags() & Display.FLAG_PRIVATE) != 0) {
|
||||
&& (display.getFlags() & Display.FLAG_PRIVATE) != 0
|
||||
&& display.getOwnerUid() != mSystemUiUid) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user