Skip to content

Commit

Permalink
implement analytics events
Browse files Browse the repository at this point in the history
  • Loading branch information
NeXTormer committed Feb 13, 2024
1 parent d3600df commit 30c4b89
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 232 deletions.
179 changes: 19 additions & 160 deletions lib/backend/analytics/frederic_analytics_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:frederic/backend/util/frederic_profiler.dart';
import 'package:frederic/theme/frederic_theme.dart';

abstract class FredericAnalyticsService {
Expand All @@ -18,6 +19,8 @@ abstract class FredericAnalyticsService {

Future<void> logSignUp(String method);

Future<void> logPurchaseApp();

Future<void> logGoalCreated();

Future<void> logGoalDeleted();
Expand All @@ -40,132 +43,9 @@ abstract class FredericAnalyticsService {

Future<void> logCompleteCalendarDay();

Future<void> logEnableCustomWorkout();

Future<void> logEnableGlobalWorkout();

Future<void> logDisableCustomWorkout();

Future<void> logDisableGlobalWorkout();

Future<void> logEnterSettingsScreen();

Future<void> logEnterUserSettingsScreen();

Future<void> logChangeColorTheme(FredericColorTheme theme);
}

// class GoogleAnalyticsService extends FredericAnalyticsService {
// // Future<void> initialize() async {
// // return;
// // }
// //
// // Future<void> enable() async {
// // await analytics.setAnalyticsCollectionEnabled(true);
// // await FirebasePerformance.instance.setPerformanceCollectionEnabled(true);
// // return FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
// // }
// //
// // Future<void> disable() async {
// // await analytics.setAnalyticsCollectionEnabled(false);
// // await FirebasePerformance.instance.setPerformanceCollectionEnabled(false);
// // return FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(false);
// // }
// //
// // void logCurrentScreen(String screen) {
// // analytics.setCurrentScreen(screenName: screen);
// // }
// //
// // Future<void> logLogin(String method) {
// // return analytics.logLogin(loginMethod: method);
// // }
// //
// // Future<void> logSignUp(String method) {
// // return analytics.logSignUp(signUpMethod: method);
// // }
// //
// // Future<void> logGoalCreated() {
// // return analytics.logEvent(name: 'create_goal');
// // }
// //
// // Future<void> logGoalDeleted() {
// // return analytics.logEvent(name: 'delete_goal');
// // }
// //
// // Future<void> logGoalSavedAsAchievement() {
// // return analytics.logEvent(name: 'goal_saved_as_achievement');
// // }
// //
// // Future<void> logAchievementDeleted() {
// // return analytics.logEvent(name: 'delete_achievement');
// // }
// //
// // Future<void> logWorkoutCreated() {
// // return analytics.logEvent(name: 'create_workout');
// // }
// //
// // Future<void> logWorkoutSaved() {
// // return analytics.logEvent(name: 'save_workout');
// // }
// //
// // Future<void> logWorkoutDeleted() {
// // return analytics.logEvent(name: 'delete_workout');
// // }
// //
// // Future<void> logAddProgressOnActivity([bool useSmartSuggestions = false]) {
// // return analytics.logEvent(
// // name: 'add_progress_using_activity',
// // parameters: {'used_smart_suggestions': useSmartSuggestions ? 1 : 0});
// // }
// //
// // Future<void> logAddProgressOnCalendar([bool useSmartSuggestions = false]) {
// // return analytics.logEvent(
// // name: 'add_progress_using_calendar',
// // parameters: {'used_smart_suggestions': useSmartSuggestions ? 1 : 0});
// // }
// //
// // Future<void> logAddProgressOnWorkoutPlayer() {
// // return analytics.logEvent(name: 'add_progress_using_workout_player');
// // }
// //
// // Future<void> logCompleteCalendarDay() {
// // return analytics.logEvent(name: 'complete_calendar_day');
// // }
// //
// // Future<void> logEnableCustomWorkout() {
// // return analytics.logEvent(name: 'enable_custom_workout');
// // }
// //
// // Future<void> logEnableGlobalWorkout() {
// // return analytics.logEvent(name: 'enable_global_workout');
// // }
// //
// // Future<void> logDisableCustomWorkout() {
// // return analytics.logEvent(name: 'disable_custom_workout');
// // }
// //
// // Future<void> logDisableGlobalWorkout() {
// // return analytics.logEvent(name: 'disable_global_workout');
// // }
// //
// // Future<void> logEnterSettingsScreen() {
// // return analytics.setCurrentScreen(screenName: 'settings_screen');
// // }
// //
// // Future<void> logEnterUserSettingsScreen() {
// // return analytics.setCurrentScreen(screenName: 'user_settings_screen');
// // }
// //
// // Future<void> logEnterHomeScreen() {
// // return analytics.setCurrentScreen(screenName: 'Home');
// // }
// //e
// // Future<void> logChangeColorTheme(FredericColorTheme theme) {
// // return analytics.logEvent(
// // name: 'change_color_theme', parameters: {'theme': theme.name});
// // }
// }

class UmamiAnalyticsService extends FredericAnalyticsService {
Dio? dio;
String trackingID = '7ad92f04-e9c1-4044-914e-a0a55946de40';
Expand All @@ -188,6 +68,15 @@ class UmamiAnalyticsService extends FredericAnalyticsService {
'User-Agent': userAgent
}));

try {
await dio?.get('/');
} catch (e) {
enabled = false;
print(e);
FredericProfiler.log(
'cant reach analytics server, disabling analytics service.');
}

if (kDebugMode) {
enabled = false;
}
Expand All @@ -207,7 +96,7 @@ class UmamiAnalyticsService extends FredericAnalyticsService {
"type": "event"
};

print("Analytics: $payload");
FredericProfiler.log("sending analytics: $payload");

try {
dio?.post('/api/send', data: payload);
Expand Down Expand Up @@ -334,42 +223,6 @@ class UmamiAnalyticsService extends FredericAnalyticsService {
return trackEvent(type: 'complete-calendar-day');
}

@override
Future<void> logEnableCustomWorkout([String? name]) async {
if (!enabled) return;
return trackEvent(type: 'enable-custom-workout');
}

@override
Future<void> logEnableGlobalWorkout([String? name]) async {
if (!enabled) return;
return trackEvent(type: 'enable-global-workout');
}

@override
Future<void> logDisableCustomWorkout([String? name]) async {
if (!enabled) return;
return trackEvent(type: 'disable-custom-workout');
}

@override
Future<void> logDisableGlobalWorkout([String? name]) async {
if (!enabled) return;
return trackEvent(type: 'disable-global-workout');
}

@override
Future<void> logEnterSettingsScreen() async {
if (!enabled) return;
return trackScreen('settings-screen');
}

@override
Future<void> logEnterUserSettingsScreen() async {
if (!enabled) return;
return trackScreen('user-settings-screen');
}

@override
Future<void> logChangeColorTheme(FredericColorTheme theme) async {
if (!enabled) return;
Expand All @@ -381,4 +234,10 @@ class UmamiAnalyticsService extends FredericAnalyticsService {
if (!enabled) return;
return trackScreen(screen);
}

@override
Future<void> logPurchaseApp() async {
if (!enabled) return;
return trackEvent(type: 'purchased-app');
}
}
3 changes: 2 additions & 1 deletion lib/backend/authentication/streak_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class StreakManager {
}
});
}

final FredericUserManager userManager;

void handleUserDataChange() {
Expand All @@ -25,7 +26,7 @@ class StreakManager {
if (!userManager.state.finishedLoading) return;
final now = DateTime.now();
//if (userManager.state.streakLatestDate?.isSameDay(now) ?? false) return;

FredericBackend.instance.analytics.logCompleteCalendarDay();
if (userManager.state.hasStreak) {
if (userManager.state.streakLatestDate?.isNotSameDay(now) ?? true) {
userManager.state.streakLatestDate = now;
Expand Down
3 changes: 3 additions & 0 deletions lib/backend/goals/frederic_goal_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:collection';

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:frederic/backend/database/frederic_data_interface.dart';
import 'package:frederic/backend/frederic_backend.dart';
import 'package:frederic/backend/goals/frederic_goal_list_data.dart';

import 'frederic_goal.dart';
Expand Down Expand Up @@ -57,10 +58,12 @@ class FredericGoalManager
final newGoalFromDatabase = await _dataInterface.create(event.newGoal);
_goals[event.newGoal.id] = newGoalFromDatabase;
emit(FredericGoalListData(event.changed, _goals));
FredericBackend.instance.analytics.logGoalCreated();
} else if (event is FredericGoalDeleteEvent) {
_goals.remove(event.goal.id);
await _dataInterface.delete(event.goal);
emit(FredericGoalListData(event.changed, _goals));
FredericBackend.instance.analytics.logGoalDeleted();
} else {
emit(FredericGoalListData(event.changed, _goals));
}
Expand Down
4 changes: 4 additions & 0 deletions lib/backend/workouts/frederic_workout_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,17 @@ class FredericWorkoutManager
FredericWorkoutEvent event, Emitter<FredericWorkoutListData> emit) async {
if (event is FredericWorkoutUpdateEvent) {
emit(FredericWorkoutListData(_workouts, event.changed));
FredericBackend.instance.analytics.logWorkoutSaved();
} else if (event is FredericWorkoutCreateEvent) {
var workout = await dataInterface.create(event.workout);
workout.onUpdate = updateWorkoutInDB;
_workouts[workout.id] = workout;
emit(FredericWorkoutListData(_workouts, event.changed));
FredericBackend.instance.analytics.logWorkoutCreated();
} else if (event is FredericWorkoutDeleteEvent) {
_deleteWorkout(event.workout);
emit(FredericWorkoutListData(_workouts, event.changed));
FredericBackend.instance.analytics.logWorkoutDeleted();
} else {
emit(FredericWorkoutListData(_workouts, event.changed));
}
Expand All @@ -95,6 +98,7 @@ class FredericWorkoutManager

class FredericWorkoutEvent {
FredericWorkoutEvent(this.changed);

List<String> changed;
}

Expand Down
5 changes: 0 additions & 5 deletions lib/screens/edit_workout_data_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,6 @@ class _EditWorkoutDataScreenState extends State<EditWorkoutDataScreen> {
context: context,
builder: (ctx) => FredericActionDialog(
onConfirm: () {
FredericBackend.instance.analytics
.logWorkoutDeleted();
FredericBackend
.instance.workoutManager
.add(FredericWorkoutDeleteEvent(
Expand Down Expand Up @@ -311,12 +309,9 @@ class _EditWorkoutDataScreenState extends State<EditWorkoutDataScreen> {
? (selectedStartDate ?? DateTime.now())
: selectedStartDate);
if (widget.isNewWorkout) {
FredericBackend.instance.analytics.logWorkoutCreated();

FredericBackend.instance.workoutManager
.add(FredericWorkoutCreateEvent(widget.workout));
} else {
FredericBackend.instance.analytics.logWorkoutSaved();
FredericBackend.instance.workoutManager.updateWorkoutInDB(widget.workout);
}
}
Expand Down
2 changes: 1 addition & 1 deletion lib/screens/settings_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class SettingsScreen extends StatelessWidget {

@override
Widget build(BuildContext context) {
FredericBackend.instance.analytics.logEnterSettingsScreen();
FredericBackend.instance.analytics.logCurrentScreen('settings-screen');
return FredericScaffold(
body: BlocBuilder<FredericUserManager, FredericUser>(
builder: (context, user) => CustomScrollView(
Expand Down
Loading

0 comments on commit 30c4b89

Please sign in to comment.