user_profile.dart 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:get_storage/get_storage.dart';
  4. import 'package:trackoffical_app/logger.dart';
  5. import 'package:trackoffical_app/model.dart';
  6. import 'package:trackoffical_app/pb.dart' as pb;
  7. class UserProfile {
  8. final token = ''.val('token');
  9. final lastUseSportWearMac = ''.val('lastUseSportWearMac');
  10. var username = ''.obs;
  11. var head = MNetImage().obs;
  12. final _sexIndex = Sex.Male.index.val('UserProfile_sex');
  13. Sex get sex => Sex.values[_sexIndex.val];
  14. set sex(Sex v) {
  15. _sexIndex.val = v.index;
  16. }
  17. var age = 12.val('UserProfile_age');
  18. var weightKg = 42.0.val('UserProfile_weightKg');
  19. var heightCm = 150.0.val('UserProfile_heightCm');
  20. var rhr = 60.val('UserProfile_rhr');
  21. /// 已经询问过开屏权限
  22. final isAskPermissions = false.val('UserProfile_isAskPermissions');
  23. var isCompassUseRealNorth = true.val('UserProfile_isCompassUseRealNorth');
  24. final isInGameUISimplifyMode = true.val('UserProfile_isInGameUISimplifyMode');
  25. final isEnableOutBoundaryWarn =
  26. true.val('UserProfile_isEnableOutBoundaryWarn');
  27. static const inGameTrajectorySecondsList = <int>[60, 90, 120];
  28. final inGameTrajectorySeconds =
  29. inGameTrajectorySecondsList[0].val('UserProfile_inGameTrajectorySeconds');
  30. final isEnableUserLocation = true.val('UserProfile_isUserLocationEnable');
  31. final isStartShowWarn = true.val('UserProfile_isStartShowWarn');
  32. final isEnableGameSound = true.val('UserProfile_isEnableGameSound');
  33. final isEnableGameVibrate = true.val('UserProfile_isEnableGameVibrate');
  34. /// 文创
  35. final isEnableGameCulture = true.val('UserProfile_isEnableGameCulture');
  36. /// 游戏开始后是否显示提示
  37. final isEnableInGameStartWarn =
  38. true.val('UserProfile_isEnableInGameStartWarn');
  39. /// 游戏开始后是否显示开始点气泡
  40. final isEnableInGameStartCPBubble =
  41. true.val('UserProfile_isEnableInGameStartCPBubble');
  42. /// 首页是否显示提示
  43. final isEnableHomeSpecialWarn =
  44. true.val('UserProfile_isEnableHomeSpecialWarn');
  45. /// 游戏开始后是否屏幕最亮
  46. final isEnableInGameBrightnessMax =
  47. false.val('UserProfile_isEnableInGameBrightnessMax');
  48. final gameSettingsUIMode = GameSettingsValue<GameUIMode, int>(
  49. 'map_mode', GameUIMode.electronicMap,
  50. storageFmt: (v) => v.index,
  51. storageFmtRe: (s)=> GameUIMode.values[s]
  52. );
  53. final gameSettingsSimpleDashboard =
  54. GameSettingsValue('simple_dashboard', true);
  55. final gameSettingsBoundaryWarn = GameSettingsValue('boundary_warn', true);
  56. final gameSettingsTrackLengthSeconds = GameSettingsValue('track_length', 60);
  57. final gameSettingsShowMyLocation =
  58. GameSettingsValue('show_my_location', true);
  59. final gameSettingsStartRemind = GameSettingsValue('start_remind', true);
  60. final gameSettingsSoundPrompt = GameSettingsValue('sound_prompt', true);
  61. final gameSettingsVibrationPrompt =
  62. GameSettingsValue('vibration_prompt', true);
  63. final gameSettingsShowOriginality =
  64. GameSettingsValue('show_originality', true);
  65. final gameSettingsRealNorth = GameSettingsValue('real_north', true);
  66. final gameSettingsGpsTrack = GameSettingsValue('gps_track', true);
  67. final gameSettingsTargetErrorMeter = GameSettingsValue('target_error', 5);
  68. final gameSettingsPunchRadiusMeter = GameSettingsValue('punch_radius', 2);
  69. final gameSettingsCpRadiusMeter = GameSettingsValue('cp_radius', 15);
  70. final gameSettingsCpColor = gameSettingsColor('cp_color', const Color(0xffff00f7));
  71. final gameSettingsCpTargetColor = gameSettingsColor('target_cp_color', const Color(0xfff44336));
  72. final gameSettingsCpJumpColor = gameSettingsColor('jump_cp_color', const Color(0xff9e9e9e));
  73. final gameSettingsCpPunchedColor = gameSettingsColor('punched_cp_color', const Color(0xff4caf50));
  74. final gameSettingsRoutePreview = GameSettingsValue('route_preview', false);
  75. final gameSettingsPunchErrorPrompt = GameSettingsValue('punch_error_prompt', true);
  76. final gameSettingsHotZonePrompt = GameSettingsValue('hotspot_prompt', true);
  77. final gameSettingsVCPPunchType = GameSettingsValue<VCPPunchType, int>(
  78. 'vcp_punch_type', VCPPunchType.manual,
  79. storageFmt: (v) => v.index,
  80. storageFmtRe: (s)=> VCPPunchType.values[s]
  81. );
  82. final _gameSettingsIndex = <String, GameSettingsValue>{};
  83. void _gameSettingsInitIndex(List<GameSettingsValue> list) {
  84. for (final one in list) {
  85. _gameSettingsIndex[one.name] = one;
  86. }
  87. }
  88. UserProfile() {
  89. _gameSettingsInitIndex([
  90. gameSettingsUIMode,
  91. gameSettingsSimpleDashboard,
  92. gameSettingsBoundaryWarn,
  93. gameSettingsTrackLengthSeconds,
  94. gameSettingsShowMyLocation,
  95. gameSettingsStartRemind,
  96. gameSettingsSoundPrompt,
  97. gameSettingsVibrationPrompt,
  98. gameSettingsShowOriginality,
  99. gameSettingsRealNorth,
  100. gameSettingsGpsTrack,
  101. gameSettingsTargetErrorMeter,
  102. gameSettingsPunchRadiusMeter,
  103. gameSettingsCpRadiusMeter,
  104. gameSettingsCpColor,
  105. gameSettingsCpTargetColor,
  106. gameSettingsCpJumpColor,
  107. gameSettingsCpPunchedColor,
  108. gameSettingsRoutePreview,
  109. gameSettingsPunchErrorPrompt,
  110. gameSettingsHotZonePrompt,
  111. gameSettingsVCPPunchType,
  112. ]);
  113. }
  114. void gameSettingsLoadLock(List<pb.ActivityRule> rules) {
  115. var msg = '载入服务器配置:\n';
  116. for (final rule in rules) {
  117. final s = _gameSettingsIndex[rule.arName];
  118. if (s != null && rule.isLock) {
  119. s.parseStringLock(rule.arValue);
  120. msg += '${rule.arName}: ${rule.arValue}';
  121. }
  122. }
  123. info(msg);
  124. }
  125. void cleanGameSettingsLock() {
  126. for (final one in _gameSettingsIndex.values) {
  127. one.lockValue = null;
  128. }
  129. }
  130. }
  131. enum GameUIMode { electronicMap, noMap, paperMap }
  132. enum VCPPunchType{ manual, auto }
  133. GameSettingsValue<Color, int> gameSettingsColor(String name, Color color){
  134. return GameSettingsValue<Color, int>(name,
  135. color,
  136. storageFmt: (v) => v.value,
  137. storageFmtRe: (s)=> Color(s)
  138. );
  139. }
  140. class GameSettingsValue<T, S> {
  141. GameSettingsValue(this.name, T value,
  142. {S Function(T)? storageFmt, T Function(S)? storageFmtRe})
  143. : _same = storageFmt==null,
  144. _storageFmt = storageFmt,
  145. _storageFmtRe = storageFmtRe{
  146. final key = 'GameSettingsValue_$name';
  147. if(_same){
  148. _storage = value.val(key);
  149. }else{
  150. _storage = storageFmt!(value).val(key);
  151. }
  152. }
  153. /// 类型T和S相同
  154. final bool _same;
  155. final String name;
  156. late ReadWriteValue<dynamic> _storage;
  157. final S Function(T)? _storageFmt;
  158. final T Function(S)? _storageFmtRe;
  159. T? lockValue;
  160. bool get isLocked => lockValue != null;
  161. parseStringLock(String value) {
  162. switch (T) {
  163. case bool:
  164. lockValue = (bool.tryParse(value) ?? false) as T;
  165. break;
  166. case int:
  167. lockValue = (int.tryParse(value) ?? 0) as T;
  168. break;
  169. case GameUIMode:
  170. lockValue = GameUIMode.values[int.tryParse(value) ?? 0] as T;
  171. break;
  172. case VCPPunchType:
  173. lockValue = VCPPunchType.values[int.tryParse(value) ?? 0] as T;
  174. break;
  175. default:
  176. throw Exception("T: $T name:$name v:$value 不支持");
  177. }
  178. }
  179. set value(T v) {
  180. if (lockValue == null) {
  181. if (_same) {
  182. _storage.val = v;
  183. } else {
  184. _storage.val = _storageFmt!(v);
  185. }
  186. }
  187. }
  188. T get value {
  189. if (_same) {
  190. return lockValue ?? _storage.val;
  191. } else {
  192. return lockValue ?? _storageFmtRe!(_storage.val);
  193. }
  194. }
  195. }