private async System.Threading.Tasks.Task FinishCreateAccount(string username, string localToken, string token, long accountId, int deviceId, string email)
        {
            if (DefaultAccountToUpgrade != null)
            {
                if (DefaultAccountToUpgrade.IsOnlineAccount)
                {
                    throw new Exception("Should be an offline account. This implies it got created but for some reason stayed on this page.");
                }

                DefaultAccountToUpgrade.Username   = username;
                DefaultAccountToUpgrade.LocalToken = localToken;
                DefaultAccountToUpgrade.Token      = token;
                DefaultAccountToUpgrade.AccountId  = accountId;
                DefaultAccountToUpgrade.DeviceId   = deviceId;

                await AccountsManager.Save(DefaultAccountToUpgrade);

                TelemetryExtension.Current?.TrackEvent("CreatedAccountFromDefault");

                // Transfer the settings
                try
                {
                    await SavedGradeScalesManager.TransferToOnlineAccountAsync(DefaultAccountToUpgrade.LocalAccountId, DefaultAccountToUpgrade.AccountId);
                }

                catch (Exception ex)
                {
                    TelemetryExtension.Current?.TrackException(ex);
                }

                // Make sure to update user info for telemetry
                TelemetryExtension.Current?.UpdateCurrentUser(DefaultAccountToUpgrade);

                // Remove this popup, and show a new one saying success!
                // We have to show first before removing otherwise iOS never shows it
                var parent = Parent;
                parent.ShowPopup(new SuccessfullyCreatedAccountViewModel(parent)
                {
                    Username = username,
                    Email    = email
                });
                base.RemoveViewModel();

                // Trigger a sync (without waiting) so all their content uploads
                Sync.StartSyncAccount(DefaultAccountToUpgrade);
            }
            else
            {
                var account = await AccountsManager.CreateAndInitializeAccountAsync(username, localToken, token, accountId, deviceId);

                if (account != null)
                {
                    // Take us to the account
                    var dontWait = FindAncestor <MainWindowViewModel>().SetCurrentAccount(account);
                }
            }
        }
        public async void Save()
        {
            try
            {
                string name = Name.Trim();

                if (name.Length == 0)
                {
                    await new PortableMessageDialog(PowerPlannerResources.GetString("String_NoNameMessageBody")).ShowAsync();
                    return;
                }

                await TryHandleUserInteractionAsync("Save", async (cancellationTask) =>
                {
                    SavedGradeScalesManager manager = await SavedGradeScalesManager.GetForAccountAsync(MainScreenViewModel.CurrentAccount);
                    cancellationTask.ThrowIfCancellationRequested();

                    if (manager == null)
                    {
                        throw new NullReferenceException("manager was null");
                    }

                    await manager.SaveGradeScale(name, _parameter.Scales);

                    if (_parameter.OnSaved != null)
                    {
                        _parameter.OnSaved.Invoke();
                    }

                    // We cancel after invoking the OnSaved, since otherwise the views wouldn't be updated correctly
                    cancellationTask.ThrowIfCancellationRequested();

                    this.RemoveViewModel();
                }, "Failed to save. Your error has been reported.");
            }

            catch (Exception ex)
            {
                TelemetryExtension.Current?.TrackException(ex);

                await new PortableMessageDialog("Failed to save. Your error has been reported.").ShowAsync();
                return;
            }
        }
        private async System.Threading.Tasks.Task finishConvertingToOnline(AccountDataItem account)
        {
            account.AccountId = _response.AccountId;
            account.DeviceId  = _response.DeviceId;
            //await login.Account.ConvertToOnline();

            await AccountsManager.Save(account);

            // Transfer the settings
            try
            {
                await SavedGradeScalesManager.TransferToOnlineAccountAsync(account.LocalAccountId, account.AccountId);
            }

            catch (Exception ex)
            {
                TelemetryExtension.Current?.TrackException(ex);
            }

            //have it sync, without waiting
            Sync.StartSyncAccount(account);
        }
        private async System.Threading.Tasks.Task FinishCreateAccount(string username, string localToken, string token, long accountId, int deviceId, string email)
        {
            if (DefaultAccountToUpgrade != null)
            {
                if (DefaultAccountToUpgrade.IsOnlineAccount)
                {
                    throw new Exception("Should be an offline account. This implies it got created but for some reason stayed on this page.");
                }

                DefaultAccountToUpgrade.Username            = username;
                DefaultAccountToUpgrade.LocalToken          = localToken;
                DefaultAccountToUpgrade.Token               = token;
                DefaultAccountToUpgrade.AccountId           = accountId;
                DefaultAccountToUpgrade.DeviceId            = deviceId;
                DefaultAccountToUpgrade.NeedsToSyncSettings = true; // Make sure we sync settings so things like week info uploads

                await AccountsManager.Save(DefaultAccountToUpgrade);

                TelemetryExtension.Current?.TrackEvent("CreatedAccountFromDefault", new Dictionary <string, string>()
                {
                    { "NewOnlineAccountId", accountId.ToString() }
                });

                // Make sure to update user info for telemetry
                TelemetryExtension.Current?.UpdateCurrentUser(DefaultAccountToUpgrade);

                // Transfer the settings
                try
                {
                    await SavedGradeScalesManager.TransferToOnlineAccountAsync(DefaultAccountToUpgrade.LocalAccountId, DefaultAccountToUpgrade.AccountId);
                }

                catch (Exception ex)
                {
                    TelemetryExtension.Current?.TrackException(ex);
                }

                try
                {
                    // Trigger a sync so all their content uploads
                    DateTime start = DateTime.UtcNow;

                    var syncResult = await Sync.SyncAccountAsync(DefaultAccountToUpgrade);

                    bool retried = false;
                    if (syncResult.Error != null)
                    {
                        // Try one more time
                        retried    = true;
                        syncResult = await Sync.SyncAccountAsync(DefaultAccountToUpgrade);
                    }

                    var duration = DateTime.UtcNow - start;

                    Dictionary <string, string> properties = new Dictionary <string, string>()
                    {
                        { "Duration", ((int)Math.Ceiling(duration.TotalSeconds)).ToString() }
                    };

                    if (retried)
                    {
                        properties["Retried"] = "true";
                    }

                    if (syncResult.Error != null)
                    {
                        properties["Error"] = syncResult.Error;
                    }

                    TelemetryExtension.Current?.TrackEvent("InitialSyncAfterCreatingAccount", properties);
                }
                catch (Exception ex)
                {
                    TelemetryExtension.Current?.TrackException(ex);
                }

                // Remove this popup, and show a new one saying success!
                // We have to show first before removing otherwise iOS never shows it
                var parent = Parent;
                parent.ShowPopup(new SuccessfullyCreatedAccountViewModel(parent)
                {
                    Username = username,
                    Email    = email
                });
                base.RemoveViewModel();
            }
            else
            {
                var account = await AccountsManager.CreateAndInitializeAccountAsync(username, localToken, token, accountId, deviceId);

                if (account != null)
                {
                    // Take us to the account
                    var dontWait = FindAncestor <MainWindowViewModel>().SetCurrentAccount(account);
                }
            }
        }
        private async System.Threading.Tasks.Task ReloadSavedGradeScalesPicker()
        {
            var account            = MainScreenViewModel.CurrentAccount;
            var savedScalesManager = await SavedGradeScalesManager.GetForAccountAsync(account);

            var savedScales = await savedScalesManager.GetSavedGradeScalesAsync();

            if (!savedScales.Any(i => i.Name.Equals("United States")))
            {
                savedScales.Add(new SavedGradeScale()
                {
                    Name        = "United States",
                    GradeScales = GradeScale.GenerateDefaultScaleWithoutLetters()
                });
            }

            if (!savedScales.Any(i => i.Name.Equals("Eleven-Point System")))
            {
                savedScales.Add(new SavedGradeScale()
                {
                    Name        = "Eleven-Point System",
                    GradeScales = GradeScale.GenerateElevenPointScale()
                });
            }

            if (!savedScales.Any(i => i.Name.Equals("Twelve-Point System")))
            {
                savedScales.Add(new SavedGradeScale()
                {
                    Name        = "Twelve-Point System",
                    GradeScales = GradeScale.GenerateTwelvePointScale()
                });
            }

            if (!savedScales.Any(i => i.Name.Equals("Mexico - 100 Point")))
            {
                savedScales.Add(new SavedGradeScale()
                {
                    Name        = "Mexico - 100 Point",
                    GradeScales = GradeScale.GenerateMexico100PointScale()
                });
            }

            if (!savedScales.Any(i => i.Name.Equals("Mexico - 10 Point")))
            {
                savedScales.Add(new SavedGradeScale()
                {
                    Name        = "Mexico - 10 Point",
                    GradeScales = GradeScale.GenerateMexico10PointScale()
                });
            }

            savedScales.Add(new SavedGradeScale()
            {
                Name = PowerPlannerResources.GetString("String_GradeScaleCustom")
            });

            SavedGradeScales = savedScales;

            UpdateSelectedSavedGradeScale();
        }