bool RecordTime(TimeEntry timeEntry, Task task)
        {
            var timeEntryModel = new TimeEntryModel
            {
                Date = GetCompatibleDate(timeEntry).ToString("O"),
                Notes = timeEntry.Comment,
                TimeString = timeEntry.MinutesSpent + "m",
                DurationSeconds = timeEntry.MinutesSpent*60,
                ProjectId = timeEntry.Project?.Id,
                TaskId = task?.Id,
                WorkItems = new List<string>(), // TODO: add functionality for tracking WorkItems
            };

            var post = new RestRequest
            {
                Resource = "Time/Save",
                Method = Method.POST,
                RequestFormat = DataFormat.Json
            };

            post.AddBody(timeEntryModel);

            var result = _api.Execute<TimeEntryModel>(post);
            return result != null;
        }
 public void TestSqliteIgnoreOnTimeEntry ()
 {
     var cache = new AttributeLookupCache<SQLite.IgnoreAttribute> ();
     var entry = new TimeEntryModel ();
     Assert.IsTrue (cache.HasAttribute (entry, TimeEntryModel.PropertyWorkspace));
     Assert.IsFalse (cache.HasAttribute (entry, TimeEntryModel.PropertyStartTime));
 }
        public RecentTimeEntryContinueDialogFragment (TimeEntryModel model)
        {
            var args = new Bundle ();
            args.PutString (TimeEntryIdArgument, model.Id.ToString ());

            Arguments = args;
        }
        public ChangeTimeEntryStopTimeDialogFragment (TimeEntryModel model) : base ()
        {
            var args = new Bundle ();
            args.PutString (TimeEntryIdArgument, model.Id.ToString ());

            Arguments = args;
        }
        private async void OnActionButtonTouchUpInside (object sender, EventArgs e)
        {
            if (isActing) {
                return;
            }
            isActing = true;

            try {
                if (currentTimeEntry != null && currentTimeEntry.State == TimeEntryState.Running) {
                    await currentTimeEntry.StopAsync ();

                    // Ping analytics
                    ServiceContainer.Resolve<ITracker>().SendTimerStopEvent (TimerStopSource.App);
                } else if (timeEntryManager != null) {
                    currentTimeEntry = (TimeEntryModel)timeEntryManager.Draft;
                    if (currentTimeEntry == null) {
                        return;
                    }

                    await currentTimeEntry.StartAsync ();

                    var controllers = new List<UIViewController> (parentController.NavigationController.ViewControllers);
                    controllers.Add (new EditTimeEntryViewController (currentTimeEntry));
                    if (ServiceContainer.Resolve<SettingsStore> ().ChooseProjectForNew) {
                        controllers.Add (new ProjectSelectionViewController (currentTimeEntry));
                    }
                    parentController.NavigationController.SetViewControllers (controllers.ToArray (), true);

                    // Ping analytics
                    ServiceContainer.Resolve<ITracker>().SendTimerStartEvent (TimerStartSource.AppNew);
                }
            } finally {
                isActing = false;
            }
        }
        protected BaseDateTimeDialogFragment (TimeEntryModel model) : base ()
        {
            var args = new Bundle ();
            args.PutString (TimeEntryIdArgument, model.Id.ToString ());

            Arguments = args;
        }
Exemple #7
0
        public EditTimeEntryFragment (TimeEntryModel model)
        {
            var args = new Bundle ();
            args.PutString (TimeEntryIdArgument, model.Id.ToString ());

            Arguments = args;
        }
        public async void StartStopTimeEntry()
        {
            if (isActing) {
                return;
            }
            isActing = true;

            try {
                if (currentTimeEntry != null && currentTimeEntry.State == TimeEntryState.Running) {
                    await currentTimeEntry.StopAsync ();

                    // Ping analytics
                    ServiceContainer.Resolve<ITracker>().SendTimerStopEvent (TimerStopSource.Widget);
                } else if (timeEntryManager != null) {
                    currentTimeEntry = (TimeEntryModel)timeEntryManager.Draft;
                    if (currentTimeEntry == null) {
                        return;
                    }
                    await currentTimeEntry.StartAsync ();

                    // Show new screen on platform
                    widgetUpdateService.ShowNewTimeEntryScreen (currentTimeEntry);

                    // Ping analytics
                    ServiceContainer.Resolve<ITracker>().SendTimerStartEvent (TimerStartSource.WidgetNew);
                }
            } finally {
                isActing = false;
            }
        }
 public static async Task<EditTimeEntryGroupViewModel> Init (List<string> timeEntryIds)
 {
     var timeEntryList = await GetTimeEntryDataList (timeEntryIds);
     var model = new TimeEntryModel (timeEntryList.Last ());
     await model.LoadAsync ();
     return new EditTimeEntryGroupViewModel (model, timeEntryList);
 }
        protected override void OnCreateActivity (Bundle state)
        {
            base.OnCreateActivity (state);

            var actionBarView = CreateDoneActionBarView ();
            DoneFrameLayout = actionBarView.FindViewById<FrameLayout> (Resource.Id.DoneFrameLayout);
            DoneFrameLayout.Click += OnDoneFrameLayoutClick;

            ActionBar.SetDisplayOptions (
                ActionBarDisplayOptions.ShowCustom,
                (ActionBarDisplayOptions)((int)ActionBarDisplayOptions.ShowCustom
                | (int)ActionBarDisplayOptions.ShowHome
                | (int)ActionBarDisplayOptions.ShowTitle));
            ActionBar.CustomView = actionBarView;

            SetContentView (Resource.Layout.EditTimeEntryActivity);

            if (state == null) {
                model = GetModelFromIntent ();
                if (model == null) {
                    Finish ();
                } else {
                    FragmentManager.BeginTransaction ()
                        .Add (Resource.Id.FrameLayout, new EditTimeEntryFragment (model))
                        .Commit ();
                }
            }
        }
Exemple #11
0
        public EditTimeEntryViewController (TimeEntryModel model)
        {
            this.model = model;

            tagsView = new TimeEntryTagsView (model.Id);

            timerController = new TimerNavigationController (model);
        }
        public void Dispose ()
        {
            durationTimer.Elapsed -= DurationTimerCallback;
            durationTimer.Dispose ();

            model.PropertyChanged -= OnPropertyChange;
            model = null;
        }
        public static bool TryShow (FragmentManager fragmentManager, TimeEntryModel model)
        {
            var settingsStore = ServiceContainer.Resolve<SettingsStore> ();
            if (settingsStore.ReadContinueDialog)
                return false;

            new RecentTimeEntryContinueDialogFragment (model).Show (fragmentManager, "notice_dialog");
            return true;
        }
        private void ContinueTimeEntry (TimeEntryModel model)
        {
            var entry = model.Continue ();

            var bus = ServiceContainer.Resolve<MessageBus> ();
            bus.Send (new UserTimeEntryStateChangeMessage (this, entry));

            DurOnlyNoticeDialogFragment.TryShow (FragmentManager);
        }
        public override void OnCreate (Bundle state)
        {
            base.OnCreate (state);

            model = Model.ById<TimeEntryModel> (TimeEntryId);
            if (model == null) {
                Dismiss ();
            }
        }
 private async void LoadData ()
 {
     model = new TimeEntryModel (TimeEntryId);
     await model.LoadAsync ();
     if (model.Workspace == null || model.Workspace.Id == Guid.Empty) {
         // Invalid model, do nothing.
     } else {
         modelLoaded = true;
     }
 }
        public override void OnCreate (Bundle state)
        {
            base.OnCreate (state);

            timeEntry = Model.ById<TimeEntryModel> (TimeEntryId);
            workspace = Model.ById<WorkspaceModel> (WorkspaceId);
            if (workspace == null) {
                Dismiss ();
            }
        }
 private async void LoadData ()
 {
     model = new TimeEntryModel (TimeEntryId);
     await model.LoadAsync ();
     if (model.Workspace == null || model.Workspace.Id == Guid.Empty) {
         Dismiss ();
     } else {
         modelLoaded = true;
     }
 }
        public void OnStart ()
        {
            currentEntry = TimeEntryModel.FindRunning () ?? TimeEntryModel.GetDraft ();

            // Start listening for changes model changes
            var bus = ServiceContainer.Resolve<MessageBus> ();
            subscriptionModelChanged = bus.Subscribe<ModelChangedMessage> (OnModelChanged);

            canRebind = true;
            Rebind ();
        }
        EditTimeEntryViewModel (TimeEntryModel model, List<TagData> tagList)
        {
            this.model = model;
            durationTimer = new Timer ();
            TagList = tagList;

            model.PropertyChanged += OnPropertyChange;
            durationTimer.Elapsed += DurationTimerCallback;

            ServiceContainer.Resolve<ITracker> ().CurrentScreen = "Edit Time Entry";
            UpdateView ();
        }
        public CreateProjectDialogFragment (TimeEntryModel timeEntry, WorkspaceModel workspace, int color)
        {
            var args = new Bundle ();

            if (timeEntry != null) {
                args.PutString (TimeEntryIdArgument, timeEntry.Id.ToString ());
            }
            args.PutString (WorkspaceIdArgument, workspace.Id.ToString ());
            args.PutInt (ProjectColorArgument, color);

            Arguments = args;
        }
        EditTimeEntryGroupViewModel (TimeEntryModel model, List<TimeEntryData> timeEntryList)
        {
            this.model = model;
            this.timeEntryList = timeEntryList;
            this.durationTimer = new Timer();

            this.model.PropertyChanged += OnPropertyChange;
            this.durationTimer.Elapsed += DurationTimerCallback;

            ServiceContainer.Resolve<ITracker> ().CurrentScreen = "Edit Grouped Time Entry";
            UpdateView ();
        }
        private void OnActiveTimeEntryChanged ()
        {
            var data = TimeEntryManager.ActiveTimeEntry;

            if (activeTimeEntryModel == null) {
                activeTimeEntryModel = new TimeEntryModel (data);
            } else {
                activeTimeEntryModel.Data = data;
            }

            SyncNotification ();
        }
 public void ShowNewTimeEntryScreen (TimeEntryModel currentTimeEntry)
 {
     var startAppIntent = new Intent (Intent.ActionMain)
     .AddCategory (Intent.CategoryLauncher)
     .AddFlags (ActivityFlags.NewTask)
     .SetComponent (
         new ComponentName (
             context.ApplicationContext.PackageName,
             "toggl.joey.ui.activities.MainDrawerActivity"
         )
     );
     context.StartActivity (startAppIntent);
 }
        public override void OnCreate (Bundle state)
        {
            base.OnCreate (state);

            model = new TimeEntryModel (TimeEntryId);
            model.PropertyChanged += OnModelPropertyChanged;

            workspaceTagsView = new WorkspaceTagsView (WorkspaceId);
            workspaceTagsView.Updated += OnWorkspaceTagsUpdated;

            LoadModel ();
            LoadTags ();
        }
        public override async void OnListItemClick(ListView l, View v, int position, long id)
        {
            RecentTimeEntriesAdapter adapter = null;

            if (l.Adapter is HeaderViewListAdapter)
            {
                var headerAdapter = (HeaderViewListAdapter)l.Adapter;
                adapter = headerAdapter.WrappedAdapter as RecentTimeEntriesAdapter;
                // Adjust the position by taking into account the fact that we've got headers
                position -= headerAdapter.HeadersCount;
            }
            else if (l.Adapter is RecentTimeEntriesAdapter)
            {
                adapter = (RecentTimeEntriesAdapter)l.Adapter;
            }

            if (adapter == null || position < 0 || position >= adapter.Count)
            {
                return;
            }

            var data = adapter.GetEntry(position);

            if (data == null)
            {
                return;
            }

            var model = new TimeEntryModel(data);

            // Show a notice about tapping on entries acts as continue.
            if (RecentTimeEntryContinueDialogFragment.TryShow(FragmentManager, model))
            {
                return;
            }

            // Scroll to top (where the new model will appear)
            ListView.SmoothScrollToPosition(0);

            DurOnlyNoticeDialogFragment.TryShow(FragmentManager);

            var entry = await model.ContinueAsync();

            // Notify that the user explicitly started something
            var bus = ServiceContainer.Resolve <MessageBus> ();

            bus.Send(new UserTimeEntryStateChangeMessage(this, entry));

            // Ping analytics
            ServiceContainer.Resolve <ITracker> ().SendTimerStartEvent(TimerStartSource.AppContinue);
        }
Exemple #27
0
        public async Task <Guid> CreateTimeEntry(int userId, TimeEntryModel data)
        {
            CreateTimeEntry request = new Dto.CreateTimeEntry()
            {
                UserId      = userId,
                EntryDate   = data.EntryDate,
                Hours       = data.Hours,
                ProjectId   = data.ProjectId,
                ProjectName = data.ProjectName
            };
            var response = await timeTrackerApiClient.PostAsync <CreateTimeEntry, CreateTimeEntryResponse>($"/timeentries", request);

            return(response.TimeEntryId);
        }
Exemple #28
0
        private async void LoadRequestedModel ()
        {
            var store = ServiceContainer.Resolve<IDataStore> ();

            var rows = await store.Table<TimeEntryData> ()
                .QueryAsync (r => r.Id == TimeEntryId && r.DeletedAt == null);
            var data = rows.FirstOrDefault ();

            if (data != null) {
                TimeEntry = new TimeEntryModel (data);
            } else {
                ResetModel ();
            }
        }
Exemple #29
0
        protected override void Rebind()
        {
            if (TimeEntry == null || !CanRebind)
            {
                return;
            }

            if (TimeEntry.State == TimeEntryState.Finished || TimeEntry.DeletedAt.HasValue)
            {
                TimeEntry = TimeEntryModel.GetDraft();
            }

            base.Rebind();
        }
Exemple #30
0
        private async void LoadData()
        {
            model = new TimeEntryModel(TimeEntryId);
            await model.LoadAsync();

            if (model.Workspace == null || model.Workspace.Id == Guid.Empty)
            {
                Dismiss();
            }
            else
            {
                modelLoaded = true;
            }
        }
Exemple #31
0
        private async void LoadData()
        {
            model = new TimeEntryModel(TimeEntryId);
            await model.LoadAsync();

            if (model.Workspace == null || model.Workspace.Id == Guid.Empty)
            {
                // Invalid model, do nothing.
            }
            else
            {
                modelLoaded = true;
            }
        }
Exemple #32
0
        public void ShowNewTimeEntryScreen(TimeEntryModel currentTimeEntry)
        {
            var startAppIntent = new Intent(Intent.ActionMain)
                                 .AddCategory(Intent.CategoryLauncher)
                                 .AddFlags(ActivityFlags.NewTask)
                                 .SetComponent(
                new ComponentName(
                    context.ApplicationContext.PackageName,
                    "toggl.joey.ui.activities.MainDrawerActivity"
                    )
                );

            context.StartActivity(startAppIntent);
        }
        public override void OnDestroy ()
        {
            if (model != null) {
                model.PropertyChanged -= OnModelPropertyChanged;
                model = null;
            }
            if (workspaceTagsView != null) {
                workspaceTagsView.Updated -= OnWorkspaceTagsUpdated;
                workspaceTagsView.Dispose ();
                workspaceTagsView = null;
            }

            base.OnDestroy ();
        }
            public void Add(TimeEntryModel entry)
            {
                var grp = data.FirstOrDefault((g) => g.CanContain(entry));

                if (grp == null)
                {
                    grp = new Group(entry);
                    data.Add(grp);
                }
                else
                {
                    grp.Add(entry);
                }
            }
        public AndroidNotificationManager ()
        {
            ctx = ServiceContainer.Resolve<Context> ();
            notificationManager = (NotificationManager)ctx.GetSystemService (Context.NotificationService);
            runningBuilder = CreateRunningNotificationBuilder (ctx);
            idleBuilder = CreateIdleNotificationBuilder (ctx);

            currentTimeEntry = TimeEntryModel.FindRunning ();
            SyncNotification ();

            var bus = ServiceContainer.Resolve<MessageBus> ();
            subscriptionModelChanged = bus.Subscribe<ModelChangedMessage> (OnModelChanged);
            subscriptionSettingChanged = bus.Subscribe<SettingChangedMessage> (OnSettingChanged);
            subscriptionAuthChanged = bus.Subscribe<AuthChangedMessage> (OnAuthChanged);
        }
        private void OnActiveTimeEntryChanged()
        {
            var data = TimeEntryManager.ActiveTimeEntry;

            if (activeTimeEntryModel == null)
            {
                activeTimeEntryModel = new TimeEntryModel(data);
            }
            else
            {
                activeTimeEntryModel.Data = data;
            }

            SyncNotification();
        }
Exemple #37
0
        public async Task <IActionResult> Delete(TimeEntryModel timeEntryModel)
        {
            try
            {
                TimeNotesUser identityUser = await _userManager.GetUserAsync(User);

                await _hourPointsServices.RemoveTimeEntryFromHourPoints(Guid.Parse(identityUser.Id), timeEntryModel.Id);

                return(RedirectToAction(nameof(Index)));
            }
            catch (Exception ex)
            {
                return(View(timeEntryModel));
            }
        }
Exemple #38
0
 private string GetProjectName(TimeEntryModel entry)
 {
     if (entry == null)
     {
         return(null);
     }
     else if (entry.Project != null)
     {
         return(entry.Project.Name);
     }
     else
     {
         return(ctx.Resources.GetString(Resource.String.RunningNotificationNoProject));
     }
 }
Exemple #39
0
        public async Task <IActionResult> Edit(TimeEntryModel timeEntryModel)
        {
            try
            {
                TimeNotesUser identityUser = await _userManager.GetUserAsync(User);

                await _hourPointsServices.UpdateTimeEntryDateHourPointed(timeEntryModel.HourPointsId, timeEntryModel.Id, Guid.Parse(identityUser.Id), timeEntryModel.DateHourPointed);

                return(RedirectToAction(nameof(Index)));
            }
            catch
            {
                return(View());
            }
        }
        private async void OnNavigationBarRightClicked(object sender, EventArgs args)
        {
            if (isSaving)
            {
                return;
            }

            try {
                isSaving = true;
                var duration = TimeSpan.Zero;

                var entered = durationView.EnteredDuration;
                if (model == null || model.State == TimeEntryState.New)
                {
                    duration = new TimeSpan(entered.Hours, entered.Minutes, 0);
                }
                else
                {
                    duration = model.GetDuration();
                    // Keep the current seconds and milliseconds
                    duration = new TimeSpan(0, entered.Hours, entered.Minutes, duration.Seconds, duration.Milliseconds);
                }

                if (model == null)
                {
                    var m = await TimeEntryModel.CreateFinishedAsync(duration);

                    var controller = new EditTimeEntryViewController(m);

                    // Replace self with edit controller on the stack
                    var vcs = NavigationController.ViewControllers;
                    vcs [vcs.Length - 1] = controller;
                    NavigationController.SetViewControllers(vcs, true);

                    // Ping analytics
                    ServiceContainer.Resolve <ITracker>().SendTimerStartEvent(TimerStartSource.AppManual);
                }
                else
                {
                    model.SetDuration(duration);
                    await model.SaveAsync();

                    NavigationController.PopViewController(true);
                }
            } finally {
                isSaving = false;
            }
        }
Exemple #41
0
        public async Task <IActionResult> Create(TimeEntryModel timeEntryModel)
        {
            if (ModelState.IsValid)
            {
                TimeNotesUser identityUser = await _userManager.GetUserAsync(User);

                if (identityUser is null)
                {
                    throw new ArgumentException($"Usuário não encontrado na base de dados.");
                }

                await _hourPointsServices.AddTimeEntryToHourPoints(Guid.Parse(identityUser.Id), _mapper.Map <TimeEntry>(timeEntryModel));
            }

            return(RedirectToAction(nameof(Index)));
        }
        private async void LoadData()
        {
            workspace = new WorkspaceModel(WorkspaceId);
            if (TimeEntryId != Guid.Empty)
            {
                timeEntry = new TimeEntryModel(TimeEntryId);
                await Task.WhenAll(workspace.LoadAsync(), timeEntry.LoadAsync());
            }
            else
            {
                await workspace.LoadAsync();
            }

            modelsLoaded = true;
            ValidateTagName();
        }
        public void ShowNewTimeEntryScreen(TimeEntryModel currentTimeEntry)
        {
            var topVCList = new List <UIViewController> (rootController.ChildViewControllers);

            if (topVCList.Count > 0)
            {
                // Get current VC's navigation
                var controllers = new List <UIViewController> (topVCList[0].NavigationController.ViewControllers);
                controllers.Add(new EditTimeEntryViewController(currentTimeEntry));
                if (ServiceContainer.Resolve <SettingsStore> ().ChooseProjectForNew)
                {
                    controllers.Add(new ProjectSelectionViewController(currentTimeEntry));
                }
                topVCList[0].NavigationController.SetViewControllers(controllers.ToArray(), true);
            }
        }
Exemple #44
0
            protected override async Task OnContinueAsync()
            {
                if (DataSource == null)
                {
                    return;
                }
                await TimeEntryModel.ContinueAsync(DataSource);

                if (ContinueCallback != null)
                {
                    ContinueCallback(DataSource);
                }

                // Ping analytics
                ServiceContainer.Resolve <ITracker>().SendTimerStartEvent(TimerStartSource.AppContinue);
            }
Exemple #45
0
        public AndroidNotificationManager()
        {
            ctx = ServiceContainer.Resolve <Context> ();
            notificationManager = (NotificationManager)ctx.GetSystemService(Context.NotificationService);
            runningBuilder      = CreateRunningNotificationBuilder(ctx);
            idleBuilder         = CreateIdleNotificationBuilder(ctx);

            currentTimeEntry = TimeEntryModel.FindRunning();
            SyncNotification();

            var bus = ServiceContainer.Resolve <MessageBus> ();

            subscriptionModelChanged   = bus.Subscribe <ModelChangedMessage> (OnModelChanged);
            subscriptionSettingChanged = bus.Subscribe <SettingChangedMessage> (OnSettingChanged);
            subscriptionAuthChanged    = bus.Subscribe <AuthChangedMessage> (OnAuthChanged);
        }
        private void SyncRunningModel()
        {
            var data = RunningTimeEntryData;

            if (data != null)
            {
                if (backingRunningTimeEntry == null)
                {
                    backingRunningTimeEntry = new TimeEntryModel(data);
                }
                else
                {
                    backingRunningTimeEntry.Data = data;
                }
            }
        }
        public override void OnDestroy()
        {
            if (model != null)
            {
                model.PropertyChanged -= OnModelPropertyChanged;
                model = null;
            }
            if (workspaceTagsView != null)
            {
                workspaceTagsView.Updated -= OnWorkspaceTagsUpdated;
                workspaceTagsView.Dispose();
                workspaceTagsView = null;
            }

            base.OnDestroy();
        }
Exemple #48
0
        private async void LoadData()
        {
            timeEntry = new TimeEntryModel(TimeEntryId);
            workspace = new WorkspaceModel(WorkspaceId);
            await Task.WhenAll(timeEntry.LoadAsync(), workspace.LoadAsync());

            if (timeEntry.Workspace == null || timeEntry.Workspace.Id == Guid.Empty)
            {
                // TODO: Better logic to determine if the models are actually non-existent
                Dismiss();
            }
            else
            {
                modelsLoaded = true;
            }
        }
        public async Task <ActionResult <TimeEntryModel> > GetById(long id)
        {
            _logger.LogInformation($"Getting a time entry with id: {id}");

            var timeEntry = await _dbContext.TimeEntries
                            .Include(x => x.Project)
                            .Include(x => x.Project.Client)
                            .Include(x => x.User)
                            .SingleOrDefaultAsync(x => x.Id == id);

            if (timeEntry == null)
            {
                return(NotFound());
            }
            return(TimeEntryModel.FromTimeEntry(timeEntry));
        }
        public void TestUserLogout()
        {
            RunAsync(async delegate {
                var te1 = TimeEntryModel.GetDraft();
                te1     = await TimeEntryModel.StartAsync(te1);

                Assert.AreEqual(te1.Id, ActiveManager.ActiveTimeEntry.Id);
                Assert.AreEqual(user.Id, ActiveManager.ActiveTimeEntry.UserId);

                ActiveManager.PropertyChanged += (sender, e) => {
                    Assert.AreEqual(ActiveManager.ActiveTimeEntry.UserId, Guid.Empty);
                    Assert.AreEqual(ActiveManager.ActiveTimeEntry.State, TimeEntryState.New);
                };
                ServiceContainer.Resolve <AuthManager> ().Forget();
            });
        }
        private void OnActionButtonTouchUpInside (object sender, EventArgs e)
        {
            if (currentTimeEntry == null) {
                currentTimeEntry = TimeEntryModel.GetDraft ();
                currentTimeEntry.Start ();

                var controllers = new List<UIViewController> (parentController.NavigationController.ViewControllers);
                controllers.Add (new EditTimeEntryViewController (currentTimeEntry));
                if (ServiceContainer.Resolve<SettingsStore> ().ChooseProjectForNew) {
                    controllers.Add (new ProjectSelectionViewController (currentTimeEntry));
                }
                parentController.NavigationController.SetViewControllers (controllers.ToArray (), true);
            } else {
                currentTimeEntry.Stop ();
            }
        }
Exemple #52
0
        public async Task StartStopTimeEntry()
        {
            if (activeTimeEntryManager.IsRunning)
            {
                await TimeEntryModel.StopAsync(activeTimeEntryManager.ActiveTimeEntry);

                ServiceContainer.Resolve <ITracker>().SendTimerStopEvent(TimerStopSource.Widget);
            }
            else
            {
                var startedEntry = await TimeEntryModel.StartAsync(TimeEntryModel.GetDraft());

                // Show new screen on platform
                widgetUpdateService.ShowNewTimeEntryScreen(new TimeEntryModel(startedEntry));
                ServiceContainer.Resolve <ITracker>().SendTimerStartEvent(TimerStartSource.WidgetNew);
            }
        }
        public static async Task StartStopTimeEntry (Context ctx)
        {
            var manager = ServiceContainer.Resolve<ActiveTimeEntryManager> ();
            if (manager.Active == null) {
                return;
            }

            var active = new TimeEntryModel (manager.Active);
            if (manager.Active.State == TimeEntryState.Running) {
                await active.StopAsync ();
                ServiceContainer.Resolve<ITracker> ().SendTimerStopEvent (TimerStopSource.Watch);
            } else {
                active.Data.Description = ctx.Resources.GetString (Resource.String.WearEntryDefaultDescription);
                await active.StartAsync ();
                ServiceContainer.Resolve<ITracker> ().SendTimerStartEvent (TimerStartSource.WatchStart);
            }
        }
        private async void LoadTimeEntries()
        {
            if (currentUserId == null)
            {
                return;
            }

            var userId = currentUserId.Value;
            var store  = ServiceContainer.Resolve <IDataStore> ();

            // Load data:
            var draftTask   = TimeEntryModel.GetDraftAsync();
            var runningTask = store.Table <TimeEntryData> ()
                              .QueryAsync(r => r.State == TimeEntryState.Running && r.DeletedAt == null && r.UserId == userId);

            await Task.WhenAll(draftTask, runningTask);

            // Check that the user hasn't changed in the mean time
            if (userId != currentUserId)
            {
                return;
            }

            // Update data
            var draftModel = draftTask.Result;

            if (draftModel != null)
            {
                var draftData = draftModel.Data;
                if (!draftEntries.UpdateData(draftData))
                {
                    draftEntries.Add(draftData);
                }
            }

            foreach (var entry in runningTask.Result)
            {
                if (!runningEntries.UpdateData(entry))
                {
                    runningEntries.Add(entry);
                }
            }

            UpdateProperties();
            TryEnforceSingleRunning();
        }
Exemple #55
0
        private static async Task FindAndStopRunning()
        {
            var userId    = ServiceContainer.Resolve <AuthManager> ().GetUserId();
            var dataStore = ServiceContainer.Resolve <IDataStore> ();

            // Find running tasks:
            var runningEntries = await dataStore.Table <TimeEntryData> ()
                                 .Where(r => r.State == TimeEntryState.Running && r.DeletedAt == null && r.UserId == userId)
                                 .ToListAsync()
                                 .ConfigureAwait(false);

            var stopTasks = runningEntries.Select(data => TimeEntryModel.StopAsync(data));
            await Task.WhenAll(stopTasks).ConfigureAwait(false);

            // Ping analytics
            ServiceContainer.Resolve <ITracker> ().SendTimerStopEvent(TimerStopSource.Notification);
        }
Exemple #56
0
        public static async Task <List <SimpleTimeEntryData> > GetTimeEntryData()
        {
            var store  = ServiceContainer.Resolve <IDataStore> ();
            var userId = ServiceContainer.Resolve <AuthManager> ().GetUserId();

            var entries = await store.Table <TimeEntryData>()
                          .Where(r => r.State != TimeEntryState.New &&
                                 r.DeletedAt == null &&
                                 r.UserId == userId)
                          .OrderByDescending(r => r.StartTime)
                          .ToListAsync();

            var uniqueEntries = entries.GroupBy(x => new { x.ProjectId, x.Description })
                                .Select(grp => grp.First())
                                .Take(itemCount)
                                .ToList();

            var simpleEntries = new List <SimpleTimeEntryData> ();

            foreach (var entry in uniqueEntries)
            {
                var model = new TimeEntryModel(entry);
                await model.LoadAsync();

                int    color       = 0;
                String projectName = "";
                if (model.Project != null)
                {
                    color       = model.Project.Color;
                    projectName = model.Project.Name;
                }
                var colorString = ProjectModel.HexColors [color % ProjectModel.HexColors.Length];

                simpleEntries.Add(
                    new SimpleTimeEntryData {
                    Id           = entry.Id,
                    IsRunning    = entry.State == TimeEntryState.Running,
                    Description  = entry.Description,
                    Project      = projectName,
                    ProjectColor = colorString,
                    StartTime    = entry.StartTime,
                    StopTime     = entry.StopTime ?? DateTime.MinValue
                });
            }
            return(simpleEntries);
        }
Exemple #57
0
        private async Task RemoveItemPermanentlyAsync(TimeEntryHolder holder)
        {
            if (holder == null)
            {
                return;
            }

            if (holder.TimeEntryDataList.Count > 1)
            {
                var timeEntryGroup = new TimeEntryGroup(holder.TimeEntryDataList);
                await timeEntryGroup.DeleteAsync();
            }
            else
            {
                await TimeEntryModel.DeleteTimeEntryDataAsync(holder.TimeEntryDataList.First());
            }
        }
Exemple #58
0
        public void Stop()
        {
            // Stop listening to timer changes
            isStarted = false;

            if (subscriptionModelChanged != null)
            {
                var bus = ServiceContainer.Resolve <MessageBus> ();
                bus.Unsubscribe(subscriptionModelChanged);
                subscriptionModelChanged = null;
            }

            if (showRunning)
            {
                currentTimeEntry = null;
            }
        }
Exemple #59
0
        public void Start()
        {
            // Start listening to timer changes
            if (showRunning)
            {
                currentTimeEntry = TimeEntryModel.FindRunning();
            }

            if (subscriptionModelChanged == null)
            {
                var bus = ServiceContainer.Resolve <MessageBus> ();
                subscriptionModelChanged = bus.Subscribe <ModelChangedMessage> (OnModelChanged);
            }

            isStarted = true;
            Rebind();
        }
        public void TestActiveEntryAfterContinue()
        {
            RunAsync(async delegate {
                var startTime = Time.UtcNow - TimeSpan.FromHours(2);
                var te1       = await DataStore.PutAsync(new TimeEntryData {
                    Description = "Morning meeting",
                    State       = TimeEntryState.Finished,
                    StartTime   = startTime,
                    ModifiedAt  = startTime,
                    IsDirty     = true,
                    WorkspaceId = workspace.Id,
                    UserId      = user.Id,
                });

                startTime = Time.UtcNow - TimeSpan.FromHours(1);
                var te2   = await DataStore.PutAsync(new TimeEntryData {
                    Description = "Morning coffee",
                    State       = TimeEntryState.Finished,
                    StartTime   = startTime,
                    ModifiedAt  = startTime,
                    IsDirty     = true,
                    WorkspaceId = workspace.Id,
                    UserId      = user.Id,
                });

                Assert.AreNotEqual(te1.Id, ActiveManager.ActiveTimeEntry.Id);
                Assert.AreNotEqual(te2.Id, ActiveManager.ActiveTimeEntry.Id);

                te1 = await TimeEntryModel.ContinueAsync(te1);
                te2 = await GetEntry(te2.Id);

                Assert.AreEqual(te1.Id, ActiveManager.ActiveTimeEntry.Id);
                Assert.IsTrue(ActiveManager.IsRunning);
                Assert.AreEqual(te1.State, TimeEntryState.Running);
                Assert.AreEqual(te2.State, TimeEntryState.Finished);

                te2 = await TimeEntryModel.ContinueAsync(te2);
                te1 = await GetEntry(te1.Id);

                Assert.AreEqual(te2.Id, ActiveManager.ActiveTimeEntry.Id);
                Assert.IsTrue(ActiveManager.IsRunning);
                Assert.AreEqual(te2.State, TimeEntryState.Running);
                Assert.AreEqual(te1.State, TimeEntryState.Finished);
            });
        }