diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index c6d5a7e268b7e..723be2481d6f1 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -126,8 +126,8 @@ public class MidiService extends IMidiManager.Stub { // This client's PID private final int mPid; // List of all receivers for this client - private final ArrayList mListeners - = new ArrayList(); + private final HashMap mListeners + = new HashMap(); // List of all device connections for this client private final HashMap mDeviceConnections = new HashMap(); @@ -143,11 +143,13 @@ public class MidiService extends IMidiManager.Stub { } public void addListener(IMidiDeviceListener listener) { - mListeners.add(listener); + // Use asBinder() so that we can match it in removeListener(). + // The listener proxy objects themselves do not match. + mListeners.put(listener.asBinder(), listener); } public void removeListener(IMidiDeviceListener listener) { - mListeners.remove(listener); + mListeners.remove(listener.asBinder()); if (mListeners.size() == 0 && mDeviceConnections.size() == 0) { close(); } @@ -184,7 +186,7 @@ public class MidiService extends IMidiManager.Stub { MidiDeviceInfo deviceInfo = device.getDeviceInfo(); try { - for (IMidiDeviceListener listener : mListeners) { + for (IMidiDeviceListener listener : mListeners.values()) { listener.onDeviceAdded(deviceInfo); } } catch (RemoteException e) { @@ -198,7 +200,7 @@ public class MidiService extends IMidiManager.Stub { MidiDeviceInfo deviceInfo = device.getDeviceInfo(); try { - for (IMidiDeviceListener listener : mListeners) { + for (IMidiDeviceListener listener : mListeners.values()) { listener.onDeviceRemoved(deviceInfo); } } catch (RemoteException e) { @@ -211,7 +213,7 @@ public class MidiService extends IMidiManager.Stub { if (!device.isUidAllowed(mUid)) return; try { - for (IMidiDeviceListener listener : mListeners) { + for (IMidiDeviceListener listener : mListeners.values()) { listener.onDeviceStatusChanged(status); } } catch (RemoteException e) {