handlers.dart 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import 'dart:convert';
  2. import 'dart:ffi';
  3. import 'package:ffi/ffi.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_hbb/plugin/ui_manager.dart';
  6. import 'package:flutter_hbb/plugin/utils/dialogs.dart';
  7. abstract class NativeHandler {
  8. bool onEvent(Map<String, dynamic> evt);
  9. }
  10. typedef OnSelectPeersCallback = Bool Function(Int returnCode,
  11. Pointer<Void> data, Uint64 dataLength, Pointer<Void> userData);
  12. typedef OnSelectPeersCallbackDart = bool Function(
  13. int returnCode, Pointer<Void> data, int dataLength, Pointer<Void> userData);
  14. class NativeUiHandler extends NativeHandler {
  15. NativeUiHandler._();
  16. static NativeUiHandler instance = NativeUiHandler._();
  17. @override
  18. bool onEvent(Map<String, dynamic> evt) {
  19. final name = evt['name'];
  20. final action = evt['action'];
  21. if (name != "native_ui") {
  22. return false;
  23. }
  24. switch (action) {
  25. case "select_peers":
  26. int cb = evt['cb'];
  27. int userData = evt['user_data'] ?? 0;
  28. final cbFuncNative = Pointer.fromAddress(cb)
  29. .cast<NativeFunction<OnSelectPeersCallback>>();
  30. final cbFuncDart = cbFuncNative.asFunction<OnSelectPeersCallbackDart>();
  31. onSelectPeers(cbFuncDart, userData);
  32. break;
  33. case "register_ui_entry":
  34. int cb = evt['on_tap_cb'];
  35. int userData = evt['user_data'] ?? 0;
  36. String title = evt['title'] ?? "";
  37. final cbFuncNative = Pointer.fromAddress(cb)
  38. .cast<NativeFunction<OnSelectPeersCallback>>();
  39. final cbFuncDart = cbFuncNative.asFunction<OnSelectPeersCallbackDart>();
  40. onRegisterUiEntry(title, cbFuncDart, userData);
  41. break;
  42. default:
  43. return false;
  44. }
  45. return true;
  46. }
  47. void onSelectPeers(OnSelectPeersCallbackDart cb, int userData) async {
  48. showPeerSelectionDialog(onPeersCallback: (peers) {
  49. String json = jsonEncode(<String, dynamic> {
  50. "peers": peers
  51. });
  52. final native = json.toNativeUtf8();
  53. cb(0, native.cast(), native.length, Pointer.fromAddress(userData));
  54. malloc.free(native);
  55. });
  56. }
  57. void onRegisterUiEntry(String title, OnSelectPeersCallbackDart cbFuncDart, int userData) {
  58. Widget widget = InkWell(
  59. child: Container(
  60. height: 25.0,
  61. child: Row(
  62. children: [
  63. Expanded(child: Text(title)),
  64. Icon(Icons.chevron_right_rounded, size: 12.0,)
  65. ],
  66. ),
  67. ),
  68. );
  69. PluginUiManager.instance.registerEntry(title, widget);
  70. }
  71. }