Skip to content

Commit d01c75a

Browse files
[MBL-19756][Student] Fix NullPointerException when displaying conference recordings with null length
refs: MBL-19756 affects: Student release note: Fixed crash when viewing conference recordings
1 parent 3a701eb commit d01c75a

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

apps/student/src/main/java/com/instructure/student/mobius/conferences/conference_details/ConferenceDetailsUpdate.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ class ConferenceDetailsUpdate : UpdateInit<ConferenceDetailsModel, ConferenceDet
5858
}
5959
is ConferenceDetailsEvent.RecordingClicked -> {
6060
val recording = model.conference.recordings.first { it.recordingId == event.recordingId }
61-
val url = recording.playbackUrl ?: recording.playbackFormats.firstOrNull()?.url.orEmpty()
61+
val url = recording.playbackUrl
62+
?: recording.playbackFormats.find { it.type == "presentation" }?.url
63+
?: recording.playbackFormats.firstOrNull()?.url.orEmpty()
6264
val newModel = model.copy(
6365
launchingRecordings = model.launchingRecordings.plus(recording.recordingId to true)
6466
)

apps/student/src/test/java/com/instructure/student/test/conferences/conference_details/ConferenceDetailsUpdateTest.kt

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@
1717
package com.instructure.student.test.conferences.conference_details
1818

1919
import androidx.test.ext.junit.runners.AndroidJUnit4
20-
import com.instructure.canvasapi2.models.*
20+
import com.instructure.canvasapi2.models.CanvasContext
21+
import com.instructure.canvasapi2.models.Conference
22+
import com.instructure.canvasapi2.models.ConferenceRecording
23+
import com.instructure.canvasapi2.models.Course
24+
import com.instructure.canvasapi2.models.PlaybackFormat
2125
import com.instructure.canvasapi2.utils.ApiPrefs
2226
import com.instructure.canvasapi2.utils.DataResult
2327
import com.instructure.student.mobius.conferences.conference_details.ConferenceDetailsEffect
@@ -33,7 +37,6 @@ import com.spotify.mobius.test.UpdateSpec
3337
import com.spotify.mobius.test.UpdateSpec.assertThatNext
3438
import io.mockk.every
3539
import io.mockk.mockkObject
36-
import io.mockk.mockkStatic
3740
import io.mockk.unmockkAll
3841
import org.junit.After
3942
import org.junit.Before
@@ -225,6 +228,46 @@ class ConferenceDetailsUpdateTest {
225228
)
226229
}
227230

231+
@Test
232+
fun `RecordingClicked prioritizes presentation type over notes when playbackUrl is null`() {
233+
val conferenceWithMultipleFormats = baseConference.copy(
234+
recordings = listOf(
235+
ConferenceRecording(
236+
recordingId = "recording_3",
237+
playbackUrl = null,
238+
playbackFormats = listOf(
239+
PlaybackFormat(
240+
length = null,
241+
type = "notes",
242+
url = "https://some.fake.url/recording_3/notes"
243+
),
244+
PlaybackFormat(
245+
length = "1",
246+
type = "presentation",
247+
url = "https://some.fake.url/recording_3/presentation"
248+
)
249+
)
250+
)
251+
)
252+
)
253+
val inputModel = initModel.copy(conference = conferenceWithMultipleFormats)
254+
val expectedModel = inputModel.copy(launchingRecordings = mapOf("recording_3" to true))
255+
updateSpec
256+
.given(inputModel)
257+
.whenEvent(ConferenceDetailsEvent.RecordingClicked(recordingId = "recording_3"))
258+
.then(
259+
assertThatNext(
260+
NextMatchers.hasModel(expectedModel),
261+
matchesEffects(
262+
ConferenceDetailsEffect.ShowRecording(
263+
"recording_3",
264+
"https://some.fake.url/recording_3/presentation"
265+
)
266+
)
267+
)
268+
)
269+
}
270+
228271
@Test
229272
fun `ShowRecordingFinished event updates the model`() {
230273
val recording = baseConference.recordings[0]

libs/canvas-api-2/src/main/java/com/instructure/canvasapi2/models/Conference.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ data class ConferenceRecording(
8383

8484
@Parcelize
8585
data class PlaybackFormat(
86-
val length: String,
86+
val length: String?,
8787
val type: String,
8888
val url: String
8989
) : Parcelable

0 commit comments

Comments
 (0)