private MediaSessionCallback CreateMediaSessionCallback() { var mediaCallback = new MediaSessionCallback(); mediaCallback.OnPlayImpl = () => { Logger.Debug("OnPlayImpl"); if (_playingQueue == null || _playingQueue.Count == 0) { _playingQueue = new List <MediaSession.QueueItem>(_musicProvider.GetRandomQueue()); _session.SetQueue(_playingQueue); _session.SetQueueTitle("Random music"); _currentIndexQueue = 0; } if (_playingQueue != null && _playingQueue.Count != 0) { HandlePlayRequest(); } }; mediaCallback.OnSkipToQueueItemImpl = (id) => { Logger.Debug("OnSkipToQueueItem"); if (_playingQueue != null && _playingQueue.Count != 0) { _currentIndexQueue = -1; int index = 0; foreach (var item in _playingQueue) { if (id == item.QueueId) { _currentIndexQueue = index; } index++; } HandlePlayRequest(); } }; mediaCallback.OnSeekToImpl = (pos) => { Logger.Debug("OnSeekToImpl:"); _musicPlayer.SeekTo((int)pos); }; mediaCallback.OnPlayFromMediaIdImpl = (mediaId, extras) => { Logger.Debug($"OnPlayFromMediaIdImpl mediaId: {mediaId}"); _playingQueue = _musicProvider.GetPlayingQueue(mediaId); _session.SetQueue(_playingQueue); string[] hierarchies = HierarchyHelper.GetHierarchy(mediaId); string month = hierarchies != null && hierarchies.Length == 2 ? hierarchies[1] : string.Empty; var queueTitle = $"{month} Podcasts"; _session.SetQueueTitle(queueTitle); if (_playingQueue != null && _playingQueue.Count != 0) { _currentIndexQueue = -1; int index = 0; foreach (var item in _playingQueue) { if (mediaId == item.Description.MediaId) { _currentIndexQueue = index; } index++; } if (_currentIndexQueue < 0) { Logger.Error($"OnPlayFromMediaIdImpl: media ID {mediaId} not be found."); } else { HandlePlayRequest(); } } }; mediaCallback.OnPauseImpl = () => { OnPause(); }; mediaCallback.OnStopImpl = () => { OnStop(null); }; mediaCallback.OnSkipToNextImpl = () => { Logger.Debug("OnSkipToNextImpl"); _currentIndexQueue++; if (_playingQueue != null && _currentIndexQueue >= _playingQueue.Count) { _currentIndexQueue = 0; } if (this.isIndexPlayable(_currentIndexQueue, _playingQueue)) { HandlePlayRequest(); } else { OnStop("Cannot skip"); } }; mediaCallback.OnSkipToPreviousImpl = () => { Logger.Debug("OnSkipToPreviousImpl"); _currentIndexQueue--; if (_playingQueue != null && _currentIndexQueue < 0) { _currentIndexQueue = 0; } if (this.isIndexPlayable(_currentIndexQueue, _playingQueue)) { HandlePlayRequest(); } else { OnStop("Cannot skip"); } }; mediaCallback.OnCustomActionImpl = (action, extras) => { if (CustomActionFavorite == action) { Logger.Info("OnCustomActionImpl"); var track = GetCurrentPlayingMusic(); if (track != null) { var musicId = track.GetString(MediaMetadata.MetadataKeyMediaId); _musicProvider.SetFavorite(musicId, !_musicProvider.IsFavorite(musicId)); } UpdatePlaybackState(null); } else { Logger.Error($"Unsupported action: {action}"); } }; mediaCallback.OnPlayFromSearchImpl = (query, extras) => { Logger.Debug($"OnPlayFromSearchImpl query={query}"); if (string.IsNullOrEmpty(query)) { _playingQueue = new List <MediaSession.QueueItem>(_musicProvider.GetRandomQueue()); } else { _playingQueue = new List <MediaSession.QueueItem>(_musicProvider.GetPlayingQueueFromSearch(query)); } _session.SetQueue(_playingQueue); if (_playingQueue != null && _playingQueue.Count != 0) { _currentIndexQueue = 0; HandlePlayRequest(); } else { OnStop("0 Found."); } }; return(mediaCallback); }