shared_state.dart 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. import 'package:flutter_hbb/common.dart';
  2. import 'package:get/get.dart';
  3. import '../consts.dart';
  4. // TODO: A lot of dup code.
  5. class PrivacyModeState {
  6. static String tag(String id) => 'privacy_mode_$id';
  7. static void init(String id) {
  8. final key = tag(id);
  9. if (!Get.isRegistered<RxString>(tag: key)) {
  10. final RxString state = ''.obs;
  11. Get.put<RxString>(state, tag: key);
  12. }
  13. }
  14. static void delete(String id) {
  15. final key = tag(id);
  16. if (Get.isRegistered<RxString>(tag: key)) {
  17. Get.delete<RxString>(tag: key);
  18. } else {
  19. Get.find<RxString>(tag: key).value = '';
  20. }
  21. }
  22. static RxString find(String id) => Get.find<RxString>(tag: tag(id));
  23. }
  24. class BlockInputState {
  25. static String tag(String id) => 'block_input_$id';
  26. static void init(String id) {
  27. final key = tag(id);
  28. if (!Get.isRegistered<RxBool>(tag: key)) {
  29. final RxBool state = false.obs;
  30. Get.put<RxBool>(state, tag: key);
  31. } else {
  32. Get.find<RxBool>(tag: key).value = false;
  33. }
  34. }
  35. static void delete(String id) {
  36. final key = tag(id);
  37. if (Get.isRegistered<RxBool>(tag: key)) {
  38. Get.delete<RxBool>(tag: key);
  39. }
  40. }
  41. static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
  42. }
  43. class CurrentDisplayState {
  44. static String tag(String id) => 'current_display_$id';
  45. static void init(String id) {
  46. final key = tag(id);
  47. if (!Get.isRegistered<RxInt>(tag: key)) {
  48. final RxInt state = RxInt(0);
  49. Get.put<RxInt>(state, tag: key);
  50. } else {
  51. Get.find<RxInt>(tag: key).value = 0;
  52. }
  53. }
  54. static void delete(String id) {
  55. final key = tag(id);
  56. if (Get.isRegistered<RxInt>(tag: key)) {
  57. Get.delete<RxInt>(tag: key);
  58. }
  59. }
  60. static RxInt find(String id) => Get.find<RxInt>(tag: tag(id));
  61. }
  62. class ConnectionType {
  63. final Rx<String> _secure = kInvalidValueStr.obs;
  64. final Rx<String> _direct = kInvalidValueStr.obs;
  65. Rx<String> get secure => _secure;
  66. Rx<String> get direct => _direct;
  67. static String get strSecure => 'secure';
  68. static String get strInsecure => 'insecure';
  69. static String get strDirect => '';
  70. static String get strIndirect => '_relay';
  71. void setSecure(bool v) {
  72. _secure.value = v ? strSecure : strInsecure;
  73. }
  74. void setDirect(bool v) {
  75. _direct.value = v ? strDirect : strIndirect;
  76. }
  77. bool isValid() {
  78. return _secure.value != kInvalidValueStr &&
  79. _direct.value != kInvalidValueStr;
  80. }
  81. }
  82. class ConnectionTypeState {
  83. static String tag(String id) => 'connection_type_$id';
  84. static void init(String id) {
  85. final key = tag(id);
  86. if (!Get.isRegistered<ConnectionType>(tag: key)) {
  87. final ConnectionType collectionType = ConnectionType();
  88. Get.put<ConnectionType>(collectionType, tag: key);
  89. }
  90. }
  91. static void delete(String id) {
  92. final key = tag(id);
  93. if (Get.isRegistered<ConnectionType>(tag: key)) {
  94. Get.delete<ConnectionType>(tag: key);
  95. }
  96. }
  97. static ConnectionType find(String id) =>
  98. Get.find<ConnectionType>(tag: tag(id));
  99. }
  100. class FingerprintState {
  101. static String tag(String id) => 'fingerprint_$id';
  102. static void init(String id) {
  103. final key = tag(id);
  104. if (!Get.isRegistered<RxString>(tag: key)) {
  105. final RxString state = ''.obs;
  106. Get.put<RxString>(state, tag: key);
  107. } else {
  108. Get.find<RxString>(tag: key).value = '';
  109. }
  110. }
  111. static void delete(String id) {
  112. final key = tag(id);
  113. if (Get.isRegistered<RxString>(tag: key)) {
  114. Get.delete<RxString>(tag: key);
  115. }
  116. }
  117. static RxString find(String id) => Get.find<RxString>(tag: tag(id));
  118. }
  119. class ShowRemoteCursorState {
  120. static String tag(String id) => 'show_remote_cursor_$id';
  121. static void init(String id) {
  122. final key = tag(id);
  123. if (!Get.isRegistered<RxBool>(tag: key)) {
  124. final RxBool state = false.obs;
  125. Get.put<RxBool>(state, tag: key);
  126. } else {
  127. Get.find<RxBool>(tag: key).value = false;
  128. }
  129. }
  130. static void delete(String id) {
  131. final key = tag(id);
  132. if (Get.isRegistered<RxBool>(tag: key)) {
  133. Get.delete<RxBool>(tag: key);
  134. }
  135. }
  136. static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
  137. }
  138. class ShowRemoteCursorLockState {
  139. static String tag(String id) => 'show_remote_cursor_lock_$id';
  140. static void init(String id) {
  141. final key = tag(id);
  142. if (!Get.isRegistered<RxBool>(tag: key)) {
  143. final RxBool state = false.obs;
  144. Get.put<RxBool>(state, tag: key);
  145. } else {
  146. Get.find<RxBool>(tag: key).value = false;
  147. }
  148. }
  149. static void delete(String id) {
  150. final key = tag(id);
  151. if (Get.isRegistered<RxBool>(tag: key)) {
  152. Get.delete<RxBool>(tag: key);
  153. }
  154. }
  155. static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
  156. }
  157. class KeyboardEnabledState {
  158. static String tag(String id) => 'keyboard_enabled_$id';
  159. static void init(String id) {
  160. final key = tag(id);
  161. if (!Get.isRegistered<RxBool>(tag: key)) {
  162. // Server side, default true
  163. final RxBool state = true.obs;
  164. Get.put<RxBool>(state, tag: key);
  165. } else {
  166. Get.find<RxBool>(tag: key).value = true;
  167. }
  168. }
  169. static void delete(String id) {
  170. final key = tag(id);
  171. if (Get.isRegistered<RxBool>(tag: key)) {
  172. Get.delete<RxBool>(tag: key);
  173. }
  174. }
  175. static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
  176. }
  177. class RemoteCursorMovedState {
  178. static String tag(String id) => 'remote_cursor_moved_$id';
  179. static void init(String id) {
  180. final key = tag(id);
  181. if (!Get.isRegistered<RxBool>(tag: key)) {
  182. final RxBool state = false.obs;
  183. Get.put<RxBool>(state, tag: key);
  184. } else {
  185. Get.find<RxBool>(tag: key).value = false;
  186. }
  187. }
  188. static void delete(String id) {
  189. final key = tag(id);
  190. if (Get.isRegistered<RxBool>(tag: key)) {
  191. Get.delete<RxBool>(tag: key);
  192. }
  193. }
  194. static RxBool find(String id) => Get.find<RxBool>(tag: tag(id));
  195. }
  196. class RemoteCountState {
  197. static String tag() => 'remote_count_';
  198. static void init() {
  199. final key = tag();
  200. if (!Get.isRegistered<RxInt>(tag: key)) {
  201. final RxInt state = 1.obs;
  202. Get.put<RxInt>(state, tag: key);
  203. } else {
  204. Get.find<RxInt>(tag: key).value = 1;
  205. }
  206. }
  207. static void delete() {
  208. final key = tag();
  209. if (Get.isRegistered<RxInt>(tag: key)) {
  210. Get.delete<RxInt>(tag: key);
  211. }
  212. }
  213. static RxInt find() => Get.find<RxInt>(tag: tag());
  214. }
  215. class PeerBoolOption {
  216. static String tag(String id, String opt) => 'peer_{$opt}_$id';
  217. static void init(String id, String opt, bool Function() init_getter) {
  218. final key = tag(id, opt);
  219. if (!Get.isRegistered<RxBool>(tag: key)) {
  220. final RxBool value = RxBool(init_getter());
  221. Get.put<RxBool>(value, tag: key);
  222. } else {
  223. Get.find<RxBool>(tag: key).value = init_getter();
  224. }
  225. }
  226. static void delete(String id, String opt) {
  227. final key = tag(id, opt);
  228. if (Get.isRegistered<RxBool>(tag: key)) {
  229. Get.delete<RxBool>(tag: key);
  230. }
  231. }
  232. static RxBool find(String id, String opt) =>
  233. Get.find<RxBool>(tag: tag(id, opt));
  234. }
  235. class PeerStringOption {
  236. static String tag(String id, String opt) => 'peer_{$opt}_$id';
  237. static void init(String id, String opt, String Function() init_getter) {
  238. final key = tag(id, opt);
  239. if (!Get.isRegistered<RxString>(tag: key)) {
  240. final RxString value = RxString(init_getter());
  241. Get.put<RxString>(value, tag: key);
  242. } else {
  243. Get.find<RxString>(tag: key).value = init_getter();
  244. }
  245. }
  246. static void delete(String id, String opt) {
  247. final key = tag(id, opt);
  248. if (Get.isRegistered<RxString>(tag: key)) {
  249. Get.delete<RxString>(tag: key);
  250. }
  251. }
  252. static RxString find(String id, String opt) =>
  253. Get.find<RxString>(tag: tag(id, opt));
  254. }
  255. class UnreadChatCountState {
  256. static String tag(id) => 'unread_chat_count_$id';
  257. static void init(String id) {
  258. final key = tag(id);
  259. if (!Get.isRegistered<RxInt>(tag: key)) {
  260. final RxInt state = RxInt(0);
  261. Get.put<RxInt>(state, tag: key);
  262. } else {
  263. Get.find<RxInt>(tag: key).value = 0;
  264. }
  265. }
  266. static void delete(String id) {
  267. final key = tag(id);
  268. if (Get.isRegistered<RxInt>(tag: key)) {
  269. Get.delete<RxInt>(tag: key);
  270. }
  271. }
  272. static RxInt find(String id) => Get.find<RxInt>(tag: tag(id));
  273. }
  274. initSharedStates(String id) {
  275. PrivacyModeState.init(id);
  276. BlockInputState.init(id);
  277. CurrentDisplayState.init(id);
  278. KeyboardEnabledState.init(id);
  279. ShowRemoteCursorState.init(id);
  280. ShowRemoteCursorLockState.init(id);
  281. RemoteCursorMovedState.init(id);
  282. FingerprintState.init(id);
  283. PeerBoolOption.init(id, kOptionZoomCursor, () => false);
  284. UnreadChatCountState.init(id);
  285. if (isMobile) ConnectionTypeState.init(id); // desktop in other places
  286. }
  287. removeSharedStates(String id) {
  288. PrivacyModeState.delete(id);
  289. BlockInputState.delete(id);
  290. CurrentDisplayState.delete(id);
  291. ShowRemoteCursorState.delete(id);
  292. ShowRemoteCursorLockState.delete(id);
  293. KeyboardEnabledState.delete(id);
  294. RemoteCursorMovedState.delete(id);
  295. FingerprintState.delete(id);
  296. PeerBoolOption.delete(id, kOptionZoomCursor);
  297. UnreadChatCountState.delete(id);
  298. if (isMobile) ConnectionTypeState.delete(id);
  299. }