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

Commit 27d38d5e authored by Dan Sandler's avatar Dan Sandler Committed by Android Git Automerger
Browse files

am 95a7829c: am b78dc69c: Merge "DO NOT MERGE: Maintain binding to crashed listeners." into klp-dev

* commit '95a7829c':
  DO NOT MERGE: Maintain binding to crashed listeners.
parents c30a8e15 95a7829c
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -260,10 +260,11 @@ public class NotificationManagerService extends INotificationManager.Stub

        @Override
        public void binderDied() {
            if (connection == null) {
                // This is not a service; it won't be recreated. We can give up this connection.
                unregisterListener(this.listener, this.userid);
            }
            // Remove the listener, but don't unbind from the service. The system will bring the
            // service back up, and the onServiceConnected handler will readd the listener with the
            // new binding. If this isn't a bound service, and is just a registered
            // INotificationListener, just removing it from the list is all we need to do anyway.
            removeListenerImpl(this.listener, this.userid);
        }

        /** convenience method for looking in mEnabledListenersForCurrentUser */
@@ -757,26 +758,36 @@ public class NotificationManagerService extends INotificationManager.Stub
    }

    /**
     * Remove a listener binder directly
     * Removes a listener from the list and unbinds from its service.
     */
    @Override
    public void unregisterListener(INotificationListener listener, int userid) {
        // no need to check permissions; if your listener binder is in the list,
        // that's proof that you had permission to add it in the first place
    public void unregisterListener(final INotificationListener listener, final int userid) {
        if (listener == null) return;

        NotificationListenerInfo info = removeListenerImpl(listener, userid);
        if (info != null && info.connection != null) {
            mContext.unbindService(info.connection);
        }
    }

    /**
     * Removes a listener from the list but does not unbind from the listener's service.
     *
     * @return the removed listener.
     */
    NotificationListenerInfo removeListenerImpl(
            final INotificationListener listener, final int userid) {
        NotificationListenerInfo listenerInfo = null;
        synchronized (mNotificationList) {
            final int N = mListeners.size();
            for (int i=N-1; i>=0; i--) {
                final NotificationListenerInfo info = mListeners.get(i);
                if (info.listener.asBinder() == listener.asBinder()
                        && info.userid == userid) {
                    mListeners.remove(i);
                    if (info.connection != null) {
                        mContext.unbindService(info.connection);
                    }
                    listenerInfo = mListeners.remove(i);
                }
            }
        }
        return listenerInfo;
    }

    /**