fix(player): 隔离播放资源所有权并修复黑屏
This commit is contained in:
1 parent
54eb5a60a8
commit
bb2c729a7e
9 files changed
+223
-25
No files matched your search
@@ -32,6 +32,68 @@ void main() {
|
||||
await session.close();
|
||||
});
|
||||
|
||||
test('should_not_retire_home_controller_when_player_switches_episodes', () async {
|
||||
final factory = FakeFactory();
|
||||
final home = PlaybackSession(
|
||||
episodes: episodes,
|
||||
factory: factory.create,
|
||||
canPlay: (episode) => episode.isFree,
|
||||
owner: PlaybackSessionOwner.home,
|
||||
);
|
||||
await home.select(0, preloadIndex: 1);
|
||||
await home.preloadSettled;
|
||||
final homePlayer = home.active;
|
||||
expect(homePlayer, isNotNull);
|
||||
|
||||
final player = PlaybackSession(
|
||||
episodes: episodes,
|
||||
factory: factory.create,
|
||||
canPlay: (episode) => episode.isFree,
|
||||
owner: PlaybackSessionOwner.player,
|
||||
);
|
||||
await player.select(0, preloadIndex: 1);
|
||||
await player.select(1, previousIndex: 0);
|
||||
await player.preloadSettled;
|
||||
|
||||
expect(home.active, same(homePlayer));
|
||||
expect(
|
||||
factory.created
|
||||
.firstWhere((candidate) => identical(candidate, homePlayer))
|
||||
.disposed,
|
||||
isFalse,
|
||||
);
|
||||
expect(player.active, isNot(same(homePlayer)));
|
||||
await player.close();
|
||||
await home.close();
|
||||
});
|
||||
|
||||
test('should_keep_home_controller_alive_when_player_session_closes', () async {
|
||||
final factory = FakeFactory();
|
||||
final home = PlaybackSession(
|
||||
episodes: episodes,
|
||||
factory: factory.create,
|
||||
canPlay: (episode) => episode.isFree,
|
||||
owner: PlaybackSessionOwner.home,
|
||||
);
|
||||
await home.select(0);
|
||||
final homePlayer = home.active! as FakePlayer;
|
||||
|
||||
final player = PlaybackSession(
|
||||
episodes: episodes,
|
||||
factory: factory.create,
|
||||
canPlay: (episode) => episode.isFree,
|
||||
owner: PlaybackSessionOwner.player,
|
||||
);
|
||||
await player.select(0);
|
||||
await player.select(1);
|
||||
await player.close();
|
||||
|
||||
expect(homePlayer.disposed, isFalse);
|
||||
expect(home.active, same(homePlayer));
|
||||
expect(home.currentIndex, 0);
|
||||
await home.close();
|
||||
});
|
||||
|
||||
test('should_release_previous_player_immediately_when_selecting_locked', () async {
|
||||
final lockedEpisodes = [
|
||||
Episode(
|
||||
|
||||
@@ -131,7 +131,7 @@ void main() {
|
||||
await tester.tap(find.byKey(const Key('home-feed-full-series')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final fullPlayer = find.byType(PlayerPage);
|
||||
final fullPlayer = _fullPlayerFinder();
|
||||
final fullLogic = _pageLogic(tester, fullPlayer);
|
||||
expect(fullLogic.session, isNot(same(sourceLogic.session)));
|
||||
final fullPlayerPort = fullLogic.session.active! as VideoPlayerPort;
|
||||
@@ -223,11 +223,17 @@ void main() {
|
||||
await tester.tap(find.byKey(const Key('home-feed-full-series')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.byType(PlayerPage), findsOneWidget);
|
||||
expect(_fullPlayerFinder(), findsOneWidget);
|
||||
expect(find.byKey(const Key('player-play-toggle')), findsOneWidget);
|
||||
expect(find.byKey(const Key('home-feed-center-play')), findsNothing);
|
||||
expect(find.byKey(const Key('home-tabs-bar')), findsNothing);
|
||||
expect(find.byKey(const Key('recommend-top-nav')), findsNothing);
|
||||
expect(
|
||||
find.byKey(const Key('home-feed-center-play')).hitTestable(),
|
||||
findsNothing,
|
||||
);
|
||||
expect(find.byKey(const Key('home-tabs-bar')).hitTestable(), findsNothing);
|
||||
expect(
|
||||
find.byKey(const Key('recommend-top-nav')).hitTestable(),
|
||||
findsNothing,
|
||||
);
|
||||
|
||||
await tester.tap(find.byKey(const Key('player-back')));
|
||||
await tester.pumpAndSettle();
|
||||
@@ -259,7 +265,7 @@ void main() {
|
||||
await tester.tap(find.byKey(const Key('home-feed-full-series')));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final fullLogic = _pageLogic(tester, find.byType(PlayerPage));
|
||||
final fullLogic = _pageLogic(tester, _fullPlayerFinder());
|
||||
await tester.drag(
|
||||
find.byKey(const Key('player-video-tap')),
|
||||
const Offset(0, -560),
|
||||
@@ -1646,6 +1652,12 @@ PlayerLogic _pageLogic(WidgetTester tester, Finder page) {
|
||||
return state.logic as PlayerLogic;
|
||||
}
|
||||
|
||||
Finder _fullPlayerFinder() {
|
||||
return find.byWidgetPredicate(
|
||||
(widget) => widget is PlayerPage && widget.handoff != null,
|
||||
);
|
||||
}
|
||||
|
||||
class _RouteVideoFactory {
|
||||
final List<_RouteVideoPlayer> created = [];
|
||||
final List<Episode> episodes = [];
|
||||
|
||||
@@ -471,13 +471,13 @@ void main() {
|
||||
|
||||
await tester.tap(find.byKey(const Key('home-feed-series-name')));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(PlayerPage), findsOneWidget);
|
||||
expect(find.byType(PlayerPage).last, findsOneWidget);
|
||||
expect(
|
||||
tester.widget<PlayerPage>(find.byType(PlayerPage)).homeMode,
|
||||
tester.widget<PlayerPage>(find.byType(PlayerPage).last).homeMode,
|
||||
isFalse,
|
||||
);
|
||||
expect(find.byKey(const Key('player-back')), findsOneWidget);
|
||||
expect(find.byKey(const Key('home-tabs-bar')), findsNothing);
|
||||
expect(find.byKey(const Key('home-tabs-bar')).hitTestable(), findsNothing);
|
||||
await tester.tap(find.byKey(const Key('player-back')));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byKey(const Key('recommend-page')), findsOneWidget);
|
||||
@@ -485,13 +485,13 @@ void main() {
|
||||
|
||||
await tester.tap(find.byKey(const Key('home-feed-full-series')));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.byType(PlayerPage), findsOneWidget);
|
||||
expect(find.byType(PlayerPage).last, findsOneWidget);
|
||||
expect(
|
||||
tester.widget<PlayerPage>(find.byType(PlayerPage)).homeMode,
|
||||
tester.widget<PlayerPage>(find.byType(PlayerPage).last).homeMode,
|
||||
isFalse,
|
||||
);
|
||||
expect(find.byKey(const Key('player-back')), findsOneWidget);
|
||||
expect(find.byKey(const Key('home-tabs-bar')), findsNothing);
|
||||
expect(find.byKey(const Key('home-tabs-bar')).hitTestable(), findsNothing);
|
||||
await tester.tap(find.byKey(const Key('player-back')));
|
||||
await tester.pumpAndSettle();
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user