Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 880fa938 authored by Vairavan Srinivasan's avatar Vairavan Srinivasan Committed by Steve Kondik
Browse files

frameworks/base: Handle death of clients in AccessibilityManagerService

AccessibilityManagerService to request for death notifications of
clients and to do a proper clean up of its lists.

CRs-Fixed: 276365

Change-Id: Ice78838e0ffd4e0a2f5d0c128b91f3c518cef199
parent af76fe8a
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -116,6 +116,14 @@ public final class AccessibilityManager {
        }
    }

    protected void finalize() throws Throwable {
       try {
           mService.removeClient(mClient);
       } finally {
           super.finalize();
       }
    }

    /**
     * Returns if the {@link AccessibilityManager} is enabled.
     *
+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,8 @@ interface IAccessibilityManager {

    void addClient(IAccessibilityManagerClient client);

    void removeClient(IAccessibilityManagerClient client);

    boolean sendAccessibilityEvent(in AccessibilityEvent uiEvent);

    List<ServiceInfo> getAccessibilityServiceList();
+39 −0
Original line number Diff line number Diff line
@@ -92,6 +92,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
    final List<IAccessibilityManagerClient> mClients =
        new ArrayList<IAccessibilityManagerClient>();

    private final ArrayList<ClientDeathHandler> mClientDeathHandlers =
        new ArrayList<ClientDeathHandler>();

    final Map<ComponentName, Service> mComponentNameToServiceMap =
        new HashMap<ComponentName, Service>();

@@ -126,6 +129,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }
    };

    private class ClientDeathHandler implements IBinder.DeathRecipient {
        final IAccessibilityManagerClient mClient;

        ClientDeathHandler(IAccessibilityManagerClient client) {
           mClient = client;
        }

        public void binderDied() {
           synchronized (mLock) {
             mClients.remove(mClient);
             mClientDeathHandlers.remove(this);
           }
        }
    }

    /**
     * Creates a new instance.
     *
@@ -274,12 +292,33 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            try {
                client.setEnabled(mIsEnabled);
                mClients.add(client);
                ClientDeathHandler cdh = new ClientDeathHandler(client);
                mClientDeathHandlers.add(cdh);
                client.asBinder().linkToDeath(cdh, 0);
            } catch (RemoteException re) {
                Slog.w(LOG_TAG, "Dead AccessibilityManagerClient: " + client, re);
            }
        }
    }

    public void removeClient(IAccessibilityManagerClient client) {
        synchronized (mLock) {
            if (mClients.remove(client)) {

                int size = mClientDeathHandlers.size();

                for (int i = 0; i < size; i++) {
                     final ClientDeathHandler cdh = mClientDeathHandlers.get(i);
                     if (cdh.mClient == client) {
                         mClientDeathHandlers.remove(i);
                         client.asBinder().unlinkToDeath(cdh, 0);
                         break;
                     }
                }
            }
        }
    }

    public boolean sendAccessibilityEvent(AccessibilityEvent event) {
        synchronized (mLock) {
            notifyAccessibilityServicesDelayedLocked(event, false);