Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -304,14 +304,6 @@ abstract class BaseRecyclerFragment<LI> : BaseRecyclerParentFragment<Any?>(), On
return items.filterIsInstance<RealmMyCourse>()
}

fun applyFilter(libraries: List<RealmMyLibrary>): List<RealmMyLibrary> {
val newList: MutableList<RealmMyLibrary> = ArrayList()
for (l in libraries) {
if (isValidFilter(l)) newList.add(l)
}
return newList
}

private fun applyCourseFilter(courses: List<RealmMyCourse>): List<RealmMyCourse> {
if (TextUtils.isEmpty(subjectLevel) && TextUtils.isEmpty(gradeLevel)) return courses
val newList: MutableList<RealmMyCourse> = ArrayList()
Expand All @@ -326,14 +318,6 @@ abstract class BaseRecyclerFragment<LI> : BaseRecyclerParentFragment<Any?>(), On
return newList
}

private fun isValidFilter(l: RealmMyLibrary): Boolean {
val sub = subjects.isEmpty() || subjects.let { l.subject?.containsAll(it) } == true
val lev = levels.isEmpty() || l.level?.containsAll(levels) == true
val lan = languages.isEmpty() || languages.contains(l.language)
val med = mediums.isEmpty() || mediums.contains(l.mediaType)
return sub && lev && lan && med
}

override fun onDestroy() {
cleanupRealm()
super.onDestroy()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,9 @@ data class ResourceItem(
val isOffline: Boolean,
val _rev: String?,
val uploadDate: String?,
val filename: String?
val filename: String?,
val subject: List<String>? = null,
val level: List<String>? = null,
val language: String? = null,
val mediaType: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import org.ole.planet.myplanet.ui.sync.RealtimeSyncHelper
import org.ole.planet.myplanet.ui.sync.RealtimeSyncMixin
import org.ole.planet.myplanet.utils.Constants.PREFS_NAME
import org.ole.planet.myplanet.utils.DialogUtils
import androidx.fragment.app.viewModels
import org.ole.planet.myplanet.utils.DialogUtils.guestDialog
import org.ole.planet.myplanet.utils.KeyboardUtils.setupUI
import org.ole.planet.myplanet.utils.Utilities
Expand Down Expand Up @@ -79,6 +80,8 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
private var isFirstResume = true
private var allLibraryItems: List<RealmMyLibrary> = emptyList()

private val resourcesViewModel: ResourcesViewModel by viewModels()

@Inject
lateinit var prefManager: SharedPrefManager

Expand Down Expand Up @@ -199,15 +202,18 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
val allResourceIds = allLibraryItems.mapNotNull { it.id }
tagsMap = tagsRepository.getTagsForResources(allResourceIds)

val filteredLibraryList = applyFilter(filterLocalLibraryByTag(searchQuery, currentSearchTags))
val mappedItems = allLibraryItems.map { it.toResourceItem() }
val mappedTagsMap = tagsMap.mapValues { entry -> entry.value.map { it.toTagItem() } }
val mappedSearchTags = currentSearchTags.map { it.toTagItem() }

resourcesViewModel.setAllLibraryItems(mappedItems, mappedTagsMap)
resourcesViewModel.setSearchTags(mappedSearchTags)
resourcesViewModel.setSearchQuery(searchQuery)

if (::adapterLibrary.isInitialized) {
adapterLibrary.setLibraryList(filteredLibraryList.map { it.toResourceItem() })
adapterLibrary.setRatingMap(map!!)
adapterLibrary.setTagsMap(tagsMap.mapValues { entry -> entry.value.map { it.toTagItem() } })
adapterLibrary.setTagsMap(mappedTagsMap)
}
checkList(filteredLibraryList.size)
showNoData(tvMessage, filteredLibraryList.size, "resources")

} catch (e: Exception) {
e.printStackTrace()
Expand All @@ -227,7 +233,11 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
isOffline = isResourceOffline(),
_rev = _rev,
uploadDate = uploadDate,
filename = filename
filename = filename,
subject = subject,
level = level,
language = language,
mediaType = mediaType
)
}

Expand All @@ -252,16 +262,20 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
val user = profileDbHandler.getUserModel()
adapterLibrary = ResourcesAdapter(requireActivity(), map!!, user?.isGuest() == true, emptyMap(), emptySet())

val filteredList = filterLocalLibraryByTag(etSearch.text?.toString()?.trim().orEmpty(), searchTags)
adapterLibrary.setLibraryList(filteredList.map { it.toResourceItem() })
adapterLibrary.setTagsMap(tagsMap.mapValues { entry -> entry.value.map { it.toTagItem() } })
val mappedItems = allLibraryItems.map { it.toResourceItem() }
val mappedTagsMap = tagsMap.mapValues { entry -> entry.value.map { it.toTagItem() } }
val mappedSearchTags = searchTags.map { it.toTagItem() }

resourcesViewModel.setAllLibraryItems(mappedItems, mappedTagsMap)
val searchQuery = etSearch.text?.toString()?.trim().orEmpty()
resourcesViewModel.setSearchQuery(searchQuery)
resourcesViewModel.setSearchTags(mappedSearchTags)

adapterLibrary.setTagsMap(mappedTagsMap)

adapterLibrary.setRatingChangeListener(this)
adapterLibrary.setListener(this)

checkList(filteredList.size)
showNoData(tvMessage, filteredList.size, "resources")
changeButtonStatus()
return adapterLibrary
}

Expand All @@ -280,22 +294,32 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
userModel = profileDbHandler.getUserModel()
setupGuestUserRestrictions()

if (userModel?.id != null) {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
resourcesRepository.observeOpenedResourceIds(userModel!!.id!!).collect { openedResourceIds ->
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
resourcesViewModel.filteredLibraryItems.collect { filteredList ->
if (::adapterLibrary.isInitialized) {
adapterLibrary.setOpenedResourceIds(openedResourceIds)
adapterLibrary.setLibraryList(filteredList) {
recyclerView.scrollToPosition(0)
}
checkList(filteredList.size)
showNoData(tvMessage, filteredList.size, "resources")
changeButtonStatus()
}
}
}

if (userModel?.id != null) {
launch {
resourcesRepository.observeOpenedResourceIds(userModel!!.id!!).collect { openedResourceIds ->
if (::adapterLibrary.isInitialized) {
adapterLibrary.setOpenedResourceIds(openedResourceIds)
}
}
}
}
}
}

if (::adapterLibrary.isInitialized) {
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
changeButtonStatus()
checkList()
}
clearTagsButton()
setupUI(binding.myLibraryParentLayout, requireActivity())
additionalSetup()
Expand Down Expand Up @@ -355,14 +379,7 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
searchTextWatcher = object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
if (!::adapterLibrary.isInitialized) return
lifecycleScope.launch {
val filteredList = applyFilter(filterLocalLibraryByTag(etSearch.text.toString().trim(), searchTags))
adapterLibrary.setLibraryList(filteredList.map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
}
resourcesViewModel.setSearchQuery(s.toString().trim())
}

override fun afterTextChanged(s: Editable) {}
Expand Down Expand Up @@ -494,16 +511,15 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
clearTags.setOnClickListener {
saveSearchActivity()
searchTags.clear()
resourcesViewModel.setSearchTags(emptyList())
etSearch.setText(R.string.empty_text)
resourcesViewModel.setSearchQuery("")
tvSelected.text = getString(R.string.empty_text)
levels.clear()
mediums.clear()
subjects.clear()
languages.clear()
adapterLibrary.setLibraryList(applyFilter(filterLocalLibraryByTag("", searchTags)).map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
resourcesViewModel.setFilters(emptySet(), emptySet(), emptySet(), emptySet())
}
}

Expand Down Expand Up @@ -538,32 +554,23 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
chipCloud.setDeleteListener(this)
if (!searchTags.any { it.name == tag.name }) searchTags.add(tag)
chipCloud.addChips(searchTags)
adapterLibrary.setLibraryList(applyFilter(filterLocalLibraryByTag(etSearch.text.toString(), searchTags)).map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
resourcesViewModel.setSearchTags(searchTags.map { it.toTagItem() })
showTagText(searchTags, tvSelected)
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
}

override fun onTagSelected(tag: RealmTag) {
tvSelected.visibility = View.VISIBLE
val li: MutableList<RealmTag> = ArrayList()
li.add(tag)
searchTags = li
resourcesViewModel.setSearchTags(searchTags.map { it.toTagItem() })
tvSelected.text = getString(R.string.tag_selected, tag.name)
adapterLibrary.setLibraryList(applyFilter(filterLocalLibraryByTag(etSearch.text.toString(), li)).map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
}

override fun onOkClicked(list: List<RealmTag>?) {
if (list?.isEmpty() == true) {
searchTags.clear()
adapterLibrary.setLibraryList(applyFilter(filterLocalLibraryByTag(etSearch.text.toString(), searchTags)).map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
resourcesViewModel.setSearchTags(emptyList())
} else {
for (tag in list ?: emptyList()) {
onTagClicked(tag)
Expand All @@ -584,21 +591,15 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem

override fun chipDeleted(i: Int, s: String) {
searchTags.removeAt(i)
adapterLibrary.setLibraryList(applyFilter(filterLocalLibraryByTag(etSearch.text.toString(), searchTags)).map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
resourcesViewModel.setSearchTags(searchTags.map { it.toTagItem() })
}

override fun filter(subjects: MutableSet<String>, languages: MutableSet<String>, mediums: MutableSet<String>, levels: MutableSet<String>) {
this.subjects = subjects
this.languages = languages
this.mediums = mediums
this.levels = levels
adapterLibrary.setLibraryList(applyFilter(filterLocalLibraryByTag(etSearch.text.toString().trim { it <= ' ' }, searchTags)).map { it.toResourceItem() }) {
recyclerView.scrollToPosition(0)
}
showNoData(tvMessage, adapterLibrary.itemCount, "resources")
resourcesViewModel.setFilters(subjects, languages, mediums, levels)
}

override suspend fun getData(): Map<String, Set<String>> {
Expand All @@ -609,10 +610,10 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem

override fun getSelectedFilter(): Map<String, Set<String>> {
val b: MutableMap<String, Set<String>> = HashMap()
b["languages"] = languages
b["subjects"] = subjects
b["mediums"] = mediums
b["levels"] = levels
b["languages"] = resourcesViewModel.getLanguages()
b["subjects"] = resourcesViewModel.getSubjects()
b["mediums"] = resourcesViewModel.getMediums()
b["levels"] = resourcesViewModel.getLevels()
return b
}

Expand Down Expand Up @@ -650,9 +651,9 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
}

private fun filterApplied(searchText: String): Boolean {
return !(subjects.isEmpty() && languages.isEmpty()
&& mediums.isEmpty() && levels.isEmpty()
&& searchTags.isEmpty() && searchText.isEmpty())
return !(resourcesViewModel.getSubjects().isEmpty() && resourcesViewModel.getLanguages().isEmpty()
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Complex binary expression [qlty:boolean-logic]

&& resourcesViewModel.getMediums().isEmpty() && resourcesViewModel.getLevels().isEmpty()
&& resourcesViewModel.getSearchTags().isEmpty() && searchText.isEmpty())
}

private fun saveSearchActivity() {
Expand All @@ -666,16 +667,17 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
return@launch
}

val tags = searchTags.toList()
resourcesRepository.saveSearchActivity(
userName,
searchText,
planetCode,
parentCode,
searchTags,
subjects,
languages,
levels,
mediums
tags,
resourcesViewModel.getSubjects(),
resourcesViewModel.getLanguages(),
resourcesViewModel.getLevels(),
resourcesViewModel.getMediums()
)
}
}
Expand Down Expand Up @@ -740,37 +742,6 @@ class ResourcesFragment : BaseRecyclerFragment<RealmMyLibrary?>(), OnLibraryItem
return if (::recyclerView.isInitialized) recyclerView else null
}

private fun filterLocalLibraryByTag(s: String, tags: List<RealmTag>): List<RealmMyLibrary> {
val normalizedSearchTerm = normalizeText(s)

var filteredList = if (s.isEmpty()) {
allLibraryItems
} else {
val queryParts = s.split(" ").filterNot { it.isEmpty() }
val normalizedQueryParts = queryParts.map { normalizeText(it) }
val startsWithQuery = mutableListOf<RealmMyLibrary>()
val containsQuery = mutableListOf<RealmMyLibrary>()

for (item in allLibraryItems) {
val title = item.title?.let { normalizeText(it) } ?: continue
if (title.startsWith(normalizedSearchTerm, ignoreCase = true)) {
startsWithQuery.add(item)
} else if (normalizedQueryParts.all { title.contains(it, ignoreCase = true) }) {
containsQuery.add(item)
}
}
startsWithQuery + containsQuery
}

if (tags.isNotEmpty()) {
filteredList = filteredList.filter { library ->
val libraryTags = library.id?.let { tagsMap[it] } ?: emptyList()
tags.any { searchTag -> libraryTags.any { it.id == searchTag.id } }
}
}
return filteredList
}

override fun deleteSelected(deleteProgress: Boolean) {
val userId = userModel?.id
val itemsToDelete = selectedItems?.mapNotNull { it?.resourceId } ?: emptyList()
Expand Down
Loading