Merge "MidiService: fix resource leak" into nyc-dev

This commit is contained in:
Phil Burk
2016-04-19 19:10:52 +00:00
committed by Android (Google) Code Review

View File

@@ -126,8 +126,8 @@ public class MidiService extends IMidiManager.Stub {
// This client's PID // This client's PID
private final int mPid; private final int mPid;
// List of all receivers for this client // List of all receivers for this client
private final ArrayList<IMidiDeviceListener> mListeners private final HashMap<IBinder, IMidiDeviceListener> mListeners
= new ArrayList<IMidiDeviceListener>(); = new HashMap<IBinder, IMidiDeviceListener>();
// List of all device connections for this client // List of all device connections for this client
private final HashMap<IBinder, DeviceConnection> mDeviceConnections private final HashMap<IBinder, DeviceConnection> mDeviceConnections
= new HashMap<IBinder, DeviceConnection>(); = new HashMap<IBinder, DeviceConnection>();
@@ -143,11 +143,13 @@ public class MidiService extends IMidiManager.Stub {
} }
public void addListener(IMidiDeviceListener listener) { 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) { public void removeListener(IMidiDeviceListener listener) {
mListeners.remove(listener); mListeners.remove(listener.asBinder());
if (mListeners.size() == 0 && mDeviceConnections.size() == 0) { if (mListeners.size() == 0 && mDeviceConnections.size() == 0) {
close(); close();
} }
@@ -184,7 +186,7 @@ public class MidiService extends IMidiManager.Stub {
MidiDeviceInfo deviceInfo = device.getDeviceInfo(); MidiDeviceInfo deviceInfo = device.getDeviceInfo();
try { try {
for (IMidiDeviceListener listener : mListeners) { for (IMidiDeviceListener listener : mListeners.values()) {
listener.onDeviceAdded(deviceInfo); listener.onDeviceAdded(deviceInfo);
} }
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -198,7 +200,7 @@ public class MidiService extends IMidiManager.Stub {
MidiDeviceInfo deviceInfo = device.getDeviceInfo(); MidiDeviceInfo deviceInfo = device.getDeviceInfo();
try { try {
for (IMidiDeviceListener listener : mListeners) { for (IMidiDeviceListener listener : mListeners.values()) {
listener.onDeviceRemoved(deviceInfo); listener.onDeviceRemoved(deviceInfo);
} }
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -211,7 +213,7 @@ public class MidiService extends IMidiManager.Stub {
if (!device.isUidAllowed(mUid)) return; if (!device.isUidAllowed(mUid)) return;
try { try {
for (IMidiDeviceListener listener : mListeners) { for (IMidiDeviceListener listener : mListeners.values()) {
listener.onDeviceStatusChanged(status); listener.onDeviceStatusChanged(status);
} }
} catch (RemoteException e) { } catch (RemoteException e) {