/// <summary> /// Checks if our "currently playing" and "fullscreen content" states still fit to the /// appropriate players, i.e. if we are in a "currently playing" state and the current player context was /// changed, the workflow state will be adapted to match the new current player context's "currently playing" state. /// The same check will happen for the primary player context and the "fullscreen content" state. /// </summary> /// <remarks> /// This method must not be called when the player manager's lock is held. /// </remarks> protected void CheckMediaWorkflowStates_NoLock() { ISystemStateService sss = ServiceRegistration.Get <ISystemStateService>(); if (sss.CurrentState != SystemState.Running) { // Only automatically change workflow states in running state return; } IWorkflowManager workflowManager = ServiceRegistration.Get <IWorkflowManager>(); workflowManager.StartBatchUpdateAsync(); ILogger log = ServiceRegistration.Get <ILogger>(); IPlayerManager playerManager = ServiceRegistration.Get <IPlayerManager>(); try { for (int i = 0; i < _playerWfStateInstances.Count; i++) { // Find the first workflow state of our cached player workflow states which doesn't fit any more // and update to the new player workflow state of the same player workflow state type, if necessary. PlayerWFStateInstance wfStateInstance = _playerWfStateInstances[i]; Guid? newStateId; string stateName; switch (wfStateInstance.WFStateType) { case PlayerWFStateType.CurrentlyPlaying: newStateId = GetPotentialCPStateId(); stateName = "Currently Playing"; break; case PlayerWFStateType.FullscreenContent: newStateId = GetPotentialFSCStateId(); stateName = "Fullscreen Content"; break; default: throw new NotImplementedException(string.Format("No handler for player workflow state type '{0}'", wfStateInstance.WFStateType)); } if (newStateId != wfStateInstance.WFStateId) { // Found the first player workflow state which doesn't fit any more log.Debug("PlayerContextManager: {0} Workflow State '{1}' doesn't fit any more to the current situation. Leaving workflow state.", stateName, wfStateInstance.WFStateId); lock (playerManager.SyncObj) // Remove all workflow states until the player workflow state which doesn't fit any more _playerWfStateInstances.RemoveRange(i, _playerWfStateInstances.Count - i); workflowManager.NavigatePopToStateAsync(wfStateInstance.WFStateId, true); if (newStateId.HasValue) { log.Debug("PlayerContextManager: Auto-switching to new {0} Workflow State '{1}'", stateName, newStateId.Value); workflowManager.NavigatePushAsync(newStateId.Value); } break; } } } finally { workflowManager.EndBatchUpdateAsync(); } }