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" />
+
+