private void RunOneDriveProviderLinkWizard()
        {
            OneDriveCartridgeProvider provider = GetOneDriveProvider();

            // Coerce value.
            if (provider.CartridgeCount == 0 ||
                System.Windows.MessageBox.Show("Cartridges and savegames from a previous OneDrive link are still stored locally. They may be deleted, depending on the OneDrive account you are about to link to.", "Overwriting Link", MessageBoxButton.OKCancel) == System.Windows.MessageBoxResult.OK)
            {
                // Progress bar.
                _progress[ProgressSourceOneDriveLink] = true;

                // Starts the link.
                provider.BeginLink();
            }
            else
            {
                // Restores the previous state.
                IsOneDriveProviderEnabled = _appSettings.ProviderLinkedHint;
            }
        }
        private void OnIsOneDriveProviderEnabledChanged(bool newValue)
        {
            if (!_isReady)
            {
                return;
            }

            OneDriveCartridgeProvider provider = GetOneDriveProvider();

            if (!newValue && _appSettings.ProviderLinkedHint)
            {
                // Coerce value.
                if (System.Windows.MessageBox.Show("Geowigo will forget the link to your OneDrive account. Cartridges and savegames will be kept and playable until you link to OneDrive again.", "Unlink OneDrive", MessageBoxButton.OKCancel) == System.Windows.MessageBoxResult.OK)
                {
                    // Unlink.
                    try
                    {
                        provider.Unlink();
                        _appSettings.ProviderLinkedHint = false;
                    }
                    catch (Exception e)
                    {
                        DebugUtils.DumpException(e, "OneDrive unlink", true);
                        System.Windows.MessageBox.Show("An error occurred while trying to unlink your OneDrive account. Make sure the device can reach the internet.", "Error", MessageBoxButton.OK);
                        _appSettings.ProviderLinkedHint = true;
                    }
                }
                else
                {
                    // Restores the previous state.
                    IsOneDriveProviderEnabled = _appSettings.ProviderLinkedHint;
                }
            }
            else if (newValue && !_appSettings.ProviderLinkedHint)
            {
                // Starts linking.
                RunOneDriveProviderLinkWizard();
            }

            RefreshOneDrive();
        }
        private void RefreshOneDrive()
        {
            // Refresh provider info.
            OneDriveCartridgeProvider provider = GetOneDriveProvider();

            if (provider == null)
            {
                // We're sure the provider is not linked.
                _appSettings.ProviderLinkedHint = false;
                IsOneDriveProviderEnabled       = false;
            }
            else if (provider.IsLinked)
            {
                // We know the provider is linked, keep this memory.
                _appSettings.ProviderLinkedHint = true;
                IsOneDriveProviderEnabled       = true;
            }
            else
            {
                // We're not sure if the provider is unlinked, or if the internet is just off.
                // Use previously stored data to figure it out.
                IsOneDriveProviderEnabled = _appSettings.ProviderLinkedHint;
            }

            // Refresh simple status.
            string simpleStatus = null;

            if (provider != null && (provider.IsLinked || provider.CartridgeCount > 0))
            {
                simpleStatus = "";

                if (provider.IsLinked && !String.IsNullOrEmpty(provider.OwnerName))
                {
                    simpleStatus += provider.OwnerName + ", ";
                }

                simpleStatus += String.Format("{0} cartridges", provider.CartridgeCount);
            }
            OneDriveProviderSimpleStatus = simpleStatus;

            // Refresh advanced status.
            string advancedStatus = null;

            if (provider != null)
            {
                if (provider.IsLinked || provider.IsSyncing)
                {
                    // Provider is linked: sync status.

                    if (provider.IsSyncing)
                    {
                        advancedStatus = "Syncing...";
                    }
                    else
                    {
                        advancedStatus = "Synchronized. ";

                        advancedStatus += "Downloads from OneDrive folder /Geowigo. ";

                        if (_appSettings.CanProviderUpload)
                        {
                            advancedStatus += "Uploads to OneDrive folder /Geowigo/Uploads. ";
                        }
                        else
                        {
                            advancedStatus += "Upload disabled. ";
                        }
                    }
                }
                else if (provider.CartridgeCount > 0)
                {
                    // Provider not linked but local content exists.

                    if (_appSettings.ProviderLinkedHint)
                    {
                        advancedStatus = "Cartridges and savegames will not be synchronized with the cloud until the device can reach the Internet.";
                    }
                    else
                    {
                        advancedStatus = "Cartridges and savegames are not synchronized with the cloud unless you link your OneDrive account.";
                    }
                }
            }
            OneDriveProviderAdvancedStatus = advancedStatus;
        }