diff options
| author | 2015-11-02 23:00:15 +0000 | |
|---|---|---|
| committer | 2015-11-02 23:00:15 +0000 | |
| commit | 350dc16475c6d64d2837ed19fa736fcdd423f61a (patch) | |
| tree | e07e0bb790b5e80701f7a0a26da19cd3530e206a | |
| parent | 6c8b91d8c2c657eb8a5b0afa00a3b93044447f56 (diff) | |
| parent | d4e9b9e4ac4196d37b0a5e59867f5a51018f4087 (diff) | |
Merge "MidiService: update listener with current status when registered"
am: d4e9b9e4ac
* commit 'd4e9b9e4ac4196d37b0a5e59867f5a51018f4087':
MidiService: update listener with current status when registered
| -rw-r--r-- | media/java/android/media/midi/MidiManager.java | 7 | ||||
| -rw-r--r-- | services/midi/java/com/android/server/midi/MidiService.java | 21 |
2 files changed, 28 insertions, 0 deletions
diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java index 7197dc09bbc3..29863d465083 100644 --- a/media/java/android/media/midi/MidiManager.java +++ b/media/java/android/media/midi/MidiManager.java @@ -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 diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index 3ecfd5509468..701e07fc2284 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -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() { |