Merge "MidiService: fix resource leak" into nyc-dev
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user