11package pizzk.media.picker.adapter
22
33import android.content.Context
4+ import android.provider.MediaStore
5+ import android.view.LayoutInflater
46import android.view.View
57import android.view.ViewGroup
8+ import android.widget.VideoView
69import androidx.viewpager.widget.PagerAdapter
710import com.github.chrisbanes.photoview.PhotoView
11+ import pizzk.media.picker.R
812import pizzk.media.picker.arch.PickControl
913import pizzk.media.picker.source.IMedia
1014import pizzk.media.picker.source.IMediaSource
1115import pizzk.media.picker.utils.PickUtils
1216
1317class PreviewPhotoAdapter (private val context : Context , private val source : IMediaSource ) :
1418 PagerAdapter () {
15- private val views: MutableList <PhotoView > = ArrayList (5 )
19+ private val views: MutableList <View > = ArrayList (5 )
1620 private val lp: ViewGroup .LayoutParams = ViewGroup .LayoutParams (
1721 ViewGroup .LayoutParams .MATCH_PARENT ,
1822 ViewGroup .LayoutParams .MATCH_PARENT
1923 )
20- private var currentItem : PhotoView ? = null
24+ private var vCurrent : View ? = null
2125 private var clickBlock: (View ) -> Unit = { _ -> }
2226 private var scaleBlock: () -> Unit = { }
27+ private var vPlaying: View ? = null
2328
2429 override fun isViewFromObject (view : View , obj : Any ): Boolean = view == = obj
2530
2631 override fun getCount (): Int = source.count()
2732
2833 override fun instantiateItem (container : ViewGroup , position : Int ): Any {
29- val view: PhotoView = if (views.isEmpty()) {
30- PhotoView (context)
34+ val view: View = if (views.isEmpty()) {
35+ LayoutInflater .from (context).inflate( R .layout.preview_photo_page_item, null )
3136 } else {
3237 views.removeAt(0 )
3338 }
34- view.setOnScaleChangeListener { _, _, _ -> scaleBlock() }
3539 container.addView(view, lp)
3640 view.setOnClickListener(clickBlock)
37- val media: IMedia = source[position] ? : return view
38- PickControl .imageLoad().load(view, media.uri(), media.mimeType())
41+ //
42+ val vPhoto = view.findViewById<PhotoView >(R .id.vPhoto)
43+ vPhoto.setOnScaleChangeListener { _, _, _ -> scaleBlock() }
44+ val vVideo = view.findViewById<VideoView >(R .id.video)
45+ val vPause = view.findViewById<View >(R .id.vPause)
46+ //
47+ val media: IMedia ? = source[position]
48+ val isVideo = media?.mediaType() == MediaStore .Files .FileColumns .MEDIA_TYPE_VIDEO
49+ vVideo.visibility = View .GONE
50+ vPause.visibility = if (isVideo) View .VISIBLE else View .GONE
51+ //
52+ media ? : return view
53+ PickControl .imageLoad().load(vPhoto, media.uri(), media.mimeType())
54+ vVideo.setVideoURI(media.uri())
55+ vVideo.setOnCompletionListener {
56+ vVideo.visibility = View .GONE
57+ }
58+ vVideo.setOnErrorListener { _, _, _ ->
59+ vVideo.visibility = View .GONE
60+ return @setOnErrorListener true
61+ }
62+ vPause.setOnClickListener {
63+ vVideo.stopPlayback()
64+ vVideo.start()
65+ vVideo.resume()
66+ vPlaying = view
67+ vVideo.visibility = View .VISIBLE
68+ }
3969 return view
4070 }
4171
@@ -48,17 +78,29 @@ class PreviewPhotoAdapter(private val context: Context, private val source: IMed
4878 }
4979
5080 override fun destroyItem (container : ViewGroup , position : Int , obj : Any ) {
51- val view: PhotoView = obj as PhotoView
81+ val view: View = obj as View
82+ if (views.size < 5 ) views.add(view)
5283 container.removeView(view)
53- views.add(view)
5484 }
5585
5686 override fun setPrimaryItem (container : ViewGroup , position : Int , obj : Any ) {
5787 super .setPrimaryItem(container, position, obj)
58- currentItem = obj as ? PhotoView
88+ vCurrent = obj as ? View
5989 }
6090
61- fun getPrimaryItem (): PhotoView ? = currentItem
91+ fun resetScale () {
92+ val view = vCurrent ? : return
93+ val vPhoto = view.findViewById<PhotoView >(R .id.vPhoto)
94+ if (vPhoto.scale != 1.0f ) vPhoto.scale = 1.0f
95+ }
96+
97+ fun stopPlay () {
98+ val view = vCurrent ? : vPlaying ? : return
99+ val vVideo = view.findViewById<VideoView >(R .id.video)
100+ vVideo.stopPlayback()
101+ vVideo.visibility = View .GONE
102+ vPlaying = null
103+ }
62104
63105 fun getPath (position : Int ): String = source[position]?.uri()?.toString() ? : " "
64106
0 commit comments