Merge "DO NOT MERGE: Maintain binding to crashed listeners." into klp-dev
This commit is contained in:
@@ -260,10 +260,11 @@ public class NotificationManagerService extends INotificationManager.Stub
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void binderDied() {
|
public void binderDied() {
|
||||||
if (connection == null) {
|
// Remove the listener, but don't unbind from the service. The system will bring the
|
||||||
// This is not a service; it won't be recreated. We can give up this connection.
|
// service back up, and the onServiceConnected handler will readd the listener with the
|
||||||
unregisterListener(this.listener, this.userid);
|
// 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 */
|
/** 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(final INotificationListener listener, final int userid) {
|
||||||
public void unregisterListener(INotificationListener listener, int userid) {
|
if (listener == null) return;
|
||||||
// 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
|
|
||||||
|
|
||||||
|
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) {
|
synchronized (mNotificationList) {
|
||||||
final int N = mListeners.size();
|
final int N = mListeners.size();
|
||||||
for (int i=N-1; i>=0; i--) {
|
for (int i=N-1; i>=0; i--) {
|
||||||
final NotificationListenerInfo info = mListeners.get(i);
|
final NotificationListenerInfo info = mListeners.get(i);
|
||||||
if (info.listener.asBinder() == listener.asBinder()
|
if (info.listener.asBinder() == listener.asBinder()
|
||||||
&& info.userid == userid) {
|
&& info.userid == userid) {
|
||||||
mListeners.remove(i);
|
listenerInfo = mListeners.remove(i);
|
||||||
if (info.connection != null) {
|
|
||||||
mContext.unbindService(info.connection);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return listenerInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user