diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java index 9a0ac230..b90d0b8a 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java @@ -7,7 +7,6 @@ import org.floens.chan.core.model.PostImage; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.view.MultiImageView; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -231,13 +230,8 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager. } @Override - public void onVideoLoaded(MultiImageView multiImageView) { - - } - - @Override - public void onVideoError(MultiImageView multiImageView, File video) { - + public void onVideoError(MultiImageView multiImageView) { + callback.onVideoError(multiImageView); } private List getOther(int position, boolean all) { @@ -276,5 +270,7 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager. void showProgress(boolean show); void onLoadProgress(float progress); + + void onVideoError(MultiImageView multiImageView); } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java index 3853d7e8..52ce57a9 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java +++ b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java @@ -34,6 +34,7 @@ public class ChanSettings { public static final BooleanSetting imageAutoLoad; public static final BooleanSetting videoAutoLoad; public static final BooleanSetting videoOpenExternal; + public static final BooleanSetting videoErrorIgnore; public static final StringSetting postDefaultName; public static final BooleanSetting postPinThread; @@ -71,6 +72,7 @@ public class ChanSettings { imageAutoLoad = new BooleanSetting(p, "preference_image_auto_load", true); videoAutoLoad = new BooleanSetting(p, "preference_autoplay", false); videoOpenExternal = new BooleanSetting(p, "preference_video_external", false); + videoErrorIgnore = new BooleanSetting(p, "preference_video_error_ignore", false); postDefaultName = new StringSetting(p, "preference_default_name", ""); postPinThread = new BooleanSetting(p, "preference_pin_on_post", false); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java index f6a3aec4..6b013ea5 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java @@ -6,7 +6,9 @@ import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Point; @@ -14,9 +16,12 @@ import android.graphics.PointF; import android.os.Build; import android.text.TextUtils; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.animation.DecelerateInterpolator; +import android.widget.CheckBox; +import android.widget.Toast; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; @@ -232,6 +237,29 @@ public class ImageViewerController extends Controller implements View.OnClickLis loadingBar.setProgress(progress); } + public void onVideoError(MultiImageView multiImageView) { + if (ChanSettings.videoErrorIgnore.get()) { + Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_SHORT).show(); + } else { + View notice = LayoutInflater.from(context).inflate(R.layout.dialog_video_error, null); + final CheckBox dontShowAgain = (CheckBox) notice.findViewById(R.id.checkbox); + + new AlertDialog.Builder(context) + .setTitle(R.string.video_playback_warning_title) + .setView(notice) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (dontShowAgain.isChecked()) { + ChanSettings.videoErrorIgnore.set(true); + } + } + }) + .setCancelable(false) + .show(); + } + } + public void startPreviewInTransition(PostImage postImage) { ThumbnailView startImageView = getTransitionImageView(postImage); 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 4702b817..35434b4a 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 @@ -36,8 +36,8 @@ import android.widget.VideoView; import org.floens.chan.R; import org.floens.chan.chan.ImageSearch; -import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.core.model.Post; +import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.activity.ImageViewActivity; import org.floens.chan.ui.adapter.ImageViewAdapter; import org.floens.chan.ui.view.MultiImageView; @@ -45,8 +45,6 @@ import org.floens.chan.ui.view.MultiImageView.Callback; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.ImageSaver; -import java.io.File; - import static org.floens.chan.utils.AndroidUtils.dp; public class ImageViewFragment extends Fragment implements Callback { @@ -272,7 +270,7 @@ public class ImageViewFragment extends Fragment implements Callback { context.startActivity(Intent.createChooser(intent, context.getString(R.string.action_share))); } - public void onVideoError(MultiImageView view, File video) { + public void onVideoError(MultiImageView view) { if (ChanSettings.getVideoErrorIgnore()) { Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_SHORT).show(); } else { @@ -353,10 +351,4 @@ public class ImageViewFragment extends Fragment implements Callback { progressDone = true; activity.updateActionBarIfSelected(this); } - - @Override - public void onVideoLoaded(MultiImageView view) { - videoSetIconToPause = true; - activity.invalidateActionBar(); - } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java b/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java index c2803f86..382431a5 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java @@ -17,7 +17,6 @@ */ package org.floens.chan.ui.view; -import android.content.ActivityNotFoundException; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; @@ -28,6 +27,7 @@ import android.view.Gravity; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; +import android.widget.MediaController; import android.widget.Toast; import android.widget.VideoView; @@ -69,6 +69,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener private Future videoRequest; private VideoView videoView; + private boolean videoError = false; public MultiImageView(Context context) { super(context); @@ -320,24 +321,16 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener 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(); - } - // TODO: check this - onModeLoaded(Mode.GIF, videoView); + AndroidUtils.openIntent(intent); + onModeLoaded(Mode.MOVIE, videoView); } else { Context proxyContext = new NoMusicServiceCommandContext(getContext()); videoView = new VideoView(proxyContext); videoView.setZOrderOnTop(true); - videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, - LayoutParams.MATCH_PARENT)); - videoView.setLayoutParams(AndroidUtils.MATCH_PARAMS); - LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - par.gravity = Gravity.CENTER; - videoView.setLayoutParams(par); + videoView.setMediaController(new MediaController(getContext())); + + addView(videoView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER)); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override @@ -346,10 +339,11 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener onModeLoaded(Mode.MOVIE, videoView); } }); + videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { - callback.onVideoError(MultiImageView.this, file); + onVideoError(); return true; } @@ -357,9 +351,12 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener videoView.setVideoPath(file.getAbsolutePath()); - addView(videoView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, Gravity.CENTER)); - - videoView.start(); + try { + videoView.start(); + } catch (IllegalStateException e) { + Logger.e(TAG, "Video view start error", e); + onVideoError(); + } } } @@ -367,6 +364,13 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener return videoView; } + private void onVideoError() { + if (!videoError) { + videoError = true; + callback.onVideoError(this); + } + } + private void onError() { Toast.makeText(getContext(), R.string.image_preview_failed, Toast.LENGTH_SHORT).show(); callback.showProgress(this, false); @@ -443,9 +447,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener void onProgress(MultiImageView multiImageView, long current, long total); - void onVideoLoaded(MultiImageView multiImageView); - - void onVideoError(MultiImageView multiImageView, File video); + void onVideoError(MultiImageView multiImageView); void onModeLoaded(MultiImageView multiImageView, Mode mode); } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index aec48d97..7811aa8c 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -77,7 +77,7 @@ public class AndroidUtils { public static void openLink(String link) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (intent.resolveActivity(getAppRes().getPackageManager()) != null) { getAppRes().startActivity(intent); @@ -91,7 +91,7 @@ public class AndroidUtils { intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, link); Intent chooser = Intent.createChooser(intent, getRes().getString(R.string.action_share)); - chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + chooser.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (chooser.resolveActivity(getAppRes().getPackageManager()) != null) { getAppRes().startActivity(chooser); @@ -100,6 +100,15 @@ public class AndroidUtils { } } + public static void openIntent(Intent intent) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + if (intent.resolveActivity(getAppRes().getPackageManager()) != null) { + getAppRes().startActivity(intent); + } else { + Toast.makeText(getAppRes(), R.string.open_link_failed, Toast.LENGTH_LONG).show(); + } + } + public static int getAttrColor(Context context, int attr) { TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[]{attr}); int color = typedArray.getColor(0, 0); diff --git a/Clover/app/src/main/res/layout/dialog_video_error.xml b/Clover/app/src/main/res/layout/dialog_video_error.xml new file mode 100644 index 00000000..a621c56d --- /dev/null +++ b/Clover/app/src/main/res/layout/dialog_video_error.xml @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 2343b6e2..f2c1694e 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -387,8 +387,8 @@ Don't have a 4chan Pass?<br> 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. + WebM video error + The WebM video failed to play. This might be a problem with the hardware of your phone.\n\nYou can install an external media player that has a software decoder and enable \"Open videos external\" in the settings so that the video opens externally in a software decoding app. Don\'t show again Open videos external Open videos in external media player