/**
* The MIT License (MIT)
* Copyright (c) 2012 David Carver
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
* OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package us.nineworlds.serenity.ui.util;
import java.util.LinkedList;
import javax.inject.Inject;
import us.nineworlds.serenity.R;
import us.nineworlds.serenity.core.externalplayer.ExternalPlayer;
import us.nineworlds.serenity.core.externalplayer.ExternalPlayerFactory;
import us.nineworlds.serenity.core.externalplayer.MXPlayer;
import us.nineworlds.serenity.core.model.VideoContentInfo;
import us.nineworlds.serenity.injection.ForVideoQueue;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.Toast;
public class ExternalPlayerResultHandler extends PlayerResultHandler {
Activity activity;
String externalPlayerValue;
boolean extPlayerVideoQueueEnabled;
int resultCode;
ExternalPlayer externalPlayer;
@Inject
protected VideoPlayerIntentUtils vpUtils;
@Inject
@ForVideoQueue
protected LinkedList<VideoContentInfo> videoQueue;
@Inject
protected SharedPreferences preferences;
public ExternalPlayerResultHandler(int resultCode, Intent data,
Activity activity, BaseAdapter adapter) {
super(data, adapter);
this.activity = activity;
externalPlayerValue = preferences.getString(
"serenity_external_player_filter", "default");
extPlayerVideoQueueEnabled = preferences.getBoolean(
"external_player_continuous_playback", false);
this.resultCode = resultCode;
}
public void updatePlaybackPosition(VideoContentInfo video, View selectedView) {
ExternalPlayerFactory externalPlayerFactory = new ExternalPlayerFactory(
video, activity);
externalPlayer = externalPlayerFactory
.createExternalPlayer(externalPlayerValue);
boolean mxPlayerCompleted = updateMXPlayerCompletedNormally(video);
if (shouldUpdatePlaybackPosition(mxPlayerCompleted)) {
updateVideoPlaybackPosition(video, selectedView);
}
if (!extPlayerVideoQueueEnabled) {
return;
}
playNextQueueEntry();
return;
}
private void playNextQueueEntry() {
if (videoQueue.isEmpty()) {
return;
}
if (isVimuUserCancelResult(resultCode)) {
showQueueNotEmptyMessage();
return;
}
if (notMXPlayer(data)) {
externalPlayerPlayNext();
return;
}
String mxplayerEndedBy = data.getStringExtra("end_by");
if ("user".equals(mxplayerEndedBy)) {
showQueueNotEmptyMessage();
return;
}
externalPlayerPlayNext();
}
private boolean shouldUpdatePlaybackPosition(boolean mxPlayerCompleted) {
return !mxPlayerCompleted && externalPlayer.supportsPlaybackPosition()
&& data.hasExtra("position");
}
private boolean updateMXPlayerCompletedNormally(VideoContentInfo video) {
if (externalPlayer instanceof MXPlayer
&& hasMXPlayerCompletedNormally(data)) {
if (video != null) {
video.setResumeOffset(video.getDuration());
toggleWatched(video);
adapter.notifyDataSetChanged();
}
return true;
}
return false;
}
protected boolean hasMXPlayerCompletedNormally(Intent data) {
String mxplayerString = data.getStringExtra("end_by");
return "playback_completion".equals(mxplayerString);
}
protected boolean notMXPlayer(Intent data) {
return !data.hasExtra("end_by");
}
protected boolean isVimuUserCancelResult(int resultCode) {
return resultCode == 0 || resultCode == 4;
}
protected void showQueueNotEmptyMessage() {
Toast.makeText(activity,
R.string.there_are_still_videos_int_the_queue_,
Toast.LENGTH_LONG).show();
}
protected void externalPlayerPlayNext() {
VideoContentInfo videoContentInfo = videoQueue.poll();
vpUtils.launchExternalPlayer(videoContentInfo, activity, false);
}
}