Merge "MediaMetrics: Add typed property keys" into rvc-dev

This commit is contained in:
Andy Hung
2020-04-07 21:47:20 +00:00
committed by Android (Google) Code Review

View File

@@ -17,6 +17,7 @@
package android.media;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.os.Bundle;
@@ -24,6 +25,7 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
/**
* MediaMetrics is the Java interface to the MediaMetrics service.
@@ -49,6 +51,77 @@ public class MediaMetrics {
// The charset used for encoding Strings to bytes.
private static final Charset MEDIAMETRICS_CHARSET = StandardCharsets.UTF_8;
/**
* Key interface.
*
* The presence of this {@code Key} interface on an object allows
* it to be used to set metrics.
*
* @param <T> type of value associated with {@code Key}.
*/
public interface Key<T> {
/**
* Returns the internal name of the key.
*/
@NonNull
String getName();
/**
* Returns the class type of the associated value.
*/
@NonNull
Class<T> getValueClass();
}
/**
* Returns a Key object with the correct interface for MediaMetrics.
*
* @param name The name of the key.
* @param type The class type of the value represented by the key.
* @param <T> The type of value.
* @return a new key interface.
*/
@NonNull
public static <T> Key<T> createKey(@NonNull String name, @NonNull Class<T> type) {
// Implementation specific.
return new Key<T>() {
private final String mName = name;
private final Class<T> mType = type;
@Override
@NonNull
public String getName() {
return mName;
}
@Override
@NonNull
public Class<T> getValueClass() {
return mType;
}
/**
* Return true if the name and the type of two objects are the same.
*/
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof Key)) {
return false;
}
Key<?> other = (Key<?>) obj;
return mName.equals(other.getName()) && mType.equals(other.getValueClass());
}
@Override
public int hashCode() {
return Objects.hash(mName, mType);
}
};
}
/**
* Item records properties and delivers to the MediaMetrics service
*
@@ -201,6 +274,28 @@ public class MediaMetrics {
mBuffer.putInt(0); // number of properties (to be later filled in by record()).
}
/**
* Sets a metrics typed key
* @param key
* @param value
* @param <T>
* @return
*/
@NonNull
public <T> Item set(@NonNull Key<T> key, @Nullable T value) {
if (value instanceof Integer) {
putInt(key.getName(), (int) value);
} else if (value instanceof Long) {
putLong(key.getName(), (long) value);
} else if (value instanceof Double) {
putDouble(key.getName(), (double) value);
} else if (value instanceof String) {
putString(key.getName(), (String) value);
}
// if value is null, etc. no error is raised.
return this;
}
/**
* Sets the property with key to an integer (32 bit) value.
*