/** * 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.SerenityConstants; import us.nineworlds.serenity.core.externalplayer.ExternalPlayer; import us.nineworlds.serenity.core.externalplayer.ExternalPlayerFactory; import us.nineworlds.serenity.core.model.VideoContentInfo; import us.nineworlds.serenity.core.util.TimeUtil; import us.nineworlds.serenity.injection.BaseInjector; import us.nineworlds.serenity.injection.ForVideoQueue; import us.nineworlds.serenity.ui.video.player.SerenitySurfaceViewVideoActivity; import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.widget.Toast; public class VideoPlayerIntentUtils extends BaseInjector { @Inject @ForVideoQueue protected LinkedList<VideoContentInfo> videoQueue; @Inject protected SharedPreferences prefs; @Inject protected TimeUtil timeUtil; /** * This must run on a UI thread. * * Launches an external player based on the information provided. * * @param videoContent * @param activity * @param autoResume */ public void launchExternalPlayer(VideoContentInfo videoContent, Activity activity, boolean autoResume) { String externalPlayerValue = prefs.getString( "serenity_external_player_filter", "default"); if (!videoQueue.isEmpty() || "default".equals(externalPlayerValue)) { videoContent.setResumeOffset(0); launchPlayer(videoContent, activity); return; } if (videoContent.isPartiallyWatched() && !autoResume) { showResumeDialogQueue(activity, videoContent); return; } launchPlayer(videoContent, activity); } protected void launchPlayer(VideoContentInfo videoContent, Activity activity) { String externalPlayerValue = prefs.getString( "serenity_external_player_filter", "default"); ExternalPlayerFactory factory = new ExternalPlayerFactory(videoContent, activity); ExternalPlayer extplay = factory .createExternalPlayer(externalPlayerValue); try { extplay.launch(); } catch (ActivityNotFoundException ex) { extplay = factory.createExternalPlayer("default"); extplay.launch(); } } /** * Play all videos in the queue launching the appropriate player. * * @param context */ public void playAllFromQueue(Activity context) { if (!videoQueue.isEmpty()) { boolean extplayer = prefs.getBoolean("external_player", false); boolean extplayerVideoQueue = prefs.getBoolean( "external_player_continuous_playback", false); if (extplayer) { if (extplayerVideoQueue) { VideoContentInfo videoContent = videoQueue.poll(); launchExternalPlayer(videoContent, context, false); } else { Toast.makeText( context, context.getResources() .getString( R.string.external_player_video_queue_support_has_not_been_enabled_), Toast.LENGTH_LONG).show(); } } else { Intent vpIntent = new Intent(context, SerenitySurfaceViewVideoActivity.class); context.startActivityForResult(vpIntent, SerenityConstants.EXIT_PLAYBACK_IMMEDIATELY); } } else { Toast.makeText(context, context.getResources().getString(R.string.queue_is_empty_), Toast.LENGTH_LONG).show(); } } protected void showResumeDialogQueue(Activity context, VideoContentInfo videoContent) { final VideoContentInfo video = videoContent; final Activity c = context; AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( context, android.R.style.Theme_Holo_Dialog); alertDialogBuilder.setTitle(R.string.resume_video); alertDialogBuilder .setMessage( context.getResources().getText( R.string.resume_the_video_from_) + timeUtil.formatDuration(video .getResumeOffset()) + context.getResources().getText( R.string._or_restart_)) .setCancelable(false) .setPositiveButton(R.string.resume, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { launchPlayer(video, c); } }) .setNegativeButton(R.string.restart, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { video.setResumeOffset(0); launchPlayer(video, c); } }); alertDialogBuilder.create(); AlertDialog dialog = alertDialogBuilder.show(); dialog.getButton(DialogInterface.BUTTON_POSITIVE) .requestFocusFromTouch(); } public void playVideo(Activity activity, VideoContentInfo videoInfo, boolean autoResume) { if (!videoQueue.isEmpty()) { Toast.makeText(activity, "Cleared video queue before playback.", Toast.LENGTH_LONG).show(); videoQueue.clear(); } boolean externalPlayer = prefs.getBoolean("external_player", false); if (externalPlayer) { launchExternalPlayer(videoInfo, activity, autoResume); return; } launchInternalPlayer(videoInfo, activity, autoResume); } /** * * @param videoInfo * @return * @param autoResume */ private void launchInternalPlayer(VideoContentInfo videoInfo, Activity activity, boolean autoResume) { videoQueue.add(videoInfo); Intent vpIntent = new Intent(activity, SerenitySurfaceViewVideoActivity.class); vpIntent.putExtra("autoResume", autoResume); activity.startActivityForResult(vpIntent, SerenityConstants.BROWSER_RESULT_CODE); } }