Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c56cc00a authored by shubang's avatar shubang
Browse files

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
parent dc2a0a63
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -69,10 +69,12 @@ package android.media {
    method public boolean advance(@NonNull android.media.MediaParser.SeekableInputReader) throws java.io.IOException;
    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 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 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 String getParserName();
    method @NonNull public static java.util.List<java.lang.String> getParserNames(@NonNull android.media.MediaFormat);
    method @NonNull public static java.util.List<java.lang.String> getParserNames(@NonNull android.media.MediaFormat);
    method public void release();
    method public void release();
    method public void seek(@NonNull android.media.MediaParser.SeekPoint);
    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 @NonNull public android.media.MediaParser setParameter(@NonNull String, @NonNull Object);
    method public boolean supportsParameter(@NonNull String);
    method public boolean supportsParameter(@NonNull String);
    field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking";
    field public static final String PARAMETER_ADTS_ENABLE_CBR_SEEKING = "android.media.mediaparser.adts.enableCbrSeeking";
+14 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.annotation.StringDef;
import android.annotation.StringDef;
import android.media.MediaCodec.CryptoInfo;
import android.media.MediaCodec.CryptoInfo;
import android.media.metrics.LogSessionId;
import android.os.Build;
import android.os.Build;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.Log;
import android.util.Log;
@@ -74,6 +75,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Function;
import java.util.function.Function;
@@ -1066,6 +1068,7 @@ public final class MediaParser {
    private boolean mReleased;
    private boolean mReleased;


    // MediaMetrics fields.
    // MediaMetrics fields.
    @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
    private final boolean mCreatedByName;
    private final boolean mCreatedByName;
    private final SparseArray<Format> mTrackFormats;
    private final SparseArray<Format> mTrackFormats;
    private String mLastObservedExceptionName;
    private String mLastObservedExceptionName;
@@ -1328,6 +1331,7 @@ public final class MediaParser {
                                MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH));
                                MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH));


        nativeSubmitMetrics(
        nativeSubmitMetrics(
                // TODO: mLogSessionId,
                mParserName,
                mParserName,
                mCreatedByName,
                mCreatedByName,
                String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool),
                String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool),
@@ -1341,6 +1345,15 @@ public final class MediaParser {
                videoHeight);
                videoHeight);
    }
    }


    public void setLogSessionId(@NonNull LogSessionId sessionId) {
        this.mLogSessionId = Objects.requireNonNull(sessionId);
    }

    @NonNull
    public LogSessionId getLogSessionId() {
        return mLogSessionId;
    }

    // Private methods.
    // Private methods.


    private MediaParser(
    private MediaParser(
@@ -2184,6 +2197,7 @@ public final class MediaParser {
    // Native methods.
    // Native methods.


    private native void nativeSubmitMetrics(
    private native void nativeSubmitMetrics(
            // TODO: String logSessionId,
            String parserName,
            String parserName,
            boolean createdByName,
            boolean createdByName,
            String parserPool,
            String parserPool,
+17 −9
Original line number Original line Diff line number Diff line
@@ -20579,6 +20579,7 @@ package android.media {
    method public int getChannelConfiguration();
    method public int getChannelConfiguration();
    method public int getChannelCount();
    method public int getChannelCount();
    method @NonNull public android.media.AudioFormat getFormat();
    method @NonNull public android.media.AudioFormat getFormat();
    method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
    method public android.os.PersistableBundle getMetrics();
    method public android.os.PersistableBundle getMetrics();
    method public static int getMinBufferSize(int, int, int);
    method public static int getMinBufferSize(int, int, int);
    method public int getNotificationMarkerPosition();
    method public int getNotificationMarkerPosition();
@@ -20601,6 +20602,7 @@ package android.media {
    method public void release();
    method public void release();
    method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
    method public void removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener);
    method @Deprecated public void removeOnRoutingChangedListener(android.media.AudioRecord.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 setNotificationMarkerPosition(int);
    method public int setPositionNotificationPeriod(int);
    method public int setPositionNotificationPeriod(int);
    method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
    method public boolean setPreferredDevice(android.media.AudioDeviceInfo);
@@ -20716,6 +20718,7 @@ package android.media {
    method public int getChannelCount();
    method public int getChannelCount();
    method public int getDualMonoMode();
    method public int getDualMonoMode();
    method @NonNull public android.media.AudioFormat getFormat();
    method @NonNull public android.media.AudioFormat getFormat();
    method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
    method public static float getMaxVolume();
    method public static float getMaxVolume();
    method public android.os.PersistableBundle getMetrics();
    method public android.os.PersistableBundle getMetrics();
    method public static int getMinBufferSize(int, int, int);
    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 setAuxEffectSendLevel(@FloatRange(from=0.0) float);
    method public int setBufferSizeInFrames(@IntRange(from=0) int);
    method public int setBufferSizeInFrames(@IntRange(from=0) int);
    method public boolean setDualMonoMode(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 setLoopPoints(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0xffffffff) int);
    method public int setNotificationMarkerPosition(int);
    method public int setNotificationMarkerPosition(int);
    method public void setOffloadDelayPadding(@IntRange(from=0) int, @IntRange(from=0) 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();
    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, @Nullable android.media.MediaCrypto, int);
    method public void configure(@Nullable android.media.MediaFormat, @Nullable android.view.Surface, int, @Nullable android.media.MediaDescrambler);
    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;
    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.MediaFormat getOutputFormat(int);
    method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int);
    method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int);
    method @Nullable public android.media.Image getOutputImage(int);
    method @Nullable public android.media.Image getOutputImage(int);
    method public String getPlaybackId();
    method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int);
    method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int);
    method @Nullable public static android.media.Image mapHardwareBuffer(@NonNull android.hardware.HardwareBuffer);
    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;
    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 setOnFrameRenderedListener(@Nullable android.media.MediaCodec.OnFrameRenderedListener, @Nullable android.os.Handler);
    method public void setOutputSurface(@NonNull android.view.Surface);
    method public void setOutputSurface(@NonNull android.view.Surface);
    method public void setParameters(@Nullable android.os.Bundle);
    method public void setParameters(@Nullable android.os.Bundle);
    method public void setPlaybackId(@NonNull String);
    method public void setVideoScalingMode(int);
    method public void setVideoScalingMode(int);
    method public void signalEndOfInputStream();
    method public void signalEndOfInputStream();
    method public void start();
    method public void start();
@@ -21964,7 +21966,7 @@ package android.media {
    method @NonNull public java.util.List<byte[]> getOfflineLicenseKeySetIds();
    method @NonNull public java.util.List<byte[]> getOfflineLicenseKeySetIds();
    method public int getOfflineLicenseState(@NonNull byte[]);
    method public int getOfflineLicenseState(@NonNull byte[]);
    method public int getOpenSessionCount();
    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 byte[] getPropertyByteArray(String);
    method @NonNull public String getPropertyString(@NonNull String);
    method @NonNull public String getPropertyString(@NonNull String);
    method @NonNull public android.media.MediaDrm.ProvisionRequest getProvisionRequest();
    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[]);
    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 {
  public static final class MediaDrm.ProvisionRequest {
    method @NonNull public byte[] getData();
    method @NonNull public byte[] getData();
    method @NonNull public String getDefaultUrl();
    method @NonNull public String getDefaultUrl();
@@ -22201,6 +22208,7 @@ package android.media {
    method public long getCachedDuration();
    method public long getCachedDuration();
    method public android.media.MediaExtractor.CasInfo getCasInfo(int);
    method public android.media.MediaExtractor.CasInfo getCasInfo(int);
    method public android.media.DrmInitData getDrmInitData();
    method public android.media.DrmInitData getDrmInitData();
    method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
    method public android.os.PersistableBundle getMetrics();
    method public android.os.PersistableBundle getMetrics();
    method @Nullable public java.util.Map<java.util.UUID,byte[]> getPsshInfo();
    method @Nullable public java.util.Map<java.util.UUID,byte[]> getPsshInfo();
    method public boolean getSampleCryptoInfo(@NonNull android.media.MediaCodec.CryptoInfo);
    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 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) throws java.io.IOException;
    method public void setDataSource(@NonNull java.io.FileDescriptor, long, long) 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 setMediaCas(@NonNull android.media.MediaCas);
    method public void unselectTrack(int);
    method public void unselectTrack(int);
    field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
    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 public java.util.List<android.media.MicrophoneInfo> getActiveMicrophones() throws java.io.IOException;
    method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
    method @Nullable public android.media.AudioRecordingConfiguration getActiveRecordingConfiguration();
    method public static final int getAudioSourceMax();
    method public static final int getAudioSourceMax();
    method @NonNull public android.media.metrics.LogSessionId getLogSessionId();
    method public int getMaxAmplitude() throws java.lang.IllegalStateException;
    method public int getMaxAmplitude() throws java.lang.IllegalStateException;
    method public android.os.PersistableBundle getMetrics();
    method public android.os.PersistableBundle getMetrics();
    method public android.media.AudioDeviceInfo getPreferredDevice();
    method public android.media.AudioDeviceInfo getPreferredDevice();
@@ -22847,6 +22857,7 @@ package android.media {
    method public void setCaptureRate(double);
    method public void setCaptureRate(double);
    method public void setInputSurface(@NonNull android.view.Surface);
    method public void setInputSurface(@NonNull android.view.Surface);
    method public void setLocation(float, float);
    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 setMaxDuration(int) throws java.lang.IllegalArgumentException;
    method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
    method public void setMaxFileSize(long) throws java.lang.IllegalArgumentException;
    method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException;
    method public void setNextOutputFile(java.io.FileDescriptor) throws java.io.IOException;
@@ -24478,6 +24489,8 @@ package android.media.metrics {
  }
  }
  public final class LogSessionId {
  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 {
  public class MediaMetricsManager {
@@ -24511,11 +24524,6 @@ package android.media.metrics {
    method @NonNull public android.media.metrics.NetworkEvent.Builder setTimeSinceCreatedMillis(@IntRange(from=0xffffffff) long);
    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 {
  public final class PlaybackErrorEvent extends android.media.metrics.Event implements android.os.Parcelable {
    method public int describeContents();
    method public int describeContents();
    method public int getErrorCode();
    method public int getErrorCode();
+1 −1
Original line number Original line Diff line number Diff line
@@ -1478,7 +1478,7 @@ package android.media.audiopolicy {
package android.media.metrics {
package android.media.metrics {


  public final class LogSessionId {
  public final class LogSessionId {
    method @NonNull public String getStringId();
    ctor public LogSessionId(@NonNull String);
  }
  }


}
}
+22 −11
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ import android.content.Context;
import android.media.MediaRecorder.Source;
import android.media.MediaRecorder.Source;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicy;
import android.media.metrics.LogSessionId;
import android.media.permission.Identity;
import android.media.permission.Identity;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjection;
import android.os.Binder;
import android.os.Binder;
@@ -282,9 +283,9 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection,


    /**
    /**
     * The log session id used for metrics.
     * 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
    // 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
     * @param logSessionId a {@link LogSessionId} instance which is used to
     *        to the metrics service.  Proper generated Ids must be obtained
     *        identify this object to the metrics service. Proper generated
     *        from the Java metrics service and should be considered opaque.
     *        Ids must be obtained from the Java metrics service and should
     *        Use null to remove the logSessionId association.
     *        be considered opaque. Use
     *        {@link LogSessionId#LOG_SESSION_ID_NONE} to remove the
     *        logSessionId association.
     * @throws IllegalStateException if AudioRecord not initialized.
     * @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) {
        if (mState == STATE_UNINITIALIZED) {
            throw new IllegalStateException("AudioRecord not initialized");
            throw new IllegalStateException("AudioRecord not initialized");
        }
        }
        native_setLogSessionId(logSessionId);
        String stringId = logSessionId.getStringId();
        native_setLogSessionId(stringId);
        mLogSessionId = logSessionId;
        mLogSessionId = logSessionId;
    }
    }


    /**
     * Returns the {@link LogSessionId}.
     */
    @NonNull
    public LogSessionId getLogSessionId() {
        return mLogSessionId;
    }

    //---------------------------------------------------------
    //---------------------------------------------------------
    // Interface definitions
    // Interface definitions
    //--------------------
    //--------------------
Loading