/// <summary>
        /// Actually does the update
        /// </summary>
        private async Task KickOffUpdate(bool force, RefCountedDeferral refDeferral)
        {
            TelemetryManager.ReportLog(this, "Updater updating.");
            try
            {
                // Figure out if we need to do a full update
                var fullUpdateFrequencyMin  = UpdateFrequency * CMaxImageCacheCount;
                var timeSinceLastFullUpdate = DateTime.Now - LastFullUpdate;

                if (timeSinceLastFullUpdate.TotalMinutes > fullUpdateFrequencyMin || force)
                {
                    TelemetryManager.ReportLog(this, "Running full update");

                    // Update lock screen images
                    if (IsLockScreenEnabled)
                    {
                        TelemetryManager.ReportLog(this, "Updating lock screen", SeverityLevel.Verbose);

                        // Make a deferral scope object so we can do our work without being killed.
                        // Note! We need release this object or it will hang the app around forever!
                        _lockScreenRefDeferral = refDeferral;
                        _lockScreenRefDeferral.AddRef();

                        // Kick off the update, this will happen async.
                        GetSubredditStories(LockScreenSubredditName, UpdateTypes.LockScreen);
                    }

                    if (IsDesktopEnabled)
                    {
                        TelemetryManager.ReportLog(this, "Updating lock screen", SeverityLevel.Verbose);

                        // Shortcut: If lock screen in enabled and it is the same subreddit just share the same cache. If not,
                        // get the desktop images
                        if (IsLockScreenEnabled && LockScreenSubredditName.Equals(DesktopSubredditName))
                        {
                            TelemetryManager.ReportLog(this, "Desktop same sub as lockscreen, skipping image update.", SeverityLevel.Verbose);
                        }
                        else
                        {
                            TelemetryManager.ReportLog(this, "Updating desktop image", SeverityLevel.Verbose);

                            // Make a deferral scope object so we can do our work without being killed.
                            // Note! We need release this object or it will hang the app around forever!
                            _mDesktopRefDeferral = refDeferral;
                            _mDesktopRefDeferral.AddRef();

                            // Kick off the update, this will happen async.
                            GetSubredditStories(DesktopSubredditName, UpdateTypes.Desktop);
                        }
                    }

                    // Update lock screen images
                    if (IsBandWallpaperEnabled)
                    {
                        TelemetryManager.ReportLog(this, "Updating band wallpaper", SeverityLevel.Verbose);

                        // Make a deferral scope object so we can do our work without being killed.
                        // Note! We need release this object or it will hang the app around forever!
                        _mBandRefDeferral = refDeferral;
                        _mBandRefDeferral.AddRef();

                        // Kick off the update, this will happen async.
                        GetSubredditStories(BandSubredditName, UpdateTypes.Band);
                    }
                }
                // Else full update
                else
                {
                    TelemetryManager.ReportLog(this, "No need for a full update, just rotating.");

                    // If we aren't doing a full update just rotate the images.
                    await DoImageRotation(UpdateTypes.All);

                    // Stop the running state
                    lock (this)
                    {
                        _isRunning = false;
                    }
                }
            }
            catch (Exception e)
            {
                _baconMan.MessageMan.DebugDia("Failed to set background image", e);
                TelemetryManager.ReportUnexpectedEvent(this, "Failed to set background image", e);
            }
        }
        /// <summary>
        /// Rotate a single image type.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private async Task <bool> DoSingleImageRotation(UpdateTypes type)
        {
            // Make sure we should do the update.
            if ((!IsLockScreenEnabled || type != UpdateTypes.LockScreen) &&
                (!IsDesktopEnabled || type != UpdateTypes.Desktop) &&
                (!IsBandWallpaperEnabled || type != UpdateTypes.Band))
            {
                return(true);
            }
            // If the lock screen and desktop are the same subreddit use the same files.
            var fileCacheType = type;

            // If this is a desktop update, and lock is enabled, and they are the same subreddit...
            if (type == UpdateTypes.Desktop && IsLockScreenEnabled && LockScreenSubredditName.Equals(DesktopSubredditName))
            {
                // If they are all the same use the lock screen cache for the desktop.
                fileCacheType = UpdateTypes.LockScreen;
            }

            // Get the current files..
            var files = await GetCurrentCacheImages(fileCacheType);

            TelemetryManager.ReportLog(this, "Current images in cache :" + files.Count);

            if (files.Count == 0)
            {
                return(true);
            }
            var currentIndex = 0;

            switch (type)
            {
            case UpdateTypes.LockScreen:
            {
                // Update the index
                CurrentLockScreenRotationIndex++;
                if (CurrentLockScreenRotationIndex >= files.Count)
                {
                    CurrentLockScreenRotationIndex = 0;
                }
                currentIndex = CurrentLockScreenRotationIndex;
                break;
            }

            case UpdateTypes.Band:
            {
                // Update the index
                CurrentBandRotationIndex++;
                if (CurrentBandRotationIndex >= files.Count)
                {
                    CurrentBandRotationIndex = 0;
                }
                currentIndex = CurrentBandRotationIndex;
                break;
            }

            case UpdateTypes.All:
                break;

            case UpdateTypes.Desktop:
                break;

            default:
            {
                // Update the index
                CurrentDesktopRotationIndex++;
                if (CurrentDesktopRotationIndex >= files.Count)
                {
                    CurrentDesktopRotationIndex = 0;
                }
                currentIndex = CurrentDesktopRotationIndex;
                break;
            }
            }

            TelemetryManager.ReportLog(this, "Current index used to set image :" + currentIndex);

            // Set the image
            var wasSuccess = await SetBackgroundImage(type, files[currentIndex]);

            if (!wasSuccess)
            {
                TelemetryManager.ReportLog(this, "Image update failed", SeverityLevel.Error);
                TelemetryManager.ReportUnexpectedEvent(this, type == UpdateTypes.LockScreen ? "LockscreenImageUpdateFailed" : "DesktopImageUpdateFailed");
            }
            else
            {
                TelemetryManager.ReportLog(this, "Image update success");
            }

            return(wasSuccess);
            // Return true if we are disabled
        }