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
85c09753
authored
Apr 26, 2022
by
Ian Baker
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge pull request #59 from h6ah4i:fix/cleanup-callbacks-on-media-controller-release
PiperOrigin-RevId: 441253378
parents
34f014ce
7536a25b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
119 additions
and
6 deletions
RELEASENOTES.md
libraries/session/src/main/java/androidx/media3/session/MediaController.java
libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTest.java
libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTestRule.java
libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java
RELEASENOTES.md
View file @
85c09753
...
@@ -65,6 +65,9 @@
...
@@ -65,6 +65,9 @@
(
[
#47
](
https://github.com/androidx/media/pull/47
)
).
(
[
#47
](
https://github.com/androidx/media/pull/47
)
).
*
Add RTP reader for WAV
*
Add RTP reader for WAV
(
[
#56
](
https://github.com/androidx/media/pull/56
)
).
(
[
#56
](
https://github.com/androidx/media/pull/56
)
).
*
Session:
*
Fix NPE in MediaControllerImplLegacy
(
[
#59
](
https://github.com/androidx/media/pull/59
)
)
*
Data sources:
*
Data sources:
*
Rename
`DummyDataSource`
to
`PlaceHolderDataSource`
.
*
Rename
`DummyDataSource`
to
`PlaceHolderDataSource`
.
*
Remove deprecated symbols:
*
Remove deprecated symbols:
...
...
libraries/session/src/main/java/androidx/media3/session/MediaController.java
View file @
85c09753
...
@@ -415,6 +415,7 @@ public class MediaController implements Player {
...
@@ -415,6 +415,7 @@ public class MediaController implements Player {
return
;
return
;
}
}
released
=
true
;
released
=
true
;
applicationHandler
.
removeCallbacksAndMessages
(
null
);
try
{
try
{
impl
.
release
();
impl
.
release
();
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
...
...
libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTest.java
View file @
85c09753
...
@@ -192,7 +192,7 @@ public class MediaControllerTest {
...
@@ -192,7 +192,7 @@ public class MediaControllerTest {
}
}
@Test
@Test
public
void
isConnected_afterDisconnection_returnsFalse
()
throws
Exception
{
public
void
isConnected_afterDisconnection
BySessionRelease
_returnsFalse
()
throws
Exception
{
CountDownLatch
disconnectedLatch
=
new
CountDownLatch
(
1
);
CountDownLatch
disconnectedLatch
=
new
CountDownLatch
(
1
);
MediaController
controller
=
MediaController
controller
=
controllerTestRule
.
createController
(
controllerTestRule
.
createController
(
...
@@ -211,6 +211,43 @@ public class MediaControllerTest {
...
@@ -211,6 +211,43 @@ public class MediaControllerTest {
}
}
@Test
@Test
public
void
isConnected_afterDisconnectionByControllerRelease_returnsFalse
()
throws
Exception
{
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
MediaController
controller
=
controllerTestRule
.
createController
(
remoteSession
.
getToken
(),
/* connectionHints= */
null
,
new
MediaController
.
Listener
()
{
@Override
public
void
onDisconnected
(
MediaController
controller
)
{
latch
.
countDown
();
}
});
threadTestRule
.
getHandler
().
postAndSync
(
controller:
:
release
);
assertThat
(
latch
.
await
(
TIMEOUT_MS
,
MILLISECONDS
)).
isTrue
();
assertThat
(
controller
.
isConnected
()).
isFalse
();
}
@Test
public
void
isConnected_afterDisconnectionByControllerReleaseRightAfterCreated_returnsFalse
()
throws
Exception
{
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
MediaController
controller
=
controllerTestRule
.
createController
(
remoteSession
.
getToken
(),
/* connectionHints= */
null
,
new
MediaController
.
Listener
()
{
@Override
public
void
onDisconnected
(
MediaController
controller
)
{
latch
.
countDown
();
}
},
/* controllerCreationListener= */
MediaController:
:
release
);
assertThat
(
latch
.
await
(
TIMEOUT_MS
,
MILLISECONDS
)).
isTrue
();
assertThat
(
controller
.
isConnected
()).
isFalse
();
}
@Test
public
void
close_twice
()
throws
Exception
{
public
void
close_twice
()
throws
Exception
{
MediaController
controller
=
controllerTestRule
.
createController
(
remoteSession
.
getToken
());
MediaController
controller
=
controllerTestRule
.
createController
(
remoteSession
.
getToken
());
threadTestRule
.
getHandler
().
postAndSync
(
controller:
:
release
);
threadTestRule
.
getHandler
().
postAndSync
(
controller:
:
release
);
...
...
libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerTestRule.java
View file @
85c09753
...
@@ -22,13 +22,16 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
...
@@ -22,13 +22,16 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import
android.content.Context
;
import
android.content.Context
;
import
android.os.Bundle
;
import
android.os.Bundle
;
import
android.support.v4.media.session.MediaSessionCompat
;
import
android.support.v4.media.session.MediaSessionCompat
;
import
androidx.annotation.MainThread
;
import
androidx.annotation.Nullable
;
import
androidx.annotation.Nullable
;
import
androidx.collection.ArrayMap
;
import
androidx.collection.ArrayMap
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.common.util.Log
;
import
androidx.media3.test.session.common.HandlerThreadTestRule
;
import
androidx.media3.test.session.common.HandlerThreadTestRule
;
import
androidx.test.core.app.ApplicationProvider
;
import
androidx.test.core.app.ApplicationProvider
;
import
com.google.common.util.concurrent.ListenableFuture
;
import
com.google.common.util.concurrent.ListenableFuture
;
import
com.google.common.util.concurrent.MoreExecutors
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.concurrent.ExecutionException
;
import
org.junit.rules.ExternalResource
;
import
org.junit.rules.ExternalResource
;
/**
/**
...
@@ -44,6 +47,13 @@ public final class MediaControllerTestRule extends ExternalResource {
...
@@ -44,6 +47,13 @@ public final class MediaControllerTestRule extends ExternalResource {
private
volatile
Class
<?
extends
MediaController
>
controllerType
;
private
volatile
Class
<?
extends
MediaController
>
controllerType
;
private
volatile
long
timeoutMs
;
private
volatile
long
timeoutMs
;
/** Listener to get notified when a controller has been created. */
public
interface
MediaControllerCreationListener
{
/** Called immediately after the given controller has been created. */
@MainThread
void
onCreated
(
MediaController
controller
);
}
public
MediaControllerTestRule
(
HandlerThreadTestRule
handlerThreadTestRule
)
{
public
MediaControllerTestRule
(
HandlerThreadTestRule
handlerThreadTestRule
)
{
this
.
handlerThreadTestRule
=
handlerThreadTestRule
;
this
.
handlerThreadTestRule
=
handlerThreadTestRule
;
controllers
=
new
ArrayMap
<>();
controllers
=
new
ArrayMap
<>();
...
@@ -96,17 +106,31 @@ public final class MediaControllerTestRule extends ExternalResource {
...
@@ -96,17 +106,31 @@ public final class MediaControllerTestRule extends ExternalResource {
public
MediaController
createController
(
public
MediaController
createController
(
MediaSessionCompat
.
Token
token
,
@Nullable
MediaController
.
Listener
listener
)
MediaSessionCompat
.
Token
token
,
@Nullable
MediaController
.
Listener
listener
)
throws
Exception
{
throws
Exception
{
return
createController
(
token
,
listener
,
/* controllerCreateListener= */
null
);
}
/** Creates {@link MediaController} from {@link MediaSessionCompat.Token}. */
public
MediaController
createController
(
MediaSessionCompat
.
Token
token
,
@Nullable
MediaController
.
Listener
listener
,
@Nullable
MediaControllerCreationListener
controllerCreationListener
)
throws
Exception
{
TestMediaBrowserListener
testListener
=
new
TestMediaBrowserListener
(
listener
);
TestMediaBrowserListener
testListener
=
new
TestMediaBrowserListener
(
listener
);
MediaController
controller
=
createControllerOnHandler
(
token
,
testListener
);
MediaController
controller
=
createControllerOnHandler
(
token
,
testListener
,
controllerCreationListener
);
controllers
.
put
(
controller
,
testListener
);
controllers
.
put
(
controller
,
testListener
);
return
controller
;
return
controller
;
}
}
private
MediaController
createControllerOnHandler
(
private
MediaController
createControllerOnHandler
(
MediaSessionCompat
.
Token
token
,
TestMediaBrowserListener
listener
)
throws
Exception
{
MediaSessionCompat
.
Token
token
,
TestMediaBrowserListener
listener
,
@Nullable
MediaControllerCreationListener
controllerCreationListener
)
throws
Exception
{
SessionToken
sessionToken
=
SessionToken
sessionToken
=
SessionToken
.
createSessionToken
(
context
,
token
).
get
(
TIMEOUT_MS
,
MILLISECONDS
);
SessionToken
.
createSessionToken
(
context
,
token
).
get
(
TIMEOUT_MS
,
MILLISECONDS
);
return
createControllerOnHandler
(
sessionToken
,
/* connectionHints= */
null
,
listener
);
return
createControllerOnHandler
(
sessionToken
,
/* connectionHints= */
null
,
listener
,
controllerCreationListener
);
}
}
/** Creates {@link MediaController} from {@link SessionToken} with default options. */
/** Creates {@link MediaController} from {@link SessionToken} with default options. */
...
@@ -120,14 +144,29 @@ public final class MediaControllerTestRule extends ExternalResource {
...
@@ -120,14 +144,29 @@ public final class MediaControllerTestRule extends ExternalResource {
@Nullable
Bundle
connectionHints
,
@Nullable
Bundle
connectionHints
,
@Nullable
MediaController
.
Listener
listener
)
@Nullable
MediaController
.
Listener
listener
)
throws
Exception
{
throws
Exception
{
return
createController
(
token
,
connectionHints
,
listener
,
/* controllerCreationListener= */
null
);
}
/** Creates {@link MediaController} from {@link SessionToken}. */
public
MediaController
createController
(
SessionToken
token
,
@Nullable
Bundle
connectionHints
,
@Nullable
MediaController
.
Listener
listener
,
@Nullable
MediaControllerCreationListener
controllerCreationListener
)
throws
Exception
{
TestMediaBrowserListener
testListener
=
new
TestMediaBrowserListener
(
listener
);
TestMediaBrowserListener
testListener
=
new
TestMediaBrowserListener
(
listener
);
MediaController
controller
=
createControllerOnHandler
(
token
,
connectionHints
,
testListener
);
MediaController
controller
=
createControllerOnHandler
(
token
,
connectionHints
,
testListener
,
controllerCreationListener
);
controllers
.
put
(
controller
,
testListener
);
controllers
.
put
(
controller
,
testListener
);
return
controller
;
return
controller
;
}
}
private
MediaController
createControllerOnHandler
(
private
MediaController
createControllerOnHandler
(
SessionToken
token
,
@Nullable
Bundle
connectionHints
,
TestMediaBrowserListener
listener
)
SessionToken
token
,
@Nullable
Bundle
connectionHints
,
TestMediaBrowserListener
listener
,
@Nullable
MediaControllerCreationListener
controllerCreationListener
)
throws
Exception
{
throws
Exception
{
// Create controller on the test handler, for changing MediaBrowserCompat's Handler
// Create controller on the test handler, for changing MediaBrowserCompat's Handler
// Looper. Otherwise, MediaBrowserCompat will post all the commands to the handler
// Looper. Otherwise, MediaBrowserCompat will post all the commands to the handler
...
@@ -153,6 +192,22 @@ public final class MediaControllerTestRule extends ExternalResource {
...
@@ -153,6 +192,22 @@ public final class MediaControllerTestRule extends ExternalResource {
return
builder
.
buildAsync
();
return
builder
.
buildAsync
();
}
}
});
});
if
(
controllerCreationListener
!=
null
)
{
future
.
addListener
(
()
->
{
@Nullable
MediaController
mediaController
=
null
;
try
{
mediaController
=
future
.
get
();
}
catch
(
ExecutionException
|
InterruptedException
e
)
{
Log
.
e
(
TAG
,
"failed getting a controller"
,
e
);
}
if
(
mediaController
!=
null
)
{
controllerCreationListener
.
onCreated
(
mediaController
);
}
},
MoreExecutors
.
directExecutor
());
}
return
future
.
get
(
timeoutMs
,
MILLISECONDS
);
return
future
.
get
(
timeoutMs
,
MILLISECONDS
);
}
}
...
...
libraries/test_session_current/src/androidTest/java/androidx/media3/session/MediaControllerWithMediaSessionCompatTest.java
View file @
85c09753
...
@@ -171,6 +171,23 @@ public class MediaControllerWithMediaSessionCompatTest {
...
@@ -171,6 +171,23 @@ public class MediaControllerWithMediaSessionCompatTest {
}
}
@Test
@Test
public
void
disconnected_byControllerReleaseRightAfterCreated
()
throws
Exception
{
CountDownLatch
latch
=
new
CountDownLatch
(
1
);
MediaController
controller
=
controllerTestRule
.
createController
(
session
.
getSessionToken
(),
new
MediaController
.
Listener
()
{
@Override
public
void
onDisconnected
(
MediaController
controller
)
{
latch
.
countDown
();
}
},
/* controllerCreationListener= */
MediaController:
:
release
);
assertThat
(
latch
.
await
(
TIMEOUT_MS
,
MILLISECONDS
)).
isTrue
();
assertThat
(
controller
.
isConnected
()).
isFalse
();
}
@Test
public
void
close_twice_doesNotCrash
()
throws
Exception
{
public
void
close_twice_doesNotCrash
()
throws
Exception
{
MediaController
controller
=
controllerTestRule
.
createController
(
session
.
getSessionToken
());
MediaController
controller
=
controllerTestRule
.
createController
(
session
.
getSessionToken
());
threadTestRule
.
getHandler
().
postAndSync
(
controller:
:
release
);
threadTestRule
.
getHandler
().
postAndSync
(
controller:
:
release
);
...
...
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