Пример #1
0
 private void SetIdleRecordActivity(ActivityRecord activityRecord)
 {
     if (activityRecord.StartTime.Date != activityRecord.EndTime.Date)
     {
         activityRecord.Activity = _homeActivity;
     }
     else if (activityRecord.Duration < _settings.MaximumBreakDuration)
     {
         activityRecord.Activity = _breakActivity;
     }
     else
     {
         activityRecord.Activity = null;
     }
 }
Пример #2
0
        private void OnUnknownActivityLogged(ActivityRecord idleActivity)
        {
            if (!idleActivity.Idle)
            {
                _log.Warn("Unknown activity notification posted for non idle activity.");

                return;
            }

            if (UnknownActivityLogged != null)
            {
                UnknownActivityLogged(this, new ActivityRecordEventArgs(idleActivity));
            }
        }
Пример #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="T:System.EventArgs"/> class.
 /// </summary>
 public ActivityRecordEventArgs(ActivityRecord activityRecord)
 {
     ActivityRecord = activityRecord;
 }
Пример #4
0
        private static void LogUserActivity(
            IActivityRecordsRepository activityRecordsRepository,
            Action<ActivityRecord> setIdleRecordActivity,
            Activity defaultActivity,
            DateTime userInputStartTime,
            DateTime lastUserInputTime,
            DateTime currentTime,
            IActivityTrackingSettings settings,
            Action onActivityLogUpdated,
            Action<ActivityRecord> onUnknownActivityLogged)
        {
            var activeTime = lastUserInputTime - userInputStartTime;
            var idleTime = currentTime - lastUserInputTime;

            bool logUpdated = false;

            Action<ActivityRecord, Action<ActivityRecord>> addOrUpdateRecord = (record, addOrUpdate) =>
            {
                if (record.Idle)
                {
                    setIdleRecordActivity(record);
                }

                addOrUpdate(record);

                if (record.Idle && record.Activity == null)
                {
                    onUnknownActivityLogged(record);
                }

                logUpdated = true;
            };

            Action<ActivityRecord> addRecord = record => addOrUpdateRecord(record, activityRecordsRepository.Add);
            Action<ActivityRecord> updateRecord = record => addOrUpdateRecord(record, activityRecordsRepository.Update);

            try
            {
                ActivityRecord lastRecord = activityRecordsRepository.GetLastRecord();

                if (lastRecord != null)
                {
                    TimeSpan idleTimeAfterLastRecord = userInputStartTime - lastRecord.EndTime;

                    if (lastRecord.Idle)
                    {
                        // Cannot log this yet. Not enough data.
                        if (activeTime < settings.MinimumActivityDuration && idleTime < settings.MinimumIdleDuration)
                        {
                            return;
                        }

                        if (activeTime < settings.MinimumActivityDuration)
                        {
                            lastRecord.EndTime = currentTime;
                            updateRecord(lastRecord);

                            return;
                        }

                        if (idleTimeAfterLastRecord.TotalMilliseconds > 0)
                        {
                            lastRecord.EndTime = userInputStartTime;
                            updateRecord(lastRecord);
                        }
                    }
                    else
                    {
                        if (idleTimeAfterLastRecord >= settings.MinimumIdleDuration)
                        {
                            var newIdleRecord = new ActivityRecord
                            {
                                StartTime = lastRecord.EndTime,
                                EndTime = userInputStartTime,
                                Idle = true,
                            };

                            addRecord(newIdleRecord);
                        }
                        else
                        {
                            lastRecord.EndTime = lastUserInputTime;
                            updateRecord(lastRecord);
                            activeTime = TimeSpan.Zero;
                        }
                    }
                }

                if (activeTime < settings.MinimumActivityDuration && idleTime < settings.MinimumIdleDuration)
                {
                    return;
                }

                if (activeTime >= settings.MinimumActivityDuration)
                {
                    addRecord(
                        new ActivityRecord
                        {
                            StartTime = userInputStartTime,
                            EndTime = lastUserInputTime,
                            Idle = false,
                            Activity = defaultActivity
                        });
                }
                else if (activeTime != TimeSpan.Zero)
                {
                    idleTime += activeTime;
                    lastUserInputTime = userInputStartTime;
                }

                if (idleTime < settings.MinimumIdleDuration)
                {
                    return;
                }

                var idleRecord = new ActivityRecord
                {
                    StartTime = lastUserInputTime,
                    EndTime = currentTime,
                    Idle = true,
                    Activity = defaultActivity
                };

                addRecord(idleRecord);
            }
            finally
            {
                if (logUpdated)
                {
                    onActivityLogUpdated();
                }
            }
        }
        public void AddRecord(ActivityRecord record)
        {
            if (_activityRecords.Any(r => r.ActivityRecordId == record.ActivityRecordId))
            {
                return;
            }

            _activityRecords.Add(record);
        }