@ -20,8 +20,10 @@ package org.floens.chan.ui.view;
import android.content.Context ;
import android.content.ContextWrapper ;
import android.content.Intent ;
import android.media.AudioManager ;
import android.media.MediaPlayer ;
import android.net.Uri ;
import android.os.Build ;
import android.util.AttributeSet ;
import android.view.Gravity ;
import android.view.View ;
@ -81,23 +83,19 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
private VideoView videoView ;
private boolean videoError = false ;
private MediaPlayer mediaPlayer ;
public MultiImageView ( Context context ) {
super ( context ) ;
init ( ) ;
this ( context , null ) ;
}
public MultiImageView ( Context context , AttributeSet attrs ) {
super ( context , attrs ) ;
init ( ) ;
this ( context , attrs , 0 ) ;
}
public MultiImageView ( Context context , AttributeSet attrs , int defStyleAttr ) {
super ( context , attrs , defStyleAttr ) ;
init ( ) ;
}
public MultiImageView ( Context context , AttributeSet attrs , int defStyle ) {
super ( context , attrs , defStyle ) ;
private void init ( ) {
inject ( this ) ;
setOnClickListener ( this ) ;
@ -165,6 +163,13 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
return bigImage ;
}
public void setVolume ( boolean muted ) {
if ( mediaPlayer ! = null ) {
final float volume = muted ? 0f : 1f ;
mediaPlayer . setVolume ( volume , volume ) ;
}
}
@Override
public void onClick ( View v ) {
callback . onTap ( this ) ;
@ -374,23 +379,24 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
videoView . setZOrderOnTop ( true ) ;
videoView . setMediaController ( new MediaController ( getContext ( ) ) ) ;
addView ( videoView , 0 , new FrameLayout . LayoutParams ( LayoutParams . MATCH_PARENT , LayoutParams . MATCH_PARENT , Gravity . CENTER ) ) ;
if ( Build . VERSION . SDK_INT > = Build . VERSION_CODES . O ) {
videoView . setAudioFocusRequest ( AudioManager . AUDIOFOCUS_NONE ) ;
}
videoView . setOnPreparedListener ( new MediaPlayer . OnPreparedListener ( ) {
@Override
public void onPrepared ( MediaPlayer mp ) {
addView ( videoView , 0 , new LayoutParams ( LayoutParams . MATCH_PARENT , LayoutParams . MATCH_PARENT , Gravity . CENTER ) ) ;
videoView . setOnPreparedListener ( mp - > {
mediaPlayer = mp ;
mp . setLooping ( true ) ;
mp . setVolume ( 0f , 0f ) ;
onModeLoaded ( Mode . MOVIE , videoView ) ;
}
callback . onVideoLoaded ( this , hasMediaPlayerAudioTracks ( mp ) ) ;
} ) ;
videoView . setOnErrorListener ( new MediaPlayer . OnErrorListener ( ) {
@Override
public boolean onError ( MediaPlayer mp , int what , int extra ) {
videoView . setOnErrorListener ( ( mp , what , extra ) - > {
onVideoError ( ) ;
return true ;
}
} ) ;
videoView . setVideoPath ( file . getAbsolutePath ( ) ) ;
@ -404,6 +410,21 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
}
private boolean hasMediaPlayerAudioTracks ( MediaPlayer mediaPlayer ) {
if ( Build . VERSION . SDK_INT > = Build . VERSION_CODES . JELLY_BEAN ) {
for ( MediaPlayer . TrackInfo trackInfo : mediaPlayer . getTrackInfo ( ) ) {
if ( trackInfo . getTrackType ( ) = = MediaPlayer . TrackInfo . MEDIA_TRACK_TYPE_AUDIO ) {
return true ;
}
}
return false ;
} else {
// It'll just show the icon without doing anything. Remove when 4.0 is dropped.
return true ;
}
}
private void onVideoError ( ) {
if ( ! videoError ) {
videoError = true ;
@ -411,6 +432,11 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
}
}
private void cleanupVideo ( VideoView videoView ) {
videoView . stopPlayback ( ) ;
mediaPlayer = null ;
}
private void setBitImageFileInternal ( File file , boolean tiling , final Mode forMode ) {
final CustomScaleImageView image = new CustomScaleImageView ( getContext ( ) ) ;
image . setImage ( ImageSource . uri ( file . getAbsolutePath ( ) ) . tiling ( tiling ) ) ;
@ -482,8 +508,7 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
if ( child ! = playView ) {
if ( child ! = view ) {
if ( child instanceof VideoView ) {
VideoView item = ( VideoView ) child ;
item . stopPlayback ( ) ;
cleanupVideo ( ( VideoView ) child ) ;
}
removeViewAt ( i ) ;
@ -511,6 +536,8 @@ public class MultiImageView extends FrameLayout implements View.OnClickListener
void onVideoError ( MultiImageView multiImageView ) ;
void onVideoLoaded ( MultiImageView multiImageView , boolean hasAudio ) ;
void onModeLoaded ( MultiImageView multiImageView , Mode mode ) ;
}