Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@ package org.readium.r2.testapp.catalogs
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.databinding.DataBindingUtil
import androidx.navigation.Navigation
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import org.readium.r2.testapp.R
import org.readium.r2.testapp.databinding.ItemRecycleCatalogListBinding
import org.readium.r2.testapp.databinding.ItemRecycleButtonBinding
import org.readium.r2.testapp.domain.model.Catalog

class CatalogFeedListAdapter(private val onLongClick: (Catalog) -> Unit) :
Expand All @@ -26,10 +25,7 @@ class CatalogFeedListAdapter(private val onLongClick: (Catalog) -> Unit) :
viewType: Int
): ViewHolder {
return ViewHolder(
DataBindingUtil.inflate(
LayoutInflater.from(parent.context),
R.layout.item_recycle_catalog_list, parent, false
)
ItemRecycleButtonBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}

Expand All @@ -40,11 +36,11 @@ class CatalogFeedListAdapter(private val onLongClick: (Catalog) -> Unit) :
viewHolder.bind(catalog)
}

inner class ViewHolder(private val binding: ItemRecycleCatalogListBinding) :
inner class ViewHolder(private val binding: ItemRecycleButtonBinding) :
RecyclerView.ViewHolder(binding.root) {

fun bind(catalog: Catalog) {
binding.catalog = catalog
binding.catalogListButton.text = catalog.title
binding.catalogListButton.setOnClickListener {
val bundle = bundleOf(CATALOGFEED to catalog)
Navigation.findNavController(it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,15 @@
package org.readium.r2.testapp.catalogs

import android.os.Bundle
import android.view.*
import android.widget.Button
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.content.res.AppCompatResources
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.core.view.setPadding
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.Navigation
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import org.readium.r2.shared.opds.Facet
import org.readium.r2.testapp.MainActivity
Expand All @@ -34,15 +30,16 @@ import org.readium.r2.testapp.opds.GridAutoFitLayoutManager
class CatalogFragment : Fragment() {

private val catalogViewModel: CatalogViewModel by viewModels()
private lateinit var catalogListAdapter: CatalogListAdapter
private lateinit var publicationAdapter: PublicationAdapter
private lateinit var groupAdapter: GroupAdapter
private lateinit var navigationAdapter: NavigationAdapter
private lateinit var catalog: Catalog
private var showFacetMenu = false
private lateinit var facets: MutableList<Facet>

private var _binding: FragmentCatalogBinding? = null
private val binding get() = _binding!!

// FIXME the entire way this fragment is built feels like a hack. Need a cleaner UI
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
Expand All @@ -56,19 +53,36 @@ class CatalogFragment : Fragment() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
catalogListAdapter = CatalogListAdapter()
publicationAdapter = PublicationAdapter()
navigationAdapter = NavigationAdapter(catalog.type)
groupAdapter = GroupAdapter(catalog.type)
setHasOptionsMenu(true)

binding.catalogDetailList.apply {
binding.catalogNavigationList.apply {
layoutManager = LinearLayoutManager(requireContext())
adapter = navigationAdapter
addItemDecoration(
CatalogFeedListFragment.VerticalSpaceItemDecoration(
10
)
)
}

binding.catalogPublicationsList.apply {
layoutManager = GridAutoFitLayoutManager(requireContext(), 120)
adapter = catalogListAdapter
adapter = publicationAdapter
addItemDecoration(
BookshelfFragment.VerticalSpaceItemDecoration(
10
)
)
}

binding.catalogGroupList.apply {
layoutManager = LinearLayoutManager(requireContext())
adapter = groupAdapter
}

(activity as MainActivity).supportActionBar?.title = catalog.title

// TODO this feels hacky, I don't want to parse the file if it has not changed
Expand All @@ -85,110 +99,10 @@ class CatalogFragment : Fragment() {
}
requireActivity().invalidateOptionsMenu()

result.feed!!.navigation.forEachIndexed { index, navigation ->
val button = Button(requireContext())
button.apply {
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
text = navigation.title
setOnClickListener {
val catalog1 = Catalog(
href = navigation.href,
title = navigation.title!!,
type = catalog.type
)
val bundle = bundleOf(CATALOGFEED to catalog1)
Navigation.findNavController(it)
.navigate(R.id.action_navigation_catalog_self, bundle)
}
}
binding.catalogLinearLayout.addView(button, index)
}

if (result.feed!!.publications.isNotEmpty()) {
catalogListAdapter.submitList(result.feed!!.publications)
}
navigationAdapter.submitList(result.feed!!.navigation)
publicationAdapter.submitList(result.feed!!.publications)
groupAdapter.submitList(result.feed!!.groups)

for (group in result.feed!!.groups) {
if (group.publications.isNotEmpty()) {
val linearLayout = LinearLayout(requireContext()).apply {
orientation = LinearLayout.HORIZONTAL
setPadding(10)
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1f
)
weightSum = 2f
addView(TextView(requireContext()).apply {
text = group.title
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1f
)
})
if (group.links.size > 0) {
addView(ImageView(requireContext()).apply {
// FIXME Have the arrow at the very end
setImageDrawable(AppCompatResources.getDrawable(requireContext(), R.drawable.ic_baseline_arrow_forward_24))
contentDescription = getString(R.string.catalog_list_more)
gravity = Gravity.END
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1f
)
setOnClickListener {
val catalog1 = Catalog(
href = group.links.first().href,
title = group.title,
type = catalog.type
)
val bundle = bundleOf(CATALOGFEED to catalog1)
Navigation.findNavController(it)
.navigate(R.id.action_navigation_catalog_self, bundle)
}
})
}
}
val publicationRecyclerView = RecyclerView(requireContext()).apply {
layoutManager = LinearLayoutManager(requireContext())
(layoutManager as LinearLayoutManager).orientation =
LinearLayoutManager.HORIZONTAL
adapter = CatalogListAdapter().apply {
submitList(group.publications)
}
}
binding.catalogLinearLayout.addView(linearLayout)
binding.catalogLinearLayout.addView(publicationRecyclerView)
}
if (group.navigation.isNotEmpty()) {
for (navigation in group.navigation) {
val button = Button(requireContext())
button.apply {
layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
)
text = navigation.title
setOnClickListener {
val catalog1 = Catalog(
href = navigation.href,
title = navigation.title!!,
type = catalog.type
)
val bundle = bundleOf(CATALOGFEED to catalog1)
Navigation.findNavController(it)
.navigate(R.id.action_navigation_catalog_self, bundle)
}
}
binding.catalogLinearLayout.addView(button)
}
}
}
binding.catalogProgressBar.visibility = View.GONE
})
}
Expand Down
100 changes: 100 additions & 0 deletions test-app/src/main/java/org/readium/r2/testapp/catalogs/GroupAdapter.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Copyright 2021 Readium Foundation. All rights reserved.
* Use of this source code is governed by the BSD-style license
* available in the top-level LICENSE file of the project.
*/

package org.readium.r2.testapp.catalogs

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.os.bundleOf
import androidx.navigation.Navigation
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import org.readium.r2.shared.opds.Group
import org.readium.r2.testapp.R
import org.readium.r2.testapp.databinding.ItemGroupViewBinding
import org.readium.r2.testapp.domain.model.Catalog

class GroupAdapter(val type: Int) :
ListAdapter<Group, GroupAdapter.ViewHolder>(GroupDiff()) {

override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
return ViewHolder(
ItemGroupViewBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
)
}

override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
val group = getItem(position)

viewHolder.bind(group)
}

inner class ViewHolder(private val binding: ItemGroupViewBinding) :
RecyclerView.ViewHolder(binding.root) {

fun bind(group: Group) {
binding.groupViewGroupPublications.itemRecycleHeaderTitle.text = group.title
if (group.links.size > 0) {
binding.groupViewGroupPublications.itemRecycleMoreButton.visibility = View.VISIBLE
binding.groupViewGroupPublications.itemRecycleMoreButton.setOnClickListener {
val catalog1 = Catalog(
href = group.links.first().href,
title = group.title,
type = type
)
val bundle = bundleOf(CatalogFeedListAdapter.CATALOGFEED to catalog1)
Navigation.findNavController(it)
.navigate(R.id.action_navigation_catalog_self, bundle)
}
}
binding.groupViewGroupPublications.recyclerView.apply {
layoutManager = LinearLayoutManager(binding.root.context)
(layoutManager as LinearLayoutManager).orientation =
LinearLayoutManager.HORIZONTAL
adapter = PublicationAdapter().apply {
submitList(group.publications)
}
}
binding.groupViewGroupLinks.apply {
layoutManager = LinearLayoutManager(binding.root.context)
adapter = NavigationAdapter(type).apply {
submitList(group.navigation)
}
addItemDecoration(
CatalogFeedListFragment.VerticalSpaceItemDecoration(
10
)
)
}
}
}

private class GroupDiff : DiffUtil.ItemCallback<Group>() {

override fun areItemsTheSame(
oldItem: Group,
newItem: Group
): Boolean {
return oldItem == newItem
}

override fun areContentsTheSame(
oldItem: Group,
newItem: Group
): Boolean {
return oldItem == newItem
}
}

}
Loading