mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-08-04 17:50:13 +08:00
@@ -19,8 +19,11 @@ import android.os.Build;
|
|||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
import androidx.annotation.Keep;
|
import androidx.annotation.Keep;
|
||||||
|
|
||||||
import com.github.dart_lang.jni_flutter.JniFlutterPlugin;
|
import com.github.dart_lang.jni_flutter.JniFlutterPlugin;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -29,6 +32,10 @@ import java.util.ArrayList;
|
|||||||
public final class AndroidHelper {
|
public final class AndroidHelper {
|
||||||
public static volatile boolean isFoldable = false;
|
public static volatile boolean isFoldable = false;
|
||||||
|
|
||||||
|
public static volatile boolean isPipMode = false;
|
||||||
|
|
||||||
|
public static volatile boolean isPipAvailable = false;
|
||||||
|
|
||||||
private AndroidHelper() {
|
private AndroidHelper() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,6 +43,10 @@ public final class AndroidHelper {
|
|||||||
return JniFlutterPlugin.getApplicationContext();
|
return JniFlutterPlugin.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int sdkInt() {
|
||||||
|
return Build.VERSION.SDK_INT;
|
||||||
|
}
|
||||||
|
|
||||||
public static void back() {
|
public static void back() {
|
||||||
Intent intent = new Intent(Intent.ACTION_MAIN);
|
Intent intent = new Intent(Intent.ACTION_MAIN);
|
||||||
intent.addCategory(Intent.CATEGORY_HOME);
|
intent.addCategory(Intent.CATEGORY_HOME);
|
||||||
|
|||||||
@@ -48,12 +48,17 @@ class MainActivity : AudioServiceActivity() {
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
window.attributes.layoutInDisplayCutoutMode = LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
|
window.attributes.layoutInDisplayCutoutMode =
|
||||||
|
LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AndroidHelper.isPipAvailable =
|
||||||
|
packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
try {
|
try {
|
||||||
AndroidHelper.isFoldable = packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE)
|
AndroidHelper.isFoldable =
|
||||||
|
packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE)
|
||||||
} catch (_: Exception) {
|
} catch (_: Exception) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,8 +78,6 @@ class MainActivity : AudioServiceActivity() {
|
|||||||
isInPictureInPictureMode: Boolean, newConfig: Configuration?
|
isInPictureInPictureMode: Boolean, newConfig: Configuration?
|
||||||
) {
|
) {
|
||||||
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
|
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
|
||||||
MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, "floating").invokeMethod(
|
AndroidHelper.isPipMode = isInPictureInPictureMode
|
||||||
"onPipChanged", isInPictureInPictureMode
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
jnigen.yaml
11
jnigen.yaml
@@ -1,11 +0,0 @@
|
|||||||
output:
|
|
||||||
dart:
|
|
||||||
path: lib/utils/android/bindings.g.dart
|
|
||||||
structure: single_file
|
|
||||||
|
|
||||||
class_path:
|
|
||||||
- android/app/src/main/java
|
|
||||||
|
|
||||||
classes:
|
|
||||||
- 'com.example.piliplus.AndroidHelper'
|
|
||||||
- 'java.lang.Runnable'
|
|
||||||
@@ -18,7 +18,6 @@ import 'package:PiliPlus/services/service_locator.dart';
|
|||||||
import 'package:PiliPlus/utils/cache_manager.dart';
|
import 'package:PiliPlus/utils/cache_manager.dart';
|
||||||
import 'package:PiliPlus/utils/calc_window_position.dart';
|
import 'package:PiliPlus/utils/calc_window_position.dart';
|
||||||
import 'package:PiliPlus/utils/date_utils.dart';
|
import 'package:PiliPlus/utils/date_utils.dart';
|
||||||
import 'package:PiliPlus/utils/device_utils.dart';
|
|
||||||
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
||||||
import 'package:PiliPlus/utils/json_file_handler.dart';
|
import 'package:PiliPlus/utils/json_file_handler.dart';
|
||||||
import 'package:PiliPlus/utils/max_screen_size.dart';
|
import 'package:PiliPlus/utils/max_screen_size.dart';
|
||||||
@@ -32,7 +31,6 @@ import 'package:PiliPlus/utils/theme_utils.dart';
|
|||||||
import 'package:PiliPlus/utils/utils.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:catcher_2/catcher_2.dart';
|
import 'package:catcher_2/catcher_2.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
|
||||||
import 'package:dynamic_color/dynamic_color.dart';
|
import 'package:dynamic_color/dynamic_color.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -90,10 +88,6 @@ Future<void> _initAppPath() async {
|
|||||||
appSupportDirPath = (await getApplicationSupportDirectory()).path;
|
appSupportDirPath = (await getApplicationSupportDirectory()).path;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _initSdkInt() async {
|
|
||||||
DeviceUtils.sdkInt = (await DeviceInfoPlugin().androidInfo).version.sdkInt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
ScaledWidgetsFlutterBinding.ensureInitialized();
|
ScaledWidgetsFlutterBinding.ensureInitialized();
|
||||||
MediaKit.ensureInitialized();
|
MediaKit.ensureInitialized();
|
||||||
@@ -117,7 +111,6 @@ void main() async {
|
|||||||
if (PlatformUtils.isMobile) {
|
if (PlatformUtils.isMobile) {
|
||||||
if (Platform.isAndroid) MaxScreenSize.init();
|
if (Platform.isAndroid) MaxScreenSize.init();
|
||||||
await Future.wait([
|
await Future.wait([
|
||||||
if (Platform.isAndroid) _initSdkInt(),
|
|
||||||
if (Pref.horizontalScreen) ?fullMode() else ?portraitUpMode(),
|
if (Pref.horizontalScreen) ?fullMode() else ?portraitUpMode(),
|
||||||
setupServiceLocator(),
|
setupServiceLocator(),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart';
|
|||||||
import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';
|
import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';
|
||||||
import 'package:PiliPlus/plugin/pl_player/view/view.dart';
|
import 'package:PiliPlus/plugin/pl_player/view/view.dart';
|
||||||
import 'package:PiliPlus/services/service_locator.dart';
|
import 'package:PiliPlus/services/service_locator.dart';
|
||||||
|
import 'package:PiliPlus/utils/android/bindings.g.dart';
|
||||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||||
import 'package:PiliPlus/utils/extension/size_ext.dart';
|
import 'package:PiliPlus/utils/extension/size_ext.dart';
|
||||||
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
||||||
@@ -49,8 +50,7 @@ import 'package:PiliPlus/utils/storage_key.dart';
|
|||||||
import 'package:PiliPlus/utils/storage_pref.dart';
|
import 'package:PiliPlus/utils/storage_pref.dart';
|
||||||
import 'package:PiliPlus/utils/utils.dart';
|
import 'package:PiliPlus/utils/utils.dart';
|
||||||
import 'package:cached_network_image/cached_network_image.dart';
|
import 'package:cached_network_image/cached_network_image.dart';
|
||||||
import 'package:canvas_danmaku/canvas_danmaku.dart';
|
import 'package:canvas_danmaku/danmaku_screen.dart';
|
||||||
import 'package:floating/floating.dart';
|
|
||||||
import 'package:flutter/foundation.dart' show kDebugMode;
|
import 'package:flutter/foundation.dart' show kDebugMode;
|
||||||
import 'package:flutter/material.dart' hide PageView;
|
import 'package:flutter/material.dart' hide PageView;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
@@ -214,7 +214,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Widget child;
|
Widget child;
|
||||||
if (Platform.isAndroid && Floating().isPipMode) {
|
if (Platform.isAndroid && AndroidHelper.isPipMode) {
|
||||||
child = videoPlayerPanel(
|
child = videoPlayerPanel(
|
||||||
isFullScreen,
|
isFullScreen,
|
||||||
width: maxWidth,
|
width: maxWidth,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import 'package:PiliPlus/plugin/pl_player/controller.dart';
|
|||||||
import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';
|
import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';
|
||||||
import 'package:PiliPlus/services/shutdown_timer_service.dart'
|
import 'package:PiliPlus/services/shutdown_timer_service.dart'
|
||||||
show shutdownTimerService;
|
show shutdownTimerService;
|
||||||
|
import 'package:PiliPlus/utils/android/bindings.g.dart';
|
||||||
import 'package:PiliPlus/utils/platform_utils.dart';
|
import 'package:PiliPlus/utils/platform_utils.dart';
|
||||||
import 'package:floating/floating.dart';
|
import 'package:floating/floating.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -159,12 +160,12 @@ class _LiveHeaderControlState extends State<LiveHeaderControl>
|
|||||||
ComBtn(
|
ComBtn(
|
||||||
height: 30,
|
height: 30,
|
||||||
tooltip: '画中画',
|
tooltip: '画中画',
|
||||||
onTap: () async {
|
onTap: () {
|
||||||
if (PlatformUtils.isDesktop) {
|
if (PlatformUtils.isDesktop) {
|
||||||
plPlayerController.toggleDesktopPip();
|
plPlayerController.toggleDesktopPip();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (await Floating().isPipAvailable) {
|
if (AndroidHelper.isPipAvailable) {
|
||||||
plPlayerController.enterPip();
|
plPlayerController.enterPip();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ import 'package:PiliPlus/services/service_locator.dart';
|
|||||||
import 'package:PiliPlus/services/shutdown_timer_service.dart'
|
import 'package:PiliPlus/services/shutdown_timer_service.dart'
|
||||||
show shutdownTimerService;
|
show shutdownTimerService;
|
||||||
import 'package:PiliPlus/utils/accounts.dart';
|
import 'package:PiliPlus/utils/accounts.dart';
|
||||||
|
import 'package:PiliPlus/utils/android/bindings.g.dart';
|
||||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||||
import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';
|
import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart';
|
||||||
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
import 'package:PiliPlus/utils/extension/theme_ext.dart';
|
||||||
@@ -62,7 +63,6 @@ import 'package:PiliPlus/utils/storage.dart';
|
|||||||
import 'package:PiliPlus/utils/storage_key.dart';
|
import 'package:PiliPlus/utils/storage_key.dart';
|
||||||
import 'package:PiliPlus/utils/theme_utils.dart';
|
import 'package:PiliPlus/utils/theme_utils.dart';
|
||||||
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
|
||||||
import 'package:floating/floating.dart';
|
|
||||||
import 'package:flutter/foundation.dart' show kDebugMode;
|
import 'package:flutter/foundation.dart' show kDebugMode;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart' show SystemUiOverlayStyle;
|
import 'package:flutter/services.dart' show SystemUiOverlayStyle;
|
||||||
@@ -274,16 +274,14 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (exitFlag) {
|
if (exitFlag) {
|
||||||
// 结束播放退出全屏
|
|
||||||
if (autoExitFullscreen) {
|
if (autoExitFullscreen) {
|
||||||
plPlayerController!.triggerFullScreen(status: false);
|
plPlayerController!.triggerFullScreen(status: false);
|
||||||
if (plPlayerController!.controlsLock.value) {
|
if (plPlayerController!.controlsLock.value) {
|
||||||
plPlayerController!.onLockControl(false);
|
plPlayerController!.onLockControl(false);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
// 播放完展示控制栏
|
if (plPlayerController!.controlsLock.value &&
|
||||||
if (Platform.isAndroid) {
|
(!Platform.isAndroid || !AndroidHelper.isPipMode)) {
|
||||||
if (await Floating().pipStatus == PiPStatus.disabled) {
|
|
||||||
plPlayerController!.onLockControl(false);
|
plPlayerController!.onLockControl(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ import 'package:PiliPlus/pages/video/widgets/header_mixin.dart';
|
|||||||
import 'package:PiliPlus/plugin/pl_player/controller.dart';
|
import 'package:PiliPlus/plugin/pl_player/controller.dart';
|
||||||
import 'package:PiliPlus/plugin/pl_player/models/data_source.dart';
|
import 'package:PiliPlus/plugin/pl_player/models/data_source.dart';
|
||||||
import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';
|
import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart';
|
||||||
import 'package:PiliPlus/services/service_locator.dart';
|
|
||||||
import 'package:PiliPlus/services/shutdown_timer_service.dart'
|
import 'package:PiliPlus/services/shutdown_timer_service.dart'
|
||||||
show shutdownTimerService;
|
show shutdownTimerService;
|
||||||
import 'package:PiliPlus/utils/accounts.dart';
|
import 'package:PiliPlus/utils/accounts.dart';
|
||||||
import 'package:PiliPlus/utils/accounts/account.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/connectivity_utils.dart';
|
||||||
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
import 'package:PiliPlus/utils/extension/num_ext.dart';
|
||||||
import 'package:PiliPlus/utils/extension/string_ext.dart';
|
import 'package:PiliPlus/utils/extension/string_ext.dart';
|
||||||
@@ -58,7 +58,6 @@ import 'package:collection/collection.dart';
|
|||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:easy_debounce/easy_throttle.dart';
|
import 'package:easy_debounce/easy_throttle.dart';
|
||||||
import 'package:file_picker/file_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:floating/floating.dart';
|
|
||||||
import 'package:flutter/foundation.dart' show compute;
|
import 'package:flutter/foundation.dart' show compute;
|
||||||
import 'package:flutter/material.dart' hide showBottomSheet;
|
import 'package:flutter/material.dart' hide showBottomSheet;
|
||||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||||
@@ -1943,87 +1942,12 @@ class HeaderControlState extends State<HeaderControl>
|
|||||||
child: IconButton(
|
child: IconButton(
|
||||||
tooltip: '画中画',
|
tooltip: '画中画',
|
||||||
style: btnStyle,
|
style: btnStyle,
|
||||||
onPressed: () async {
|
onPressed: () {
|
||||||
if (PlatformUtils.isDesktop) {
|
if (PlatformUtils.isDesktop) {
|
||||||
plPlayerController.toggleDesktopPip();
|
plPlayerController.toggleDesktopPip();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (await Floating().isPipAvailable) {
|
if (AndroidHelper.isPipAvailable) {
|
||||||
if (context.mounted &&
|
|
||||||
!videoPlayerServiceHandler!.enableBackgroundPlay) {
|
|
||||||
final theme = Theme.of(context);
|
|
||||||
ScaffoldMessenger.of(context).showSnackBar(
|
|
||||||
SnackBar(
|
|
||||||
content: Column(
|
|
||||||
children: [
|
|
||||||
const Row(
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
Icons.check,
|
|
||||||
color: Colors.green,
|
|
||||||
),
|
|
||||||
SizedBox(width: 10),
|
|
||||||
Text(
|
|
||||||
'画中画',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 15,
|
|
||||||
height: 1.5,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
const SizedBox(height: 10),
|
|
||||||
const Text(
|
|
||||||
'建议开启【后台音频服务】\n'
|
|
||||||
'避免画中画没有暂停按钮',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.5,
|
|
||||||
height: 1.5,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
TextButton(
|
|
||||||
style: ButtonStyle(
|
|
||||||
foregroundColor:
|
|
||||||
WidgetStatePropertyAll(
|
|
||||||
theme
|
|
||||||
.snackBarTheme
|
|
||||||
.actionTextColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onPressed: () {
|
|
||||||
plPlayerController.setBackgroundPlay(
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
SmartDialog.showToast("请重新载入本页面刷新");
|
|
||||||
},
|
|
||||||
child: const Text('启用后台音频服务'),
|
|
||||||
),
|
|
||||||
const SizedBox(width: 10),
|
|
||||||
TextButton(
|
|
||||||
style: ButtonStyle(
|
|
||||||
foregroundColor:
|
|
||||||
WidgetStatePropertyAll(
|
|
||||||
theme
|
|
||||||
.snackBarTheme
|
|
||||||
.actionTextColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onPressed: () {},
|
|
||||||
child: const Text('不启用'),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
duration: const Duration(seconds: 2),
|
|
||||||
showCloseIcon: true,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
await Future.delayed(const Duration(seconds: 3));
|
|
||||||
}
|
|
||||||
if (!context.mounted) return;
|
|
||||||
plPlayerController.enterPip();
|
plPlayerController.enterPip();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ import 'package:PiliPlus/utils/utils.dart';
|
|||||||
import 'package:archive/archive.dart' show getCrc32;
|
import 'package:archive/archive.dart' show getCrc32;
|
||||||
import 'package:canvas_danmaku/canvas_danmaku.dart';
|
import 'package:canvas_danmaku/canvas_danmaku.dart';
|
||||||
import 'package:easy_debounce/easy_throttle.dart';
|
import 'package:easy_debounce/easy_throttle.dart';
|
||||||
import 'package:floating/floating.dart';
|
|
||||||
import 'package:flutter/foundation.dart' show kDebugMode;
|
import 'package:flutter/foundation.dart' show kDebugMode;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart' show HapticFeedback, DeviceOrientation;
|
import 'package:flutter/services.dart' show HapticFeedback, DeviceOrientation;
|
||||||
@@ -210,7 +209,7 @@ class PlPlayerController with BlockConfigMixin {
|
|||||||
|
|
||||||
late final bool autoPiP = Pref.autoPiP;
|
late final bool autoPiP = Pref.autoPiP;
|
||||||
bool get isPipMode =>
|
bool get isPipMode =>
|
||||||
(Platform.isAndroid && Floating().isPipMode) ||
|
(Platform.isAndroid && AndroidHelper.isPipMode) ||
|
||||||
(PlatformUtils.isDesktop && isDesktopPip);
|
(PlatformUtils.isDesktop && isDesktopPip);
|
||||||
late bool isDesktopPip = false;
|
late bool isDesktopPip = false;
|
||||||
late Rect _lastWindowBounds;
|
late Rect _lastWindowBounds;
|
||||||
|
|||||||
@@ -38,407 +38,6 @@ import 'package:jni/jni.dart' as jni$_;
|
|||||||
|
|
||||||
const _$jniVersionCheck = jni$_.JniVersionCheck(1, 0);
|
const _$jniVersionCheck = jni$_.JniVersionCheck(1, 0);
|
||||||
|
|
||||||
/// from: `com.example.piliplus.AndroidHelper$ToDart`
|
|
||||||
extension type AndroidHelper$ToDart._(jni$_.JObject _$this)
|
|
||||||
implements jni$_.JObject {
|
|
||||||
static final _class = jni$_.JClass.forName(
|
|
||||||
r'com/example/piliplus/AndroidHelper$ToDart',
|
|
||||||
);
|
|
||||||
|
|
||||||
/// The type which includes information such as the signature of this class.
|
|
||||||
static const jni$_.JType<AndroidHelper$ToDart> type =
|
|
||||||
$AndroidHelper$ToDart$Type$();
|
|
||||||
static final _id_onUserLeaveHint = _class.staticFieldId(
|
|
||||||
r'onUserLeaveHint',
|
|
||||||
r'Ljava/lang/Runnable;',
|
|
||||||
);
|
|
||||||
|
|
||||||
/// from: `static public bridge java.lang.Runnable onUserLeaveHint`
|
|
||||||
/// The returned object must be released after use, by calling the [release] method.
|
|
||||||
static Runnable? get onUserLeaveHint =>
|
|
||||||
_id_onUserLeaveHint.getNullable(_class, Runnable.type) as Runnable?;
|
|
||||||
|
|
||||||
/// from: `static public bridge java.lang.Runnable onUserLeaveHint`
|
|
||||||
/// The returned object must be released after use, by calling the [release] method.
|
|
||||||
static set onUserLeaveHint(Runnable? value) =>
|
|
||||||
_id_onUserLeaveHint.set(_class, Runnable.type, value);
|
|
||||||
|
|
||||||
static final _id_onConfigurationChanged = _class.staticFieldId(
|
|
||||||
r'onConfigurationChanged',
|
|
||||||
r'Ljava/lang/Runnable;',
|
|
||||||
);
|
|
||||||
|
|
||||||
/// from: `static public bridge java.lang.Runnable onConfigurationChanged`
|
|
||||||
/// The returned object must be released after use, by calling the [release] method.
|
|
||||||
static Runnable? get onConfigurationChanged =>
|
|
||||||
_id_onConfigurationChanged.getNullable(_class, Runnable.type)
|
|
||||||
as Runnable?;
|
|
||||||
|
|
||||||
/// from: `static public bridge java.lang.Runnable onConfigurationChanged`
|
|
||||||
/// The returned object must be released after use, by calling the [release] method.
|
|
||||||
static set onConfigurationChanged(Runnable? value) =>
|
|
||||||
_id_onConfigurationChanged.set(_class, Runnable.type, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
final class $AndroidHelper$ToDart$Type$
|
|
||||||
extends jni$_.JType<AndroidHelper$ToDart> {
|
|
||||||
@jni$_.internal
|
|
||||||
const $AndroidHelper$ToDart$Type$();
|
|
||||||
|
|
||||||
@jni$_.internal
|
|
||||||
@core$_.override
|
|
||||||
String get signature => r'Lcom/example/piliplus/AndroidHelper$ToDart;';
|
|
||||||
}
|
|
||||||
|
|
||||||
/// from: `com.example.piliplus.AndroidHelper`
|
|
||||||
extension type AndroidHelper._(jni$_.JObject _$this) implements jni$_.JObject {
|
|
||||||
static final _class = jni$_.JClass.forName(
|
|
||||||
r'com/example/piliplus/AndroidHelper',
|
|
||||||
);
|
|
||||||
|
|
||||||
/// The type which includes information such as the signature of this class.
|
|
||||||
static const jni$_.JType<AndroidHelper> type = $AndroidHelper$Type$();
|
|
||||||
static final _id_isFoldable = _class.staticFieldId(
|
|
||||||
r'isFoldable',
|
|
||||||
r'Z',
|
|
||||||
);
|
|
||||||
|
|
||||||
/// from: `static public bridge boolean isFoldable`
|
|
||||||
static core$_.bool get isFoldable =>
|
|
||||||
_id_isFoldable.getNullable(_class, jni$_.jboolean.type) as core$_.bool;
|
|
||||||
|
|
||||||
/// from: `static public bridge boolean isFoldable`
|
|
||||||
static set isFoldable(core$_.bool value) =>
|
|
||||||
_id_isFoldable.set(_class, jni$_.jboolean.type, value);
|
|
||||||
|
|
||||||
static final _id_back = _class.staticMethodId(
|
|
||||||
r'back',
|
|
||||||
r'()V',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _back =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticVoidMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public void back()`
|
|
||||||
static void back() {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
_back(_$$classRef.pointer, _id_back.pointer).check();
|
|
||||||
}
|
|
||||||
|
|
||||||
static final _id_biliSendCommAntifraud = _class.staticMethodId(
|
|
||||||
r'biliSendCommAntifraud',
|
|
||||||
r'(IJIJJJJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)V',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _biliSendCommAntifraud =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
jni$_.VarArgs<
|
|
||||||
(
|
|
||||||
jni$_.Int32,
|
|
||||||
jni$_.Int64,
|
|
||||||
jni$_.Int32,
|
|
||||||
jni$_.Int64,
|
|
||||||
jni$_.Int64,
|
|
||||||
jni$_.Int64,
|
|
||||||
jni$_.Int64,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Int64,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
)
|
|
||||||
>,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticVoidMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
core$_.int,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public void biliSendCommAntifraud(int i, long j, int i1, long j1, long j2, long j3, long j4, java.lang.String string, java.lang.String string1, java.lang.String string2, long j5, java.lang.String string3)`
|
|
||||||
static void biliSendCommAntifraud(
|
|
||||||
core$_.int i,
|
|
||||||
core$_.int j,
|
|
||||||
core$_.int i1,
|
|
||||||
core$_.int j1,
|
|
||||||
core$_.int j2,
|
|
||||||
core$_.int j3,
|
|
||||||
core$_.int j4,
|
|
||||||
jni$_.JString string,
|
|
||||||
jni$_.JString? string1,
|
|
||||||
jni$_.JString string2,
|
|
||||||
core$_.int j5,
|
|
||||||
jni$_.JString string3,
|
|
||||||
) {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
final _$string = string.reference;
|
|
||||||
final _$string1 = string1?.reference ?? jni$_.jNullReference;
|
|
||||||
final _$string2 = string2.reference;
|
|
||||||
final _$string3 = string3.reference;
|
|
||||||
_biliSendCommAntifraud(
|
|
||||||
_$$classRef.pointer,
|
|
||||||
_id_biliSendCommAntifraud.pointer,
|
|
||||||
i,
|
|
||||||
j,
|
|
||||||
i1,
|
|
||||||
j1,
|
|
||||||
j2,
|
|
||||||
j3,
|
|
||||||
j4,
|
|
||||||
_$string.pointer,
|
|
||||||
_$string1.pointer,
|
|
||||||
_$string2.pointer,
|
|
||||||
j5,
|
|
||||||
_$string3.pointer,
|
|
||||||
).check();
|
|
||||||
}
|
|
||||||
|
|
||||||
static final _id_openLinkVerifySettings = _class.staticMethodId(
|
|
||||||
r'openLinkVerifySettings',
|
|
||||||
r'()V',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _openLinkVerifySettings =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticVoidMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public void openLinkVerifySettings()`
|
|
||||||
static void openLinkVerifySettings() {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
_openLinkVerifySettings(
|
|
||||||
_$$classRef.pointer,
|
|
||||||
_id_openLinkVerifySettings.pointer,
|
|
||||||
).check();
|
|
||||||
}
|
|
||||||
|
|
||||||
static final _id_openMusic = _class.staticMethodId(
|
|
||||||
r'openMusic',
|
|
||||||
r'(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _openMusic =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JniResult Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
jni$_.VarArgs<
|
|
||||||
(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
)
|
|
||||||
>,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticBooleanMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JniResult Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public boolean openMusic(java.lang.String string, java.lang.String string1, java.lang.String string2)`
|
|
||||||
static core$_.bool openMusic(
|
|
||||||
jni$_.JString string,
|
|
||||||
jni$_.JString? string1,
|
|
||||||
jni$_.JString? string2,
|
|
||||||
) {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
final _$string = string.reference;
|
|
||||||
final _$string1 = string1?.reference ?? jni$_.jNullReference;
|
|
||||||
final _$string2 = string2?.reference ?? jni$_.jNullReference;
|
|
||||||
return _openMusic(
|
|
||||||
_$$classRef.pointer,
|
|
||||||
_id_openMusic.pointer,
|
|
||||||
_$string.pointer,
|
|
||||||
_$string1.pointer,
|
|
||||||
_$string2.pointer,
|
|
||||||
).boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
static final _id_setPipAutoEnterEnabled = _class.staticMethodId(
|
|
||||||
r'setPipAutoEnterEnabled',
|
|
||||||
r'(ZJ)V',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _setPipAutoEnterEnabled =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
jni$_.VarArgs<(jni$_.Int32, jni$_.Int64)>,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticVoidMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
core$_.int,
|
|
||||||
core$_.int,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public void setPipAutoEnterEnabled(boolean z, long j)`
|
|
||||||
static void setPipAutoEnterEnabled(
|
|
||||||
core$_.bool z,
|
|
||||||
core$_.int j,
|
|
||||||
) {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
_setPipAutoEnterEnabled(
|
|
||||||
_$$classRef.pointer,
|
|
||||||
_id_setPipAutoEnterEnabled.pointer,
|
|
||||||
z ? 1 : 0,
|
|
||||||
j,
|
|
||||||
).check();
|
|
||||||
}
|
|
||||||
|
|
||||||
static final _id_maxScreenSize = _class.staticMethodId(
|
|
||||||
r'maxScreenSize',
|
|
||||||
r'()[I',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _maxScreenSize =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JniResult Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticObjectMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JniResult Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public int[] maxScreenSize()`
|
|
||||||
/// The returned object must be released after use, by calling the [release] method.
|
|
||||||
static jni$_.JIntArray? maxScreenSize() {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
return _maxScreenSize(
|
|
||||||
_$$classRef.pointer,
|
|
||||||
_id_maxScreenSize.pointer,
|
|
||||||
).object<jni$_.JIntArray?>();
|
|
||||||
}
|
|
||||||
|
|
||||||
static final _id_createShortcut = _class.staticMethodId(
|
|
||||||
r'createShortcut',
|
|
||||||
r'(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V',
|
|
||||||
);
|
|
||||||
|
|
||||||
static final _createShortcut =
|
|
||||||
jni$_.ProtectedJniExtensions.lookup<
|
|
||||||
jni$_.NativeFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
jni$_.VarArgs<
|
|
||||||
(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
)
|
|
||||||
>,
|
|
||||||
)
|
|
||||||
>
|
|
||||||
>('globalEnv_CallStaticVoidMethod')
|
|
||||||
.asFunction<
|
|
||||||
jni$_.JThrowablePtr Function(
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.JMethodIDPtr,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
jni$_.Pointer<jni$_.Void>,
|
|
||||||
)
|
|
||||||
>();
|
|
||||||
|
|
||||||
/// from: `static public void createShortcut(java.lang.String string, java.lang.String string1, java.lang.String string2, java.lang.String string3)`
|
|
||||||
static void createShortcut(
|
|
||||||
jni$_.JString string,
|
|
||||||
jni$_.JString string1,
|
|
||||||
jni$_.JString string2,
|
|
||||||
jni$_.JString string3,
|
|
||||||
) {
|
|
||||||
final _$$classRef = _class.reference;
|
|
||||||
final _$string = string.reference;
|
|
||||||
final _$string1 = string1.reference;
|
|
||||||
final _$string2 = string2.reference;
|
|
||||||
final _$string3 = string3.reference;
|
|
||||||
_createShortcut(
|
|
||||||
_$$classRef.pointer,
|
|
||||||
_id_createShortcut.pointer,
|
|
||||||
_$string.pointer,
|
|
||||||
_$string1.pointer,
|
|
||||||
_$string2.pointer,
|
|
||||||
_$string3.pointer,
|
|
||||||
).check();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final class $AndroidHelper$Type$ extends jni$_.JType<AndroidHelper> {
|
|
||||||
@jni$_.internal
|
|
||||||
const $AndroidHelper$Type$();
|
|
||||||
|
|
||||||
@jni$_.internal
|
|
||||||
@core$_.override
|
|
||||||
String get signature => r'Lcom/example/piliplus/AndroidHelper;';
|
|
||||||
}
|
|
||||||
|
|
||||||
/// from: `java.lang.Runnable`
|
/// from: `java.lang.Runnable`
|
||||||
extension type Runnable._(jni$_.JObject _$this) implements jni$_.JObject {
|
extension type Runnable._(jni$_.JObject _$this) implements jni$_.JObject {
|
||||||
static final _class = jni$_.JClass.forName(r'java/lang/Runnable');
|
static final _class = jni$_.JClass.forName(r'java/lang/Runnable');
|
||||||
@@ -584,3 +183,458 @@ final class $Runnable$Type$ extends jni$_.JType<Runnable> {
|
|||||||
@core$_.override
|
@core$_.override
|
||||||
String get signature => r'Ljava/lang/Runnable;';
|
String get signature => r'Ljava/lang/Runnable;';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// from: `com.example.piliplus.AndroidHelper`
|
||||||
|
extension type AndroidHelper._(jni$_.JObject _$this) implements jni$_.JObject {
|
||||||
|
static final _class = jni$_.JClass.forName(
|
||||||
|
r'com/example/piliplus/AndroidHelper',
|
||||||
|
);
|
||||||
|
|
||||||
|
/// The type which includes information such as the signature of this class.
|
||||||
|
static const jni$_.JType<AndroidHelper> type = $AndroidHelper$Type$();
|
||||||
|
static final _id_isFoldable = _class.staticFieldId(
|
||||||
|
r'isFoldable',
|
||||||
|
r'Z',
|
||||||
|
);
|
||||||
|
|
||||||
|
/// from: `static public volatile boolean isFoldable`
|
||||||
|
static core$_.bool get isFoldable =>
|
||||||
|
_id_isFoldable.getNullable(_class, jni$_.jboolean.type) as core$_.bool;
|
||||||
|
|
||||||
|
/// from: `static public volatile boolean isFoldable`
|
||||||
|
static set isFoldable(core$_.bool value) =>
|
||||||
|
_id_isFoldable.set(_class, jni$_.jboolean.type, value);
|
||||||
|
|
||||||
|
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_sdkInt = _class.staticMethodId(
|
||||||
|
r'sdkInt',
|
||||||
|
r'()I',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _sdkInt =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JniResult Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticIntMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JniResult Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public int sdkInt()`
|
||||||
|
static core$_.int sdkInt() {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
return _sdkInt(_$$classRef.pointer, _id_sdkInt.pointer).integer;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_back = _class.staticMethodId(
|
||||||
|
r'back',
|
||||||
|
r'()V',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _back =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticVoidMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public void back()`
|
||||||
|
static void back() {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
_back(_$$classRef.pointer, _id_back.pointer).check();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_biliSendCommAntifraud = _class.staticMethodId(
|
||||||
|
r'biliSendCommAntifraud',
|
||||||
|
r'(IJIJJJJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;)V',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _biliSendCommAntifraud =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
jni$_.VarArgs<
|
||||||
|
(
|
||||||
|
jni$_.Int32,
|
||||||
|
jni$_.Int64,
|
||||||
|
jni$_.Int32,
|
||||||
|
jni$_.Int64,
|
||||||
|
jni$_.Int64,
|
||||||
|
jni$_.Int64,
|
||||||
|
jni$_.Int64,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Int64,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
)
|
||||||
|
>,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticVoidMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
core$_.int,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public void biliSendCommAntifraud(int action, long oid, int type, long rpId, long root, long parent, long ctime, java.lang.String commentText, java.lang.String pictures, java.lang.String sourceId, long uid, java.lang.String cookie)`
|
||||||
|
static void biliSendCommAntifraud(
|
||||||
|
core$_.int action,
|
||||||
|
core$_.int oid,
|
||||||
|
core$_.int type,
|
||||||
|
core$_.int rpId,
|
||||||
|
core$_.int root,
|
||||||
|
core$_.int parent,
|
||||||
|
core$_.int ctime,
|
||||||
|
jni$_.JString commentText,
|
||||||
|
jni$_.JString? pictures,
|
||||||
|
jni$_.JString sourceId,
|
||||||
|
core$_.int uid,
|
||||||
|
jni$_.JString cookie,
|
||||||
|
) {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
final _$commentText = commentText.reference;
|
||||||
|
final _$pictures = pictures?.reference ?? jni$_.jNullReference;
|
||||||
|
final _$sourceId = sourceId.reference;
|
||||||
|
final _$cookie = cookie.reference;
|
||||||
|
_biliSendCommAntifraud(
|
||||||
|
_$$classRef.pointer,
|
||||||
|
_id_biliSendCommAntifraud.pointer,
|
||||||
|
action,
|
||||||
|
oid,
|
||||||
|
type,
|
||||||
|
rpId,
|
||||||
|
root,
|
||||||
|
parent,
|
||||||
|
ctime,
|
||||||
|
_$commentText.pointer,
|
||||||
|
_$pictures.pointer,
|
||||||
|
_$sourceId.pointer,
|
||||||
|
uid,
|
||||||
|
_$cookie.pointer,
|
||||||
|
).check();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_openLinkVerifySettings = _class.staticMethodId(
|
||||||
|
r'openLinkVerifySettings',
|
||||||
|
r'()V',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _openLinkVerifySettings =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticVoidMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public void openLinkVerifySettings()`
|
||||||
|
static void openLinkVerifySettings() {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
_openLinkVerifySettings(
|
||||||
|
_$$classRef.pointer,
|
||||||
|
_id_openLinkVerifySettings.pointer,
|
||||||
|
).check();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_openMusic = _class.staticMethodId(
|
||||||
|
r'openMusic',
|
||||||
|
r'(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _openMusic =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JniResult Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
jni$_.VarArgs<
|
||||||
|
(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
)
|
||||||
|
>,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticBooleanMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JniResult Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public boolean openMusic(java.lang.String title, java.lang.String artist, java.lang.String album)`
|
||||||
|
static core$_.bool openMusic(
|
||||||
|
jni$_.JString title,
|
||||||
|
jni$_.JString? artist,
|
||||||
|
jni$_.JString? album,
|
||||||
|
) {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
final _$title = title.reference;
|
||||||
|
final _$artist = artist?.reference ?? jni$_.jNullReference;
|
||||||
|
final _$album = album?.reference ?? jni$_.jNullReference;
|
||||||
|
return _openMusic(
|
||||||
|
_$$classRef.pointer,
|
||||||
|
_id_openMusic.pointer,
|
||||||
|
_$title.pointer,
|
||||||
|
_$artist.pointer,
|
||||||
|
_$album.pointer,
|
||||||
|
).boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_setPipAutoEnterEnabled = _class.staticMethodId(
|
||||||
|
r'setPipAutoEnterEnabled',
|
||||||
|
r'(ZJ)V',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _setPipAutoEnterEnabled =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
jni$_.VarArgs<(jni$_.Int32, jni$_.Int64)>,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticVoidMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
core$_.int,
|
||||||
|
core$_.int,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public void setPipAutoEnterEnabled(boolean autoEnable, long engineId)`
|
||||||
|
static void setPipAutoEnterEnabled(
|
||||||
|
core$_.bool autoEnable,
|
||||||
|
core$_.int engineId,
|
||||||
|
) {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
_setPipAutoEnterEnabled(
|
||||||
|
_$$classRef.pointer,
|
||||||
|
_id_setPipAutoEnterEnabled.pointer,
|
||||||
|
autoEnable ? 1 : 0,
|
||||||
|
engineId,
|
||||||
|
).check();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_maxScreenSize = _class.staticMethodId(
|
||||||
|
r'maxScreenSize',
|
||||||
|
r'()[I',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _maxScreenSize =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JniResult Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticObjectMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JniResult Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public int[] maxScreenSize()`
|
||||||
|
/// The returned object must be released after use, by calling the [release] method.
|
||||||
|
static jni$_.JIntArray? maxScreenSize() {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
return _maxScreenSize(
|
||||||
|
_$$classRef.pointer,
|
||||||
|
_id_maxScreenSize.pointer,
|
||||||
|
).object<jni$_.JIntArray?>();
|
||||||
|
}
|
||||||
|
|
||||||
|
static final _id_createShortcut = _class.staticMethodId(
|
||||||
|
r'createShortcut',
|
||||||
|
r'(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V',
|
||||||
|
);
|
||||||
|
|
||||||
|
static final _createShortcut =
|
||||||
|
jni$_.ProtectedJniExtensions.lookup<
|
||||||
|
jni$_.NativeFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
jni$_.VarArgs<
|
||||||
|
(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
)
|
||||||
|
>,
|
||||||
|
)
|
||||||
|
>
|
||||||
|
>('globalEnv_CallStaticVoidMethod')
|
||||||
|
.asFunction<
|
||||||
|
jni$_.JThrowablePtr Function(
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.JMethodIDPtr,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
jni$_.Pointer<jni$_.Void>,
|
||||||
|
)
|
||||||
|
>();
|
||||||
|
|
||||||
|
/// from: `static public void createShortcut(java.lang.String id, java.lang.String uri, java.lang.String label, java.lang.String icon)`
|
||||||
|
static void createShortcut(
|
||||||
|
jni$_.JString id,
|
||||||
|
jni$_.JString uri,
|
||||||
|
jni$_.JString label,
|
||||||
|
jni$_.JString icon,
|
||||||
|
) {
|
||||||
|
final _$$classRef = _class.reference;
|
||||||
|
final _$id = id.reference;
|
||||||
|
final _$uri = uri.reference;
|
||||||
|
final _$label = label.reference;
|
||||||
|
final _$icon = icon.reference;
|
||||||
|
_createShortcut(
|
||||||
|
_$$classRef.pointer,
|
||||||
|
_id_createShortcut.pointer,
|
||||||
|
_$id.pointer,
|
||||||
|
_$uri.pointer,
|
||||||
|
_$label.pointer,
|
||||||
|
_$icon.pointer,
|
||||||
|
).check();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final class $AndroidHelper$Type$ extends jni$_.JType<AndroidHelper> {
|
||||||
|
@jni$_.internal
|
||||||
|
const $AndroidHelper$Type$();
|
||||||
|
|
||||||
|
@jni$_.internal
|
||||||
|
@core$_.override
|
||||||
|
String get signature => r'Lcom/example/piliplus/AndroidHelper;';
|
||||||
|
}
|
||||||
|
|
||||||
|
/// from: `com.example.piliplus.AndroidHelper$ToDart`
|
||||||
|
extension type AndroidHelper$ToDart._(jni$_.JObject _$this)
|
||||||
|
implements jni$_.JObject {
|
||||||
|
static final _class = jni$_.JClass.forName(
|
||||||
|
r'com/example/piliplus/AndroidHelper$ToDart',
|
||||||
|
);
|
||||||
|
|
||||||
|
/// The type which includes information such as the signature of this class.
|
||||||
|
static const jni$_.JType<AndroidHelper$ToDart> type =
|
||||||
|
$AndroidHelper$ToDart$Type$();
|
||||||
|
static final _id_onUserLeaveHint = _class.staticFieldId(
|
||||||
|
r'onUserLeaveHint',
|
||||||
|
r'Ljava/lang/Runnable;',
|
||||||
|
);
|
||||||
|
|
||||||
|
/// from: `static public volatile java.lang.Runnable onUserLeaveHint`
|
||||||
|
/// The returned object must be released after use, by calling the [release] method.
|
||||||
|
static Runnable? get onUserLeaveHint =>
|
||||||
|
_id_onUserLeaveHint.getNullable(_class, Runnable.type) as Runnable?;
|
||||||
|
|
||||||
|
/// from: `static public volatile java.lang.Runnable onUserLeaveHint`
|
||||||
|
/// The returned object must be released after use, by calling the [release] method.
|
||||||
|
static set onUserLeaveHint(Runnable? value) =>
|
||||||
|
_id_onUserLeaveHint.set(_class, Runnable.type, value);
|
||||||
|
|
||||||
|
static final _id_onConfigurationChanged = _class.staticFieldId(
|
||||||
|
r'onConfigurationChanged',
|
||||||
|
r'Ljava/lang/Runnable;',
|
||||||
|
);
|
||||||
|
|
||||||
|
/// from: `static public volatile java.lang.Runnable onConfigurationChanged`
|
||||||
|
/// The returned object must be released after use, by calling the [release] method.
|
||||||
|
static Runnable? get onConfigurationChanged =>
|
||||||
|
_id_onConfigurationChanged.getNullable(_class, Runnable.type)
|
||||||
|
as Runnable?;
|
||||||
|
|
||||||
|
/// from: `static public volatile java.lang.Runnable onConfigurationChanged`
|
||||||
|
/// The returned object must be released after use, by calling the [release] method.
|
||||||
|
static set onConfigurationChanged(Runnable? value) =>
|
||||||
|
_id_onConfigurationChanged.set(_class, Runnable.type, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
final class $AndroidHelper$ToDart$Type$
|
||||||
|
extends jni$_.JType<AndroidHelper$ToDart> {
|
||||||
|
@jni$_.internal
|
||||||
|
const $AndroidHelper$ToDart$Type$();
|
||||||
|
|
||||||
|
@jni$_.internal
|
||||||
|
@core$_.override
|
||||||
|
String get signature => r'Lcom/example/piliplus/AndroidHelper$ToDart;';
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
|
import 'package:PiliPlus/utils/android/bindings.g.dart';
|
||||||
import 'package:PiliPlus/utils/platform_utils.dart';
|
import 'package:PiliPlus/utils/platform_utils.dart';
|
||||||
import 'package:flutter/widgets.dart' show WidgetsBinding, Size;
|
import 'package:flutter/widgets.dart' show WidgetsBinding, Size;
|
||||||
|
|
||||||
abstract final class DeviceUtils {
|
abstract final class DeviceUtils {
|
||||||
static late int sdkInt;
|
static final int sdkInt = AndroidHelper.sdkInt();
|
||||||
|
|
||||||
static bool get isTablet {
|
static bool get isTablet {
|
||||||
return size.shortestSide >= 600;
|
return size.shortestSide >= 600;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ abstract final class MaxScreenSize {
|
|||||||
static void init() {
|
static void init() {
|
||||||
_initScreenSize();
|
_initScreenSize();
|
||||||
if (AndroidHelper.isFoldable) {
|
if (AndroidHelper.isFoldable) {
|
||||||
AndroidHelper$ToDart.onUserLeaveHint = Runnable.implement(
|
AndroidHelper$ToDart.onConfigurationChanged = Runnable.implement(
|
||||||
$Runnable(run: _initScreenSize),
|
$Runnable(run: _initScreenSize),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -195,13 +195,13 @@ abstract final class PageUtils {
|
|||||||
: height > width
|
: height > width
|
||||||
? const Rational.vertical()
|
? const Rational.vertical()
|
||||||
: const Rational.landscape();
|
: const Rational.landscape();
|
||||||
Floating().enable(
|
Floating.enable(
|
||||||
isAuto
|
isAuto
|
||||||
? AutoEnable(aspectRatio: aspectRatio)
|
? AutoEnable(aspectRatio: aspectRatio)
|
||||||
: EnableManual(aspectRatio: aspectRatio),
|
: EnableManual(aspectRatio: aspectRatio),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
Floating().enable(isAuto ? const AutoEnable() : const EnableManual());
|
Floating.enable(isAuto ? const AutoEnable() : const EnableManual());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -595,8 +595,8 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: version-3
|
ref: dev
|
||||||
resolved-ref: a66ec0b9dabde6b5880a3f4f3425e57842a38e51
|
resolved-ref: fdd44a501d9717ebab04e8004fca2818a6bed236
|
||||||
url: "https://github.com/bggRGjQaUbCoE/floating.git"
|
url: "https://github.com/bggRGjQaUbCoE/floating.git"
|
||||||
source: git
|
source: git
|
||||||
version: "3.0.0"
|
version: "3.0.0"
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ dependencies:
|
|||||||
floating:
|
floating:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/bggRGjQaUbCoE/floating.git
|
url: https://github.com/bggRGjQaUbCoE/floating.git
|
||||||
ref: version-3
|
ref: dev
|
||||||
flutter_cache_manager: ^3.4.1
|
flutter_cache_manager: ^3.4.1
|
||||||
flutter_displaymode: ^0.7.0
|
flutter_displaymode: ^0.7.0
|
||||||
flutter_html: ^3.0.0-beta.2
|
flutter_html: ^3.0.0-beta.2
|
||||||
|
|||||||
1
tool/README.md
Normal file
1
tool/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
run `dart run tool/jnigen.dart`
|
||||||
23
tool/jnigen.dart
Normal file
23
tool/jnigen.dart
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import 'dart:io' show Platform;
|
||||||
|
|
||||||
|
import 'package:jnigen/jnigen.dart';
|
||||||
|
|
||||||
|
void main(List<String> args) {
|
||||||
|
final packageRoot = Platform.script.resolve('../');
|
||||||
|
generateJniBindings(
|
||||||
|
Config(
|
||||||
|
outputConfig: OutputConfig(
|
||||||
|
dartConfig: DartCodeOutputConfig(
|
||||||
|
path: packageRoot.resolve('lib/utils/android/bindings.g.dart'),
|
||||||
|
structure: .singleFile,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
androidSdkConfig: AndroidSdkConfig(addGradleDeps: true),
|
||||||
|
sourcePath: [packageRoot.resolve('android/app/src/main/java')],
|
||||||
|
classes: [
|
||||||
|
'com.example.piliplus',
|
||||||
|
'java.lang.Runnable',
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user