Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/video_player/video_player_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 2.7.10

* Fixes a [bug](https://github.com/flutter/flutter/issues/156158) where
disposing a video player (including implicitly by switching tabs or views
in a running app) would cause native stack traces.

## 2.7.9

* Updates Java compatibility version to 11.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import androidx.media3.common.MediaItem;
import androidx.media3.common.PlaybackParameters;
import androidx.media3.exoplayer.ExoPlayer;

import io.flutter.Log;
import io.flutter.view.TextureRegistry;

final class VideoPlayer implements TextureRegistry.SurfaceProducer.Callback {
Expand Down Expand Up @@ -160,7 +162,7 @@ long getPosition() {
}

void dispose() {
surfaceProducer.release();
exoPlayer.release();
surfaceProducer.release();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
package io.flutter.plugins.videoplayer;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

Expand All @@ -22,11 +23,16 @@
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
* Unit tests for {@link VideoPlayer}.
*
Expand Down Expand Up @@ -264,12 +270,16 @@ public void onSurfaceCreatedWithoutDestroyDoesNotRecreate() {
}

@Test
public void disposeReleasesTextureAndPlayer() {
public void disposeReleasesExoPlayerBeforeTexture() {
VideoPlayer videoPlayer = createVideoPlayer();

videoPlayer.dispose();

verify(mockProducer).release();
verify(mockExoPlayer).release();
// Regression test for https://github.com/flutter/flutter/issues/156158.
// The player must be destroyed before the surface it is writing to.
InOrder inOrder = inOrder(mockExoPlayer, mockProducer);
inOrder.verify(mockExoPlayer).release();
inOrder.verify(mockProducer).release();
}

// TODO(matanlurey): Replace with inline calls to onSurfaceAvailable once
Expand Down
2 changes: 1 addition & 1 deletion packages/video_player/video_player_android/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: video_player_android
description: Android implementation of the video_player plugin.
repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22
version: 2.7.9
version: 2.7.10

environment:
sdk: ^3.5.0
Expand Down