android/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt

159 lines
5.6 KiB
Kotlin

/*
* Nextcloud Android client application
*
* @author Tobias Kaminsky
* @author Chris Narkiewicz <hello@ezaquarii.com>
*
* Copyright (C) 2018 Tobias Kaminsky
* Copyright (C) 2018 Nextcloud
* Copyright (C) 2020 Chris Narkiewicz <hello@ezaquarii.com>
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
package com.owncloud.android.ui.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter
import com.afollestad.sectionedrecyclerview.SectionedViewHolder
import com.nextcloud.client.account.User
import com.nextcloud.client.network.ClientFactory
import com.owncloud.android.R
import com.owncloud.android.databinding.UnifiedSearchEmptyBinding
import com.owncloud.android.databinding.UnifiedSearchFooterBinding
import com.owncloud.android.databinding.UnifiedSearchHeaderBinding
import com.owncloud.android.databinding.UnifiedSearchItemBinding
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.ThumbnailsCacheManager.InitDiskCacheTask
import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
import com.owncloud.android.utils.theme.ViewThemeUtils
/**
* This Adapter populates a SectionedRecyclerView with search results by unified search
*/
@Suppress("LongParameterList")
class UnifiedSearchListAdapter(
private val storageManager: FileDataStorageManager,
private val listInterface: UnifiedSearchListInterface,
private val filesAction: UnifiedSearchItemViewHolder.FilesAction,
private val user: User,
private val clientFactory: ClientFactory,
private val context: Context,
private val viewThemeUtils: ViewThemeUtils
) : SectionedRecyclerViewAdapter<SectionedViewHolder>() {
companion object {
private const val VIEW_TYPE_EMPTY = Int.MAX_VALUE
}
private var sections: List<UnifiedSearchSection> = emptyList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SectionedViewHolder {
val layoutInflater = LayoutInflater.from(context)
return when (viewType) {
VIEW_TYPE_HEADER -> {
val binding = UnifiedSearchHeaderBinding.inflate(
layoutInflater,
parent,
false
)
UnifiedSearchHeaderViewHolder(binding, viewThemeUtils, context)
}
VIEW_TYPE_FOOTER -> {
val binding = UnifiedSearchFooterBinding.inflate(
layoutInflater,
parent,
false
)
UnifiedSearchFooterViewHolder(binding, context, listInterface)
}
VIEW_TYPE_ITEM -> {
val binding = UnifiedSearchItemBinding.inflate(
layoutInflater,
parent,
false
)
UnifiedSearchItemViewHolder(
binding,
user,
clientFactory,
storageManager,
listInterface,
filesAction,
context,
viewThemeUtils
)
}
VIEW_TYPE_EMPTY -> {
val binding = UnifiedSearchEmptyBinding.inflate(layoutInflater, parent, false)
EmptyViewHolder(binding)
}
else -> throw IllegalArgumentException("Invalid view type")
}
}
internal class EmptyViewHolder(binding: UnifiedSearchEmptyBinding) :
SectionedViewHolder(binding.getRoot())
override fun getSectionCount(): Int {
return sections.size
}
override fun getItemCount(section: Int): Int {
return sections[section].entries.size
}
override fun onBindHeaderViewHolder(holder: SectionedViewHolder, section: Int, expanded: Boolean) {
val headerViewHolder = holder as UnifiedSearchHeaderViewHolder
headerViewHolder.bind(sections[section])
}
override fun onBindFooterViewHolder(holder: SectionedViewHolder, section: Int) {
if (sections[section].hasMoreResults) {
val footerViewHolder = holder as UnifiedSearchFooterViewHolder
footerViewHolder.bind(sections[section])
}
}
override fun getFooterViewType(section: Int): Int = when {
sections[section].hasMoreResults -> VIEW_TYPE_FOOTER
else -> VIEW_TYPE_EMPTY
}
override fun onBindViewHolder(
holder: SectionedViewHolder,
section: Int,
relativePosition: Int,
absolutePosition: Int
) {
// TODO different binding (and also maybe diff UI) for non-file results
val itemViewHolder = holder as UnifiedSearchItemViewHolder
val entry = sections[section].entries[relativePosition]
itemViewHolder.bind(entry)
}
override fun onViewAttachedToWindow(holder: SectionedViewHolder) {
if (holder is UnifiedSearchItemViewHolder) {
val thumbnailShimmer = holder.binding.thumbnailShimmer
if (thumbnailShimmer.visibility == View.VISIBLE) {
thumbnailShimmer.setImageResource(R.drawable.background)
thumbnailShimmer.resetLoader()
}
}
}
@SuppressLint("NotifyDataSetChanged")
fun setData(sections: List<UnifiedSearchSection>) {
this.sections = sections
notifyDataSetChanged()
}
init {
// initialise thumbnails cache on background thread
InitDiskCacheTask().execute()
}
}