opt in-app fullscreen

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-09-26 10:26:27 +08:00
parent d961b6d7a9
commit 86a79a9733
10 changed files with 25 additions and 31 deletions

View File

@@ -161,7 +161,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
if (isFullScreen && Platform.isIOS) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!_liveRoomController.isPortrait.value) {
landScape();
landscape();
}
});
}

View File

@@ -7,6 +7,7 @@ import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/pages/login/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -76,8 +77,8 @@ class _LoginPageState extends State<LoginPage> {
),
if (isMobile)
TextButton.icon(
onPressed: () => launchUrl(
Uri.parse(_loginPageCtr.codeInfo.value.data.url),
onPressed: () => PageUtils.launchURL(
_loginPageCtr.codeInfo.value.data.url,
mode: LaunchMode.externalNonBrowserApplication,
),
icon: const Icon(Icons.open_in_browser_outlined),

View File

@@ -309,13 +309,4 @@ List<SettingsModel> get playSettings => [
setKey: SettingBoxKey.tempPlayerConf,
defaultVal: false,
),
if (Utils.isDesktop)
const SettingsModel(
settingsType: SettingsType.sw1tch,
title: '独占全屏',
subtitle: '关闭为应用内全屏',
leading: Icon(Icons.zoom_out_map_rounded),
setKey: SettingBoxKey.nativeFullscreen,
defaultVal: true,
),
];

View File

@@ -189,7 +189,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
(mode == FullScreenMode.auto && isVertical) ||
(mode == FullScreenMode.ratio &&
(isVertical || maxHeight / maxWidth < 1.25)))) {
landScape();
landscape();
}
});
}

View File

@@ -153,7 +153,10 @@ class PlayerFocus extends StatelessWidget {
return true;
case LogicalKeyboardKey.keyF:
plPlayerController.triggerFullScreen(status: !isFullScreen);
plPlayerController.triggerFullScreen(
status: !isFullScreen,
inAppFullScreen: HardwareKeyboard.instance.isShiftPressed,
);
return true;
case LogicalKeyboardKey.escape:

View File

@@ -1463,7 +1463,10 @@ class PlPlayerController {
// 全屏
bool fsProcessing = false;
Future<void> triggerFullScreen({bool status = true}) async {
Future<void> triggerFullScreen({
bool status = true,
bool inAppFullScreen = false,
}) async {
if (fsProcessing) {
return;
}
@@ -1493,10 +1496,10 @@ class PlPlayerController {
(isVertical || size.height / size.width < 1.25)))) {
await verticalScreenForTwoSeconds();
} else {
await landScape();
await landscape(inAppFullScreen: inAppFullScreen);
}
} else if (isFullScreen.value && !status) {
showStatusBar();
showStatusBar(inAppFullScreen: inAppFullScreen);
toggleFullScreen(false);
if (mode == FullScreenMode.none) {
fsProcessing = false;

View File

@@ -8,14 +8,14 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
//横屏
Future<void> landScape() async {
Future<void> landscape({bool inAppFullScreen = false}) async {
dynamic document;
try {
if (kIsWeb) {
await document.documentElement?.requestFullscreen();
} else if (Utils.isMobile) {
await AutoOrientation.landscapeAutoMode(forceSensor: true);
} else if (Utils.isDesktop && Pref.nativeFullscreen) {
} else if (Utils.isDesktop && !inAppFullScreen) {
await const MethodChannel(
'com.alexmercerind/media_kit_video',
).invokeMethod(
@@ -76,7 +76,7 @@ Future<void> hideStatusBar() async {
bool _showStatusBar = true;
//退出全屏显示
Future<void> showStatusBar() async {
Future<void> showStatusBar({bool inAppFullScreen = false}) async {
if (_showStatusBar) {
return;
}
@@ -94,7 +94,7 @@ Future<void> showStatusBar() async {
mode,
overlays: SystemUiOverlay.values,
);
} else if (Utils.isDesktop && Pref.nativeFullscreen) {
} else if (Utils.isDesktop && !inAppFullScreen) {
await const MethodChannel(
'com.alexmercerind/media_kit_video',
).invokeMethod(

View File

@@ -631,13 +631,13 @@ abstract class PageUtils {
}
}
static Future<void> launchURL(String url) async {
static Future<void> launchURL(
String url, {
LaunchMode mode = LaunchMode.externalApplication,
}) async {
try {
final Uri uri = Uri.parse(url);
if (!await launchUrl(
uri,
mode: LaunchMode.externalApplication,
)) {
if (!await launchUrl(uri, mode: mode)) {
SmartDialog.showToast('Could not launch $url');
}
} catch (e) {

View File

@@ -213,8 +213,7 @@ abstract class SettingBoxKey {
enableGradientBg = 'enableGradientBg',
navBarSort = 'navBarSort',
tempPlayerConf = 'tempPlayerConf',
reduceLuxColor = 'reduceLuxColor',
nativeFullscreen = 'nativeFullscreen';
reduceLuxColor = 'reduceLuxColor';
}
abstract class LocalCacheKey {

View File

@@ -832,7 +832,4 @@ abstract class Pref {
static bool get keyboardControl =>
_setting.get(SettingBoxKey.keyboardControl, defaultValue: true);
static bool get nativeFullscreen =>
_setting.get(SettingBoxKey.nativeFullscreen, defaultValue: true);
}