package tv.emby.embyatv.eventhandling;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import java.util.Arrays;
import java.util.Calendar;
import mediabrowser.apiinteraction.ApiClient;
import mediabrowser.apiinteraction.ApiEventListener;
import mediabrowser.apiinteraction.Response;
import mediabrowser.model.dto.BaseItemDto;
import mediabrowser.model.querying.ItemFields;
import mediabrowser.model.querying.ItemsResult;
import mediabrowser.model.session.BrowseRequest;
import mediabrowser.model.session.GeneralCommand;
import mediabrowser.model.session.PlayRequest;
import mediabrowser.model.session.PlaystateRequest;
import mediabrowser.model.session.SessionInfoDto;
import tv.emby.embyatv.R;
import tv.emby.embyatv.TvApp;
import tv.emby.embyatv.itemhandling.BaseRowItem;
import tv.emby.embyatv.itemhandling.ItemLauncher;
import tv.emby.embyatv.playback.MediaManager;
import tv.emby.embyatv.playback.PlaybackOverlayActivity;
import tv.emby.embyatv.querying.StdItemQuery;
import tv.emby.embyatv.util.Utils;
/**
* Created by Eric on 2/14/2015.
*/
public class TvApiEventListener extends ApiEventListener {
@Override
public void onPlaybackStopped(ApiClient client, SessionInfoDto info) {
TvApp app = TvApp.getApplication();
app.getLogger().Debug("Got Playback stopped message from server");
if (info.getUserId().equals(app.getCurrentUser().getId())) {
app.setLastPlayback(Calendar.getInstance());
if (info.getNowPlayingItem() == null) return;
switch (info.getNowPlayingItem().getType()) {
case "Movie":
TvApp.getApplication().setLastMoviePlayback(Calendar.getInstance());
break;
case "Episode":
TvApp.getApplication().setLastTvPlayback(Calendar.getInstance());
break;
}
}
}
@Override
public void onGeneralCommand(ApiClient client, GeneralCommand command) {
switch (command.getName().toLowerCase()) {
case "mute":
TvApp.getApplication().setAudioMuted(true);
break;
case "unmute":
TvApp.getApplication().setAudioMuted(false);
break;
case "togglemute":
TvApp.getApplication().setAudioMuted(!TvApp.getApplication().isAudioMuted());
break;
}
}
@Override
public void onPlaystateCommand(ApiClient client, PlaystateRequest command) {
switch (command.getCommand()) {
case Stop:
TvApp.getApplication().stopPlayback();
break;
case Pause:
TvApp.getApplication().pausePlayback();
break;
case Unpause:
TvApp.getApplication().unPausePlayback();
break;
case NextTrack:
TvApp.getApplication().playbackNext();
break;
case PreviousTrack:
TvApp.getApplication().playbackPrev();
break;
case Seek:
Long pos = command.getSeekPositionTicks() / 10000;
TvApp.getApplication().playbackSeek(pos.intValue());
break;
case Rewind:
TvApp.getApplication().playbackJumpBack();
break;
case FastForward:
TvApp.getApplication().playbackJump();
break;
}
}
@Override
public void onBrowseCommand(ApiClient client, BrowseRequest command) {
TvApp.getApplication().getLogger().Debug("Browse command received");
if (TvApp.getApplication().getCurrentActivity() == null || videoPlaying()) {
TvApp.getApplication().getLogger().Info("Command ignored due to no activity or playback in progress");
return;
}
client.GetItemAsync(command.getItemId(), TvApp.getApplication().getCurrentUser().getId(), new Response<BaseItemDto>() {
@Override
public void onResponse(BaseItemDto response) {
//Create a rowItem and pass to our handler
ItemLauncher.launch(new BaseRowItem(0, response), null, -1, TvApp.getApplication().getCurrentActivity(), true);
}
});
}
private boolean videoPlaying() {
return (TvApp.getApplication().getPlaybackController() != null && (TvApp.getApplication().getPlaybackController().isPlaying() || TvApp.getApplication().getPlaybackController().isPaused()));
}
@Override
public void onPlayCommand(ApiClient client, PlayRequest command) {
if (videoPlaying()) {
TvApp.getApplication().getCurrentActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Utils.showToast(TvApp.getApplication().getCurrentActivity(), TvApp.getApplication().getString(R.string.msg_remote_already_playing));
}
});
return;
}
if (command.getItemIds().length > 1) {
TvApp.getApplication().getLogger().Info("Playing multiple items by remote request");
if (TvApp.getApplication().getCurrentActivity() == null) {
TvApp.getApplication().getLogger().Error("No current activity. Cannot play");
return;
}
StdItemQuery query = new StdItemQuery(new ItemFields[] {ItemFields.MediaSources});
query.setIds(command.getItemIds());
TvApp.getApplication().getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
@Override
public void onResponse(ItemsResult response) {
if (response.getItems() != null && response.getItems().length > 0) {
//peek at first item to see what type it is
switch (response.getItems()[0].getMediaType()) {
case "Video":
MediaManager.setCurrentVideoQueue(Arrays.asList(response.getItems()));
Intent intent = new Intent(TvApp.getApplication().getCurrentActivity(), PlaybackOverlayActivity.class);
TvApp.getApplication().getCurrentActivity().startActivity(intent);
break;
case "Audio":
MediaManager.playNow(Arrays.asList(response.getItems()));
break;
}
}
}
});
} else {
if (command.getItemIds().length > 0) {
TvApp.getApplication().getLogger().Info("Playing single item by remote request");
Context context = TvApp.getApplication().getCurrentActivity() != null ? TvApp.getApplication().getCurrentActivity() : TvApp.getApplication();
Utils.retrieveAndPlay(command.getItemIds()[0], false, command.getStartPositionTicks() != null ? command.getStartPositionTicks() : 0, context);
}
}
}
}