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
4bf7ffd9
authored
Dec 15, 2021
by
ibaker
Committed by
Ian Baker
Dec 16, 2021
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Move ImaAdsLoader Player.Listener implementation to internal class
PiperOrigin-RevId: 416613846
parent
9316b4f4
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
66 additions
and
61 deletions
extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java
extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java
extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java
View file @
4bf7ffd9
...
@@ -86,7 +86,7 @@ import java.util.Set;
...
@@ -86,7 +86,7 @@ import java.util.Set;
* href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/omsdk">IMA
* href="https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/omsdk">IMA
* SDK Open Measurement documentation</a> for more information.
* SDK Open Measurement documentation</a> for more information.
*/
*/
public
final
class
ImaAdsLoader
implements
Player
.
Listener
,
AdsLoader
{
public
final
class
ImaAdsLoader
implements
AdsLoader
{
static
{
static
{
ExoPlayerLibraryInfo
.
registerModule
(
"goog.exo.ima"
);
ExoPlayerLibraryInfo
.
registerModule
(
"goog.exo.ima"
);
...
@@ -386,6 +386,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -386,6 +386,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
private
final
ImaUtil
.
Configuration
configuration
;
private
final
ImaUtil
.
Configuration
configuration
;
private
final
Context
context
;
private
final
Context
context
;
private
final
ImaUtil
.
ImaFactory
imaFactory
;
private
final
ImaUtil
.
ImaFactory
imaFactory
;
private
final
PlayerListenerImpl
playerListener
;
private
final
HashMap
<
Object
,
AdTagLoader
>
adTagLoaderByAdsId
;
private
final
HashMap
<
Object
,
AdTagLoader
>
adTagLoaderByAdsId
;
private
final
HashMap
<
AdsMediaSource
,
AdTagLoader
>
adTagLoaderByAdsMediaSource
;
private
final
HashMap
<
AdsMediaSource
,
AdTagLoader
>
adTagLoaderByAdsMediaSource
;
private
final
Timeline
.
Period
period
;
private
final
Timeline
.
Period
period
;
...
@@ -402,6 +403,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -402,6 +403,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
this
.
context
=
context
.
getApplicationContext
();
this
.
context
=
context
.
getApplicationContext
();
this
.
configuration
=
configuration
;
this
.
configuration
=
configuration
;
this
.
imaFactory
=
imaFactory
;
this
.
imaFactory
=
imaFactory
;
playerListener
=
new
PlayerListenerImpl
();
supportedMimeTypes
=
ImmutableList
.
of
();
supportedMimeTypes
=
ImmutableList
.
of
();
adTagLoaderByAdsId
=
new
HashMap
<>();
adTagLoaderByAdsId
=
new
HashMap
<>();
adTagLoaderByAdsMediaSource
=
new
HashMap
<>();
adTagLoaderByAdsMediaSource
=
new
HashMap
<>();
...
@@ -532,7 +534,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -532,7 +534,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
if
(
player
==
null
)
{
if
(
player
==
null
)
{
return
;
return
;
}
}
player
.
addListener
(
this
);
player
.
addListener
(
playerListener
);
}
}
@Nullable
AdTagLoader
adTagLoader
=
adTagLoaderByAdsId
.
get
(
adsId
);
@Nullable
AdTagLoader
adTagLoader
=
adTagLoaderByAdsId
.
get
(
adsId
);
...
@@ -554,7 +556,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -554,7 +556,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
}
}
if
(
player
!=
null
&&
adTagLoaderByAdsMediaSource
.
isEmpty
())
{
if
(
player
!=
null
&&
adTagLoaderByAdsMediaSource
.
isEmpty
())
{
player
.
removeListener
(
this
);
player
.
removeListener
(
playerListener
);
player
=
null
;
player
=
null
;
}
}
}
}
...
@@ -562,7 +564,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -562,7 +564,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
@Override
@Override
public
void
release
()
{
public
void
release
()
{
if
(
player
!=
null
)
{
if
(
player
!=
null
)
{
player
.
removeListener
(
this
);
player
.
removeListener
(
playerListener
);
player
=
null
;
player
=
null
;
maybeUpdateCurrentAdTagLoader
();
maybeUpdateCurrentAdTagLoader
();
}
}
...
@@ -602,37 +604,6 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -602,37 +604,6 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
.
handlePrepareError
(
adGroupIndex
,
adIndexInAdGroup
,
exception
);
.
handlePrepareError
(
adGroupIndex
,
adIndexInAdGroup
,
exception
);
}
}
// Player.Listener implementation.
@Override
public
void
onTimelineChanged
(
Timeline
timeline
,
@Player
.
TimelineChangeReason
int
reason
)
{
if
(
timeline
.
isEmpty
())
{
// The player is being reset or contains no media.
return
;
}
maybeUpdateCurrentAdTagLoader
();
maybePreloadNextPeriodAds
();
}
@Override
public
void
onPositionDiscontinuity
(
Player
.
PositionInfo
oldPosition
,
Player
.
PositionInfo
newPosition
,
@Player
.
DiscontinuityReason
int
reason
)
{
maybeUpdateCurrentAdTagLoader
();
maybePreloadNextPeriodAds
();
}
@Override
public
void
onShuffleModeEnabledChanged
(
boolean
shuffleModeEnabled
)
{
maybePreloadNextPeriodAds
();
}
@Override
public
void
onRepeatModeChanged
(
@Player
.
RepeatMode
int
repeatMode
)
{
maybePreloadNextPeriodAds
();
}
// Internal methods.
// Internal methods.
private
void
maybeUpdateCurrentAdTagLoader
()
{
private
void
maybeUpdateCurrentAdTagLoader
()
{
...
@@ -672,7 +643,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -672,7 +643,7 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
}
}
private
void
maybePreloadNextPeriodAds
()
{
private
void
maybePreloadNextPeriodAds
()
{
@Nullable
Player
player
=
this
.
player
;
@Nullable
Player
player
=
ImaAdsLoader
.
this
.
player
;
if
(
player
==
null
)
{
if
(
player
==
null
)
{
return
;
return
;
}
}
...
@@ -706,6 +677,38 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
...
@@ -706,6 +677,38 @@ public final class ImaAdsLoader implements Player.Listener, AdsLoader {
nextAdTagLoader
.
maybePreloadAds
(
Util
.
usToMs
(
periodPositionUs
),
Util
.
usToMs
(
period
.
durationUs
));
nextAdTagLoader
.
maybePreloadAds
(
Util
.
usToMs
(
periodPositionUs
),
Util
.
usToMs
(
period
.
durationUs
));
}
}
private
final
class
PlayerListenerImpl
implements
Player
.
Listener
{
@Override
public
void
onTimelineChanged
(
Timeline
timeline
,
@Player
.
TimelineChangeReason
int
reason
)
{
if
(
timeline
.
isEmpty
())
{
// The player is being reset or contains no media.
return
;
}
maybeUpdateCurrentAdTagLoader
();
maybePreloadNextPeriodAds
();
}
@Override
public
void
onPositionDiscontinuity
(
Player
.
PositionInfo
oldPosition
,
Player
.
PositionInfo
newPosition
,
@Player
.
DiscontinuityReason
int
reason
)
{
maybeUpdateCurrentAdTagLoader
();
maybePreloadNextPeriodAds
();
}
@Override
public
void
onShuffleModeEnabledChanged
(
boolean
shuffleModeEnabled
)
{
maybePreloadNextPeriodAds
();
}
@Override
public
void
onRepeatModeChanged
(
@Player
.
RepeatMode
int
repeatMode
)
{
maybePreloadNextPeriodAds
();
}
}
/**
/**
* Default {@link ImaUtil.ImaFactory} for non-test usage, which delegates to {@link
* Default {@link ImaUtil.ImaFactory} for non-test usage, which delegates to {@link
* ImaSdkFactory}.
* ImaSdkFactory}.
...
...
extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/FakeExoPlayer.java
View file @
4bf7ffd9
...
@@ -15,10 +15,13 @@
...
@@ -15,10 +15,13 @@
*/
*/
package
com
.
google
.
android
.
exoplayer2
.
ext
.
ima
;
package
com
.
google
.
android
.
exoplayer2
.
ext
.
ima
;
import
static
com
.
google
.
android
.
exoplayer2
.
util
.
Assertions
.
checkState
;
import
android.os.Looper
;
import
android.os.Looper
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.ExoPlayer
;
import
com.google.android.exoplayer2.ExoPlayer
;
import
com.google.android.exoplayer2.MediaItem
;
import
com.google.android.exoplayer2.MediaItem
;
import
com.google.android.exoplayer2.PlaybackException
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Timeline
;
import
com.google.android.exoplayer2.Timeline
;
import
com.google.android.exoplayer2.TracksInfo
;
import
com.google.android.exoplayer2.TracksInfo
;
...
@@ -182,6 +185,29 @@ import com.google.android.exoplayer2.util.Util;
...
@@ -182,6 +185,29 @@ import com.google.android.exoplayer2.util.Util;
}
}
}
}
/**
* Sets an error on this player.
*
* <p>This will propagate the error to {@link Player.Listener#onPlayerError(PlaybackException)}
* and {@link Player.Listener#onPlayerErrorChanged(PlaybackException)} and will also update the
* state to {@link Player#STATE_IDLE}.
*
* <p>The player must be in {@link #STATE_BUFFERING} or {@link #STATE_READY}.
*/
@SuppressWarnings
(
"deprecation"
)
// Calling deprecated listener.onPlayerStateChanged()
public
void
setPlayerError
(
PlaybackException
error
)
{
checkState
(
state
==
STATE_BUFFERING
||
state
==
STATE_READY
);
this
.
state
=
Player
.
STATE_IDLE
;
listeners
.
sendEvent
(
Player
.
EVENT_PLAYBACK_STATE_CHANGED
,
listener
->
{
listener
.
onPlayerError
(
error
);
listener
.
onPlayerErrorChanged
(
error
);
listener
.
onPlayerStateChanged
(
playWhenReady
,
state
);
listener
.
onPlaybackStateChanged
(
state
);
});
}
// ExoPlayer methods. Other methods are unsupported.
// ExoPlayer methods. Other methods are unsupported.
@Override
@Override
...
...
extensions/ima/src/test/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoaderTest.java
View file @
4bf7ffd9
...
@@ -56,7 +56,6 @@ import com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer;
...
@@ -56,7 +56,6 @@ import com.google.ads.interactivemedia.v3.api.player.VideoAdPlayer;
import
com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate
;
import
com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.C
;
import
com.google.android.exoplayer2.ExoPlaybackException
;
import
com.google.android.exoplayer2.ExoPlaybackException
;
import
com.google.android.exoplayer2.MediaItem
;
import
com.google.android.exoplayer2.PlaybackException
;
import
com.google.android.exoplayer2.PlaybackException
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Player
;
import
com.google.android.exoplayer2.Timeline
;
import
com.google.android.exoplayer2.Timeline
;
...
@@ -276,30 +275,7 @@ public final class ImaAdsLoaderTest {
...
@@ -276,30 +275,7 @@ public final class ImaAdsLoaderTest {
ExoPlaybackException
anException
=
ExoPlaybackException
anException
=
ExoPlaybackException
.
createForSource
(
ExoPlaybackException
.
createForSource
(
new
IOException
(),
PlaybackException
.
ERROR_CODE_IO_UNSPECIFIED
);
new
IOException
(),
PlaybackException
.
ERROR_CODE_IO_UNSPECIFIED
);
imaAdsLoader
.
onPlayerErrorChanged
(
anException
);
fakePlayer
.
setPlayerError
(
anException
);
imaAdsLoader
.
onPlayerError
(
anException
);
imaAdsLoader
.
onPositionDiscontinuity
(
new
Player
.
PositionInfo
(
/* windowUid= */
new
Object
(),
/* windowIndex= */
0
,
/* mediaItem= */
MediaItem
.
fromUri
(
"http://google.com/0"
),
/* periodUid= */
new
Object
(),
/* periodIndex= */
0
,
/* positionMs= */
10_000
,
/* contentPositionMs= */
0
,
/* adGroupIndex= */
-
1
,
/* adIndexInAdGroup= */
-
1
),
new
Player
.
PositionInfo
(
/* windowUid= */
new
Object
(),
/* windowIndex= */
1
,
/* mediaItem= */
MediaItem
.
fromUri
(
"http://google.com/1"
),
/* periodUid= */
new
Object
(),
/* periodIndex= */
0
,
/* positionMs= */
20_000
,
/* contentPositionMs= */
0
,
/* adGroupIndex= */
-
1
,
/* adIndexInAdGroup= */
-
1
),
Player
.
DISCONTINUITY_REASON_SEEK
);
adEventListener
.
onAdEvent
(
getAdEvent
(
AdEventType
.
CONTENT_RESUME_REQUESTED
,
/* ad= */
null
));
adEventListener
.
onAdEvent
(
getAdEvent
(
AdEventType
.
CONTENT_RESUME_REQUESTED
,
/* ad= */
null
));
imaAdsLoader
.
handlePrepareError
(
imaAdsLoader
.
handlePrepareError
(
adsMediaSource
,
/* adGroupIndex= */
0
,
/* adIndexInAdGroup= */
0
,
new
IOException
());
adsMediaSource
,
/* adGroupIndex= */
0
,
/* adIndexInAdGroup= */
0
,
new
IOException
());
...
...
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