Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
cd2c1f2f
authored
Nov 06, 2019
by
bachinger
Committed by
Oliver Woodman
Nov 15, 2019
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Playlist API: Add setMediaItem() and prepare()
PiperOrigin-RevId: 278867153
parent
4570cd37
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
302 additions
and
46 deletions
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java
testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java
demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java
View file @
cd2c1f2f
...
@@ -394,7 +394,8 @@ public class PlayerActivity extends AppCompatActivity
...
@@ -394,7 +394,8 @@ public class PlayerActivity extends AppCompatActivity
if
(
haveStartPosition
)
{
if
(
haveStartPosition
)
{
player
.
seekTo
(
startWindow
,
startPosition
);
player
.
seekTo
(
startWindow
,
startPosition
);
}
}
player
.
prepare
(
mediaSource
,
!
haveStartPosition
,
false
);
player
.
setMediaItem
(
mediaSource
);
player
.
prepare
();
updateButtonVisibility
();
updateButtonVisibility
();
}
}
...
...
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java
View file @
cd2c1f2f
...
@@ -331,25 +331,50 @@ public interface ExoPlayer extends Player {
...
@@ -331,25 +331,50 @@ public interface ExoPlayer extends Player {
*/
*/
void
retry
();
void
retry
();
/** Prepares the player. */
void
prepare
();
/**
/**
* Prepares the player to play the provided {@link MediaSource}. Equivalent to {@code
* @deprecated Use {@code setMediaItem(mediaSource, C.TIME_UNSET)} and {@link #prepare()} instead.
* prepare(mediaSource, true, true)}.
*/
*/
@Deprecated
void
prepare
(
MediaSource
mediaSource
);
void
prepare
(
MediaSource
mediaSource
);
/** @deprecated Use {@link #setMediaItem(MediaSource, long)} and {@link #prepare()} instead. */
@Deprecated
void
prepare
(
MediaSource
mediaSource
,
boolean
resetPosition
,
boolean
resetState
);
/**
/**
* Prepares the player to play the provided {@link MediaSource}, optionally resetting the playback
* Sets the specified {@link MediaSource}.
* position the default position in the first {@link Timeline.Window}.
*
*
* @param mediaSource The {@link MediaSource} to play.
* <p>Note: This is an intermediate implementation towards a larger change. Until then {@link
* @param resetPosition Whether the playback position should be reset to the default position in
* #prepare()} has to be called immediately after calling this method.
* the first {@link Timeline.Window}. If false, playback will start from the position defined
*
* by {@link #getCurrentWindowIndex()} and {@link #getCurrentPosition()}.
* @param mediaItem The new {@link MediaSource}.
* @param resetState Whether the timeline, manifest, tracks and track selections should be reset.
* Should be true unless the player is being prepared to play the same media as it was playing
* previously (e.g. if playback failed and is being retried).
*/
*/
void
prepare
(
MediaSource
mediaSource
,
boolean
resetPosition
,
boolean
resetState
);
void
setMediaItem
(
MediaSource
mediaItem
);
/**
* Sets the specified {@link MediaSource}.
*
* <p>Note: This is an intermediate implementation towards a larger change. Until then {@link
* #prepare()} has to be called immediately after calling this method.
*
* <p>This intermediate implementation calls {@code stop(true)} before seeking to avoid seeking in
* a media item that has been set previously. It is equivalent with calling
*
* <pre><code>
* if (!getCurrentTimeline().isEmpty()) {
* player.stop(true);
* }
* player.seekTo(0, startPositionMs);
* player.setMediaItem(mediaItem);
* </code></pre>
*
* @param mediaItem The new {@link MediaSource}.
* @param startPositionMs The position in milliseconds to start playback from.
*/
void
setMediaItem
(
MediaSource
mediaItem
,
long
startPositionMs
);
/**
/**
* Creates a message that can be sent to a {@link PlayerMessage.Target}. By default, the message
* Creates a message that can be sent to a {@link PlayerMessage.Target}. By default, the message
...
...
library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java
View file @
cd2c1f2f
...
@@ -62,7 +62,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
...
@@ -62,7 +62,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
private
final
Timeline
.
Period
period
;
private
final
Timeline
.
Period
period
;
private
final
ArrayDeque
<
Runnable
>
pendingListenerNotifications
;
private
final
ArrayDeque
<
Runnable
>
pendingListenerNotifications
;
private
MediaSource
mediaSource
;
@Nullable
private
MediaSource
mediaSource
;
private
boolean
playWhenReady
;
private
boolean
playWhenReady
;
@PlaybackSuppressionReason
private
int
playbackSuppressionReason
;
@PlaybackSuppressionReason
private
int
playbackSuppressionReason
;
@RepeatMode
private
int
repeatMode
;
@RepeatMode
private
int
repeatMode
;
...
@@ -219,34 +219,38 @@ import java.util.concurrent.CopyOnWriteArrayList;
...
@@ -219,34 +219,38 @@ import java.util.concurrent.CopyOnWriteArrayList;
}
}
@Override
@Override
@Deprecated
public
void
prepare
(
MediaSource
mediaSource
)
{
public
void
prepare
(
MediaSource
mediaSource
)
{
prepare
(
mediaSource
,
/* resetPosition= */
true
,
/* resetState= */
true
);
setMediaItem
(
mediaSource
);
prepareInternal
(
/* resetPosition= */
true
,
/* resetState= */
true
);
}
}
@Override
@Override
@Deprecated
public
void
prepare
(
MediaSource
mediaSource
,
boolean
resetPosition
,
boolean
resetState
)
{
public
void
prepare
(
MediaSource
mediaSource
,
boolean
resetPosition
,
boolean
resetState
)
{
this
.
mediaSource
=
mediaSource
;
setMediaItem
(
mediaSource
);
PlaybackInfo
playbackInfo
=
prepareInternal
(
resetPosition
,
resetState
);
getResetPlaybackInfo
(
resetPosition
,
resetState
,
/* resetError= */
true
,
/* playbackState= */
Player
.
STATE_BUFFERING
);
// Trigger internal prepare first before updating the playback info and notifying external
// listeners to ensure that new operations issued in the listener notifications reach the
// player after this prepare. The internal player can't change the playback info immediately
// because it uses a callback.
hasPendingPrepare
=
true
;
pendingOperationAcks
++;
internalPlayer
.
prepare
(
mediaSource
,
resetPosition
,
resetState
);
updatePlaybackInfo
(
playbackInfo
,
/* positionDiscontinuity= */
false
,
/* ignored */
DISCONTINUITY_REASON_INTERNAL
,
TIMELINE_CHANGE_REASON_RESET
,
/* seekProcessed= */
false
);
}
}
@Override
public
void
prepare
()
{
Assertions
.
checkNotNull
(
mediaSource
);
prepareInternal
(
/* resetPosition= */
false
,
/* resetState= */
true
);
}
@Override
public
void
setMediaItem
(
MediaSource
mediaItem
,
long
startPositionMs
)
{
if
(!
getCurrentTimeline
().
isEmpty
())
{
stop
(
/* reset= */
true
);
}
seekTo
(
/* windowIndex= */
0
,
startPositionMs
);
setMediaItem
(
mediaItem
);
}
@Override
public
void
setMediaItem
(
MediaSource
mediaItem
)
{
mediaSource
=
mediaItem
;
}
@Override
@Override
public
void
setPlayWhenReady
(
boolean
playWhenReady
)
{
public
void
setPlayWhenReady
(
boolean
playWhenReady
)
{
...
@@ -606,6 +610,29 @@ import java.util.concurrent.CopyOnWriteArrayList;
...
@@ -606,6 +610,29 @@ import java.util.concurrent.CopyOnWriteArrayList;
}
}
}
}
/* package */
void
prepareInternal
(
boolean
resetPosition
,
boolean
resetState
)
{
Assertions
.
checkNotNull
(
mediaSource
);
PlaybackInfo
playbackInfo
=
getResetPlaybackInfo
(
resetPosition
,
resetState
,
/* resetError= */
true
,
/* playbackState= */
Player
.
STATE_BUFFERING
);
// Trigger internal prepare first before updating the playback info and notifying external
// listeners to ensure that new operations issued in the listener notifications reach the
// player after this prepare. The internal player can't change the playback info immediately
// because it uses a callback.
hasPendingPrepare
=
true
;
pendingOperationAcks
++;
internalPlayer
.
prepare
(
mediaSource
,
resetPosition
,
resetState
);
updatePlaybackInfo
(
playbackInfo
,
/* positionDiscontinuity= */
false
,
/* ignored */
DISCONTINUITY_REASON_INTERNAL
,
TIMELINE_CHANGE_REASON_RESET
,
/* seekProcessed= */
false
);
}
private
void
handlePlaybackParameters
(
private
void
handlePlaybackParameters
(
PlaybackParameters
playbackParameters
,
boolean
operationAck
)
{
PlaybackParameters
playbackParameters
,
boolean
operationAck
)
{
if
(
operationAck
)
{
if
(
operationAck
)
{
...
...
library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java
View file @
cd2c1f2f
...
@@ -1140,6 +1140,7 @@ public class SimpleExoPlayer extends BasePlayer
...
@@ -1140,6 +1140,7 @@ public class SimpleExoPlayer extends BasePlayer
}
}
@Override
@Override
@SuppressWarnings
(
"deprecation"
)
public
void
retry
()
{
public
void
retry
()
{
verifyApplicationThread
();
verifyApplicationThread
();
if
(
mediaSource
!=
null
if
(
mediaSource
!=
null
...
@@ -1149,23 +1150,38 @@ public class SimpleExoPlayer extends BasePlayer
...
@@ -1149,23 +1150,38 @@ public class SimpleExoPlayer extends BasePlayer
}
}
@Override
@Override
@Deprecated
@SuppressWarnings
(
"deprecation"
)
public
void
prepare
(
MediaSource
mediaSource
)
{
public
void
prepare
(
MediaSource
mediaSource
)
{
prepare
(
mediaSource
,
/* resetPosition= */
true
,
/* resetState= */
true
);
prepare
(
mediaSource
,
/* resetPosition= */
true
,
/* resetState= */
true
);
}
}
@Override
@Override
@Deprecated
public
void
prepare
(
MediaSource
mediaSource
,
boolean
resetPosition
,
boolean
resetState
)
{
public
void
prepare
(
MediaSource
mediaSource
,
boolean
resetPosition
,
boolean
resetState
)
{
verifyApplicationThread
();
verifyApplicationThread
();
if
(
this
.
mediaSource
!=
null
)
{
setMediaItem
(
mediaSource
);
this
.
mediaSource
.
removeEventListener
(
analyticsCollector
);
prepareInternal
(
resetPosition
,
resetState
);
analyticsCollector
.
resetForNewMediaSource
();
}
}
this
.
mediaSource
=
mediaSource
;
@Override
mediaSource
.
addEventListener
(
eventHandler
,
analyticsCollector
);
public
void
prepare
()
{
@AudioFocusManager
.
PlayerCommand
verifyApplicationThread
();
int
playerCommand
=
audioFocusManager
.
handlePrepare
(
getPlayWhenReady
());
prepareInternal
(
/* resetPosition= */
false
,
/* resetState= */
true
);
updatePlayWhenReady
(
getPlayWhenReady
(),
playerCommand
);
}
player
.
prepare
(
mediaSource
,
resetPosition
,
resetState
);
@Override
public
void
setMediaItem
(
MediaSource
mediaItem
,
long
startPositionMs
)
{
verifyApplicationThread
();
setMediaItemInternal
(
mediaItem
);
player
.
setMediaItem
(
mediaItem
,
startPositionMs
);
}
@Override
public
void
setMediaItem
(
MediaSource
mediaItem
)
{
verifyApplicationThread
();
setMediaItemInternal
(
mediaItem
);
player
.
setMediaItem
(
mediaItem
);
}
}
@Override
@Override
...
@@ -1410,6 +1426,23 @@ public class SimpleExoPlayer extends BasePlayer
...
@@ -1410,6 +1426,23 @@ public class SimpleExoPlayer extends BasePlayer
// Internal methods.
// Internal methods.
private
void
prepareInternal
(
boolean
resetPosition
,
boolean
resetState
)
{
Assertions
.
checkNotNull
(
mediaSource
);
@AudioFocusManager
.
PlayerCommand
int
playerCommand
=
audioFocusManager
.
handlePrepare
(
getPlayWhenReady
());
updatePlayWhenReady
(
getPlayWhenReady
(),
playerCommand
);
player
.
prepareInternal
(
resetPosition
,
resetState
);
}
private
void
setMediaItemInternal
(
MediaSource
mediaItem
)
{
if
(
mediaSource
!=
null
)
{
mediaSource
.
removeEventListener
(
analyticsCollector
);
analyticsCollector
.
resetForNewMediaSource
();
}
mediaSource
=
mediaItem
;
mediaSource
.
addEventListener
(
eventHandler
,
analyticsCollector
);
}
private
void
removeSurfaceCallbacks
()
{
private
void
removeSurfaceCallbacks
()
{
if
(
textureView
!=
null
)
{
if
(
textureView
!=
null
)
{
if
(
textureView
.
getSurfaceTextureListener
()
!=
componentListener
)
{
if
(
textureView
.
getSurfaceTextureListener
()
!=
componentListener
)
{
...
...
library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java
View file @
cd2c1f2f
...
@@ -16,6 +16,7 @@
...
@@ -16,6 +16,7 @@
package
com
.
google
.
android
.
exoplayer2
;
package
com
.
google
.
android
.
exoplayer2
;
import
static
com
.
google
.
common
.
truth
.
Truth
.
assertThat
;
import
static
com
.
google
.
common
.
truth
.
Truth
.
assertThat
;
import
static
org
.
junit
.
Assert
.
assertArrayEquals
;
import
static
org
.
junit
.
Assert
.
fail
;
import
static
org
.
junit
.
Assert
.
fail
;
import
static
org
.
robolectric
.
Shadows
.
shadowOf
;
import
static
org
.
robolectric
.
Shadows
.
shadowOf
;
...
@@ -33,7 +34,10 @@ import com.google.android.exoplayer2.Timeline.Window;
...
@@ -33,7 +34,10 @@ import com.google.android.exoplayer2.Timeline.Window;
import
com.google.android.exoplayer2.analytics.AnalyticsListener
;
import
com.google.android.exoplayer2.analytics.AnalyticsListener
;
import
com.google.android.exoplayer2.audio.AudioAttributes
;
import
com.google.android.exoplayer2.audio.AudioAttributes
;
import
com.google.android.exoplayer2.source.ClippingMediaSource
;
import
com.google.android.exoplayer2.source.ClippingMediaSource
;
import
com.google.android.exoplayer2.source.CompositeMediaSource
;
import
com.google.android.exoplayer2.source.ConcatenatingMediaSource
;
import
com.google.android.exoplayer2.source.ConcatenatingMediaSource
;
import
com.google.android.exoplayer2.source.LoopingMediaSource
;
import
com.google.android.exoplayer2.source.MediaPeriod
;
import
com.google.android.exoplayer2.source.MediaSource
;
import
com.google.android.exoplayer2.source.MediaSource
;
import
com.google.android.exoplayer2.source.MediaSource.MediaPeriodId
;
import
com.google.android.exoplayer2.source.MediaSource.MediaPeriodId
;
import
com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
;
import
com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher
;
...
@@ -1582,6 +1586,7 @@ public final class ExoPlayerTest {
...
@@ -1582,6 +1586,7 @@ public final class ExoPlayerTest {
AtomicInteger
counter
=
new
AtomicInteger
();
AtomicInteger
counter
=
new
AtomicInteger
();
ActionSchedule
actionSchedule
=
ActionSchedule
actionSchedule
=
new
ActionSchedule
.
Builder
(
"testSendMessagesFromStartPositionOnlyOnce"
)
new
ActionSchedule
.
Builder
(
"testSendMessagesFromStartPositionOnlyOnce"
)
.
waitForTimelineChanged
()
.
pause
()
.
pause
()
.
sendMessage
(
.
sendMessage
(
(
messageType
,
payload
)
->
{
(
messageType
,
payload
)
->
{
...
@@ -2860,6 +2865,155 @@ public final class ExoPlayerTest {
...
@@ -2860,6 +2865,155 @@ public final class ExoPlayerTest {
assertThat
(
seenPlaybackSuppression
.
get
()).
isFalse
();
assertThat
(
seenPlaybackSuppression
.
get
()).
isFalse
();
}
}
@Test
public
void
testDelegatingMediaSourceApproach
()
throws
Exception
{
Timeline
fakeTimeline
=
new
FakeTimeline
(
new
TimelineWindowDefinition
(
/* isSeekable= */
true
,
/* isDynamic= */
false
,
/* durationUs= */
10_000
));
final
ConcatenatingMediaSource
underlyingSource
=
new
ConcatenatingMediaSource
();
CompositeMediaSource
<
Void
>
delegatingMediaSource
=
new
CompositeMediaSource
<
Void
>()
{
@Override
public
void
prepareSourceInternal
(
@Nullable
TransferListener
mediaTransferListener
)
{
super
.
prepareSourceInternal
(
mediaTransferListener
);
underlyingSource
.
addMediaSource
(
new
FakeMediaSource
(
fakeTimeline
,
Builder
.
VIDEO_FORMAT
));
underlyingSource
.
addMediaSource
(
new
FakeMediaSource
(
fakeTimeline
,
Builder
.
VIDEO_FORMAT
));
prepareChildSource
(
null
,
underlyingSource
);
}
@Override
public
MediaPeriod
createPeriod
(
MediaPeriodId
id
,
Allocator
allocator
,
long
startPositionUs
)
{
return
underlyingSource
.
createPeriod
(
id
,
allocator
,
startPositionUs
);
}
@Override
public
void
releasePeriod
(
MediaPeriod
mediaPeriod
)
{
underlyingSource
.
releasePeriod
(
mediaPeriod
);
}
@Override
protected
void
onChildSourceInfoRefreshed
(
Void
id
,
MediaSource
mediaSource
,
Timeline
timeline
)
{
refreshSourceInfo
(
timeline
);
}
};
int
[]
currentWindowIndices
=
new
int
[
1
];
long
[]
currentPlaybackPositions
=
new
long
[
1
];
long
[]
windowCounts
=
new
long
[
1
];
int
seekToWindowIndex
=
1
;
ActionSchedule
actionSchedule
=
new
ActionSchedule
.
Builder
(
"testDelegatingMediaSourceApproach"
)
.
seek
(
/* windowIndex= */
1
,
/* positionMs= */
5000
)
.
waitForSeekProcessed
()
.
executeRunnable
(
new
PlayerRunnable
()
{
@Override
public
void
run
(
SimpleExoPlayer
player
)
{
currentWindowIndices
[
0
]
=
player
.
getCurrentWindowIndex
();
currentPlaybackPositions
[
0
]
=
player
.
getCurrentPosition
();
windowCounts
[
0
]
=
player
.
getCurrentTimeline
().
getWindowCount
();
}
})
.
build
();
ExoPlayerTestRunner
exoPlayerTestRunner
=
new
Builder
()
.
setMediaSource
(
delegatingMediaSource
)
.
setActionSchedule
(
actionSchedule
)
.
build
(
context
)
.
start
()
.
blockUntilActionScheduleFinished
(
TIMEOUT_MS
)
.
blockUntilEnded
(
TIMEOUT_MS
);
exoPlayerTestRunner
.
assertTimelineChangeReasonsEqual
(
Player
.
TIMELINE_CHANGE_REASON_PREPARED
);
assertArrayEquals
(
new
long
[]
{
2
},
windowCounts
);
assertArrayEquals
(
new
int
[]
{
seekToWindowIndex
},
currentWindowIndices
);
assertArrayEquals
(
new
long
[]
{
5_000
},
currentPlaybackPositions
);
}
@Test
public
void
testSeekTo_windowIndexIsReset_deprecated
()
throws
Exception
{
FakeTimeline
fakeTimeline
=
new
FakeTimeline
(
/* windowCount= */
1
);
FakeMediaSource
mediaSource
=
new
FakeMediaSource
(
fakeTimeline
);
LoopingMediaSource
loopingMediaSource
=
new
LoopingMediaSource
(
mediaSource
,
2
);
final
int
[]
windowIndex
=
{
C
.
INDEX_UNSET
};
final
long
[]
positionMs
=
{
C
.
TIME_UNSET
};
ActionSchedule
actionSchedule
=
new
ActionSchedule
.
Builder
(
"testSeekTo_windowIndexIsReset_deprecated"
)
.
seek
(
/* windowIndex= */
1
,
/* positionMs= */
C
.
TIME_UNSET
)
.
waitForSeekProcessed
()
.
playUntilPosition
(
/* windowIndex= */
1
,
/* positionMs= */
5000
)
.
executeRunnable
(
new
PlayerRunnable
()
{
@Override
public
void
run
(
SimpleExoPlayer
player
)
{
//noinspection deprecation
player
.
prepare
(
mediaSource
);
player
.
seekTo
(
/* positionMs= */
5000
);
}
})
.
executeRunnable
(
new
PlayerRunnable
()
{
@Override
public
void
run
(
SimpleExoPlayer
player
)
{
windowIndex
[
0
]
=
player
.
getCurrentWindowIndex
();
positionMs
[
0
]
=
player
.
getCurrentPosition
();
}
})
.
build
();
new
ExoPlayerTestRunner
.
Builder
()
.
setMediaSource
(
loopingMediaSource
)
.
setActionSchedule
(
actionSchedule
)
.
build
(
context
)
.
start
()
.
blockUntilActionScheduleFinished
(
TIMEOUT_MS
);
assertThat
(
windowIndex
[
0
]).
isEqualTo
(
0
);
assertThat
(
positionMs
[
0
]).
isAtLeast
(
5000L
);
}
@Test
public
void
testSeekTo_windowIndexIsReset
()
throws
Exception
{
FakeTimeline
fakeTimeline
=
new
FakeTimeline
(
/* windowCount= */
1
);
FakeMediaSource
mediaSource
=
new
FakeMediaSource
(
fakeTimeline
);
LoopingMediaSource
loopingMediaSource
=
new
LoopingMediaSource
(
mediaSource
,
2
);
final
int
[]
windowIndex
=
{
C
.
INDEX_UNSET
};
final
long
[]
positionMs
=
{
C
.
TIME_UNSET
};
ActionSchedule
actionSchedule
=
new
ActionSchedule
.
Builder
(
"testSeekTo_windowIndexIsReset"
)
.
seek
(
/* windowIndex= */
1
,
/* positionMs= */
C
.
TIME_UNSET
)
.
waitForSeekProcessed
()
.
playUntilPosition
(
/* windowIndex= */
1
,
/* positionMs= */
5000
)
.
executeRunnable
(
new
PlayerRunnable
()
{
@Override
public
void
run
(
SimpleExoPlayer
player
)
{
player
.
setMediaItem
(
mediaSource
,
/* positionMs= */
5000
);
player
.
prepare
();
}
})
.
executeRunnable
(
new
PlayerRunnable
()
{
@Override
public
void
run
(
SimpleExoPlayer
player
)
{
windowIndex
[
0
]
=
player
.
getCurrentWindowIndex
();
positionMs
[
0
]
=
player
.
getCurrentPosition
();
}
})
.
build
();
new
ExoPlayerTestRunner
.
Builder
()
.
setMediaSource
(
loopingMediaSource
)
.
setActionSchedule
(
actionSchedule
)
.
build
(
context
)
.
start
()
.
blockUntilActionScheduleFinished
(
TIMEOUT_MS
);
assertThat
(
windowIndex
[
0
]).
isEqualTo
(
0
);
assertThat
(
positionMs
[
0
]).
isAtLeast
(
5000L
);
}
// Internal methods.
// Internal methods.
private
static
ActionSchedule
.
Builder
addSurfaceSwitch
(
ActionSchedule
.
Builder
builder
)
{
private
static
ActionSchedule
.
Builder
addSurfaceSwitch
(
ActionSchedule
.
Builder
builder
)
{
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.java
View file @
cd2c1f2f
...
@@ -431,7 +431,8 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
...
@@ -431,7 +431,8 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
if
(
actionSchedule
!=
null
)
{
if
(
actionSchedule
!=
null
)
{
actionSchedule
.
start
(
player
,
trackSelector
,
null
,
handler
,
ExoPlayerTestRunner
.
this
);
actionSchedule
.
start
(
player
,
trackSelector
,
null
,
handler
,
ExoPlayerTestRunner
.
this
);
}
}
player
.
prepare
(
mediaSource
,
/* resetPosition= */
false
,
/* resetState= */
false
);
player
.
setMediaItem
(
mediaSource
);
player
.
prepare
();
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
handleException
(
e
);
handleException
(
e
);
}
}
...
...
testutils/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java
View file @
cd2c1f2f
...
@@ -97,6 +97,11 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
...
@@ -97,6 +97,11 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
}
}
@Override
@Override
public
void
prepare
()
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
prepare
(
MediaSource
mediaSource
)
{
public
void
prepare
(
MediaSource
mediaSource
)
{
throw
new
UnsupportedOperationException
();
throw
new
UnsupportedOperationException
();
}
}
...
@@ -107,6 +112,16 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
...
@@ -107,6 +112,16 @@ public abstract class StubExoPlayer extends BasePlayer implements ExoPlayer {
}
}
@Override
@Override
public
void
setMediaItem
(
MediaSource
mediaItem
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
setMediaItem
(
MediaSource
mediaItem
,
long
startPositionMs
)
{
throw
new
UnsupportedOperationException
();
}
@Override
public
void
setPlayWhenReady
(
boolean
playWhenReady
)
{
public
void
setPlayWhenReady
(
boolean
playWhenReady
)
{
throw
new
UnsupportedOperationException
();
throw
new
UnsupportedOperationException
();
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment