Merge "MidiService: update listener with current status when registered"

This commit is contained in:
Glenn Kasten
2015-11-02 22:50:50 +00:00
committed by Gerrit Code Review
2 changed files with 28 additions and 0 deletions

View File

@@ -169,6 +169,13 @@ public final class MidiManager {
/**
* Registers a callback to receive notifications when MIDI devices are added and removed.
*
* The {@link DeviceCallback#onDeviceStatusChanged} method will be called immediately
* for any devices that have open ports. This allows applications to know which input
* ports are already in use and, therefore, unavailable.
*
* Applications should call {@link #getDevices} before registering the callback
* to get a list of devices already added.
*
* @param callback a {@link DeviceCallback} for MIDI device notifications
* @param handler The {@link android.os.Handler Handler} that will be used for delivering the
* device notifications. If handler is null, then the thread used for the

View File

@@ -575,6 +575,8 @@ public class MidiService extends IMidiManager.Stub {
Client client = getClient(token);
if (client == null) return;
client.addListener(listener);
// Let listener know whether any ports are already busy.
updateStickyDeviceStatus(client.mUid, listener);
}
@Override
@@ -584,6 +586,25 @@ public class MidiService extends IMidiManager.Stub {
client.removeListener(listener);
}
// Inform listener of the status of all known devices.
private void updateStickyDeviceStatus(int uid, IMidiDeviceListener listener) {
synchronized (mDevicesByInfo) {
for (Device device : mDevicesByInfo.values()) {
// ignore private devices that our client cannot access
if (device.isUidAllowed(uid)) {
try {
MidiDeviceStatus status = device.getDeviceStatus();
if (status != null) {
listener.onDeviceStatusChanged(status);
}
} catch (RemoteException e) {
Log.e(TAG, "remote exception", e);
}
}
}
}
}
private static final MidiDeviceInfo[] EMPTY_DEVICE_INFO_ARRAY = new MidiDeviceInfo[0];
public MidiDeviceInfo[] getDevices() {