From f859205438a496c7859233e5880b086984bd58d7 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Mon, 27 Oct 2014 10:52:45 +0000 Subject: [PATCH] Let FileDataSource report to a TransferListener. --- .../exoplayer/upstream/FileDataSource.java | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/upstream/FileDataSource.java b/library/src/main/java/com/google/android/exoplayer/upstream/FileDataSource.java index a08cacb982..ec9a3b9ade 100644 --- a/library/src/main/java/com/google/android/exoplayer/upstream/FileDataSource.java +++ b/library/src/main/java/com/google/android/exoplayer/upstream/FileDataSource.java @@ -36,8 +36,27 @@ public final class FileDataSource implements DataSource { } + private final TransferListener listener; + private RandomAccessFile file; private long bytesRemaining; + private boolean opened; + + /** + * Constructs a new {@link DataSource} that retrieves data from a file. + */ + public FileDataSource() { + this(null); + } + + /** + * Constructs a new {@link DataSource} that retrieves data from a file. + * + * @param listener An optional listener. Specify {@code null} for no listener. + */ + public FileDataSource(TransferListener listener) { + this.listener = listener; + } @Override public long open(DataSpec dataSpec) throws FileDataSourceException { @@ -46,10 +65,16 @@ public final class FileDataSource implements DataSource { file.seek(dataSpec.position); bytesRemaining = dataSpec.length == C.LENGTH_UNBOUNDED ? file.length() - dataSpec.position : dataSpec.length; - return bytesRemaining; } catch (IOException e) { throw new FileDataSourceException(e); } + + opened = true; + if (listener != null) { + listener.onTransferStart(); + } + + return bytesRemaining; } @Override @@ -63,7 +88,14 @@ public final class FileDataSource implements DataSource { } catch (IOException e) { throw new FileDataSourceException(e); } - bytesRemaining -= bytesRead; + + if (bytesRead > 0) { + bytesRemaining -= bytesRead; + if (listener != null) { + listener.onBytesTransferred(bytesRead); + } + } + return bytesRead; } } @@ -75,8 +107,16 @@ public final class FileDataSource implements DataSource { file.close(); } catch (IOException e) { throw new FileDataSourceException(e); + } finally { + file = null; + + if (opened) { + opened = false; + if (listener != null) { + listener.onTransferEnd(); + } + } } - file = null; } }