OSDN Git Service

MidiService: update listener with current status when registered
authorPhil Burk <philburk@google.com>
Thu, 6 Aug 2015 06:32:54 +0000 (23:32 -0700)
committerPhil Burk <philburk@google.com>
Mon, 12 Oct 2015 20:59:57 +0000 (20:59 +0000)
This will give an app an opportunity to learn whether an input port is busy
before the user tries to connect and then fails.

Bug: 22825043
Change-Id: Ifede60f166dfe66ea15453044fce06f4a8452b18
Signed-off-by: Phil Burk <philburk@google.com>
(cherry picked from commit b2355940e3e697deeecd1b6511cd5094f9dc553a)

media/java/android/media/midi/MidiManager.java
services/midi/java/com/android/server/midi/MidiService.java

index 7197dc0..29863d4 100644 (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
index 3ecfd55..701e07f 100644 (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() {