瀏覽代碼

Merge branch 'v1.1.0' into v1.1.0-iOS

# Conflicts:
#	lib/resource/assets.gen.dart
“HeShaoZe” 4 月之前
父節點
當前提交
239379b7a6

二進制
assets/images/icon_track_daily_doubt.webp


+ 8 - 0
assets/string/base/string.xml

@@ -366,4 +366,12 @@
     <string name="track_analyse_result_title">分析结果总结:</string>
     <string name="track_analyse_done">分析完毕</string>
     <string name="track_analyse_done_detail">过往的常去动态定位分析完毕,请看下方</string>
+    <string name="permission_notification_setting">通知栏权限</string>
+    <string name="permission_notification_setting_subtitle">
+        开启通知栏权限,可随时查看好友“每日轨迹”
+    </string>
+    <string name="track_no_doubt_desc">未授权原因:\n
+        1.可能是自己/TA手机解锁权限尚未开启,请在个人中心设置中开启权限\n
+        2.可能是TA手机尚未开启本软件
+    </string>
 </resources>

+ 1 - 1
lib/data/bean/track_daily_bean.dart

@@ -20,7 +20,7 @@ class TrackDailyBean {
   String? network;
 
   @JsonKey(name: 'status')
-  int status;
+  int? status;
 
   @JsonKey(name: 'lng')
   double? lng;

+ 1 - 1
lib/data/bean/track_daily_bean.g.dart

@@ -15,7 +15,7 @@ TrackDailyBean _$TrackDailyBeanFromJson(Map<String, dynamic> json) =>
       network: json['network'] as String?,
       lat: (json['lat'] as num?)?.toDouble(),
       lng: (json['lng'] as num?)?.toDouble(),
-      status: (json['status'] as num).toInt(),
+      status: (json['status'] as num?)?.toInt(),
       totalUnlock: (json['totalUnlock'] as num?)?.toInt(),
       highUnlock: (json['highUnlock'] as num?)?.toInt(),
     );

+ 1 - 1
lib/di/get_it.config.dart

@@ -69,9 +69,9 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i256.AboutController>(() => _i256.AboutController());
     gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
     gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
-    gh.factory<_i779.NewsReportController>(() => _i779.NewsReportController());
     gh.factory<_i108.PermissionSettingController>(
         () => _i108.PermissionSettingController());
+    gh.factory<_i779.NewsReportController>(() => _i779.NewsReportController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i772.InternetConnectionHelper>(
         () => _i772.InternetConnectionHelper());

+ 17 - 1
lib/helper/internet_connection_helper.dart

@@ -91,13 +91,29 @@ class InternetConnectionHelper {
     if (!await PermissionUtil.checkLocationPermission()) {
       return null;
     }
-    final wifiName = await wifiInfo.getWifiName();
+    String? wifiName = await wifiInfo.getWifiName();
+    wifiName = clean(wifiName);
     AtmobLog.d(tag, 'wifi名称:$wifiName');
+
     _networkName = wifiName;
     atmobPlatformInfo.setWifiName(wifiName);
     return wifiName;
   }
 
+  static String? clean(String? ssid) {
+    if (ssid == null || ssid.trim().isEmpty) return null;
+
+    String trimmed = ssid.trim();
+
+    if (trimmed.startsWith('"') &&
+        trimmed.endsWith('"') &&
+        trimmed.length >= 2) {
+      return trimmed.substring(1, trimmed.length - 1);
+    }
+
+    return trimmed;
+  }
+
   void _setMobileNetworkName() {
     _networkName = Constants.kMobileNetworkTag;
   }

+ 16 - 0
lib/module/permission/permission_setting_controller.dart

@@ -6,8 +6,10 @@ import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/repositories/phone_event_repository.dart';
 import 'package:location/resource/string.gen.dart';
+import 'package:location/utils/notification_util.dart';
 import 'package:location/utils/toast_util.dart';
 import 'package:mobile_use_statistics/flutter_mobile_statistics.dart';
+import 'package:permission_handler/permission_handler.dart';
 import '../../utils/permission_util.dart';
 
 @injectable
@@ -82,4 +84,18 @@ class PermissionSettingController extends BaseController {
       ToastUtil.show(StringName.permissionRequestFail);
     }
   }
+
+  void openNotificationSetting() async {
+    bool hasPermission = await NotificationUtil.hasNotificationPermission();
+    if (hasPermission) {
+      ToastUtil.show(StringName.permissionSettingSuccess);
+      return;
+    }
+    hasPermission = await NotificationUtil.requestNotificationPermission();
+    if (hasPermission) {
+      ToastUtil.show(StringName.permissionSettingSuccess);
+    } else {
+      ToastUtil.show(StringName.permissionRequestFail);
+    }
+  }
 }

+ 5 - 0
lib/module/permission/permission_setting_page.dart

@@ -35,6 +35,10 @@ class PermissionSettingPage extends BasePage<PermissionSettingController> {
                 StringName.permissionPhoneScreenSettingSubtitle, () {
               controller.openPhoneScreenSetting();
             }),
+            buildPermissionItem(StringName.permissionNotificationSetting,
+                StringName.permissionNotificationSettingSubtitle, () {
+              controller.openNotificationSetting();
+            }),
             Obx(() {
               return Visibility(
                 visible: controller.permissionShowBattery,
@@ -76,6 +80,7 @@ class PermissionSettingPage extends BasePage<PermissionSettingController> {
       ),
       padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 22.w),
       child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
         children: [
           Row(
             children: [

+ 10 - 0
lib/module/track/track_controller.dart

@@ -47,6 +47,8 @@ class TrackController extends BaseController
   final selectPadding =
       MapPadding(left: 80.w, top: 150.w, right: 80.w, bottom: Get.height / 2);
 
+  final RxDouble trackBottomHeight = RxDouble(330.w);
+
   final TrackRepository trackRepository;
   final FriendsRepository friendsRepository;
   final AccountRepository accountRepository;
@@ -161,6 +163,14 @@ class TrackController extends BaseController
 
   setSheetProgress(double progress) {
     _sheetProgress.value = progress;
+    if (progress >= 1) {
+      trackBottomHeight.value = 0;
+    } else if (progress <= 0.45) {
+      trackBottomHeight.value = 330.w;
+    } else {
+      double percent = (1 - progress) / (1 - 0.45);
+      trackBottomHeight.value = 330.w * percent;
+    }
   }
 
   void onCurrentLocationClick() async {

+ 38 - 14
lib/module/track/track_day_detail/track_daily_item.dart

@@ -1,19 +1,16 @@
-import 'dart:math';
-
 import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:location/data/bean/track_daily_bean.dart';
-import 'package:location/data/bean/user_info.dart';
 import 'package:location/data/consts/constants.dart';
 import 'package:location/dialog/track_error_tips_dialog.dart';
-import 'package:location/module/analyse/location_analyse_page.dart';
 import 'package:location/module/track/track_util.dart';
 import 'package:location/resource/assets.gen.dart';
 import 'package:location/resource/colors.gen.dart';
 import 'package:location/resource/string.gen.dart';
 import 'package:location/utils/common_expand.dart';
 import 'package:location/utils/date_util.dart';
-
+import 'package:location/utils/toast_util.dart';
 import '../track_status.dart';
 
 typedef TrackItemClick = void Function(TrackDailyBean bean);
@@ -324,18 +321,45 @@ Widget _buildNetDesc(String? network) {
   );
 }
 
+Widget _buildDoubtView() {
+  return Container(
+      constraints: BoxConstraints(
+        maxWidth: 0.9.sw,
+      ),
+      decoration: BoxDecoration(
+        color: ColorName.black60,
+        borderRadius: BorderRadius.circular(4.r),
+      ),
+      padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w),
+      child: Text(
+        StringName.trackNoDoubtDesc,
+        style: TextStyle(fontSize: 12.sp, color: ColorName.white),
+      ));
+}
+
 Widget _buildLockDesc(int? highUnlock, int? totalUnlock) {
   if ((highUnlock == null && totalUnlock == null) ||
       (highUnlock == 0 && totalUnlock == 0)) {
-    return Row(
-      children: [
-        Assets.images.iconTrackUnlockNoPermission
-            .image(width: 14.w, height: 14.w),
-        SizedBox(width: 2.w),
-        Text(StringName.trackDetailNoAuthorize,
-            style:
-                TextStyle(fontSize: 11.sp, color: '#919DBE'.color, height: 1))
-      ],
+    return GestureDetector(
+      behavior: HitTestBehavior.opaque,
+      onTap: () {
+        ToastUtil.show("",
+            displayTime: Duration(seconds: 3),
+            alignment: Alignment.center,
+            builder: (cxt) => _buildDoubtView());
+      },
+      child: Row(
+        children: [
+          Assets.images.iconTrackUnlockNoPermission
+              .image(width: 14.w, height: 14.w),
+          SizedBox(width: 2.w),
+          Text(StringName.trackDetailNoAuthorize,
+              style: TextStyle(
+                  fontSize: 11.sp, color: '#919DBE'.color, height: 1)),
+          SizedBox(width: 1.w),
+          Assets.images.iconTrackDailyDoubt.image(width: 12.w, height: 12.w)
+        ],
+      ),
     );
   } else {
     return Row(

+ 4 - 0
lib/module/track/track_day_detail/track_day_detail_controller.dart

@@ -73,6 +73,10 @@ class TrackDayDetailController extends BaseController {
 
   final RxnString _summaryError = RxnString();
 
+  RxDouble get _trackBottomHeight => trackController.trackBottomHeight;
+
+  double get trackBottomHeight => _trackBottomHeight.value;
+
   CancelableFuture? requestTrackFuture;
 
   String? get summaryError => _summaryError.value;

+ 12 - 0
lib/module/track/track_day_detail/track_day_detail_view.dart

@@ -72,6 +72,9 @@ class TrackDayDetailView extends BaseView<TrackDayDetailController> {
               child: buildTrackDailySummaryView(),
             ),
             SliverToBoxAdapter(
+              child: buildTrackExtraBottomView(),
+            ),
+            SliverToBoxAdapter(
                 child: Container(
               height: 80.w,
               color: '#F8F5FF'.color,
@@ -83,6 +86,15 @@ class TrackDayDetailView extends BaseView<TrackDayDetailController> {
     );
   }
 
+  Widget buildTrackExtraBottomView() {
+    return Obx(() {
+      return Container(
+        height: controller.trackBottomHeight,
+        color: '#F8F5FF'.color,
+      );
+    });
+  }
+
   Widget buildTrackDailySummaryView() {
     return RepaintBoundary(
       key: controller.shareGlobalKey,

+ 5 - 0
lib/resource/assets.gen.dart

@@ -510,6 +510,10 @@ class $AssetsImagesGen {
   AssetGenImage get iconTrackAnalyseRefresh =>
       const AssetGenImage('assets/images/icon_track_analyse_refresh.webp');
 
+  /// File path: assets/images/icon_track_daily_doubt.webp
+  AssetGenImage get iconTrackDailyDoubt =>
+      const AssetGenImage('assets/images/icon_track_daily_doubt.webp');
+
   /// File path: assets/images/icon_track_daily_report.webp
   AssetGenImage get iconTrackDailyReport =>
       const AssetGenImage('assets/images/icon_track_daily_report.webp');
@@ -780,6 +784,7 @@ class $AssetsImagesGen {
     iconSplashTitle,
     iconTrackAiInterpretation,
     iconTrackAnalyseRefresh,
+    iconTrackDailyDoubt,
     iconTrackDailyReport,
     iconTrackDailySummary,
     iconTrackDailySummaryArrow,

+ 6 - 0
lib/resource/string.gen.dart

@@ -304,6 +304,9 @@ class StringName {
   static String get trackAnalyseResultTitle => 'track_analyse_result_title'.tr; // 分析结果总结:
   static String get trackAnalyseDone => 'track_analyse_done'.tr; // 分析完毕
   static String get trackAnalyseDoneDetail => 'track_analyse_done_detail'.tr; // 过往的常去动态定位分析完毕,请看下方
+  static String get permissionNotificationSetting => 'permission_notification_setting'.tr; // 通知栏权限
+  static String get permissionNotificationSettingSubtitle => 'permission_notification_setting_subtitle'.tr; // 开启通知栏权限,可随时查看好友“每日轨迹”
+  static String get trackNoDoubtDesc => 'track_no_doubt_desc'.tr; // 未授权原因:\n 1.可能是自己/TA手机解锁权限尚未开启,请在个人中心设置中开启权限\n 2.可能是TA手机尚未开启本软件
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -611,6 +614,9 @@ class StringMultiSource {
       'track_analyse_result_title': '分析结果总结:',
       'track_analyse_done': '分析完毕',
       'track_analyse_done_detail': '过往的常去动态定位分析完毕,请看下方',
+      'permission_notification_setting': '通知栏权限',
+      'permission_notification_setting_subtitle': '开启通知栏权限,可随时查看好友“每日轨迹”',
+      'track_no_doubt_desc': '未授权原因:\n 1.可能是自己/TA手机解锁权限尚未开启,请在个人中心设置中开启权限\n 2.可能是TA手机尚未开启本软件',
     },
   };
 }

+ 15 - 0
lib/utils/notification_util.dart

@@ -0,0 +1,15 @@
+import 'package:permission_handler/permission_handler.dart';
+
+class NotificationUtil {
+  NotificationUtil._();
+
+  static Future<bool> hasNotificationPermission() async {
+    final status = await Permission.notification.status;
+    return status.isGranted;
+  }
+
+  static Future<bool> requestNotificationPermission() async {
+    final status = await Permission.locationWhenInUse.request();
+    return status.isGranted;
+  }
+}

+ 10 - 2
lib/utils/toast_util.dart

@@ -9,17 +9,25 @@ class ToastUtil {
 
   static void show(String? msg,
       {Duration? displayTime,
+      Alignment? alignment,
       SmartToastType? displayType = SmartToastType.normal,
+      WidgetBuilder? builder,
       bool? addPostFrame}) {
     if (msg != null) {
       if (addPostFrame == true) {
         WidgetsBinding.instance.addPostFrameCallback((_) {
           SmartDialog.showToast(msg,
-              displayType: displayType, displayTime: displayTime);
+              builder: builder,
+              alignment: alignment,
+              displayType: displayType,
+              displayTime: displayTime);
         });
       } else {
         SmartDialog.showToast(msg,
-            displayType: displayType, displayTime: displayTime);
+            builder: builder,
+            alignment: alignment,
+            displayType: displayType,
+            displayTime: displayTime);
       }
     }
   }