From b42538192d20fcb189731264061aa0025db58f1c Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Tue, 17 Aug 2021 00:10:53 +0200 Subject: [PATCH] Analytics: Move firebase lab detection into analytics package This way the app.dart file has minimal logic. --- lib/analytics/analytics.dart | 51 +++++++++++++------------------ lib/analytics/config.dart | 16 ++++------ lib/app.dart | 10 +----- lib/settings/settings_screen.dart | 8 ++--- 4 files changed, 32 insertions(+), 53 deletions(-) diff --git a/lib/analytics/analytics.dart b/lib/analytics/analytics.dart index e02b380a..a4cc6855 100644 --- a/lib/analytics/analytics.dart +++ b/lib/analytics/analytics.dart @@ -1,4 +1,7 @@ +import 'package:flutter/foundation.dart' as foundation; + import 'package:fixnum/fixnum.dart'; +import 'package:flutter_runtime_env/flutter_runtime_env.dart'; import 'package:function_types/function_types.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -15,11 +18,8 @@ import 'storage.dart'; export 'events.dart'; -const defaultAnalyticsEnabled = true; - class Analytics { - bool enabled = defaultAnalyticsEnabled; - bool collectUsageStatistics = defaultAnalyticsEnabled; + late bool enabled; final Func2, void> analyticsCallback; final AnalyticsStorage storage; @@ -32,57 +32,48 @@ class Analytics { required this.enabled, required this.pref, required this.pseudoId, - }) : config = AnalyticsConfig("", pref) { - collectUsageStatistics = - pref.getBool("collectUsageStatistics") ?? collectUsageStatistics; - + required this.config, + }) { _sessionId = DateTime.now().millisecondsSinceEpoch.toRadixString(16); } static Analytics? _global; - static Analytics init({ - required bool enable, + static Future init({ required SharedPreferences pref, required Func2, void> analyticsCallback, required String storagePath, - }) { + }) async { + bool inFireBaseTestLab = await inFirebaseTestLab(); + bool canBeEnabled = !foundation.kDebugMode && !inFireBaseTestLab; + var pseudoId = pref.getString("pseudoId"); if (pseudoId == null) { pseudoId = const Uuid().v4(); pref.setString("pseudoId", pseudoId); } + var config = AnalyticsConfig("", pref); + config.load(pref); + + var enabled = canBeEnabled && config.enabled; + _global = Analytics._( analyticsCallback: analyticsCallback, storage: AnalyticsStorage(storagePath), - enabled: enable, + enabled: enabled, pseudoId: pseudoId, pref: pref, + config: config, ); + Log.d("Analytics Collection: $enabled"); + Log.d("Analytics Storage: $storagePath"); + _global!._sendAppUpdateEvent(); return _global!; } - Future save() async { - _setBool(pref, "collectUsageStatistics", collectUsageStatistics, - defaultAnalyticsEnabled); - } - - Future _setBool( - SharedPreferences pref, - String key, - bool value, - bool defaultValue, - ) async { - if (value == defaultValue) { - await pref.remove(key); - } else { - await pref.setBool(key, value); - } - } - static Analytics? get instance => _global; late String _sessionId; diff --git a/lib/analytics/config.dart b/lib/analytics/config.dart index 0c4eedc4..e80b850c 100644 --- a/lib/analytics/config.dart +++ b/lib/analytics/config.dart @@ -14,22 +14,18 @@ class AnalyticsConfig extends ChangeNotifier with SettingsSharedPref { final SharedPreferences pref; var appVersion = ""; + var enabled = true; void load(SharedPreferences pref) { appVersion = pref.getString("appVersion") ?? ""; + + enabled = pref.getBool("collectUsageStatistics") ?? enabled; } Future save() async { - // var def = AnalyticsConfig(id, pref); + var def = AnalyticsConfig(id, pref); - pref.setString("appVersion", appVersion); + await setBool("collectUsageStatistics", enabled, def.enabled); + await pref.setString("appVersion", appVersion); } } - - -// TODO -// 1. Config -// 2. Move all the logic from app to here (firebase) -// 3. Move the controlling logic over here -// 4. Backend stuff -// 5. Simple event log - UI diff --git a/lib/app.dart b/lib/app.dart index a3857c6f..58ec6c86 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -1,11 +1,9 @@ import 'dart:async'; -import 'package:flutter/foundation.dart' as foundation; import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization_loader/easy_localization_loader.dart'; -import 'package:flutter_runtime_env/flutter_runtime_env.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; @@ -99,17 +97,11 @@ class JournalApp extends StatefulWidget { AppSettings appSettings, SharedPreferences pref, ) async { - bool inFireBaseTestLab = await inFirebaseTestLab(); - bool enabled = !foundation.kDebugMode && !inFireBaseTestLab; - var supportDir = await getApplicationSupportDirectory(); var analyticsStorage = p.join(supportDir.path, 'analytics'); await Directory(analyticsStorage).create(recursive: true); - Log.d("Analytics Collection: $enabled"); - Log.d("Analytics Storage: $analyticsStorage"); - var analytics = Analytics.init( - enable: enabled, + var analytics = await Analytics.init( pref: pref, analyticsCallback: captureErrorBreadcrumb, storagePath: analyticsStorage, diff --git a/lib/settings/settings_screen.dart b/lib/settings/settings_screen.dart index 3381aa5a..b96c86bd 100644 --- a/lib/settings/settings_screen.dart +++ b/lib/settings/settings_screen.dart @@ -466,11 +466,11 @@ class SettingsListState extends State { if (Analytics.instance != null) SwitchListTile( title: Text(tr('settings.usageStats')), - value: Analytics.instance!.collectUsageStatistics, + value: Analytics.instance!.config.enabled, onChanged: (bool val) { - Analytics.instance!.collectUsageStatistics = val; - Analytics.instance!.save(); - setState(() {}); + Analytics.instance!.config.enabled = val; + Analytics.instance!.config.save(); + setState(() {}); // Remove this once Analytics.instace is not used // FIXME: This also should go in the ananlytics package logEvent(