From 6fd14e48533f4ee31dbd9b33226ba10c20ca1b06 Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Tue, 19 Aug 2014 20:22:46 +0200 Subject: [PATCH] Add workaround for webm's Allow videos to be opened in external media player. Show a warning if video playback fails. --- .../org/floens/chan/core/ChanPreferences.java | 14 +++- .../chan/ui/fragment/ImageViewFragment.java | 48 +++++++++++++ .../chan/ui/view/ThumbnailImageView.java | 69 +++++++++++++------ Clover/app/src/main/res/values/strings.xml | 6 ++ Clover/app/src/main/res/xml/preference.xml | 6 ++ 5 files changed, 120 insertions(+), 23 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java b/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java index 8d8489a0..028165c7 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java +++ b/Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java @@ -104,7 +104,7 @@ public class ChanPreferences { } public static boolean getVideoAutoPlay() { - return getImageAutoLoad() && p().getBoolean("preference_autoplay", false); + return getImageAutoLoad() && !getVideoExternal() && p().getBoolean("preference_autoplay", false); } public static boolean getThreadAutoRefresh() { @@ -176,4 +176,16 @@ public class ChanPreferences { public static String getBoardMode() { return p().getString("preference_board_mode", "catalog"); } + + public static boolean getVideoErrorIgnore() { + return p().getBoolean("preference_video_error_ignore", false); + } + + public static void setVideoErrorIgnore(boolean show) { + p().edit().putBoolean("preference_video_error_ignore", show).commit(); + } + + public static boolean getVideoExternal() { + return p().getBoolean("preference_video_external", false); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java index d07cd2bd..1cb31611 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java @@ -17,14 +17,20 @@ */ package org.floens.chan.ui.fragment; +import android.app.AlertDialog; import android.app.Fragment; import android.content.Context; +import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; import android.widget.VideoView; import org.floens.chan.R; @@ -38,6 +44,8 @@ import org.floens.chan.ui.view.ThumbnailImageView.ThumbnailImageViewCallback; import org.floens.chan.utils.ImageSaver; import org.floens.chan.utils.Utils; +import java.io.File; + public class ImageViewFragment extends Fragment implements ThumbnailImageViewCallback { private Context context; private ImageViewActivity activity; @@ -146,6 +154,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal imageView.setBigImage(post.imageUrl); break; } + } @Override @@ -249,6 +258,45 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal } } + public void onVideoError(File video) { + if (ChanPreferences.getVideoErrorIgnore()) { + Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_SHORT).show(); + } else { + showVideoWarning(); + } + } + + private void showVideoWarning() { + LinearLayout notice = new LinearLayout(context); + notice.setOrientation(LinearLayout.VERTICAL); + + TextView noticeText = new TextView(context); + noticeText.setText(R.string.video_playback_warning); + noticeText.setTextSize(16f); + notice.addView(noticeText, Utils.MATCH_WRAP_PARAMS); + + final CheckBox dontShowAgain = new CheckBox(context); + dontShowAgain.setText(R.string.video_playback_ignore); + notice.addView(dontShowAgain, Utils.MATCH_WRAP_PARAMS); + + int padding = Utils.dp(16f); + notice.setPadding(padding, padding, padding, padding); + + new AlertDialog.Builder(context) + .setTitle(R.string.video_playback_warning_title) + .setView(notice) + .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (dontShowAgain.isChecked()) { + ChanPreferences.setVideoErrorIgnore(true); + } + } + }) + .setCancelable(false) + .show(); + } + private void startVideo() { if (videoVisible) return; videoVisible = true; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java index 4c11c10b..e18376e4 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java @@ -17,8 +17,11 @@ */ package org.floens.chan.ui.view; +import android.content.ActivityNotFoundException; import android.content.Context; +import android.content.Intent; import android.media.MediaPlayer; +import android.net.Uri; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; @@ -34,6 +37,7 @@ import com.koushikdutta.async.future.Future; import org.floens.chan.ChanApplication; import org.floens.chan.R; +import org.floens.chan.core.ChanPreferences; import org.floens.chan.utils.FileCache; import org.floens.chan.utils.Logger; import org.floens.chan.utils.Utils; @@ -224,29 +228,48 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener } @Override - public void onSuccess(File file) { - videoView = new VideoView(getContext()); - videoView.setZOrderOnTop(true); - videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT)); - videoView.setLayoutParams(Utils.MATCH_PARAMS); - LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - par.gravity = Gravity.CENTER; - videoView.setLayoutParams(par); - - videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - mp.setLooping(true); - callback.onVideoLoaded(); + public void onSuccess(final File file) { + if (ChanPreferences.getVideoExternal()) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(Uri.fromFile(file), "video/*"); + + try { + getContext().startActivity(intent); + } catch (ActivityNotFoundException e) { + Toast.makeText(getContext(), R.string.open_link_failed, Toast.LENGTH_SHORT).show(); } - }); - - videoView.setVideoPath(file.getAbsolutePath()); - - setView(videoView, false); - - videoView.start(); + } else { + videoView = new VideoView(getContext()); + videoView.setZOrderOnTop(true); + videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT)); + videoView.setLayoutParams(Utils.MATCH_PARAMS); + LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + par.gravity = Gravity.CENTER; + videoView.setLayoutParams(par); + + videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setLooping(true); + callback.onVideoLoaded(); + } + }); + videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + callback.onVideoError(file); + + return true; + } + }); + + videoView.setVideoPath(file.getAbsolutePath()); + + setView(videoView, false); + + videoView.start(); + } } @Override @@ -298,5 +321,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener public void setLinearProgress(long current, long total, boolean done); public void onVideoLoaded(); + + public void onVideoError(File video); } } diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index b621753a..6b8fca70 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -242,6 +242,12 @@ along with this program. If not, see . Advanced settings Anonymous + + WebM not supported + Unfortunately, your hardware doesn\'t support playing WebM videos.\nYou can install an external media player that has a software decoder. Then if you installed that, enable \"Open videos external\" in the settings. + Don\'t show again + Open videos external + Open videos in external media player diff --git a/Clover/app/src/main/res/xml/preference.xml b/Clover/app/src/main/res/xml/preference.xml index 10bfd164..d468788d 100644 --- a/Clover/app/src/main/res/xml/preference.xml +++ b/Clover/app/src/main/res/xml/preference.xml @@ -71,6 +71,12 @@ along with this program. If not, see . android:dependency="preference_image_auto_load" android:key="preference_autoplay" android:title="@string/preference_autoplay" /> + +