Ver código fonte

[new]增加网络类型上报

zk 4 meses atrás
pai
commit
4736b0609d

+ 3 - 0
lib/data/repositories/account_repository.dart

@@ -16,6 +16,7 @@ import 'package:location/data/repositories/message_repository.dart';
 import 'package:location/data/repositories/phone_event_repository.dart';
 import 'package:location/data/repositories/urgent_contact_repository.dart';
 import 'package:location/di/get_it.dart';
+import 'package:location/module/main/today_track_helper.dart';
 import 'package:location/push_notification/ios_push_notification_service.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/socket/atmob_location_client.dart';
@@ -161,6 +162,8 @@ class AccountRepository {
     urgentContactRepository.clearContactList();
 
     phoneEventRepository.stopReportPhoneEvent();
+
+    TodayTrackHelper.getInstance().clear();
   }
 
   void refreshMemberStatus() {

+ 2 - 0
lib/data/repositories/phone_event_repository.dart

@@ -68,6 +68,8 @@ class PhoneEventRepository {
   }
 
   void _schedulePeriodicReport() {
+    AtmobLog.d(tag, '_schedulePeriodicReport');
+    _reportTimer?.cancel();
     _reportTimer = Timer.periodic(_taskIntervalTime, (_) => _runReportTasks());
   }
 

+ 5 - 2
lib/di/get_it.config.dart

@@ -23,6 +23,7 @@ import '../data/repositories/message_repository.dart' as _i791;
 import '../data/repositories/phone_event_repository.dart' as _i274;
 import '../data/repositories/track_repository.dart' as _i240;
 import '../data/repositories/urgent_contact_repository.dart' as _i983;
+import '../helper/internet_connection_helper.dart' as _i772;
 import '../module/about/about_controller.dart' as _i256;
 import '../module/add_friend/add_friend_dialog_controller.dart' as _i897;
 import '../module/browser/browser_controller.dart' as _i923;
@@ -68,8 +69,8 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i756.TrackDetailController>(
         () => _i756.TrackDetailController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
-    gh.lazySingleton<_i220.AtmobLocationClient>(
-        () => _i220.AtmobLocationClient());
+    gh.lazySingleton<_i772.InternetConnectionHelper>(
+        () => _i772.InternetConnectionHelper());
     gh.singleton<_i243.AtmobApi>(
         () => networkModule.provideAtmobApi(gh<_i361.Dio>()));
     gh.singleton<_i361.Dio>(
@@ -90,6 +91,8 @@ extension GetItInjectableX on _i174.GetIt {
         () => _i274.PhoneEventRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i983.UrgentContactRepository>(
         () => _i983.UrgentContactRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i220.AtmobLocationClient>(
+        () => _i220.AtmobLocationClient(gh<_i772.InternetConnectionHelper>()));
     gh.factory<_i1008.LoginController>(
         () => _i1008.LoginController(gh<_i20.AccountRepository>()));
     gh.factory<_i489.NewsController>(

+ 1 - 1
lib/dialog/net_error_dialog.dart

@@ -103,7 +103,7 @@ class _NetErrorView extends StatelessWidget {
   }
 
   void onNetErrorAgainClick() async {
-    if (await InternetConnectionHelper.isConnected()) {
+    if (await InternetConnectionHelper.getInstance().isConnected()) {
       NetErrorDialog.dismiss();
     } else {
       ToastUtil.show(StringName.networkError);

+ 127 - 16
lib/helper/internet_connection_helper.dart

@@ -1,36 +1,147 @@
 import 'dart:async';
-
+import 'package:injectable/injectable.dart';
 import 'package:internet_connection_checker/internet_connection_checker.dart';
-
+import 'package:location/data/consts/constants.dart';
+import 'package:location/di/get_it.dart';
+import 'package:location/utils/atmob_log.dart';
+import 'package:location/utils/permission_util.dart';
+import '../device/atmob_platform_info.dart';
 import '../dialog/net_error_dialog.dart';
+import 'package:connectivity_plus/connectivity_plus.dart';
+import 'package:network_info_plus/network_info_plus.dart';
 
+@lazySingleton
 class InternetConnectionHelper {
-  InternetConnectionHelper._();
+  InternetConnectionHelper();
+
+  final String tag = 'InternetConnectionHelper';
+
+  String? _networkName;
+
+  NetworkType? networkType;
+
+  StreamSubscription<InternetConnectionStatus>? _connectSubscription;
+  StreamSubscription<List<ConnectivityResult>>? netTypeSubscription;
+
+  // 控制延迟弹窗的 timer
+  Timer? _disconnectTimer;
 
-  static StreamSubscription<InternetConnectionStatus>? _subscription;
+  // 当前是否显示了断网弹窗
+  bool _isDialogVisible = false;
 
-  ///当前网络是否可用
-  static Future<bool> isConnected() {
+  final wifiInfo = NetworkInfo();
+
+  static InternetConnectionHelper getInstance() {
+    return getIt<InternetConnectionHelper>();
+  }
+
+  Future<String?> getNetworkName() async {
+    //如何网络情况不是wifi则直接返回
+    if (networkType == NetworkType.mobile) {
+      return _networkName;
+    } else if (networkType == NetworkType.wifi) {
+      if (_networkName?.isNotEmpty == true) {
+        return _networkName;
+      } else {
+        return await _attemptGetWifiName();
+      }
+    } else {
+      return null;
+    }
+  }
+
+  /// 当前网络是否可用
+  Future<bool> isConnected() {
     return InternetConnectionChecker.instance.hasConnection;
   }
 
-  static void startInternetConnection() {
-    _subscription?.cancel();
-    _subscription = InternetConnectionChecker.instance.onStatusChange.listen(
+  void startListenNetwork() {
+    netTypeSubscription?.cancel();
+    netTypeSubscription = Connectivity()
+        .onConnectivityChanged
+        .listen((List<ConnectivityResult> result) {
+      AtmobLog.d(tag, '网络类型:$result');
+      if (result.contains(ConnectivityResult.wifi)) {
+        //获取wif名称
+        networkType = NetworkType.wifi;
+        _attemptGetWifiName();
+      } else if (result.contains(ConnectivityResult.none)) {
+        networkType = NetworkType.none;
+        _setNoNetworkName();
+      } else {
+        networkType = NetworkType.mobile;
+        //其他情况都暂定为移动网络
+        _setMobileNetworkName();
+      }
+    });
+  }
+
+  void stopListenNetwork() {
+    netTypeSubscription?.cancel();
+    netTypeSubscription = null;
+  }
+
+  void _setNoNetworkName() {
+    _networkName = null;
+    atmobPlatformInfo.setWifiName(null);
+  }
+
+  Future<String?> _attemptGetWifiName() async {
+    //判断当前是否有权限
+    if (!await PermissionUtil.checkLocationPermission()) {
+      return null;
+    }
+    final wifiName = await wifiInfo.getWifiName();
+    AtmobLog.d(tag, 'wifi名称:$wifiName');
+    _networkName = wifiName;
+    atmobPlatformInfo.setWifiName(wifiName);
+    return wifiName;
+  }
+
+  void _setMobileNetworkName() {
+    _networkName = Constants.kMobileNetworkTag;
+  }
+
+  void startInternetConnection() {
+    _connectSubscription?.cancel();
+    _connectSubscription =
+        InternetConnectionChecker.instance.onStatusChange.listen(
       (InternetConnectionStatus status) {
+        AtmobLog.d(tag, '网络连接情况:$status');
         if (status == InternetConnectionStatus.connected) {
-          //有网
-          NetErrorDialog.dismiss();
+          // 网络恢复,取消延迟弹窗任务
+          _disconnectTimer?.cancel();
+          _disconnectTimer = null;
+
+          // 关闭弹窗(如果已显示)
+          if (_isDialogVisible) {
+            NetErrorDialog.dismiss();
+            _isDialogVisible = false;
+          }
         } else {
-          //无网络|网络差
-          NetErrorDialog.show();
+          // 进入无网络状态,3秒内仍未恢复才弹窗
+          _disconnectTimer?.cancel();
+          _disconnectTimer = Timer(Duration(seconds: 3), () async {
+            final stillDisconnected = !await isConnected();
+            if (stillDisconnected && !_isDialogVisible) {
+              NetErrorDialog.show();
+              _isDialogVisible = true;
+            }
+          });
         }
       },
     );
   }
 
-  //一般不需要调用
-  static void stopInternetConnection() {
-    _subscription?.cancel();
+  void stopInternetConnection() {
+    _connectSubscription?.cancel();
+    _disconnectTimer?.cancel();
+    _isDialogVisible = false;
   }
 }
+
+enum NetworkType {
+  wifi,
+  mobile,
+  none,
+}

+ 2 - 4
lib/module/main/main_controller.dart

@@ -96,7 +96,6 @@ class MainController extends BaseController {
   RxMap<String, TodayTrackReportBean> get todayTrackReportMap =>
       todayTrackHelper.todayTrackReportMap;
 
-  double? _friendTrackVisibleFraction;
 
   MainController(
       this.friendsRepository,
@@ -111,7 +110,8 @@ class MainController extends BaseController {
   @override
   void onReady() {
     super.onReady();
-    InternetConnectionHelper.startInternetConnection();
+    InternetConnectionHelper.getInstance().startInternetConnection();
+    InternetConnectionHelper.getInstance().startListenNetwork();
 
     integrateList.add(mineUserInfo);
     initLastCheckFriendId();
@@ -461,8 +461,6 @@ class MainController extends BaseController {
   }
 
   void onFriendVisibleFraction(double visibleFraction) {
-    AtmobLog.d('zk', 'onFriendVisibleFraction: $visibleFraction');
-    _friendTrackVisibleFraction = visibleFraction;
     if (visibleFraction > 0.2) {
       _requestSelectedFriendTrack();
     }

+ 22 - 0
lib/module/main/today_track_helper.dart

@@ -2,7 +2,12 @@ import 'package:flutter_map/flutter_map.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get_rx/src/rx_types/rx_types.dart';
 import 'package:injectable/injectable.dart';
+import 'package:location/data/consts/error_code.dart';
 import 'package:location/data/repositories/track_repository.dart';
+import 'package:location/di/get_it.dart';
+import 'package:location/handler/error_handler.dart';
+import 'package:location/utils/http_handler.dart';
+import 'package:location/utils/toast_util.dart';
 import '../../data/bean/atmob_track_point.dart';
 import '../../data/bean/track_daily_bean.dart';
 
@@ -15,6 +20,14 @@ class TodayTrackHelper {
 
   TodayTrackHelper(this.trackRepository);
 
+  static TodayTrackHelper getInstance() {
+    return getIt.get<TodayTrackHelper>();
+  }
+
+  void clear() {
+    todayTrackReportMap.clear();
+  }
+
   void requestTodayTrackReport(String userId) {
     todayTrackReportMap.putIfAbsent(userId, () => TodayTrackReportBean(userId));
     //确保一定有实例
@@ -80,6 +93,13 @@ class TodayTrackHelper {
 
       bean.isRequestSuccess.value = true;
       bean.lastRequestTime = DateTime.now();
+    }).catchError((error) {
+      if (error is ServerErrorException) {
+        if (error.code == ErrorCode.noMember) {
+          bean.noMember.value = true;
+        }
+      }
+      ErrorHandler.toastError(error);
     }).whenComplete(() {
       bean.isRequesting = false;
     });
@@ -93,6 +113,8 @@ class TodayTrackReportBean {
 
   final RxBool isRequestSuccess = RxBool(false);
 
+  final RxnBool noMember = RxnBool();
+
   TrackDailyBean? startPoint;
 
   TrackDailyBean? exceptionPoint;

+ 12 - 3
lib/socket/atmob_location_client.dart

@@ -5,6 +5,7 @@ import 'package:flutter_map/src/entity/map_location.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/data/repositories/friends_repository.dart';
 import 'package:location/di/get_it.dart';
+import 'package:location/helper/internet_connection_helper.dart';
 import 'package:location/socket/base_message.dart';
 import 'package:location/socket/socket_constants.dart';
 import 'package:location/utils/async_util.dart';
@@ -31,7 +32,9 @@ class AtmobLocationClient {
   bool _isConnecting = false;
   CancelableFuture? cancelableFuture;
 
-  AtmobLocationClient() {
+  final InternetConnectionHelper internetConnectionHelper;
+
+  AtmobLocationClient(this.internetConnectionHelper) {
     startWebsocketInternal();
   }
 
@@ -213,13 +216,19 @@ class AtmobLocationClient {
     AtmobLog.d(tag, 'send location: $msg');
   }
 
-  void uploadLocation(MapLocation location) {
+  void uploadLocation(MapLocation location) async {
     if (_webSocket == null ||
         location.latitude == 0 && location.longitude == 0 ||
         location.address == null ||
         location.address!.isEmpty) {
       return;
     }
-    _sendMessage(LocationMessage.obtainMessage(location));
+    String? network;
+    try {
+      network = await internetConnectionHelper
+          .getNetworkName()
+          .timeout(Duration(seconds: 2));
+    } catch (e) {}
+    _sendMessage(LocationMessage.obtainMessage(location, network));
   }
 }

+ 8 - 7
lib/socket/location_message.dart

@@ -8,16 +8,17 @@ import 'message_data.dart';
 class LocationMessage extends BaseMessage {
   static LocationMessage? message;
 
-  static String obtainMessage(MapLocation location) {
+  static String obtainMessage(MapLocation location, String? network) {
     message ??= LocationMessage();
     message!.cmd = "u.location";
     message!.data = jsonEncode(MessageData(
-            longitude: location.longitude,
-            latitude: location.latitude,
-            speed: location.speed,
-            bearing: location.bearing,
-            address: location.address)
-        .toJson());
+      longitude: location.longitude,
+      latitude: location.latitude,
+      speed: location.speed,
+      bearing: location.bearing,
+      address: location.address,
+      network: network,
+    ).toJson());
     return jsonEncode(message!.toJson());
   }
 }

+ 9 - 2
lib/socket/message_data.dart

@@ -19,8 +19,15 @@ class MessageData {
   @JsonKey(name: "addr")
   final String? address;
 
-  MessageData(
-      {this.latitude, this.longitude, this.speed, this.bearing, this.address});
+  @JsonKey(name: "network")
+  final String? network;
+
+  MessageData({this.latitude,
+    this.longitude,
+    this.speed,
+    this.bearing,
+    this.address,
+    this.network});
 
   factory MessageData.fromJson(Map<String, dynamic> json) =>
       _$MessageDataFromJson(json);

+ 2 - 0
lib/socket/message_data.g.dart

@@ -12,6 +12,7 @@ MessageData _$MessageDataFromJson(Map<String, dynamic> json) => MessageData(
       speed: (json['speed'] as num?)?.toDouble(),
       bearing: (json['bearing'] as num?)?.toDouble(),
       address: json['addr'] as String?,
+      network: json['network'] as String?,
     );
 
 Map<String, dynamic> _$MessageDataToJson(MessageData instance) =>
@@ -21,4 +22,5 @@ Map<String, dynamic> _$MessageDataToJson(MessageData instance) =>
       'speed': instance.speed,
       'bearing': instance.bearing,
       'addr': instance.address,
+      'network': instance.network,
     };

+ 3 - 0
pubspec.yaml

@@ -158,6 +158,9 @@ dependencies:
   #获取手机电量
   battery_plus: ^6.2.2
 
+  #获取wifi相关信息
+  network_info_plus: ^6.1.4
+
   ######################地图########################
   flutter_map:
     path: plugins/map