Skip to content

Commit df1cf70

Browse files
rocketsrogermergify[bot]
authored andcommitted
Closes mozilla-mobile#9531: Return content icon if get artwork fails
1 parent 9673de1 commit df1cf70

File tree

6 files changed

+68
-17
lines changed

6 files changed

+68
-17
lines changed

components/browser/engine-gecko-beta/src/main/java/mozilla/components/browser/engine/gecko/mediasession/GeckoMediaSessionDelegate.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
package mozilla.components.browser.engine.gecko.mediasession
66

77
import android.graphics.Bitmap
8+
import kotlinx.coroutines.withTimeoutOrNull
89
import mozilla.components.browser.engine.gecko.GeckoEngineSession
910
import mozilla.components.browser.engine.gecko.await
1011
import mozilla.components.concept.engine.mediasession.MediaSession
1112
import org.mozilla.geckoview.GeckoSession
1213
import org.mozilla.geckoview.MediaSession as GeckoViewMediaSession
1314

15+
private const val ARTWORK_RETRIEVE_TIMEOUT = 1000L
16+
private const val ARTWORK_IMAGE_SIZE = 48
17+
1418
internal class GeckoMediaSessionDelegate(
1519
private val engineSession: GeckoEngineSession
1620
) : GeckoViewMediaSession.Delegate {
@@ -32,8 +36,16 @@ internal class GeckoMediaSessionDelegate(
3236
mediaSession: GeckoViewMediaSession,
3337
metaData: GeckoViewMediaSession.Metadata
3438
) {
35-
val getArtwork: (suspend (Int) -> Bitmap?)? = metaData.artwork?.let {
36-
{ size -> it.getBitmap(size).await() }
39+
val getArtwork: (suspend () -> Bitmap?)? = metaData.artwork?.let {
40+
{
41+
try {
42+
withTimeoutOrNull(ARTWORK_RETRIEVE_TIMEOUT) {
43+
it.getBitmap(ARTWORK_IMAGE_SIZE).await()
44+
}
45+
} catch (e: IllegalArgumentException) {
46+
null
47+
}
48+
}
3749
}
3850

3951
engineSession.notifyObservers {

components/browser/engine-gecko-nightly/src/main/java/mozilla/components/browser/engine/gecko/mediasession/GeckoMediaSessionDelegate.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
package mozilla.components.browser.engine.gecko.mediasession
66

77
import android.graphics.Bitmap
8+
import kotlinx.coroutines.withTimeoutOrNull
89
import mozilla.components.browser.engine.gecko.GeckoEngineSession
910
import mozilla.components.browser.engine.gecko.await
1011
import mozilla.components.concept.engine.mediasession.MediaSession
1112
import org.mozilla.geckoview.GeckoSession
1213
import org.mozilla.geckoview.MediaSession as GeckoViewMediaSession
1314

15+
private const val ARTWORK_RETRIEVE_TIMEOUT = 1000L
16+
private const val ARTWORK_IMAGE_SIZE = 48
17+
1418
internal class GeckoMediaSessionDelegate(
1519
private val engineSession: GeckoEngineSession
1620
) : GeckoViewMediaSession.Delegate {
@@ -32,8 +36,16 @@ internal class GeckoMediaSessionDelegate(
3236
mediaSession: GeckoViewMediaSession,
3337
metaData: GeckoViewMediaSession.Metadata
3438
) {
35-
val getArtwork: (suspend (Int) -> Bitmap?)? = metaData.artwork?.let {
36-
{ size -> it.getBitmap(size).await() }
39+
val getArtwork: (suspend () -> Bitmap?)? = metaData.artwork?.let {
40+
{
41+
try {
42+
withTimeoutOrNull(ARTWORK_RETRIEVE_TIMEOUT) {
43+
it.getBitmap(ARTWORK_IMAGE_SIZE).await()
44+
}
45+
} catch (e: IllegalArgumentException) {
46+
null
47+
}
48+
}
3749
}
3850

3951
engineSession.notifyObservers {

components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/mediasession/GeckoMediaSessionDelegate.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@
55
package mozilla.components.browser.engine.gecko.mediasession
66

77
import android.graphics.Bitmap
8+
import kotlinx.coroutines.withTimeoutOrNull
89
import mozilla.components.browser.engine.gecko.GeckoEngineSession
910
import mozilla.components.browser.engine.gecko.await
1011
import mozilla.components.concept.engine.mediasession.MediaSession
1112
import org.mozilla.geckoview.GeckoSession
1213
import org.mozilla.geckoview.MediaSession as GeckoViewMediaSession
1314

15+
private const val ARTWORK_RETRIEVE_TIMEOUT = 1000L
16+
private const val ARTWORK_IMAGE_SIZE = 48
17+
1418
internal class GeckoMediaSessionDelegate(
1519
private val engineSession: GeckoEngineSession
1620
) : GeckoViewMediaSession.Delegate {
@@ -32,8 +36,16 @@ internal class GeckoMediaSessionDelegate(
3236
mediaSession: GeckoViewMediaSession,
3337
metaData: GeckoViewMediaSession.Metadata
3438
) {
35-
val getArtwork: (suspend (Int) -> Bitmap?)? = metaData.artwork?.let {
36-
{ size -> it.getBitmap(size).await() }
39+
val getArtwork: (suspend () -> Bitmap?)? = metaData.artwork?.let {
40+
{
41+
try {
42+
withTimeoutOrNull(ARTWORK_RETRIEVE_TIMEOUT) {
43+
it.getBitmap(ARTWORK_IMAGE_SIZE).await()
44+
}
45+
} catch (e: IllegalArgumentException) {
46+
null
47+
}
48+
}
3749
}
3850

3951
engineSession.notifyObservers {

components/concept/engine/src/main/java/mozilla/components/concept/engine/mediasession/MediaSession.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class MediaSession {
4545
val title: String? = null,
4646
val artist: String? = null,
4747
val album: String? = null,
48-
val getArtwork: (suspend (Int) -> Bitmap?)?
48+
val getArtwork: (suspend () -> Bitmap?)?
4949
)
5050

5151
/**

components/feature/media/src/main/java/mozilla/components/feature/media/ext/SessionState.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,11 @@ package mozilla.components.feature.media.ext
66

77
import android.content.Context
88
import android.graphics.Bitmap
9-
import kotlinx.coroutines.withTimeoutOrNull
109
import mozilla.components.browser.state.state.BrowserState
1110
import mozilla.components.browser.state.state.SessionState
1211
import mozilla.components.concept.engine.mediasession.MediaSession
1312
import mozilla.components.feature.media.R
1413

15-
private const val ARTWORK_RETRIEVE_TIMEOUT = 1000L
16-
private const val ARTWORK_IMAGE_SIZE = 48
17-
1814
internal fun SessionState?.getTitleOrUrl(context: Context, title: String? = null): String = when {
1915
this == null -> context.getString(R.string.mozac_feature_media_notification_private_mode)
2016
content.private -> context.getString(R.string.mozac_feature_media_notification_private_mode)
@@ -23,13 +19,13 @@ internal fun SessionState?.getTitleOrUrl(context: Context, title: String? = null
2319
else -> content.url
2420
}
2521

26-
internal suspend fun SessionState?.getNonPrivateIcon(getArtwork: (suspend (Int) -> Bitmap?)?): Bitmap? = when {
22+
@Suppress("TooGenericExceptionCaught")
23+
internal suspend fun SessionState?.getNonPrivateIcon(
24+
getArtwork: (suspend () -> Bitmap?)?
25+
): Bitmap? = when {
2726
this == null -> null
2827
content.private -> null
29-
getArtwork != null ->
30-
withTimeoutOrNull(ARTWORK_RETRIEVE_TIMEOUT) {
31-
getArtwork(ARTWORK_IMAGE_SIZE)
32-
}
28+
getArtwork != null -> getArtwork() ?: content.icon
3329
else -> content.icon
3430
}
3531

components/feature/media/src/test/java/mozilla/components/feature/media/ext/SessionStateKtTest.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import org.junit.runner.RunWith
1515
@RunWith(AndroidJUnit4::class)
1616
class SessionStateKtTest {
1717
private val bitmap: Bitmap = mock()
18-
private val getArtwork: (suspend (Int) -> Bitmap?) = { bitmap }
18+
private val getArtwork: (suspend () -> Bitmap?) = { bitmap }
19+
private val getArtworkNull: (suspend () -> Bitmap?) = { null }
1920

2021
@Test
2122
fun `getNonPrivateIcon returns null when in private mode`() {
@@ -67,6 +68,24 @@ class SessionStateKtTest {
6768
assertEquals(result, icon)
6869
}
6970

71+
@Test
72+
fun `getNonPrivateIcon returns content icon when getArtwork return null`() {
73+
val sessionState: SessionState = mock()
74+
val contentState: ContentState = mock()
75+
val icon: Bitmap = mock()
76+
77+
whenever(sessionState.content).thenReturn(contentState)
78+
whenever(contentState.private).thenReturn(false)
79+
whenever(contentState.icon).thenReturn(icon)
80+
81+
var result: Bitmap?
82+
runBlocking {
83+
result = sessionState.getNonPrivateIcon(getArtworkNull)
84+
}
85+
86+
assertEquals(result, icon)
87+
}
88+
7089
@Test
7190
fun `getTitleOrUrl returns null when in private mode`() {
7291
val sessionState: SessionState = mock()

0 commit comments

Comments
 (0)