Package com.google.android.exoplayer2.upstream

## Class StatsDataSource

- java.lang.Object
- - com.google.android.exoplayer2.upstream.StatsDataSource

- All Implemented Interfaces:
    `DataReader`, `DataSource`

      public final class StatsDataSource
      extends Object
      implements DataSource

  `DataSource` wrapper which keeps track of bytes transferred, redirected uris, and response headers.

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from interface com.google.android.exoplayer2.upstream.DataSource

      `DataSource.Factory`

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `StatsDataSource​(DataSource dataSource)` | Creates the stats data source.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `addTransferListener​(TransferListener transferListener)` | Adds a `TransferListener` to listen to data transfers.
    `void` | `close()` | Closes the source.
    `long` | `getBytesRead()` | Returns the total number of bytes that have been read from the data source.
    `Uri` | `getLastOpenedUri()` | Returns the `Uri` associated with the last `open(DataSpec)` call.
    `Map<String,​List<String>>` | `getLastResponseHeaders()` | Returns the response headers associated with the last `open(DataSpec)` call.
    `Map<String,​List<String>>` | `getResponseHeaders()` | When the source is open, returns the response headers associated with the last `DataSource.open(com.google.android.exoplayer2.upstream.DataSpec)` call.
    `Uri` | `getUri()` | When the source is open, returns the `Uri` from which data is being read.
    `long` | `open​(DataSpec dataSpec)` | Opens the source to read the specified data.
    `int` | `read​(byte[] buffer, int offset, int readLength)` | Reads up to `length` bytes of data from the input.
    `void` | `resetBytesRead()` | Resets the number of bytes read as returned from `getBytesRead()` to zero.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### StatsDataSource

          public StatsDataSource​(DataSource dataSource)

      Creates the stats data source.
      Parameters:
        `dataSource` - The wrapped `DataSource`.

  - ### Method Detail

    - #### resetBytesRead

          public void resetBytesRead()

      Resets the number of bytes read as returned from `getBytesRead()` to zero.

    - #### getBytesRead

          public long getBytesRead()

      Returns the total number of bytes that have been read from the data source.

    - #### getLastOpenedUri

          public Uri getLastOpenedUri()

      Returns the `Uri` associated with the last `open(DataSpec)` call. If redirection occurred, this is the redirected uri.

    - #### getLastResponseHeaders

          public Map<String,​List<String>> getLastResponseHeaders()

      Returns the response headers associated with the last `open(DataSpec)` call.

    - #### addTransferListener

          public void addTransferListener​(TransferListener transferListener)

      Description copied from interface: `DataSource`
      Adds a `TransferListener` to listen to data transfers. This method is not thread-safe.
      Specified by:
        `addTransferListener` in interface `DataSource`
      Parameters:
        `transferListener` - A `TransferListener`.

    - #### open

          public long open​(DataSpec dataSpec)
                    throws IOException

      Description copied from interface: `DataSource`
      Opens the source to read the specified data. If an `IOException` is thrown, callers must still call `DataSource.close()` to ensure that any partial effects of the invocation are cleaned up.

      The following edge case behaviors apply:

      - If the `requested position` is within the resource, but the `requested length` extends beyond the end of the resource, then `DataSource.open(com.google.android.exoplayer2.upstream.DataSpec)` will succeed and data from the requested position to the end of the resource will be made available through `DataReader.read(byte[], int, int)`.
      - If the `requested position` is equal to the length of the resource, then `DataSource.open(com.google.android.exoplayer2.upstream.DataSpec)` will succeed, and `DataReader.read(byte[], int, int)` will immediately return `C.RESULT_END_OF_INPUT`.
      - If the `requested position` is greater than the length of the resource, then `DataSource.open(com.google.android.exoplayer2.upstream.DataSpec)` will throw an `IOException` for which `DataSourceException.isCausedByPositionOutOfRange(java.io.IOException)` will be `true`.
      Specified by:
        `open` in interface `DataSource`
      Parameters:
        `dataSpec` - Defines the data to be read.
      Returns:
        The number of bytes that can be read from the opened source. For unbounded requests (i.e., requests where `DataSpec.length` equals `C.LENGTH_UNSET`) this value is the resolved length of the request, or `C.LENGTH_UNSET` if the length is still unresolved. For all other requests, the value returned will be equal to the request's `DataSpec.length`.
      Throws:
        `IOException` - If an error occurs opening the source. `DataSourceException` can be thrown or used as a cause of the thrown exception to specify the reason of the error.

    - #### read

          public int read​(byte[] buffer,
                          int offset,
                          int readLength)
                   throws IOException

      Description copied from interface: `DataReader`
      Reads up to `length` bytes of data from the input.

      If `readLength` is zero then 0 is returned. Otherwise, if no data is available because the end of the opened range has been reached, then `C.RESULT_END_OF_INPUT` is returned. Otherwise, the call will block until at least one byte of data has been read and the number of bytes read is returned.

      Specified by:
        `read` in interface `DataReader`
      Parameters:
        `buffer` - A target array into which data should be written.
        `offset` - The offset into the target array at which to write.
        `readLength` - The maximum number of bytes to read from the input.
      Returns:
        The number of bytes read, or `C.RESULT_END_OF_INPUT` if the input has ended. This may be less than `length` because the end of the input (or available data) was reached, the method was interrupted, or the operation was aborted early for another reason.
      Throws:
        `IOException` - If an error occurs reading from the input.

    - #### getUri

          @Nullable
          public Uri getUri()

      Description copied from interface: `DataSource`
      When the source is open, returns the `Uri` from which data is being read. The returned `Uri` will be identical to the one passed `DataSource.open(DataSpec)` in the `DataSpec` unless redirection has occurred. If redirection has occurred, the `Uri` after redirection is returned.
      Specified by:
        `getUri` in interface `DataSource`
      Returns:
        The `Uri` from which data is being read, or null if the source is not open.

    - #### getResponseHeaders

          public Map<String,​List<String>> getResponseHeaders()

      Description copied from interface: `DataSource`
      When the source is open, returns the response headers associated with the last `DataSource.open(com.google.android.exoplayer2.upstream.DataSpec)` call. Otherwise, returns an empty map.

      Key look-up in the returned map is case-insensitive.

      Specified by:
        `getResponseHeaders` in interface `DataSource`

    - #### close

          public void close()
                     throws IOException

      Description copied from interface: `DataSource`
      Closes the source. This method must be called even if the corresponding call to `DataSource.open(DataSpec)` threw an `IOException`.
      Specified by:
        `close` in interface `DataSource`
      Throws:
        `IOException` - If an error occurs closing the source.