d3b6026bfd
- Filled empty libs/hbb_common/ submodule (cloned from rustdesk/hbb_common) - Patched Flutter 3.44 / Dart 3.12 compatibility: * flutter/lib/generated_bridge.dart: asTypedList with cast<>, DartPort=Int64 * flutter/lib/common.dart: DialogTheme->DialogThemeData, TabBarTheme->TabBarThemeData * flutter/pubspec.yaml: extended_text 14.0.0->15.0.2, google_fonts override 5.0.0 * flutter/macos/Runner/Configs/Release.xcconfig: EXCLUDED_ARCHS=x86_64 - Build verified: cargo check + cargo build --features flutter + cargo build --release --features flutter - Verified flutter build macos --debug and --release both produce working .app - Verified .dmg installer (27MB arm64) created via hdiutil - Build deps: Xcode 26.5, CocoaPods 1.16.2, Flutter 3.44, VCPKG arm64-osx
369 lines
9.2 KiB
Dart
369 lines
9.2 KiB
Dart
import 'package:flutter_hbb/common.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
import '../consts.dart';
|
|
|
|
// TODO: A lot of dup code.
|
|
|
|
class PrivacyModeState {
|
|
static String tag(String id) => 'privacy_mode_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxString>(tag: key)) {
|
|
final RxString state = ''.obs;
|
|
Get.put<RxString>(state, tag: key);
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxString>(tag: key)) {
|
|
Get.delete<RxString>(tag: key);
|
|
} else {
|
|
Get.find<RxString>(tag: key).value = '';
|
|
}
|
|
}
|
|
|
|
static RxString find(String id) => Get.find<RxString>(tag: tag(id));
|
|
}
|
|
|
|
class BlockInputState {
|
|
static String tag(String id) => 'block_input_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxBool>(tag: key)) {
|
|
final RxBool state = false.obs;
|
|
Get.put<RxBool>(state, tag: key);
|
|
} else {
|
|
Get.find<RxBool>(tag: key).value = false;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxBool>(tag: key)) {
|
|
Get.delete<RxBool>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
|
|
}
|
|
|
|
class CurrentDisplayState {
|
|
static String tag(String id) => 'current_display_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxInt>(tag: key)) {
|
|
final RxInt state = RxInt(0);
|
|
Get.put<RxInt>(state, tag: key);
|
|
} else {
|
|
Get.find<RxInt>(tag: key).value = 0;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxInt>(tag: key)) {
|
|
Get.delete<RxInt>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxInt find(String id) => Get.find<RxInt>(tag: tag(id));
|
|
}
|
|
|
|
class ConnectionType {
|
|
final Rx<String> _secure = kInvalidValueStr.obs;
|
|
final Rx<String> _direct = kInvalidValueStr.obs;
|
|
final Rx<String> _stream_type = kInvalidValueStr.obs;
|
|
|
|
Rx<String> get secure => _secure;
|
|
Rx<String> get direct => _direct;
|
|
Rx<String> get stream_type => _stream_type;
|
|
|
|
static String get strSecure => 'secure';
|
|
static String get strInsecure => 'insecure';
|
|
static String get strDirect => '';
|
|
static String get strIndirect => '_relay';
|
|
|
|
void setSecure(bool v) {
|
|
_secure.value = v ? strSecure : strInsecure;
|
|
}
|
|
|
|
void setDirect(bool v) {
|
|
_direct.value = v ? strDirect : strIndirect;
|
|
}
|
|
|
|
void setStreamType(String v) {
|
|
_stream_type.value = v;
|
|
}
|
|
|
|
bool isValid() {
|
|
return _secure.value != kInvalidValueStr &&
|
|
_direct.value != kInvalidValueStr &&
|
|
_stream_type.value != kInvalidValueStr;
|
|
}
|
|
}
|
|
|
|
class ConnectionTypeState {
|
|
static String tag(String id) => 'connection_type_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<ConnectionType>(tag: key)) {
|
|
final ConnectionType collectionType = ConnectionType();
|
|
Get.put<ConnectionType>(collectionType, tag: key);
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<ConnectionType>(tag: key)) {
|
|
Get.delete<ConnectionType>(tag: key);
|
|
}
|
|
}
|
|
|
|
static ConnectionType find(String id) =>
|
|
Get.find<ConnectionType>(tag: tag(id));
|
|
}
|
|
|
|
class FingerprintState {
|
|
static String tag(String id) => 'fingerprint_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxString>(tag: key)) {
|
|
final RxString state = ''.obs;
|
|
Get.put<RxString>(state, tag: key);
|
|
} else {
|
|
Get.find<RxString>(tag: key).value = '';
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxString>(tag: key)) {
|
|
Get.delete<RxString>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxString find(String id) => Get.find<RxString>(tag: tag(id));
|
|
}
|
|
|
|
class ShowRemoteCursorState {
|
|
static String tag(String id) => 'show_remote_cursor_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxBool>(tag: key)) {
|
|
final RxBool state = false.obs;
|
|
Get.put<RxBool>(state, tag: key);
|
|
} else {
|
|
Get.find<RxBool>(tag: key).value = false;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxBool>(tag: key)) {
|
|
Get.delete<RxBool>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
|
|
}
|
|
|
|
class ShowRemoteCursorLockState {
|
|
static String tag(String id) => 'show_remote_cursor_lock_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxBool>(tag: key)) {
|
|
final RxBool state = false.obs;
|
|
Get.put<RxBool>(state, tag: key);
|
|
} else {
|
|
Get.find<RxBool>(tag: key).value = false;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxBool>(tag: key)) {
|
|
Get.delete<RxBool>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
|
|
}
|
|
|
|
class KeyboardEnabledState {
|
|
static String tag(String id) => 'keyboard_enabled_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxBool>(tag: key)) {
|
|
// Server side, default true
|
|
final RxBool state = true.obs;
|
|
Get.put<RxBool>(state, tag: key);
|
|
} else {
|
|
Get.find<RxBool>(tag: key).value = true;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxBool>(tag: key)) {
|
|
Get.delete<RxBool>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
|
|
}
|
|
|
|
class RemoteCursorMovedState {
|
|
static String tag(String id) => 'remote_cursor_moved_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxBool>(tag: key)) {
|
|
final RxBool state = false.obs;
|
|
Get.put<RxBool>(state, tag: key);
|
|
} else {
|
|
Get.find<RxBool>(tag: key).value = false;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxBool>(tag: key)) {
|
|
Get.delete<RxBool>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
|
|
}
|
|
|
|
class RemoteCountState {
|
|
static String tag() => 'remote_count_';
|
|
|
|
static void init() {
|
|
final key = tag();
|
|
if (!Get.isRegistered<RxInt>(tag: key)) {
|
|
final RxInt state = 1.obs;
|
|
Get.put<RxInt>(state, tag: key);
|
|
} else {
|
|
Get.find<RxInt>(tag: key).value = 1;
|
|
}
|
|
}
|
|
|
|
static void delete() {
|
|
final key = tag();
|
|
if (Get.isRegistered<RxInt>(tag: key)) {
|
|
Get.delete<RxInt>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxInt find() => Get.find<RxInt>(tag: tag());
|
|
}
|
|
|
|
class PeerBoolOption {
|
|
static String tag(String id, String opt) => 'peer_{$opt}_$id';
|
|
|
|
static void init(String id, String opt, bool Function() init_getter) {
|
|
final key = tag(id, opt);
|
|
if (!Get.isRegistered<RxBool>(tag: key)) {
|
|
final RxBool value = RxBool(init_getter());
|
|
Get.put<RxBool>(value, tag: key);
|
|
} else {
|
|
Get.find<RxBool>(tag: key).value = init_getter();
|
|
}
|
|
}
|
|
|
|
static void delete(String id, String opt) {
|
|
final key = tag(id, opt);
|
|
if (Get.isRegistered<RxBool>(tag: key)) {
|
|
Get.delete<RxBool>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxBool find(String id, String opt) =>
|
|
Get.find<RxBool>(tag: tag(id, opt));
|
|
}
|
|
|
|
class PeerStringOption {
|
|
static String tag(String id, String opt) => 'peer_{$opt}_$id';
|
|
|
|
static void init(String id, String opt, String Function() init_getter) {
|
|
final key = tag(id, opt);
|
|
if (!Get.isRegistered<RxString>(tag: key)) {
|
|
final RxString value = RxString(init_getter());
|
|
Get.put<RxString>(value, tag: key);
|
|
} else {
|
|
Get.find<RxString>(tag: key).value = init_getter();
|
|
}
|
|
}
|
|
|
|
static void delete(String id, String opt) {
|
|
final key = tag(id, opt);
|
|
if (Get.isRegistered<RxString>(tag: key)) {
|
|
Get.delete<RxString>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxString find(String id, String opt) =>
|
|
Get.find<RxString>(tag: tag(id, opt));
|
|
}
|
|
|
|
class UnreadChatCountState {
|
|
static String tag(id) => 'unread_chat_count_$id';
|
|
|
|
static void init(String id) {
|
|
final key = tag(id);
|
|
if (!Get.isRegistered<RxInt>(tag: key)) {
|
|
final RxInt state = RxInt(0);
|
|
Get.put<RxInt>(state, tag: key);
|
|
} else {
|
|
Get.find<RxInt>(tag: key).value = 0;
|
|
}
|
|
}
|
|
|
|
static void delete(String id) {
|
|
final key = tag(id);
|
|
if (Get.isRegistered<RxInt>(tag: key)) {
|
|
Get.delete<RxInt>(tag: key);
|
|
}
|
|
}
|
|
|
|
static RxInt find(String id) => Get.find<RxInt>(tag: tag(id));
|
|
}
|
|
|
|
initSharedStates(String id) {
|
|
PrivacyModeState.init(id);
|
|
BlockInputState.init(id);
|
|
CurrentDisplayState.init(id);
|
|
KeyboardEnabledState.init(id);
|
|
ShowRemoteCursorState.init(id);
|
|
ShowRemoteCursorLockState.init(id);
|
|
RemoteCursorMovedState.init(id);
|
|
FingerprintState.init(id);
|
|
PeerBoolOption.init(id, kOptionZoomCursor, () => false);
|
|
UnreadChatCountState.init(id);
|
|
if (isMobile) ConnectionTypeState.init(id); // desktop in other places
|
|
}
|
|
|
|
removeSharedStates(String id) {
|
|
PrivacyModeState.delete(id);
|
|
BlockInputState.delete(id);
|
|
CurrentDisplayState.delete(id);
|
|
ShowRemoteCursorState.delete(id);
|
|
ShowRemoteCursorLockState.delete(id);
|
|
KeyboardEnabledState.delete(id);
|
|
RemoteCursorMovedState.delete(id);
|
|
FingerprintState.delete(id);
|
|
PeerBoolOption.delete(id, kOptionZoomCursor);
|
|
UnreadChatCountState.delete(id);
|
|
if (isMobile) ConnectionTypeState.delete(id);
|
|
}
|