|
|
|
@ -36,12 +36,23 @@ import com.android.volley.VolleyError; |
|
|
|
|
import com.android.volley.toolbox.ImageLoader; |
|
|
|
|
import com.android.volley.toolbox.ImageLoader.ImageContainer; |
|
|
|
|
import com.davemorrissey.labs.subscaleview.ImageSource; |
|
|
|
|
import com.google.android.exoplayer2.ExoPlayer; |
|
|
|
|
import com.google.android.exoplayer2.ExoPlayerFactory; |
|
|
|
|
import com.google.android.exoplayer2.Player; |
|
|
|
|
import com.google.android.exoplayer2.SimpleExoPlayer; |
|
|
|
|
import com.google.android.exoplayer2.source.ExtractorMediaSource; |
|
|
|
|
import com.google.android.exoplayer2.source.MediaSource; |
|
|
|
|
import com.google.android.exoplayer2.ui.PlayerView; |
|
|
|
|
import com.google.android.exoplayer2.upstream.DataSource; |
|
|
|
|
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; |
|
|
|
|
import com.google.android.exoplayer2.util.Util; |
|
|
|
|
|
|
|
|
|
import org.floens.chan.R; |
|
|
|
|
import org.floens.chan.core.cache.FileCache; |
|
|
|
|
import org.floens.chan.core.cache.FileCacheDownloader; |
|
|
|
|
import org.floens.chan.core.cache.FileCacheListener; |
|
|
|
|
import org.floens.chan.core.cache.FileCacheProvider; |
|
|
|
|
import org.floens.chan.core.di.UserAgentProvider; |
|
|
|
|
import org.floens.chan.core.model.PostImage; |
|
|
|
|
import org.floens.chan.core.settings.ChanSettings; |
|
|
|
|
import org.floens.chan.utils.AndroidUtils; |
|
|
|
@ -70,11 +81,13 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
@Inject |
|
|
|
|
ImageLoader imageLoader; |
|
|
|
|
|
|
|
|
|
@Inject |
|
|
|
|
UserAgentProvider userAgent; |
|
|
|
|
|
|
|
|
|
private ImageView playView; |
|
|
|
|
|
|
|
|
|
private PostImage postImage; |
|
|
|
|
private Callback callback; |
|
|
|
|
|
|
|
|
|
private Mode mode = Mode.UNLOADED; |
|
|
|
|
|
|
|
|
|
private boolean hasContent = false; |
|
|
|
@ -84,8 +97,10 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
private FileCacheDownloader videoRequest; |
|
|
|
|
|
|
|
|
|
private VideoView videoView; |
|
|
|
|
private PlayerView exoVideoView; |
|
|
|
|
private boolean videoError = false; |
|
|
|
|
private MediaPlayer mediaPlayer; |
|
|
|
|
private SimpleExoPlayer exoPlayer; |
|
|
|
|
|
|
|
|
|
public MultiImageView(Context context) { |
|
|
|
|
this(context, null); |
|
|
|
@ -166,9 +181,15 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void setVolume(boolean muted) { |
|
|
|
|
if (mediaPlayer != null) { |
|
|
|
|
final float volume = muted ? 0f : 1f; |
|
|
|
|
mediaPlayer.setVolume(volume, volume); |
|
|
|
|
final float volume = muted ? 0f : 1f; |
|
|
|
|
if (ChanSettings.videoUseExoplayer.get()) { |
|
|
|
|
if (exoPlayer != null) { |
|
|
|
|
exoPlayer.getAudioComponent().setVolume(volume); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (mediaPlayer != null) { |
|
|
|
|
mediaPlayer.setVolume(volume, volume); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -391,6 +412,21 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
AndroidUtils.openIntent(intent); |
|
|
|
|
|
|
|
|
|
onModeLoaded(Mode.MOVIE, videoView); |
|
|
|
|
} else if (ChanSettings.videoUseExoplayer.get()) { |
|
|
|
|
exoVideoView = new PlayerView(getContext()); |
|
|
|
|
exoPlayer = ExoPlayerFactory.newSimpleInstance(getContext()); |
|
|
|
|
exoVideoView.setPlayer(exoPlayer); |
|
|
|
|
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(getContext(), |
|
|
|
|
Util.getUserAgent(getContext(), userAgent.getUserAgent())); |
|
|
|
|
MediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory) |
|
|
|
|
.createMediaSource(android.net.Uri.fromFile(file)); |
|
|
|
|
|
|
|
|
|
exoPlayer.setRepeatMode(Player.REPEAT_MODE_ALL); //Repeat forever
|
|
|
|
|
|
|
|
|
|
exoPlayer.prepare(videoSource); |
|
|
|
|
callback.onVideoLoaded(this, hasMediaPlayerAudioTracks(exoPlayer)); |
|
|
|
|
addView(exoVideoView); |
|
|
|
|
exoPlayer.setPlayWhenReady(true); |
|
|
|
|
} else { |
|
|
|
|
Context proxyContext = new NoMusicServiceCommandContext(getContext()); |
|
|
|
|
|
|
|
|
@ -451,6 +487,10 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean hasMediaPlayerAudioTracks(ExoPlayer mediaPlayer) { |
|
|
|
|
return mediaPlayer.getAudioComponent() != null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void onVideoError() { |
|
|
|
|
if (!videoError) { |
|
|
|
|
videoError = true; |
|
|
|
@ -463,6 +503,10 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
mediaPlayer = null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void cleanupVideo(PlayerView videoView) { |
|
|
|
|
videoView.getPlayer().release(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void setBitImageFileInternal(File file, boolean tiling, final Mode forMode) { |
|
|
|
|
final CustomScaleImageView image = new CustomScaleImageView(getContext()); |
|
|
|
|
image.setImage(ImageSource.uri(file.getAbsolutePath()).tiling(tiling)); |
|
|
|
@ -535,6 +579,8 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener |
|
|
|
|
if (child != view) { |
|
|
|
|
if (child instanceof VideoView) { |
|
|
|
|
cleanupVideo((VideoView) child); |
|
|
|
|
} else if (child instanceof PlayerView) { |
|
|
|
|
cleanupVideo((PlayerView) child); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
removeViewAt(i); |
|
|
|
|