fix(player): 路由覆盖时暂停播放
This commit is contained in:
1 parent
911f13f464
commit
699fd427b8
5 files changed
+141
-2
No files matched your search
@@ -1,5 +1,7 @@
|
||||
// Author: fruit.com.cn
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
@@ -10,11 +12,14 @@ import 'package:fruitshorts/app.dart';
|
||||
import 'package:fruitshorts/core/data/models/drama.dart';
|
||||
import 'package:fruitshorts/core/data/models/interaction.dart';
|
||||
import 'package:fruitshorts/core/data/models/play_ticket.dart';
|
||||
import 'package:fruitshorts/core/data/models/player_port.dart';
|
||||
import 'package:fruitshorts/core/data/repositories/favorite_repository.dart';
|
||||
import 'package:fruitshorts/core/data/repositories/playback_repository.dart';
|
||||
import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart';
|
||||
import 'package:fruitshorts/core/data/services/playback_session.dart';
|
||||
import 'package:fruitshorts/core/theme/app_colors.dart';
|
||||
import 'package:fruitshorts/core/widgets/remote_image.dart';
|
||||
import 'package:fruitshorts/pages/auth/auth_view.dart';
|
||||
import 'package:fruitshorts/pages/player/widgets/player_center_toggle.dart';
|
||||
import 'package:fruitshorts/pages/player/widgets/seek_progress_bar.dart';
|
||||
|
||||
@@ -61,6 +66,72 @@ void main() {
|
||||
_expectPlayerNavigationBar(tester);
|
||||
});
|
||||
|
||||
testWidgets('should_pause_and_resume_player_when_page_route_covers_it', (
|
||||
tester,
|
||||
) async {
|
||||
final players = <_RecordingPlayer>[];
|
||||
await _pumpApp(
|
||||
tester,
|
||||
playerFactory: (_) {
|
||||
final player = _RecordingPlayer();
|
||||
players.add(player);
|
||||
return player;
|
||||
},
|
||||
);
|
||||
await _openSeriesPlayer(tester);
|
||||
final player = players.firstWhere((item) => item.playing);
|
||||
expect(player.playing, isTrue);
|
||||
|
||||
final navigator = tester.state<NavigatorState>(
|
||||
find.byType(Navigator).first,
|
||||
);
|
||||
unawaited(
|
||||
navigator.push<void>(
|
||||
MaterialPageRoute(
|
||||
builder: (_) => const Scaffold(key: Key('test-covering-route')),
|
||||
),
|
||||
),
|
||||
);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.byKey(const Key('test-covering-route')), findsOneWidget);
|
||||
expect(player.playing, isFalse);
|
||||
|
||||
navigator.pop();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(player.playing, isTrue);
|
||||
});
|
||||
|
||||
testWidgets('should_pause_feed_when_auth_page_is_pushed_and_resume_on_pop', (
|
||||
tester,
|
||||
) async {
|
||||
final players = <_RecordingPlayer>[];
|
||||
await _pumpApp(
|
||||
tester,
|
||||
playerFactory: (_) {
|
||||
final player = _RecordingPlayer();
|
||||
players.add(player);
|
||||
return player;
|
||||
},
|
||||
);
|
||||
final player = players.firstWhere((item) => item.playing);
|
||||
expect(player.playing, isTrue);
|
||||
|
||||
await tester.tap(find.byKey(const Key('rail-save')));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.tap(find.text('Sign In'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(find.byType(AuthPage), findsOneWidget);
|
||||
expect(player.playing, isFalse);
|
||||
|
||||
await tester.pageBack();
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(player.playing, isTrue);
|
||||
});
|
||||
|
||||
testWidgets('should_fall_back_to_black_when_poster_is_empty', (tester) async {
|
||||
await _pumpApp(
|
||||
tester,
|
||||
@@ -1071,6 +1142,7 @@ Future<void> _pumpApp(
|
||||
FakeCatalogRepository? catalog,
|
||||
FakePlaybackRepository? playback,
|
||||
FakeInteractionRepository? interactions,
|
||||
PlayerFactory? playerFactory,
|
||||
}) async {
|
||||
tester.view.physicalSize = size;
|
||||
tester.view.devicePixelRatio = 1;
|
||||
@@ -1079,7 +1151,7 @@ Future<void> _pumpApp(
|
||||
final repository = catalog ?? FakeCatalogRepository();
|
||||
await tester.pumpWidget(
|
||||
LumaDramaApp(
|
||||
playerFactory: createWidgetPlayer,
|
||||
playerFactory: playerFactory ?? createWidgetPlayer,
|
||||
catalogRepository: repository,
|
||||
categoryRepository: FakeCategoryRepository(catalog: repository),
|
||||
watchHistoryRepository: InMemoryWatchHistoryRepository(),
|
||||
@@ -1094,6 +1166,26 @@ Future<void> _pumpApp(
|
||||
await tester.pumpAndSettle();
|
||||
}
|
||||
|
||||
class _RecordingPlayer implements PlayerPort {
|
||||
bool playing = false;
|
||||
|
||||
@override
|
||||
Future<void> initialize() async {}
|
||||
|
||||
@override
|
||||
Future<void> play() async {
|
||||
playing = true;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> pause() async {
|
||||
playing = false;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> dispose() async {}
|
||||
}
|
||||
|
||||
const _lockedDrama = Drama(
|
||||
id: 'locked-demo',
|
||||
title: 'Locked Demo',
|
||||
|
||||
Reference in new issue
Block a user