67 lines
2.3 KiB
Kotlin
67 lines
2.3 KiB
Kotlin
package org.schabi.newpipe.info_list
|
|
|
|
import android.util.Log
|
|
import com.xwray.groupie.GroupieAdapter
|
|
import org.schabi.newpipe.extractor.stream.StreamInfo
|
|
import kotlin.math.max
|
|
|
|
/**
|
|
* Custom RecyclerView.Adapter/GroupieAdapter for [StreamSegmentItem] for handling selection state.
|
|
*/
|
|
class StreamSegmentAdapter(
|
|
private val listener: StreamSegmentListener
|
|
) : GroupieAdapter() {
|
|
|
|
var currentIndex: Int = 0
|
|
private set
|
|
|
|
/**
|
|
* Returns `true` if the provided [StreamInfo] contains segments, `false` otherwise.
|
|
*/
|
|
fun setItems(info: StreamInfo): Boolean {
|
|
if (info.streamSegments.isNotEmpty()) {
|
|
clear()
|
|
addAll(info.streamSegments.map { StreamSegmentItem(it, listener) })
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
fun selectSegment(segment: StreamSegmentItem) {
|
|
unSelectCurrentSegment()
|
|
currentIndex = max(0, getAdapterPosition(segment))
|
|
segment.isSelected = true
|
|
segment.notifyChanged(StreamSegmentItem.PAYLOAD_SELECT)
|
|
}
|
|
|
|
fun selectSegmentAt(position: Int) {
|
|
try {
|
|
selectSegment(getGroupAtAdapterPosition(position) as StreamSegmentItem)
|
|
} catch (e: IndexOutOfBoundsException) {
|
|
// Just to make sure that getGroupAtAdapterPosition doesn't close the app
|
|
// Shouldn't happen since setItems is always called before select-methods but just in case
|
|
currentIndex = 0
|
|
Log.e("StreamSegmentAdapter", "selectSegmentAt: ${e.message}")
|
|
}
|
|
}
|
|
|
|
private fun unSelectCurrentSegment() {
|
|
try {
|
|
val segmentItem = getGroupAtAdapterPosition(currentIndex) as StreamSegmentItem
|
|
currentIndex = 0
|
|
segmentItem.isSelected = false
|
|
segmentItem.notifyChanged(StreamSegmentItem.PAYLOAD_SELECT)
|
|
} catch (e: IndexOutOfBoundsException) {
|
|
// Just to make sure that getGroupAtAdapterPosition doesn't close the app
|
|
// Shouldn't happen since setItems is always called before select-methods but just in case
|
|
currentIndex = 0
|
|
Log.e("StreamSegmentAdapter", "unSelectCurrentSegment: ${e.message}")
|
|
}
|
|
}
|
|
|
|
interface StreamSegmentListener {
|
|
fun onItemClick(item: StreamSegmentItem, seconds: Int)
|
|
fun onItemLongClick(item: StreamSegmentItem, seconds: Int)
|
|
}
|
|
}
|