Fix up videoview warnings

filtering
Floens 10 years ago
parent aaeb4833ac
commit 86525f993b
  1. 12
      Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java
  2. 2
      Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java
  3. 28
      Clover/app/src/main/java/org/floens/chan/ui/controller/ImageViewerController.java
  4. 12
      Clover/app/src/main/java/org/floens/chan/ui/fragment/ImageViewFragment.java
  5. 44
      Clover/app/src/main/java/org/floens/chan/ui/view/MultiImageView.java
  6. 13
      Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java
  7. 26
      Clover/app/src/main/res/layout/dialog_video_error.xml
  8. 4
      Clover/app/src/main/res/values/strings.xml

@ -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<PostImage> 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);
}
}

@ -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);

@ -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);

@ -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();
}
}

@ -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);
}

@ -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);

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:textSize="16sp"
android:text="@string/video_playback_warning"
android:paddingTop="24dp"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/checkbox"
android:text="@string/video_playback_ignore"
android:layout_marginTop="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

@ -387,8 +387,8 @@ Don't have a 4chan Pass?&lt;br>
<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_warning_title">WebM video error</string>
<string name="video_playback_warning">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.</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>

Loading…
Cancel
Save