diff --git a/android/app/src/main/java/com/example/piliplus/AndroidHelper.java b/android/app/src/main/java/com/example/piliplus/AndroidHelper.java index f8e7b91ec..6813a48f6 100644 --- a/android/app/src/main/java/com/example/piliplus/AndroidHelper.java +++ b/android/app/src/main/java/com/example/piliplus/AndroidHelper.java @@ -20,6 +20,10 @@ import org.jetbrains.annotations.NotNull; @Keep public final class AndroidHelper { + public static volatile boolean isPipMode = false; + + public static volatile boolean isPipAvailable = false; + private AndroidHelper() { } diff --git a/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt b/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt index d60e3ac52..2fc4a6549 100644 --- a/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/piliplus/MainActivity.kt @@ -41,6 +41,9 @@ class MainActivity : AudioServiceActivity() { window.attributes.layoutInDisplayCutoutMode = LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES } + + AndroidHelper.isPipAvailable = + packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) } override fun onDestroy() { @@ -52,8 +55,6 @@ class MainActivity : AudioServiceActivity() { isInPictureInPictureMode: Boolean, newConfig: Configuration? ) { super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) - MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, "floating").invokeMethod( - "onPipChanged", isInPictureInPictureMode - ) + AndroidHelper.isPipMode = isInPictureInPictureMode } } diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 39dc04e5c..ee5b1f9a4 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -31,6 +31,7 @@ import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; import 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart'; import 'package:PiliPlus/plugin/pl_player/view/view.dart'; import 'package:PiliPlus/services/service_locator.dart'; +import 'package:PiliPlus/utils/android/bindings.g.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; @@ -44,7 +45,6 @@ import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart'; -import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show kDebugMode, clampDouble; import 'package:flutter/material.dart' hide PageView; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -194,7 +194,7 @@ class _LiveRoomPageState extends State @override Widget build(BuildContext context) { Widget child; - if (Platform.isAndroid && Floating().isPipMode) { + if (Platform.isAndroid && AndroidHelper.isPipMode) { child = videoPlayerPanel( isFullScreen, width: maxWidth, diff --git a/lib/pages/live_room/widgets/header_control.dart b/lib/pages/live_room/widgets/header_control.dart index 8b98bf255..44d9da8c3 100644 --- a/lib/pages/live_room/widgets/header_control.dart +++ b/lib/pages/live_room/widgets/header_control.dart @@ -7,8 +7,8 @@ import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart'; import 'package:PiliPlus/services/shutdown_timer_service.dart' show shutdownTimerService; +import 'package:PiliPlus/utils/android/bindings.g.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; -import 'package:floating/floating.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; @@ -159,12 +159,12 @@ class _LiveHeaderControlState extends State ComBtn( height: 30, tooltip: '画中画', - onTap: () async { + onTap: () { if (PlatformUtils.isDesktop) { plPlayerController.toggleDesktopPip(); return; } - if (await Floating().isPipAvailable) { + if (AndroidHelper.isPipAvailable) { plPlayerController.enterPip(); } }, diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index d0cd53850..eb93dfbf9 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -55,7 +55,6 @@ import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; -import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show kDebugMode, clampDouble; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show SystemUiOverlayStyle; @@ -238,17 +237,10 @@ class _VideoDetailPageVState extends State } if (exitFlag) { - // 结束播放退出全屏 plPlayerController!.triggerFullScreen(status: false); if (plPlayerController!.controlsLock.value) { plPlayerController!.onLockControl(false); } - // 播放完展示控制栏 - if (Platform.isAndroid) { - if (await Floating().pipStatus == PiPStatus.disabled) { - plPlayerController!.onLockControl(false); - } - } } } } diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index 33821b297..afcfc6391 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -37,6 +37,7 @@ import 'package:PiliPlus/services/shutdown_timer_service.dart' show shutdownTimerService; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; +import 'package:PiliPlus/utils/android/bindings.g.dart'; import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; @@ -54,7 +55,6 @@ import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:file_picker/file_picker.dart'; -import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show compute; import 'package:flutter/material.dart' hide showBottomSheet; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -1751,12 +1751,12 @@ class HeaderControlState extends State child: IconButton( tooltip: '画中画', style: btnStyle, - onPressed: () async { + onPressed: () { if (PlatformUtils.isDesktop) { plPlayerController.toggleDesktopPip(); return; } - if (await Floating().isPipAvailable) { + if (AndroidHelper.isPipAvailable) { plPlayerController.enterPip(); } }, diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 38b597b85..490c79c27 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -24,6 +24,7 @@ import 'package:PiliPlus/plugin/pl_player/models/video_fit_type.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/android/bindings.g.dart'; import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/box_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; @@ -36,7 +37,6 @@ import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:archive/archive.dart' show getCrc32; import 'package:canvas_danmaku/canvas_danmaku.dart'; -import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show HapticFeedback, DeviceOrientation; @@ -193,7 +193,7 @@ class PlPlayerController with BlockConfigMixin { isLive ? _enableShowLiveDanmaku : _enableShowDanmaku; bool get isPipMode => - (Platform.isAndroid && Floating().isPipMode) || + (Platform.isAndroid && AndroidHelper.isPipMode) || (PlatformUtils.isDesktop && isDesktopPip); late bool isDesktopPip = false; late Rect _lastWindowBounds; diff --git a/lib/utils/android/bindings.g.dart b/lib/utils/android/bindings.g.dart index 7d4129e22..9fc550356 100644 --- a/lib/utils/android/bindings.g.dart +++ b/lib/utils/android/bindings.g.dart @@ -192,6 +192,33 @@ extension type AndroidHelper._(jni$_.JObject _$this) implements jni$_.JObject { /// The type which includes information such as the signature of this class. static const jni$_.JType type = $AndroidHelper$Type$(); + static final _id_isPipMode = _class.staticFieldId( + r'isPipMode', + r'Z', + ); + + /// from: `static public volatile boolean isPipMode` + static core$_.bool get isPipMode => + _id_isPipMode.getNullable(_class, jni$_.jboolean.type) as core$_.bool; + + /// from: `static public volatile boolean isPipMode` + static set isPipMode(core$_.bool value) => + _id_isPipMode.set(_class, jni$_.jboolean.type, value); + + static final _id_isPipAvailable = _class.staticFieldId( + r'isPipAvailable', + r'Z', + ); + + /// from: `static public volatile boolean isPipAvailable` + static core$_.bool get isPipAvailable => + _id_isPipAvailable.getNullable(_class, jni$_.jboolean.type) + as core$_.bool; + + /// from: `static public volatile boolean isPipAvailable` + static set isPipAvailable(core$_.bool value) => + _id_isPipAvailable.set(_class, jni$_.jboolean.type, value); + static final _id_back = _class.staticMethodId( r'back', r'()V', diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index 4d8f36c97..d3bc691ba 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -191,13 +191,13 @@ abstract final class PageUtils { : height > width ? const Rational.vertical() : const Rational.landscape(); - Floating().enable( + Floating.enable( isAuto ? AutoEnable(aspectRatio: aspectRatio) : EnableManual(aspectRatio: aspectRatio), ); } else { - Floating().enable(isAuto ? const AutoEnable() : const EnableManual()); + Floating.enable(isAuto ? const AutoEnable() : const EnableManual()); } } diff --git a/pubspec.lock b/pubspec.lock index 7fb30438e..9de378923 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -563,8 +563,8 @@ packages: dependency: "direct main" description: path: "." - ref: version-3 - resolved-ref: a66ec0b9dabde6b5880a3f4f3425e57842a38e51 + ref: dev + resolved-ref: fdd44a501d9717ebab04e8004fca2818a6bed236 url: "https://github.com/bggRGjQaUbCoE/floating.git" source: git version: "3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index e6c20df3a..a231deb91 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -84,7 +84,7 @@ dependencies: floating: git: url: https://github.com/bggRGjQaUbCoE/floating.git - ref: version-3 + ref: dev flutter_cache_manager: ^3.4.1 flutter_html: ^3.0.0-beta.2 flutter_inappwebview: ^6.1.5