Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-05-31 11:05:30 +08:00
parent b3e2dcf2c5
commit bee04fb2b0
17 changed files with 520 additions and 523 deletions

View File

@@ -19,8 +19,11 @@ import android.os.Build;
import android.provider.MediaStore;
import android.provider.Settings;
import android.view.WindowManager;
import androidx.annotation.Keep;
import com.github.dart_lang.jni_flutter.JniFlutterPlugin;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -29,6 +32,10 @@ import java.util.ArrayList;
public final class AndroidHelper {
public static volatile boolean isFoldable = false;
public static volatile boolean isPipMode = false;
public static volatile boolean isPipAvailable = false;
private AndroidHelper() {
}
@@ -36,6 +43,10 @@ public final class AndroidHelper {
return JniFlutterPlugin.getApplicationContext();
}
public static int sdkInt() {
return Build.VERSION.SDK_INT;
}
public static void back() {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);

View File

@@ -48,12 +48,17 @@ class MainActivity : AudioServiceActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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) {
try {
AndroidHelper.isFoldable = packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE)
AndroidHelper.isFoldable =
packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE)
} catch (_: Exception) {
}
}
@@ -73,8 +78,6 @@ class MainActivity : AudioServiceActivity() {
isInPictureInPictureMode: Boolean, newConfig: Configuration?
) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, "floating").invokeMethod(
"onPipChanged", isInPictureInPictureMode
)
AndroidHelper.isPipMode = isInPictureInPictureMode
}
}

View File

@@ -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'

View File

@@ -18,7 +18,6 @@ import 'package:PiliPlus/services/service_locator.dart';
import 'package:PiliPlus/utils/cache_manager.dart';
import 'package:PiliPlus/utils/calc_window_position.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/json_file_handler.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:catcher_2/catcher_2.dart';
import 'package:collection/collection.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -90,10 +88,6 @@ Future<void> _initAppPath() async {
appSupportDirPath = (await getApplicationSupportDirectory()).path;
}
Future<void> _initSdkInt() async {
DeviceUtils.sdkInt = (await DeviceInfoPlugin().androidInfo).version.sdkInt;
}
void main() async {
ScaledWidgetsFlutterBinding.ensureInitialized();
MediaKit.ensureInitialized();
@@ -117,7 +111,6 @@ void main() async {
if (PlatformUtils.isMobile) {
if (Platform.isAndroid) MaxScreenSize.init();
await Future.wait([
if (Platform.isAndroid) _initSdkInt(),
if (Pref.horizontalScreen) ?fullMode() else ?portraitUpMode(),
setupServiceLocator(),
]);

View File

@@ -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/view/view.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/size_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/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:canvas_danmaku/danmaku_screen.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart' hide PageView;
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@@ -214,7 +214,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
@override
Widget build(BuildContext context) {
Widget child;
if (Platform.isAndroid && Floating().isPipMode) {
if (Platform.isAndroid && AndroidHelper.isPipMode) {
child = videoPlayerPanel(
isFullScreen,
width: maxWidth,

View File

@@ -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/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';
@@ -159,12 +160,12 @@ class _LiveHeaderControlState extends State<LiveHeaderControl>
ComBtn(
height: 30,
tooltip: '画中画',
onTap: () async {
onTap: () {
if (PlatformUtils.isDesktop) {
plPlayerController.toggleDesktopPip();
return;
}
if (await Floating().isPipAvailable) {
if (AndroidHelper.isPipAvailable) {
plPlayerController.enterPip();
}
},

View File

@@ -50,6 +50,7 @@ import 'package:PiliPlus/services/service_locator.dart';
import 'package:PiliPlus/services/shutdown_timer_service.dart'
show shutdownTimerService;
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/scroll_controller_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/theme_utils.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/material.dart';
import 'package:flutter/services.dart' show SystemUiOverlayStyle;
@@ -274,16 +274,14 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
}
if (exitFlag) {
// 结束播放退出全屏
if (autoExitFullscreen) {
plPlayerController!.triggerFullScreen(status: false);
if (plPlayerController!.controlsLock.value) {
plPlayerController!.onLockControl(false);
}
}
// 播放完展示控制栏
if (Platform.isAndroid) {
if (await Floating().pipStatus == PiPStatus.disabled) {
} else {
if (plPlayerController!.controlsLock.value &&
(!Platform.isAndroid || !AndroidHelper.isPipMode)) {
plPlayerController!.onLockControl(false);
}
}

View File

@@ -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/models/data_source.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'
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';
@@ -58,7 +58,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';
@@ -1943,87 +1942,12 @@ class HeaderControlState extends State<HeaderControl>
child: IconButton(
tooltip: '画中画',
style: btnStyle,
onPressed: () async {
onPressed: () {
if (PlatformUtils.isDesktop) {
plPlayerController.toggleDesktopPip();
return;
}
if (await Floating().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;
if (AndroidHelper.isPipAvailable) {
plPlayerController.enterPip();
}
},

View File

@@ -49,7 +49,6 @@ import 'package:PiliPlus/utils/utils.dart';
import 'package:archive/archive.dart' show getCrc32;
import 'package:canvas_danmaku/canvas_danmaku.dart';
import 'package:easy_debounce/easy_throttle.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;
@@ -210,7 +209,7 @@ class PlPlayerController with BlockConfigMixin {
late final bool autoPiP = Pref.autoPiP;
bool get isPipMode =>
(Platform.isAndroid && Floating().isPipMode) ||
(Platform.isAndroid && AndroidHelper.isPipMode) ||
(PlatformUtils.isDesktop && isDesktopPip);
late bool isDesktopPip = false;
late Rect _lastWindowBounds;

View File

@@ -38,407 +38,6 @@ import 'package:jni/jni.dart' as jni$_;
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`
extension type Runnable._(jni$_.JObject _$this) implements jni$_.JObject {
static final _class = jni$_.JClass.forName(r'java/lang/Runnable');
@@ -584,3 +183,458 @@ final class $Runnable$Type$ extends jni$_.JType<Runnable> {
@core$_.override
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;';
}

View File

@@ -1,8 +1,9 @@
import 'package:PiliPlus/utils/android/bindings.g.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:flutter/widgets.dart' show WidgetsBinding, Size;
abstract final class DeviceUtils {
static late int sdkInt;
static final int sdkInt = AndroidHelper.sdkInt();
static bool get isTablet {
return size.shortestSide >= 600;

View File

@@ -10,7 +10,7 @@ abstract final class MaxScreenSize {
static void init() {
_initScreenSize();
if (AndroidHelper.isFoldable) {
AndroidHelper$ToDart.onUserLeaveHint = Runnable.implement(
AndroidHelper$ToDart.onConfigurationChanged = Runnable.implement(
$Runnable(run: _initScreenSize),
);
}

View File

@@ -195,13 +195,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());
}
}

View File

@@ -595,8 +595,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"

View File

@@ -86,7 +86,7 @@ dependencies:
floating:
git:
url: https://github.com/bggRGjQaUbCoE/floating.git
ref: version-3
ref: dev
flutter_cache_manager: ^3.4.1
flutter_displaymode: ^0.7.0
flutter_html: ^3.0.0-beta.2

1
tool/README.md Normal file
View File

@@ -0,0 +1 @@
run `dart run tool/jnigen.dart`

23
tool/jnigen.dart Normal file
View 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',
],
),
);
}