Change session ID string to ID object

Based on API review feedback from jmtrivi@ to reduce unexpected
usage of the APIs.

And add some stub APIs

Reference CLs:
MediaDrm ag/13835091 by robertshih@
MediaExtractor: ag/13607751 by aquilescanta@
MediaParser: ag/13714647 by aquilescanta@
MediaRecorder: ag/13545885 by dichenzhang@
AudioTrack & AudioRecord: ag/13712857 by hunga@

Bug: 183095725
Test: pending CTS
CTS-Coverage-Bug: 183366721
Change-Id: I931edf021a5ec6b27a25bc6142a129b92da0fc9a
Merged-In: I931edf021a5ec6b27a25bc6142a129b92da0fc9a
This commit is contained in:
shubang
2021-03-18 07:10:22 -07:00
parent dc2a0a63f9
commit c56cc00ab8
12 changed files with 176 additions and 105 deletions

View File

@@ -69,10 +69,12 @@ package android.media {
method public boolean advance(@NonNull android.media.MediaParser.SeekableInputReader) throws java.io.IOException;
method @NonNull public static android.media.MediaParser create(@NonNull android.media.MediaParser.OutputConsumer, @NonNull java.lang.String...);
method @NonNull public static android.media.MediaParser createByName(@NonNull String, @NonNull android.media.MediaParser.OutputConsumer);
method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
method @NonNull public String getParserName();
method @NonNull public static java.util.List<java.lang.String> getParserNames(@NonNull android.media.MediaFormat);
method public void release();
method public void seek(@NonNull android.media.MediaParser.SeekPoint);
method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
method @NonNull public android.media.MediaParser setParameter(@NonNull String, @NonNull Object);
method public boolean supportsParameter(@NonNull String);
field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking";

View File

@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringDef;
import android.media.MediaCodec.CryptoInfo;
import android.media.metrics.LogSessionId;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
@@ -74,6 +75,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Function;
@@ -1066,6 +1068,7 @@ public final class MediaParser {
private boolean mReleased;
// MediaMetrics fields.
@NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
private final boolean mCreatedByName;
private final SparseArray<Format> mTrackFormats;
private String mLastObservedExceptionName;
@@ -1328,6 +1331,7 @@ public final class MediaParser {
MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH));
nativeSubmitMetrics(
// TODO: mLogSessionId,
mParserName,
mCreatedByName,
String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool),
@@ -1341,6 +1345,15 @@ public final class MediaParser {
videoHeight);
}
public void setLogSessionId(@NonNull LogSessionId sessionId) {
this.mLogSessionId = Objects.requireNonNull(sessionId);
}
@NonNull
public LogSessionId getLogSessionId() {
return mLogSessionId;
}
// Private methods.
private MediaParser(
@@ -2184,6 +2197,7 @@ public final class MediaParser {
// Native methods.
private native void nativeSubmitMetrics(
// TODO: String logSessionId,
String parserName,
boolean createdByName,
String parserPool,

View File

@@ -20579,6 +20579,7 @@ package android.media {
method public int getChannelConfiguration();
method public int getChannelCount();
method @NonNull public android.media.AudioFormat getFormat();
method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
method public android.os.PersistableBundle getMetrics();
method public static int getMinBufferSize(int, int, int);
method public int getNotificationMarkerPosition();
@@ -20601,6 +20602,7 @@ package android.media {
method public void release();
method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
method @Deprecated public void removeOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener);
method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
method public int setNotificationMarkerPosition(int);
method public int setPositionNotificationPeriod(int);
method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
@@ -20716,6 +20718,7 @@ package android.media {
method public int getChannelCount();
method public int getDualMonoMode();
method @NonNull public android.media.AudioFormat getFormat();
method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
method public static float getMaxVolume();
method public android.os.PersistableBundle getMetrics();
method public static int getMinBufferSize(int, int, int);
@@ -20753,6 +20756,7 @@ package android.media {
method public int setAuxEffectSendLevel(@FloatRange(from=0.0) float);
method public int setBufferSizeInFrames(@IntRange(from=0) int);
method public boolean setDualMonoMode(int);
method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
method public int setLoopPoints(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0xffffffff) int);
method public int setNotificationMarkerPosition(int);
method public void setOffloadDelayPadding(@IntRange(from=0) int, @IntRange(from=0) int);
@@ -21307,7 +21311,7 @@ package android.media {
method @NonNull public String getDiagnosticInfo();
}
public final class MediaCodec implements android.media.metrics.PlaybackComponent {
public final class MediaCodec {
method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, @Nullable android.media.MediaCrypto, int);
method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, int, @Nullable android.media.MediaDescrambler);
method @NonNull public static android.media.MediaCodec createByCodecName(@NonNull String) throws java.io.IOException;
@@ -21333,7 +21337,6 @@ package android.media {
method @NonNull public android.media.MediaFormat getOutputFormat(int);
method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int);
method @Nullable public android.media.Image getOutputImage(int);
method public String getPlaybackId();
method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int);
method @Nullable public static android.media.Image mapHardwareBuffer(@NonNull android.hardware.HardwareBuffer);
method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException;
@@ -21350,7 +21353,6 @@ package android.media {
method public void setOnFrameRenderedListener(@Nullable android.media.MediaCodec.OnFrameRenderedListener, @Nullable android.os.Handler);
method public void setOutputSurface(@NonNull android.view.Surface);
method public void setParameters(@Nullable android.os.Bundle);
method public void setPlaybackId(@NonNull String);
method public void setVideoScalingMode(int);
method public void signalEndOfInputStream();
method public void start();
@@ -21964,7 +21966,7 @@ package android.media {
method @NonNull public java.util.List<byte[]> getOfflineLicenseKeySetIds();
method public int getOfflineLicenseState(@NonNull byte[]);
method public int getOpenSessionCount();
method @Nullable public android.media.metrics.PlaybackComponent getPlaybackComponent(@NonNull byte[]);
method @Nullable public android.media.MediaDrm.PlaybackComponent getPlaybackComponent(@NonNull byte[]);
method @NonNull public byte[] getPropertyByteArray(String);
method @NonNull public String getPropertyString(@NonNull String);
method @NonNull public android.media.MediaDrm.ProvisionRequest getProvisionRequest();
@@ -22169,6 +22171,11 @@ package android.media {
method public void onSessionLostState(@NonNull android.media.MediaDrm, @NonNull byte[]);
}
public final class MediaDrm.PlaybackComponent {
method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
}
public static final class MediaDrm.ProvisionRequest {
method @NonNull public byte[] getData();
method @NonNull public String getDefaultUrl();
@@ -22201,6 +22208,7 @@ package android.media {
method public long getCachedDuration();
method public android.media.MediaExtractor.CasInfo getCasInfo(int);
method public android.media.DrmInitData getDrmInitData();
method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
method public android.os.PersistableBundle getMetrics();
method @Nullable public java.util.Map<java.util.UUID,byte[]> getPsshInfo();
method public boolean getSampleCryptoInfo(@NonNull android.media.MediaCodec.CryptoInfo);
@@ -22222,6 +22230,7 @@ package android.media {
method public void setDataSource(@NonNull android.content.res.AssetFileDescriptor) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDataSource(@NonNull java.io.FileDescriptor) throws java.io.IOException;
method public void setDataSource(@NonNull java.io.FileDescriptor, long, long) throws java.io.IOException;
method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
method public void setMediaCas(@NonNull android.media.MediaCas);
method public void unselectTrack(int);
field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
@@ -22825,6 +22834,7 @@ package android.media {
method public java.util.List<android.media.MicrophoneInfo> getActiveMicrophones() throws java.io.IOException;
method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
method public static final int getAudioSourceMax();
method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
method public int getMaxAmplitude() throws java.lang.IllegalStateException;
method public android.os.PersistableBundle getMetrics();
method public android.media.AudioDeviceInfo getPreferredDevice();
@@ -22847,6 +22857,7 @@ package android.media {
method public void setCaptureRate(double);
method public void setInputSurface(@NonNull android.view.Surface);
method public void setLocation(float, float);
method public void setLogSessionId(@NonNull android.media.metrics.LogSessionId);
method public void setMaxDuration(int) throws java.lang.IllegalArgumentException;
method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException;
@@ -24478,6 +24489,8 @@ package android.media.metrics {
}
public final class LogSessionId {
method @NonNull public String getStringId();
field @NonNull public static final android.media.metrics.LogSessionId LOG_SESSION_ID_NONE;
}
public class MediaMetricsManager {
@@ -24511,11 +24524,6 @@ package android.media.metrics {
method @NonNull public android.media.metrics.NetworkEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long);
}
public interface PlaybackComponent {
method @NonNull public String getPlaybackId();
method public void setPlaybackId(@NonNull String);
}
public final class PlaybackErrorEvent extends android.media.metrics.Event implements android.os.Parcelable {
method public int describeContents();
method public int getErrorCode();

View File

@@ -1478,7 +1478,7 @@ package android.media.audiopolicy {
package android.media.metrics {
public final class LogSessionId {
method @NonNull public String getStringId();
ctor public LogSessionId(@NonNull String);
}
}

View File

@@ -32,6 +32,7 @@ import android.content.Context;
import android.media.MediaRecorder.Source;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioPolicy;
import android.media.metrics.LogSessionId;
import android.media.permission.Identity;
import android.media.projection.MediaProjection;
import android.os.Binder;
@@ -282,9 +283,9 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
/**
* The log session id used for metrics.
* A null or empty string here means it is not set.
* {@link LogSessionId#LOG_SESSION_ID_NONE} here means it is not set.
*/
private String mLogSessionId;
@NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
//---------------------------------------------------------
// Constructor, Finalize
@@ -1963,24 +1964,34 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,
}
/**
* Sets a string handle to this AudioRecord for metrics collection.
* Sets a {@link LogSessionId} instance to this AudioRecord for metrics collection.
*
* @param logSessionId a string which is used to identify this object
* to the metrics service. Proper generated Ids must be obtained
* from the Java metrics service and should be considered opaque.
* Use null to remove the logSessionId association.
* @param logSessionId a {@link LogSessionId} instance which is used to
* identify this object to the metrics service. Proper generated
* Ids must be obtained from the Java metrics service and should
* be considered opaque. Use
* {@link LogSessionId#LOG_SESSION_ID_NONE} to remove the
* logSessionId association.
* @throws IllegalStateException if AudioRecord not initialized.
*
* @hide
*/
public void setLogSessionId(@Nullable String logSessionId) {
public void setLogSessionId(@NonNull LogSessionId logSessionId) {
Objects.requireNonNull(logSessionId);
if (mState == STATE_UNINITIALIZED) {
throw new IllegalStateException("AudioRecord not initialized");
}
native_setLogSessionId(logSessionId);
String stringId = logSessionId.getStringId();
native_setLogSessionId(stringId);
mLogSessionId = logSessionId;
}
/**
* Returns the {@link LogSessionId}.
*/
@NonNull
public LogSessionId getLogSessionId() {
return mLogSessionId;
}
//---------------------------------------------------------
// Interface definitions
//--------------------

View File

@@ -26,6 +26,7 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.media.metrics.LogSessionId;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -45,6 +46,7 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.NioUtils;
import java.util.LinkedList;
import java.util.Objects;
import java.util.concurrent.Executor;
/**
@@ -567,9 +569,9 @@ public class AudioTrack extends PlayerBase
/**
* The log session id used for metrics.
* A null or empty string here means it is not set.
* {@link LogSessionId#LOG_SESSION_ID_NONE} here means it is not set.
*/
private String mLogSessionId;
@NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
//--------------------------------
// Used exclusively by native code
@@ -4044,24 +4046,35 @@ public class AudioTrack extends PlayerBase
}
/**
* Sets a string handle to this AudioTrack for metrics collection.
* Sets a {@link LogSessionId} instance to this AudioTrack for metrics collection.
*
* @param logSessionId a string which is used to identify this object
* to the metrics service. Proper generated Ids must be obtained
* from the Java metrics service and should be considered opaque.
* Use null to remove the logSessionId association.
* @param logSessionId a {@link LogSessionId} instance which is used to
* identify this object to the metrics service. Proper generated
* Ids must be obtained from the Java metrics service and should
* be considered opaque. Use
* {@link LogSessionId#LOG_SESSION_ID_NONE} to remove the
* logSessionId association.
* @throws IllegalStateException if AudioTrack not initialized.
*
* @hide
*/
public void setLogSessionId(@Nullable String logSessionId) {
public void setLogSessionId(@NonNull LogSessionId logSessionId) {
Objects.requireNonNull(logSessionId);
if (mState == STATE_UNINITIALIZED) {
throw new IllegalStateException("track not initialized");
}
native_setLogSessionId(logSessionId);
String stringId = logSessionId.getStringId();
native_setLogSessionId(stringId);
mLogSessionId = logSessionId;
}
/**
* Returns the {@link LogSessionId}.
*/
@NonNull
public LogSessionId getLogSessionId() {
return mLogSessionId;
}
//---------------------------------------------------------
// Inner classes
//--------------------

View File

@@ -25,7 +25,6 @@ import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.hardware.HardwareBuffer;
import android.media.MediaCodecInfo.CodecCapabilities;
import android.media.metrics.PlaybackComponent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -1539,7 +1538,7 @@ import java.util.concurrent.locks.ReentrantLock;
</tbody>
</table>
*/
final public class MediaCodec implements PlaybackComponent {
final public class MediaCodec {
/**
* Per buffer metadata includes an offset and size specifying
@@ -1697,22 +1696,6 @@ final public class MediaCodec implements PlaybackComponent {
private static final int CB_OUTPUT_FORMAT_CHANGE = 4;
/**
* @hide
*/
@Override
public void setPlaybackId(@NonNull String playbackId) {
// TODO: add a native method to pass the ID to the native code for logging.
mPlaybackId = playbackId;
}
/**
* @hide
*/
@Override
public String getPlaybackId() {
return mPlaybackId;
}
private class EventHandler extends Handler {
private MediaCodec mCodec;

View File

@@ -27,7 +27,7 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.media.metrics.PlaybackComponent;
import android.media.metrics.LogSessionId;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
@@ -50,6 +50,7 @@ import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@@ -1379,7 +1380,7 @@ public final class MediaDrm implements AutoCloseable {
public byte[] openSession(@SecurityLevel int level) throws
NotProvisionedException, ResourceBusyException {
byte[] sessionId = openSessionNative(level);
mPlaybackComponentMap.put(ByteBuffer.wrap(sessionId), new PlaybackComponentImpl(sessionId));
mPlaybackComponentMap.put(ByteBuffer.wrap(sessionId), new PlaybackComponent(sessionId));
return sessionId;
}
@@ -2929,8 +2930,8 @@ public final class MediaDrm implements AutoCloseable {
/**
* Obtain a {@link PlaybackComponent} associated with a DRM session.
* Call {@link PlaybackComponent#setPlaybackId(String)} on the returned object
* to associate a playback session with the DRM session.
* Call {@link PlaybackComponent#setLogSessionId(LogSessionId)} on
* the returned object to associate a playback session with the DRM session.
*
* @param sessionId a DRM session ID obtained from {@link #openSession()}
* @return a {@link PlaybackComponent} associated with the session,
@@ -2945,28 +2946,37 @@ public final class MediaDrm implements AutoCloseable {
return mPlaybackComponentMap.get(ByteBuffer.wrap(sessionId));
}
private native void setPlaybackId(byte[] sessionId, String playbackId);
private native void setPlaybackId(byte[] sessionId, String logSessionId);
private final class PlaybackComponentImpl implements PlaybackComponent {
/** This class contains the Drm session ID and log session ID */
public final class PlaybackComponent {
private final byte[] mSessionId;
private String mPlaybackId = "";
@NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
public PlaybackComponentImpl(byte[] sessionId) {
/** @hide */
public PlaybackComponent(byte[] sessionId) {
mSessionId = sessionId;
}
@Override
public void setPlaybackId(@NonNull String playbackId) {
if (playbackId == null) {
/**
* Gets the {@link LogSessionId}.
*/
public void setLogSessionId(@NonNull LogSessionId logSessionId) {
Objects.requireNonNull(logSessionId);
if (logSessionId.getStringId() == null) {
throw new IllegalArgumentException("playbackId is null");
}
MediaDrm.this.setPlaybackId(mSessionId, playbackId);
mPlaybackId = playbackId;
MediaDrm.this.setPlaybackId(mSessionId, logSessionId.getStringId());
mLogSessionId = logSessionId;
}
@Override
@NonNull public String getPlaybackId() {
return mPlaybackId;
/**
* Returns the {@link LogSessionId}.
*/
@NonNull public LogSessionId getLogSessionId() {
return mLogSessionId;
}
}

View File

@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.metrics.LogSessionId;
import android.net.Uri;
import android.os.IBinder;
import android.os.IHwBinder;
@@ -40,6 +41,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
@@ -73,7 +75,7 @@ import java.util.stream.Collectors;
* <p>This class requires the {@link android.Manifest.permission#INTERNET} permission
* when used with network-based content.
*/
final public class MediaExtractor {
public final class MediaExtractor {
public MediaExtractor() {
native_setup();
}
@@ -767,6 +769,22 @@ final public class MediaExtractor {
*/
public native boolean hasCacheReachedEndOfStream();
/**
* Sets the {@link LogSessionId} for MediaExtractor.
*/
public void setLogSessionId(@NonNull LogSessionId logSessionId) {
mLogSessionId = Objects.requireNonNull(logSessionId);
// TODO: implement native_setPlaybackId(playbackId);
}
/**
* Returns the {@link LogSessionId} for MediaExtractor.
*/
@NonNull
public LogSessionId getLogSessionId() {
return mLogSessionId;
}
/**
* Return Metrics data about the current media container.
*
@@ -796,6 +814,7 @@ final public class MediaExtractor {
}
private MediaCas mMediaCas;
@NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
private long mNativeContext;

View File

@@ -29,6 +29,7 @@ import android.app.ActivityThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.hardware.Camera;
import android.media.metrics.LogSessionId;
import android.media.permission.Identity;
import android.os.Build;
import android.os.Handler;
@@ -130,6 +131,8 @@ public class MediaRecorder implements AudioRouting,
private int mChannelCount;
@NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
/**
* Default constructor.
*
@@ -164,6 +167,27 @@ public class MediaRecorder implements AudioRouting,
ActivityThread.currentPackageName(), myIdentity(context));
}
/**
* Sets the {@link LogSessionId} for MediaRecorder.
*
* @param id the global ID for monitoring the MediaRecorder performance
*/
public void setLogSessionId(@NonNull LogSessionId id) {
Objects.requireNonNull(id);
mLogSessionId = id;
setParameter("log-session-id=" + id.getStringId());
}
/**
* Returns the {@link LogSessionId} for MediaRecorder.
*
* @return the global ID for monitoring the MediaRecorder performance
*/
@NonNull
public LogSessionId getLogSessionId() {
return mLogSessionId;
}
/**
* Sets a {@link android.hardware.Camera} to use for recording.
*

View File

@@ -17,20 +17,29 @@
package android.media.metrics;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import java.util.Objects;
/**
* An instances of this class represents the ID of a log session.
*/
public final class LogSessionId {
private final String mSessionId;
@NonNull private final String mSessionId;
/* package */ LogSessionId(@NonNull String id) {
mSessionId = id;
}
/**
* A {@link LogSessionId} object which is used to clear any existing session ID.
*/
@NonNull public static final LogSessionId LOG_SESSION_ID_NONE = new LogSessionId("");
/** @hide */
@TestApi
public LogSessionId(@NonNull String id) {
mSessionId = Objects.requireNonNull(id);
}
/** Returns the ID represented by a string. */
@NonNull
public String getStringId() {
return mSessionId;
@@ -40,4 +49,17 @@ public final class LogSessionId {
public String toString() {
return mSessionId;
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LogSessionId that = (LogSessionId) o;
return Objects.equals(mSessionId, that.mSessionId);
}
@Override
public int hashCode() {
return Objects.hash(mSessionId);
}
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.media.metrics;
import android.annotation.NonNull;
/**
* Interface for playback related components used by playback metrics.
*/
public interface PlaybackComponent {
/**
* Sets the playback ID of the component.
*/
void setPlaybackId(@NonNull String playbackId);
/**
* Gets playback ID.
*/
@NonNull String getPlaybackId();
}