From 84b674079db819963b227df4dadb0fb5180527e6 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Thu, 15 Sep 2016 11:00:57 -0700 Subject: [PATCH] Make MidiDeviceInfo accessible to native code Update Java serialization code to allow interacting with native serialization code. One notable change is due to the fact that properties of non-primitive types can not be read back by native code, the properties are serialized in two versions: one only contains properties having primitive types, and another contains all the properties. The latter is ignored by native code. Bug: 25945784 Test: using a PoC app Change-Id: I047a5bdec3006bcbce34c1c63aa7746e01f7a71e --- .../android/media/midi/MidiDeviceInfo.aidl | 2 +- .../android/media/midi/MidiDeviceInfo.java | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/media/java/android/media/midi/MidiDeviceInfo.aidl b/media/java/android/media/midi/MidiDeviceInfo.aidl index f2f37a22cc919..5b2ac9b646633 100644 --- a/media/java/android/media/midi/MidiDeviceInfo.aidl +++ b/media/java/android/media/midi/MidiDeviceInfo.aidl @@ -16,4 +16,4 @@ package android.media.midi; -parcelable MidiDeviceInfo; +parcelable MidiDeviceInfo cpp_header "media/MidiDeviceInfo.h"; diff --git a/media/java/android/media/midi/MidiDeviceInfo.java b/media/java/android/media/midi/MidiDeviceInfo.java index a59be5475ccd7..66d1ed793a6c6 100644 --- a/media/java/android/media/midi/MidiDeviceInfo.java +++ b/media/java/android/media/midi/MidiDeviceInfo.java @@ -32,6 +32,11 @@ public final class MidiDeviceInfo implements Parcelable { private static final String TAG = "MidiDeviceInfo"; + /* + * Please note that constants and (un)marshalling code need to be kept in sync + * with the native implementation (MidiDeviceInfo.h|cpp) + */ + /** * Constant representing USB MIDI devices for {@link #getType} */ @@ -321,15 +326,17 @@ public final class MidiDeviceInfo implements Parcelable { public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public MidiDeviceInfo createFromParcel(Parcel in) { + // Needs to be kept in sync with code in MidiDeviceInfo.cpp int type = in.readInt(); int id = in.readInt(); - int inputPorts = in.readInt(); - int outputPorts = in.readInt(); + int inputPortCount = in.readInt(); + int outputPortCount = in.readInt(); String[] inputPortNames = in.createStringArray(); String[] outputPortNames = in.createStringArray(); - Bundle properties = in.readBundle(); boolean isPrivate = (in.readInt() == 1); - return new MidiDeviceInfo(type, id, inputPorts, outputPorts, + Bundle basicPropertiesIgnored = in.readBundle(); + Bundle properties = in.readBundle(); + return new MidiDeviceInfo(type, id, inputPortCount, outputPortCount, inputPortNames, outputPortNames, properties, isPrivate); } @@ -342,14 +349,34 @@ public final class MidiDeviceInfo implements Parcelable { return 0; } + private Bundle getBasicProperties(String[] keys) { + Bundle basicProperties = new Bundle(); + for (String key : keys) { + String val = mProperties.getString(key); + if (val != null) { + basicProperties.putString(key, val); + } + } + return basicProperties; + } + public void writeToParcel(Parcel parcel, int flags) { + // Needs to be kept in sync with code in MidiDeviceInfo.cpp parcel.writeInt(mType); parcel.writeInt(mId); parcel.writeInt(mInputPortCount); parcel.writeInt(mOutputPortCount); parcel.writeStringArray(mInputPortNames); parcel.writeStringArray(mOutputPortNames); - parcel.writeBundle(mProperties); parcel.writeInt(mIsPrivate ? 1 : 0); + // "Basic" properties only contain properties of primitive types + // and thus can be read back by native code. "Extra" properties is + // a superset that contains all properties. + parcel.writeBundle(getBasicProperties(new String[] { + PROPERTY_NAME, PROPERTY_MANUFACTURER, PROPERTY_PRODUCT, PROPERTY_VERSION, + PROPERTY_SERIAL_NUMBER, PROPERTY_ALSA_CARD, PROPERTY_ALSA_DEVICE + })); + // Must be serialized last so native code can safely ignore it. + parcel.writeBundle(mProperties); } }