Dubhe
Committed by GitHub

feat: add uniqueId and ignoreNullKey

@@ -35,10 +35,7 @@ class ClickInfo { @@ -35,10 +35,7 @@ class ClickInfo {
35 } else { 35 } else {
36 clickInfo._elementManualKey = key?.toString() ?? md5.convert(utf8.encode('${clickInfo._elementType}${clickInfo._elementPath}')).toString(); 36 clickInfo._elementManualKey = key?.toString() ?? md5.convert(utf8.encode('${clickInfo._elementType}${clickInfo._elementPath}')).toString();
37 } 37 }
38 - clickInfo._ignore = AutoTrackConfigManager.instance.isIgnoreElement(key);  
39 - if (key is AutoTrackElementKey && !clickInfo._ignore) {  
40 - clickInfo._ignore = key.ignore;  
41 - } 38 + clickInfo._ignore = clickInfo._checkIgnore(key, clickInfo);
42 39
43 return clickInfo; 40 return clickInfo;
44 } 41 }
@@ -72,6 +69,23 @@ class ClickInfo { @@ -72,6 +69,23 @@ class ClickInfo {
72 69
73 final PageInfo pageInfo; 70 final PageInfo pageInfo;
74 71
  72 + bool _checkIgnore(Key? key, ClickInfo clickInfo) {
  73 + if (AutoTrackConfigManager.instance.isIgnoreElement(key)) {
  74 + return true;
  75 + }
  76 + if (key is AutoTrackElementKey) {
  77 + if (key.ignore) {
  78 + return true;
  79 + }
  80 + }
  81 +
  82 + if (key == null && AutoTrackConfigManager.instance.config.enableIgnoreNullKey) {
  83 + return true;
  84 + }
  85 +
  86 + return false;
  87 + }
  88 +
75 @override 89 @override
76 String toString() { 90 String toString() {
77 return [ 91 return [
@@ -12,6 +12,7 @@ class AutoTrackConfig { @@ -12,6 +12,7 @@ class AutoTrackConfig {
12 this.trackId, 12 this.trackId,
13 this.userId, 13 this.userId,
14 this.signature, 14 this.signature,
  15 + this.uniqueId,
15 this.pageConfigs = const [], 16 this.pageConfigs = const [],
16 this.useCustomRoute = false, 17 this.useCustomRoute = false,
17 this.ignoreElementKeys = const [], 18 this.ignoreElementKeys = const [],
@@ -20,7 +21,8 @@ class AutoTrackConfig { @@ -20,7 +21,8 @@ class AutoTrackConfig {
20 this.enablePageLeave = false, 21 this.enablePageLeave = false,
21 this.enableClick = true, 22 this.enableClick = true,
22 this.enableUpload = false, 23 this.enableUpload = false,
23 - this.enableDrag = false 24 + this.enableDrag = false,
  25 + this.enableIgnoreNullKey = false
24 }) { 26 }) {
25 trackId ??= const Uuid().v4().replaceAll('-', ''); 27 trackId ??= const Uuid().v4().replaceAll('-', '');
26 signature ??= (t) => sha256.convert(utf8.encode('$appKey$t$appSecret')).toString(); 28 signature ??= (t) => sha256.convert(utf8.encode('$appKey$t$appSecret')).toString();
@@ -31,6 +33,8 @@ class AutoTrackConfig { @@ -31,6 +33,8 @@ class AutoTrackConfig {
31 String? appSecret; 33 String? appSecret;
32 String? trackId; 34 String? trackId;
33 String? userId; 35 String? userId;
  36 + String? uniqueId;
  37 +
34 Function? signature; 38 Function? signature;
35 39
36 List<AutoTrackPageConfig> pageConfigs; 40 List<AutoTrackPageConfig> pageConfigs;
@@ -58,6 +62,8 @@ class AutoTrackConfig { @@ -58,6 +62,8 @@ class AutoTrackConfig {
58 bool enableUpload; 62 bool enableUpload;
59 63
60 bool enableDrag; 64 bool enableDrag;
  65 +
  66 + bool enableIgnoreNullKey;
61 } 67 }
62 68
63 typedef PageWidgetFunc = bool Function(Widget); 69 typedef PageWidgetFunc = bool Function(Widget);
  1 +import 'dart:convert';
  2 +
1 import 'package:auto_track/auto_track/config/queue.dart'; 3 import 'package:auto_track/auto_track/config/queue.dart';
  4 +import 'package:crypto/crypto.dart';
2 import 'package:device_info_plus/device_info_plus.dart'; 5 import 'package:device_info_plus/device_info_plus.dart';
3 import 'package:flutter/widgets.dart'; 6 import 'package:flutter/widgets.dart';
4 import 'package:package_info_plus/package_info_plus.dart'; 7 import 'package:package_info_plus/package_info_plus.dart';
@@ -8,19 +11,24 @@ import 'config.dart'; @@ -8,19 +11,24 @@ import 'config.dart';
8 class AutoTrackConfigManager { 11 class AutoTrackConfigManager {
9 static final AutoTrackConfigManager instance = AutoTrackConfigManager._(); 12 static final AutoTrackConfigManager instance = AutoTrackConfigManager._();
10 13
11 -  
12 AutoTrackConfigManager._() { 14 AutoTrackConfigManager._() {
13 PackageInfo.fromPlatform().then((value) => _appVersion = value.version); 15 PackageInfo.fromPlatform().then((value) => _appVersion = value.version);
14 - DeviceInfoPlugin().deviceInfo.then((value) => _deviceInfo = value.data); 16 + DeviceInfoPlugin().deviceInfo.then((value) {
  17 + _deviceInfo = value.data;
  18 + baseDeviceInfo = value;
  19 + });
15 } 20 }
16 21
17 String _appVersion = ''; 22 String _appVersion = '';
18 String get appVersion => _appVersion; 23 String get appVersion => _appVersion;
19 24
  25 + BaseDeviceInfo? baseDeviceInfo;
  26 + String _deviceId = '';
  27 + String get deviceId => _deviceId;
  28 +
20 Map<String, dynamic> _deviceInfo = {}; 29 Map<String, dynamic> _deviceInfo = {};
21 Map<String, dynamic> get deviceInfo => _deviceInfo; 30 Map<String, dynamic> get deviceInfo => _deviceInfo;
22 31
23 -  
24 AutoTrackConfig _config = AutoTrackConfig(); 32 AutoTrackConfig _config = AutoTrackConfig();
25 AutoTrackConfig get config => _config; 33 AutoTrackConfig get config => _config;
26 34
@@ -29,6 +37,13 @@ class AutoTrackConfigManager { @@ -29,6 +37,13 @@ class AutoTrackConfigManager {
29 37
30 void updateConfig(AutoTrackConfig config) { 38 void updateConfig(AutoTrackConfig config) {
31 _config = config; 39 _config = config;
  40 + if (baseDeviceInfo is IosDeviceInfo) {
  41 + _deviceId = md5.convert(utf8.encode('${(baseDeviceInfo as IosDeviceInfo).identifierForVendor}#${config.appKey}')).toString();
  42 + } else if (baseDeviceInfo is AndroidDeviceInfo) {
  43 + _deviceId = md5.convert(utf8.encode('${(baseDeviceInfo as AndroidDeviceInfo).serialNumber}#${config.appKey}')).toString();
  44 + } else {
  45 + _deviceId = '';
  46 + }
32 if (config.enableUpload) { 47 if (config.enableUpload) {
33 AutoTrackQueue.instance.start(); 48 AutoTrackQueue.instance.start();
34 } else { 49 } else {
@@ -81,20 +96,24 @@ class AutoTrackConfigManager { @@ -81,20 +96,24 @@ class AutoTrackConfigManager {
81 } 96 }
82 } 97 }
83 98
  99 + void enableIgnoreNullKey(bool enable) {
  100 + _config.enableIgnoreNullKey = enable;
  101 + }
  102 +
84 List<AutoTrackPageConfig> get pageConfigs => _config.pageConfigs; 103 List<AutoTrackPageConfig> get pageConfigs => _config.pageConfigs;
85 104
86 bool get useCustomRoute => _config.useCustomRoute; 105 bool get useCustomRoute => _config.useCustomRoute;
87 106
88 AutoTrackPageConfig getPageConfig(Widget pageWidget) { 107 AutoTrackPageConfig getPageConfig(Widget pageWidget) {
89 return _config.pageConfigs.firstWhere( 108 return _config.pageConfigs.firstWhere(
90 - (pageConfig) => pageConfig.isPageWidget!(pageWidget),  
91 - orElse: () => AutoTrackPageConfig()  
92 - ); 109 + (pageConfig) => pageConfig.isPageWidget!(pageWidget),
  110 + orElse: () => AutoTrackPageConfig());
93 } 111 }
94 112
95 Set<Key> getIgnoreElementKeySet() => _config.getIgnoreElementKeySet(); 113 Set<Key> getIgnoreElementKeySet() => _config.getIgnoreElementKeySet();
96 114
97 - Set<String> getIgnoreElementStringKeySet() => _config.getIgnoreElementStringKeySet(); 115 + Set<String> getIgnoreElementStringKeySet() =>
  116 + _config.getIgnoreElementStringKeySet();
98 117
99 bool isIgnoreElement(Key? key) { 118 bool isIgnoreElement(Key? key) {
100 if (key == null) { 119 if (key == null) {
@@ -121,4 +140,6 @@ class AutoTrackConfigManager { @@ -121,4 +140,6 @@ class AutoTrackConfigManager {
121 bool get clickEnable => _config.enableClick; 140 bool get clickEnable => _config.enableClick;
122 141
123 bool get dragEnable => _config.enableDrag; 142 bool get dragEnable => _config.enableDrag;
  143 +
  144 + bool get ignoreNullKeyEnable => _config.enableIgnoreNullKey;
124 } 145 }
@@ -47,6 +47,7 @@ class AutoTrackQueue { @@ -47,6 +47,7 @@ class AutoTrackQueue {
47 't': t, 47 't': t,
48 'user_id': config.userId ?? '', 48 'user_id': config.userId ?? '',
49 'track_id': config.trackId ?? '', 49 'track_id': config.trackId ?? '',
  50 + 'unique_id': config.uniqueId ?? AutoTrackConfigManager.instance.deviceId,
50 'data_list': uploadList.map((e) => e.toMap()).toList(), 51 'data_list': uploadList.map((e) => e.toMap()).toList(),
51 'app_version': AutoTrackConfigManager.instance.appVersion, 52 'app_version': AutoTrackConfigManager.instance.appVersion,
52 'device_info': AutoTrackConfigManager.instance.deviceInfo 53 'device_info': AutoTrackConfigManager.instance.deviceInfo
@@ -67,6 +67,16 @@ class AutoTrack { @@ -67,6 +67,16 @@ class AutoTrack {
67 return _instance; 67 return _instance;
68 } 68 }
69 69
  70 + AutoTrack enableIgnoreNullKey() {
  71 + AutoTrackConfigManager.instance.enableIgnoreNullKey(true);
  72 + return _instance;
  73 + }
  74 +
  75 + AutoTrack disableIgnoreNullKey() {
  76 + AutoTrackConfigManager.instance.enableIgnoreNullKey(false);
  77 + return _instance;
  78 + }
  79 +
70 AutoTrack enableUpload() { 80 AutoTrack enableUpload() {
71 AutoTrackConfigManager.instance.enableUpload(true); 81 AutoTrackConfigManager.instance.enableUpload(true);
72 return _instance; 82 return _instance;
@@ -122,4 +132,4 @@ class AutoTrack { @@ -122,4 +132,4 @@ class AutoTrack {
122 } 132 }
123 return _instance; 133 return _instance;
124 } 134 }
125 -} 135 +}
@@ -17,7 +17,7 @@ class PageInfo { @@ -17,7 +17,7 @@ class PageInfo {
17 pageInfo._pagePath = pageConfig.pagePath ?? route.settings.name ?? ''; 17 pageInfo._pagePath = pageConfig.pagePath ?? route.settings.name ?? '';
18 pageInfo._pageTitle = pageConfig.pageTitle ?? pageInfo._findTitle(element) ?? ''; 18 pageInfo._pageTitle = pageConfig.pageTitle ?? pageInfo._findTitle(element) ?? '';
19 pageInfo._pageManualKey = pageConfig.pageID ?? md5.convert(utf8.encode('${pageInfo._pageKey}${pageInfo._pagePath}${pageInfo._pageTitle}')).toString(); 19 pageInfo._pageManualKey = pageConfig.pageID ?? md5.convert(utf8.encode('${pageInfo._pageKey}${pageInfo._pagePath}${pageInfo._pageTitle}')).toString();
20 - pageInfo.ignore = pageConfig.ignore; 20 + pageInfo.ignore = pageInfo._checkIgnore(pageConfig);
21 return pageInfo; 21 return pageInfo;
22 } 22 }
23 23
@@ -37,6 +37,18 @@ class PageInfo { @@ -37,6 +37,18 @@ class PageInfo {
37 String _pagePath = ''; 37 String _pagePath = '';
38 String get pagePath => _pagePath; 38 String get pagePath => _pagePath;
39 39
  40 + bool _checkIgnore(AutoTrackPageConfig pageConfig) {
  41 + if (pageConfig.ignore) {
  42 + return true;
  43 + }
  44 +
  45 + if (AutoTrackConfigManager.instance.config.enableIgnoreNullKey && pageConfig.pageID == null) {
  46 + return true;
  47 + }
  48 +
  49 + return false;
  50 + }
  51 +
40 String? _findTitle(Element element) { 52 String? _findTitle(Element element) {
41 String? title; 53 String? title;
42 ElementUtil.walkElement(element, (child, _) { 54 ElementUtil.walkElement(element, (child, _) {