Use Flutter's supported desktop application-exit API so the second root Back press closes Plezy on Windows. Preserve fullscreen when video player navigation is enabled while keeping fullscreen-first Escape behavior for normal desktop use. close #1582
45 lines
1.5 KiB
Dart
45 lines
1.5 KiB
Dart
import 'dart:io' show Platform;
|
|
import 'dart:ui' as ui;
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import '../utils/platform_detector.dart';
|
|
|
|
typedef AppExitApplication = Future<ui.AppExitResponse> Function(ui.AppExitType exitType, int exitCode);
|
|
|
|
class AppExitService {
|
|
static const bool _tvosBuild = bool.fromEnvironment('TVOS_BUILD');
|
|
static const MethodChannel _channel = MethodChannel('com.plezy/app_exit');
|
|
|
|
/// Requests that the host platform closes or backgrounds the app.
|
|
///
|
|
/// tvOS has no public API for force-quitting or going Home, so callers that
|
|
/// handle a physical back/Menu key should let the event continue instead.
|
|
static Future<bool> requestExit({AppExitApplication? exitApplicationForTesting}) async {
|
|
if (_tvosBuild || PlatformDetector.isAppleTV()) return false;
|
|
|
|
if (Platform.isAndroid) {
|
|
try {
|
|
return await _channel.invokeMethod<bool>('requestExit') ?? true;
|
|
} on MissingPluginException {
|
|
await SystemNavigator.pop();
|
|
return true;
|
|
} on PlatformException {
|
|
await SystemNavigator.pop();
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (PlatformDetector.isDesktopOS()) {
|
|
final exitApplication =
|
|
exitApplicationForTesting ??
|
|
(exitType, exitCode) => ServicesBinding.instance.exitApplication(exitType, exitCode);
|
|
final response = await exitApplication(ui.AppExitType.required, 0);
|
|
return response == ui.AppExitResponse.exit;
|
|
}
|
|
|
|
await SystemNavigator.pop();
|
|
return true;
|
|
}
|
|
}
|