public PlaybackManager(IPlaybackServiceCallback serviceCallback, Resources resources,
                               MusicProvider musicProvider, QueueManager queueManager,
                               IPlayback playback)
        {
            this.musicProvider   = musicProvider;
            this.serviceCallback = serviceCallback;
            this.resources       = resources;
            this.queueManager    = queueManager;

            mediaSessionCallback.OnPlayImpl = () =>
            {
                LogHelper.Debug(Tag, "play");
                if (queueManager.CurrentMusic == null)
                {
                    queueManager.SetRandomQueue();
                }
                HandlePlayRequest();
            };

            mediaSessionCallback.OnSkipToQueueItemImpl = (long queueId) =>
            {
                LogHelper.Debug(Tag, "OnSkipToQueueItem:" + queueId);
                queueManager.SetCurrentQueueItem(queueId);
                HandlePlayRequest();
                queueManager.UpdateMetadata();
            };

            mediaSessionCallback.OnSeekToImpl = (long position) =>
            {
                LogHelper.Debug(Tag, "onSeekTo:", position);
                playback.SeekTo((int)position);
            };

            mediaSessionCallback.OnPlayFromMediaIdImpl = (string mediaId, Bundle extras) =>
            {
                LogHelper.Debug(Tag, "playFromMediaId mediaId:", mediaId, "  extras=", extras);
                queueManager.SetQueueFromMusic(mediaId);
                HandlePlayRequest();
            };

            mediaSessionCallback.OnPauseImpl = () =>
            {
                LogHelper.Debug(Tag, "pause. current state=" + Playback.State);
                HandlePauseRequest();
            };

            mediaSessionCallback.OnStopImpl = () =>
            {
                LogHelper.Debug(Tag, "stop. current state=" + Playback.State);
                HandleStopRequest(null);
            };

            mediaSessionCallback.OnSkipToNextImpl = () =>
            {
                LogHelper.Debug(Tag, "skipToNext");
                if (queueManager.SkipQueuePosition(1))
                {
                    HandlePlayRequest();
                }
                else
                {
                    HandleStopRequest("Cannot skip");
                }
                queueManager.UpdateMetadata();
            };

            mediaSessionCallback.OnSkipToPreviousImpl = () =>
            {
                if (queueManager.SkipQueuePosition(-1))
                {
                    HandlePlayRequest();
                }
                else
                {
                    HandleStopRequest("Cannot skip");
                }
                queueManager.UpdateMetadata();
            };

            mediaSessionCallback.OnPlayFromSearchImpl = (string query, Bundle extras) =>
            {
                LogHelper.Debug(Tag, "playFromSearch  query=", query, " extras=", extras);

                Playback.State = PlaybackStateCompat.StateConnecting;
                queueManager.SetQueueFromSearch(query, extras);
                HandlePlayRequest();
                queueManager.UpdateMetadata();
            };

            Playback          = playback;
            Playback.Callback = this;
        }