diff --git a/android/app/src/main/kotlin/com/orz12/PiliPalaX/MainActivity.kt b/android/app/src/main/kotlin/com/example/PiliPalaX/MainActivity.kt similarity index 91% rename from android/app/src/main/kotlin/com/orz12/PiliPalaX/MainActivity.kt rename to android/app/src/main/kotlin/com/example/PiliPalaX/MainActivity.kt index 1c1de5398..16232a283 100644 --- a/android/app/src/main/kotlin/com/orz12/PiliPalaX/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/PiliPalaX/MainActivity.kt @@ -16,7 +16,8 @@ class MainActivity : AudioServiceActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - methodChannel = MethodChannel(flutterEngine!!.getDartExecutor()!!.getBinaryMessenger(), CHANNEL) + + methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "pilipalax") methodChannel.setMethodCallHandler { call, result -> if (call.method == "back") { back() @@ -53,10 +54,6 @@ class MainActivity : AudioServiceActivity() { methodChannel.invokeMethod("onUserLeaveHint", null) } - companion object { - private const val CHANNEL = "onUserLeaveHint" - } - override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration?) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) MethodChannel( diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 6fb1e25d8..9c4790af0 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -108,7 +108,7 @@ class _LiveRoomPageState extends State ScreenBrightness().resetApplicationScreenBrightness(); PlPlayerController.setPlayCallBack(null); _liveRoomController.msgStream?.close(); - floating?.dispose(); + // floating?.dispose(); _node.dispose(); plPlayerController.dispose(); _ctr.dispose(); @@ -442,8 +442,8 @@ class _LiveRoomPageState extends State }); if (Platform.isAndroid) { return PiPSwitcher( - childWhenDisabled: childWhenDisabled, - childWhenEnabled: videoPlayerPanel, + getChildWhenDisabled: () => childWhenDisabled, + getChildWhenEnabled: () => videoPlayerPanel, floating: floating, ); } else { diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index d2d37fe5c..9febac233 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:PiliPalaX/grpc/grpc_client.dart'; +import 'package:PiliPalaX/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; @@ -155,7 +156,7 @@ class _MainAppState extends State _mainController.bottomBarStream.add(true); } else { if (Platform.isAndroid) { - const MethodChannel("onUserLeaveHint").invokeMethod('back'); + Utils.channel.invokeMethod('back'); } else { SystemNavigator.pop(); } diff --git a/lib/pages/video/detail/view.dart b/lib/pages/video/detail/view.dart index 96114e8a9..fbcbc5116 100644 --- a/lib/pages/video/detail/view.dart +++ b/lib/pages/video/detail/view.dart @@ -70,7 +70,6 @@ class _VideoDetailPageState extends State late final _introController = ScrollController(); late String heroTag; - PlayerStatus playerStatus = PlayerStatus.playing; double doubleOffset = 0; late Future _futureBuilderFuture; @@ -83,11 +82,10 @@ class _VideoDetailPageState extends State late bool pipNoDanmaku; late bool removeSafeArea; // late bool showStatusBarBackgroundColor; - final Floating floating = Floating(); + // final Floating floating = Floating(); // 生命周期监听 // late final AppLifecycleListener _lifecycleListener; bool isShowing = true; - late final MethodChannel onUserLeaveHintListener; // StreamSubscription? _bufferedListener; bool get isFullScreen => plPlayerController?.isFullScreen.value ?? false; @@ -166,13 +164,12 @@ class _VideoDetailPageState extends State appbarStreamListen(); // lifecycleListener(); autoScreen(); - onUserLeaveHintListener = const MethodChannel("onUserLeaveHint"); - onUserLeaveHintListener.setMethodCallHandler((call) async { + Utils.channel.setMethodCallHandler((call) async { if (call.method == 'onUserLeaveHint') { if (autoPiP && - plPlayerController != null && - playerStatus == PlayerStatus.playing) { - autoEnterPip(); + plPlayerController?.playerStatus.status.value == + PlayerStatus.playing) { + enterPip(); } } }); @@ -234,7 +231,6 @@ class _VideoDetailPageState extends State // 播放器状态监听 void playerListener(PlayerStatus? status) async { - playerStatus = status!; if (status == PlayerStatus.completed) { shutdownTimerService.handleWaitingFinished(); bool notExitFlag = false; @@ -345,8 +341,8 @@ class _VideoDetailPageState extends State videoDetailController.positionSubscription?.cancel(); videoIntroController.canelTimer(); appbarStream.close(); - floating.dispose(); - videoDetailController.floating?.dispose(); + // floating.dispose(); + // videoDetailController.floating?.dispose(); videoIntroController.videoDetail.close(); videoDetailController.cid.close(); if (!horizontalScreen) { @@ -487,11 +483,9 @@ class _VideoDetailPageState extends State // } // } - void autoEnterPip() { - final String routePath = Get.currentRoute; - - if (autoPiP && routePath.startsWith('/video')) { - floating.enable( + void enterPip() { + if (Get.currentRoute.startsWith('/video')) { + videoDetailController.floating?.enable( EnableManual( aspectRatio: Rational( videoDetailController.data.dash!.video!.first.width!, @@ -1117,9 +1111,9 @@ class _VideoDetailPageState extends State Widget autoChoose(Widget childWhenDisabled) { if (Platform.isAndroid) { return PiPSwitcher( - childWhenDisabled: childWhenDisabled, - childWhenEnabled: childWhenEnabled, - floating: floating, + getChildWhenDisabled: () => childWhenDisabled, + getChildWhenEnabled: () => childWhenEnabled, + floating: videoDetailController.floating, ); } return childWhenDisabled; diff --git a/lib/pages/video/detail/widgets/header_control.dart b/lib/pages/video/detail/widgets/header_control.dart index 1b1036972..bd2a11511 100644 --- a/lib/pages/video/detail/widgets/header_control.dart +++ b/lib/pages/video/detail/widgets/header_control.dart @@ -99,7 +99,7 @@ class _HeaderControlState extends State { @override void dispose() { - widget.floating?.dispose(); + // widget.floating?.dispose(); // fullScreenStatusListener.cancel(); clock?.cancel(); super.dispose(); diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 71fdb1e68..c60fe5d7d 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:PiliPalaX/common/widgets/segment_progress_bar.dart'; import 'package:PiliPalaX/utils/extension.dart'; +import 'package:PiliPalaX/utils/utils.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; @@ -1291,6 +1292,7 @@ class PlPlayerController { return; } _playerCount.value = 0; + Utils.channel.setMethodCallHandler(null); pause(); try { _timer?.cancel(); diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index eed1504b5..c18c058cc 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -33,6 +33,8 @@ import 'package:html/parser.dart' as html_parser; class Utils { static final Random random = Random(); + static const channel = MethodChannel("pilipalax"); + static Future getWwebid(mid) async { try { dynamic response = diff --git a/pubspec.lock b/pubspec.lock index 3576c897b..fa926e10d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -582,7 +582,7 @@ packages: description: path: "." ref: version-3 - resolved-ref: b9a19d54defde1819bdfe8f26b950928b0e8a592 + resolved-ref: "202a46c31bc2c101b254f559115e47661cdb2479" url: "https://github.com/bggRGjQaUbCoE/floating.git" source: git version: "3.0.0"