Add workaround for webm's

Allow videos to be opened in external media player.
Show a warning if video playback fails.
captchafix
Florens Douwes 11 years ago
parent 125c9d8d9b
commit 6fd14e4853
  1. 14
      Clover/app/src/main/java/org/floens/chan/core/ChanPreferences.java
  2. 48
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java
  3. 69
      Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java
  4. 6
      Clover/app/src/main/res/values/strings.xml
  5. 6
      Clover/app/src/main/res/xml/preference.xml

@ -104,7 +104,7 @@ public class ChanPreferences {
} }
public static boolean getVideoAutoPlay() { public static boolean getVideoAutoPlay() {
return getImageAutoLoad() && p().getBoolean("preference_autoplay", false); return getImageAutoLoad() && !getVideoExternal() && p().getBoolean("preference_autoplay", false);
} }
public static boolean getThreadAutoRefresh() { public static boolean getThreadAutoRefresh() {
@ -176,4 +176,16 @@ public class ChanPreferences {
public static String getBoardMode() { public static String getBoardMode() {
return p().getString("preference_board_mode", "catalog"); 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);
}
} }

@ -17,14 +17,20 @@
*/ */
package org.floens.chan.ui.fragment; package org.floens.chan.ui.fragment;
import android.app.AlertDialog;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; 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 android.widget.VideoView;
import org.floens.chan.R; 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.ImageSaver;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import java.io.File;
public class ImageViewFragment extends Fragment implements ThumbnailImageViewCallback { public class ImageViewFragment extends Fragment implements ThumbnailImageViewCallback {
private Context context; private Context context;
private ImageViewActivity activity; private ImageViewActivity activity;
@ -146,6 +154,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
imageView.setBigImage(post.imageUrl); imageView.setBigImage(post.imageUrl);
break; break;
} }
} }
@Override @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() { private void startVideo() {
if (videoVisible) return; if (videoVisible) return;
videoVisible = true; videoVisible = true;

@ -17,8 +17,11 @@
*/ */
package org.floens.chan.ui.view; package org.floens.chan.ui.view;
import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.Uri;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
@ -34,6 +37,7 @@ import com.koushikdutta.async.future.Future;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.ChanPreferences;
import org.floens.chan.utils.FileCache; import org.floens.chan.utils.FileCache;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
@ -224,29 +228,48 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
} }
@Override @Override
public void onSuccess(File file) { public void onSuccess(final File file) {
videoView = new VideoView(getContext()); if (ChanPreferences.getVideoExternal()) {
videoView.setZOrderOnTop(true); Intent intent = new Intent(Intent.ACTION_VIEW);
videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, intent.setDataAndType(Uri.fromFile(file), "video/*");
LayoutParams.MATCH_PARENT));
videoView.setLayoutParams(Utils.MATCH_PARAMS); try {
LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); getContext().startActivity(intent);
par.gravity = Gravity.CENTER; } catch (ActivityNotFoundException e) {
videoView.setLayoutParams(par); Toast.makeText(getContext(), R.string.open_link_failed, Toast.LENGTH_SHORT).show();
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true);
callback.onVideoLoaded();
} }
}); } else {
videoView = new VideoView(getContext());
videoView.setVideoPath(file.getAbsolutePath()); videoView.setZOrderOnTop(true);
videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
setView(videoView, false); LayoutParams.MATCH_PARENT));
videoView.setLayoutParams(Utils.MATCH_PARAMS);
videoView.start(); 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 @Override
@ -298,5 +321,7 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
public void setLinearProgress(long current, long total, boolean done); public void setLinearProgress(long current, long total, boolean done);
public void onVideoLoaded(); public void onVideoLoaded();
public void onVideoError(File video);
} }
} }

@ -242,6 +242,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="settings_advanced_label">Advanced settings</string> <string name="settings_advanced_label">Advanced settings</string>
<string name="default_name">Anonymous</string> <string name="default_name">Anonymous</string>
<string name="video_playback_warning_title">WebM not supported</string>
<string name="video_playback_warning">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.</string>
<string name="video_playback_ignore">Don\'t show again</string>
<string name="preference_video_external">Open videos external</string>
<string name="preference_video_external_summary">Open videos in external media player</string>
</resources> </resources>

@ -71,6 +71,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:dependency="preference_image_auto_load" android:dependency="preference_image_auto_load"
android:key="preference_autoplay" android:key="preference_autoplay"
android:title="@string/preference_autoplay" /> android:title="@string/preference_autoplay" />
<CheckBoxPreference
android:defaultValue="false"
android:key="preference_video_external"
android:summary="@string/preference_video_external_summary"
android:title="@string/preference_video_external" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/preference_posting"> <PreferenceCategory android:title="@string/preference_posting">

Loading…
Cancel
Save