diff --git a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt new file mode 100644 index 0000000..7fb2511 --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferItemAdapter.kt @@ -0,0 +1,38 @@ +package com.denizk0461.studip.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.denizk0461.studip.databinding.ItemCanteenBinding +import com.denizk0461.studip.model.CanteenOffer + +class CanteenOfferItemAdapter(private val offers: List) : RecyclerView.Adapter() { + + class OfferViewHolder(val binding: ItemCanteenBinding) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OfferViewHolder { + return OfferViewHolder( + ItemCanteenBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun getItemCount(): Int = offers.size + + override fun onBindViewHolder(holder: OfferViewHolder, position: Int) { + val currentItem = offers[position] + + holder.binding.textCategory.text = currentItem.category + holder.binding.tempContent.text = "${currentItem.title} • ${currentItem.price}" + + // TODO inflate view saying "no offers!" or sth + } + +// interface OnClickListener { +// fun onClick(event: StudIPEvent) +// fun onLongClick(event: StudIPEvent) +// } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt new file mode 100644 index 0000000..3def8fc --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt @@ -0,0 +1,42 @@ +package com.denizk0461.studip.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.denizk0461.studip.databinding.ItemScrollablePageBinding +import com.denizk0461.studip.model.CanteenOffer + +class CanteenOfferPageAdapter(private var offers: List, private var daysCovered: Int) : RecyclerView.Adapter() { + + class CanteenOfferPageViewHolder(val binding: ItemScrollablePageBinding) : RecyclerView.ViewHolder(binding.root) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CanteenOfferPageViewHolder = + CanteenOfferPageViewHolder( + ItemScrollablePageBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun getItemCount(): Int = daysCovered + + override fun onBindViewHolder(holder: CanteenOfferPageViewHolder, position: Int) { + + holder.binding.pageRecyclerView.apply { + + layoutManager = LinearLayoutManager(holder.binding.root.context, LinearLayoutManager.VERTICAL, false) + + val filtered = offers.filter { it.dateId == position + 1 } + adapter = CanteenOfferItemAdapter(filtered) // TODO check if empty + scheduleLayoutAnimation() + } + } + + fun setNewItems(items: List, daysCovered: Int) { + this.daysCovered = daysCovered + offers = items + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt similarity index 97% rename from app/src/main/java/com/denizk0461/studip/adapter/StudIPEventAdapter.kt rename to app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt index adecfb6..0e08a75 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt @@ -9,9 +9,9 @@ import com.denizk0461.studip.model.StudIPEvent import com.denizk0461.studip.databinding.ItemEventBinding import java.util.* -class StudIPEventAdapter( +class StudIPEventItemAdapter( events: List, private val currentDay: Int, private val onClickListener: OnClickListener -) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { private val filteredEvents: List = events.filter { it.day == currentDay } private val currentCalendar = Calendar.getInstance() diff --git a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt index d807268..afc190e 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt @@ -5,14 +5,14 @@ import android.view.ViewGroup import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.denizk0461.studip.model.StudIPEvent -import com.denizk0461.studip.databinding.ItemEventPageBinding +import com.denizk0461.studip.databinding.ItemScrollablePageBinding -class StudIPEventPageAdapter(private var events: List, private val onClickListener: StudIPEventAdapter.OnClickListener) : RecyclerView.Adapter() { +class StudIPEventPageAdapter(private var events: List, private val onClickListener: StudIPEventItemAdapter.OnClickListener) : RecyclerView.Adapter() { - class EventPageViewHolder(val binding: ItemEventPageBinding) : RecyclerView.ViewHolder(binding.root) + class EventPageViewHolder(val binding: ItemScrollablePageBinding) : RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EventPageViewHolder = EventPageViewHolder( - ItemEventPageBinding.inflate( + ItemScrollablePageBinding.inflate( LayoutInflater.from(parent.context), parent, false @@ -25,7 +25,7 @@ class StudIPEventPageAdapter(private var events: List, private val holder.binding.pageRecyclerView.apply { layoutManager = LinearLayoutManager(holder.binding.root.context, LinearLayoutManager.VERTICAL, false) - adapter = StudIPEventAdapter(events, currentDay = position, onClickListener) // TODO check if empty + adapter = StudIPEventItemAdapter(events, currentDay = position, onClickListener) // TODO check if empty scheduleLayoutAnimation() } } diff --git a/app/src/main/java/com/denizk0461/studip/data/StwParser.kt b/app/src/main/java/com/denizk0461/studip/data/StwParser.kt index f05a8ed..6760d58 100644 --- a/app/src/main/java/com/denizk0461/studip/data/StwParser.kt +++ b/app/src/main/java/com/denizk0461/studip/data/StwParser.kt @@ -34,7 +34,7 @@ class StwParser { private fun parseFromPage(url: String): List { val items = mutableListOf() - var date = "" + var date: String var day = 0 val doc = Jsoup.connect(url).get() @@ -59,6 +59,7 @@ class StwParser { val newItem = CanteenOffer( id = id, date = date, + dateId = day, category = categoryTitle, title = tableRows[1].getFilteredText(), price = tableRows.getTextOrEmpty(2), @@ -75,8 +76,6 @@ class StwParser { ) items.add(newItem) id += 1 - - Log.d("eek!", newItem.toString()) } } } @@ -88,7 +87,7 @@ class StwParser { getElementsByAttributeValue("src", preference).isNotEmpty() private fun Element.getFilteredText(): String { - var text = html() + var text = html().replace("&", "&") while (text.contains("")) { text = text.substring(0 until text.indexOf("")) + text.substring(text.indexOf("")+6 until text.length) diff --git a/app/src/main/java/com/denizk0461/studip/db/EventDatabase.kt b/app/src/main/java/com/denizk0461/studip/db/EventDatabase.kt index b4ffca6..5fad4c1 100644 --- a/app/src/main/java/com/denizk0461/studip/db/EventDatabase.kt +++ b/app/src/main/java/com/denizk0461/studip/db/EventDatabase.kt @@ -7,7 +7,7 @@ import androidx.room.RoomDatabase import com.denizk0461.studip.model.CanteenOffer import com.denizk0461.studip.model.StudIPEvent -@Database(entities = [StudIPEvent::class, CanteenOffer::class], version = 6) +@Database(entities = [StudIPEvent::class, CanteenOffer::class], version = 7) abstract class EventDatabase : RoomDatabase() { abstract fun dao(): EventDAO diff --git a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt index 162af04..f4a2f58 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt @@ -6,8 +6,10 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import com.denizk0461.studip.adapter.CanteenOfferPageAdapter import com.denizk0461.studip.databinding.FragmentCanteenBinding import com.denizk0461.studip.viewmodel.CanteenViewModel +import com.google.android.material.tabs.TabLayoutMediator class CanteenFragment : Fragment() { @@ -17,6 +19,9 @@ class CanteenFragment : Fragment() { // onDestroyView. private val binding get() = _binding!! + private var dates = listOf() + + private lateinit var viewPagerAdapter: CanteenOfferPageAdapter private val viewModel: CanteenViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { @@ -27,7 +32,18 @@ class CanteenFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0) + binding.viewPager.adapter = viewPagerAdapter + + createTabLayoutMediator() + viewModel.allOffers.observe(viewLifecycleOwner) { offers -> + + dates = offers.map { it.date }.distinct() + createTabLayoutMediator() + + viewPagerAdapter.setNewItems(offers, dates.size) + // TODO this must be changed. if an exception is raised, then this will not fire binding.swipeRefreshLayout.isRefreshing = false } @@ -39,6 +55,14 @@ class CanteenFragment : Fragment() { } } + private fun createTabLayoutMediator() { + if (dates.isNotEmpty()) { + TabLayoutMediator(binding.dayTabLayout, binding.viewPager) { tab, position -> + tab.text = dates[position] + }.attach() + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt index c2face9..f88617b 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt @@ -7,7 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.viewModels import com.denizk0461.studip.R -import com.denizk0461.studip.adapter.StudIPEventAdapter +import com.denizk0461.studip.adapter.StudIPEventItemAdapter import com.denizk0461.studip.adapter.StudIPEventPageAdapter import com.denizk0461.studip.databinding.FragmentEventBinding import com.denizk0461.studip.model.StudIPEvent @@ -26,7 +26,6 @@ class EventFragment : Fragment() { // onDestroyView. private val binding get() = _binding!! - private lateinit var viewPagerAdapter: StudIPEventPageAdapter private var dayOfWeek: Int = 0 private val dayStrings = listOf( R.string.monday, @@ -36,6 +35,7 @@ class EventFragment : Fragment() { R.string.friday, ) + private lateinit var viewPagerAdapter: StudIPEventPageAdapter private val viewModel: EventViewModel by viewModels() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { @@ -54,7 +54,7 @@ class EventFragment : Fragment() { else -> 0 } - viewPagerAdapter = StudIPEventPageAdapter(listOf(), object : StudIPEventAdapter.OnClickListener { + viewPagerAdapter = StudIPEventPageAdapter(listOf(), object : StudIPEventItemAdapter.OnClickListener { override fun onClick(event: StudIPEvent) { } diff --git a/app/src/main/java/com/denizk0461/studip/model/CanteenOffer.kt b/app/src/main/java/com/denizk0461/studip/model/CanteenOffer.kt index 4fdc7ae..1a13585 100644 --- a/app/src/main/java/com/denizk0461/studip/model/CanteenOffer.kt +++ b/app/src/main/java/com/denizk0461/studip/model/CanteenOffer.kt @@ -7,6 +7,7 @@ import androidx.room.PrimaryKey data class CanteenOffer( @PrimaryKey val id: Int, val date: String, + val dateId: Int, // gives every item on the same day the same ID for easier filtering val category: String, val title: String, val price: String, // price for students diff --git a/app/src/main/res/layout/item_canteen.xml b/app/src/main/res/layout/item_canteen.xml new file mode 100644 index 0000000..29c4be9 --- /dev/null +++ b/app/src/main/res/layout/item_canteen.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_event.xml b/app/src/main/res/layout/item_event.xml index e5f0257..57dc01c 100644 --- a/app/src/main/res/layout/item_event.xml +++ b/app/src/main/res/layout/item_event.xml @@ -2,7 +2,6 @@ diff --git a/app/src/main/res/layout/item_event_page.xml b/app/src/main/res/layout/item_scrollable_page.xml similarity index 100% rename from app/src/main/res/layout/item_event_page.xml rename to app/src/main/res/layout/item_scrollable_page.xml