From b39aa1f003e5893ae2f8dcddc8804b5e4f0df2b2 Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Thu, 20 Apr 2023 21:35:09 +0200 Subject: [PATCH] Fixed a bug that would cause the tab for a day without canteen offers to not be shown, causing the offers for the next days to be shifted over, thus not showing the offers for the last day that's available online. I know I didn't explain that very well, but it's fixed now anyway, soo (: also made some minor visual adjustments to margins and colours --- .../studip/adapter/StudIPEventItemAdapter.kt | 17 ++++---- .../com/denizk0461/studip/data/StwParser.kt | 22 ----------- .../java/com/denizk0461/studip/db/EventDAO.kt | 3 ++ .../denizk0461/studip/db/EventRepository.kt | 2 + .../studip/fragment/CanteenFragment.kt | 24 +++++------- .../studip/viewmodel/CanteenViewModel.kt | 3 ++ app/src/main/res/layout/fragment_canteen.xml | 34 +++++++++------- app/src/main/res/layout/fragment_settings.xml | 39 +++++++++++++++++-- app/src/main/res/layout/item_canteen_line.xml | 2 + app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values/strings.xml | 4 +- 11 files changed, 88 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt index 692aabe..5a1256d 100644 --- a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt +++ b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventItemAdapter.kt @@ -45,24 +45,23 @@ class StudIPEventItemAdapter( val colorTextHintLighter = TypedValue() val theme = holder.binding.root.context.theme - theme.resolveAttribute(R.attr.colorPrimaryTranslucent, colorPrimaryTranslucent, true) - theme.resolveAttribute(R.attr.colorCardBackground, colorCardBackground, true) - theme.resolveAttribute(R.attr.colorTextHintLighter, colorTextHintLighter, true) + theme.apply { + resolveAttribute(R.attr.colorPrimaryTranslucent, colorPrimaryTranslucent, true) + resolveAttribute(R.attr.colorCardBackground, colorCardBackground, true) + resolveAttribute(R.attr.colorTextHintLighter, colorTextHintLighter, true) + } if (!isAnyCourseHighlighted && currentItem.isCurrentCourse(currentCalendar)) { // highlight isAnyCourseHighlighted = true holder.binding.cardBackground.apply { - backgroundTintList = ColorStateList.valueOf(colorPrimaryTranslucent.data)//R.attr.colorPrimaryTranslucent) + backgroundTintList = ColorStateList.valueOf(colorPrimaryTranslucent.data) strokeColor = context.getColor(android.R.color.transparent) - }//colorPrimary.data -// holder.binding.cardBackground.strokeWidth = 6 // TODO replace this with proper float -> dp conversion -// R.color.list_card_selected) + } } else { // un-highlight holder.binding.cardBackground.apply { - backgroundTintList = ColorStateList.valueOf(colorCardBackground.data)//context.getColor(R.attr.colorCardBackground)) + backgroundTintList = ColorStateList.valueOf(colorCardBackground.data) strokeColor = colorTextHintLighter.data } -// holder.binding.cardBackground.strokeWidth = 3 // this should (?) be 1dp } holder.binding.cardBackground.setOnClickListener { 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 3afaed5..75c29d8 100644 --- a/app/src/main/java/com/denizk0461/studip/data/StwParser.kt +++ b/app/src/main/java/com/denizk0461/studip/data/StwParser.kt @@ -1,6 +1,5 @@ package com.denizk0461.studip.data -import android.util.Log import com.denizk0461.studip.db.EventRepository import com.denizk0461.studip.model.* import org.jsoup.Jsoup @@ -89,8 +88,6 @@ class StwParser { isGame = prefs.isDietaryPreferenceMet(PREFERENCE_GAME), ).deconstruct() -// Log.d("eek!4", "prefString = $prefString") - repo.insert( OfferItem( itemId, @@ -101,25 +98,6 @@ class StwParser { ) ) itemId += 1 - -// val newItem = CanteenOffer( -// id = id, -// date = date, -// dateId = day, -// category = categoryTitle, -// title = tableRows[1].getFilteredText(), -//// price = tableRows.getTextOrEmpty(2), -// isFair = prefs.isDietaryPreferenceMet(PREFERENCE_FAIR), -// isFish = prefs.isDietaryPreferenceMet(PREFERENCE_FISH), -// isPoultry = prefs.isDietaryPreferenceMet(PREFERENCE_POULTRY), -// isLamb = prefs.isDietaryPreferenceMet(PREFERENCE_LAMB), -// isVital = prefs.isDietaryPreferenceMet(PREFERENCE_VITAL), -// isBeef = prefs.isDietaryPreferenceMet(PREFERENCE_BEEF), -// isPork = prefs.isDietaryPreferenceMet(PREFERENCE_PORK), -// isVegan = prefs.isDietaryPreferenceMet(PREFERENCE_VEGAN), -// isVegetarian = prefs.isDietaryPreferenceMet(PREFERENCE_VEGETARIAN), -// isGame = prefs.isDietaryPreferenceMet(PREFERENCE_GAME), -// ) } categoryId += 1 } diff --git a/app/src/main/java/com/denizk0461/studip/db/EventDAO.kt b/app/src/main/java/com/denizk0461/studip/db/EventDAO.kt index 177153f..91c16fd 100644 --- a/app/src/main/java/com/denizk0461/studip/db/EventDAO.kt +++ b/app/src/main/java/com/denizk0461/studip/db/EventDAO.kt @@ -66,6 +66,9 @@ interface EventDAO { @get:Query("SELECT id FROM offer_date") val updateObserver: LiveData> + @Query("SELECT * FROM offer_date") + fun getDates(): List + @Query("DELETE FROM offer_date") fun nukeOfferDates() diff --git a/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt b/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt index 5f67f07..19d98bc 100644 --- a/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt +++ b/app/src/main/java/com/denizk0461/studip/db/EventRepository.kt @@ -21,6 +21,8 @@ class EventRepository(app: Application) { val allOffers: LiveData> = dao.allOffers + fun getDates(): List = dao.getDates() + fun getDietaryPrefs(): String { return prefs.getString(dietaryPrefString, "..........") ?: ".........." // return DietaryPrefObject( 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 a141d67..9e311b2 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt @@ -10,10 +10,7 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import com.denizk0461.studip.adapter.CanteenOfferPageAdapter import com.denizk0461.studip.databinding.FragmentCanteenBinding -import com.denizk0461.studip.model.CanteenOffer -import com.denizk0461.studip.model.CanteenOfferGroup -import com.denizk0461.studip.model.CanteenOfferGroupElement -import com.denizk0461.studip.model.DietaryPreferences +import com.denizk0461.studip.model.* import com.denizk0461.studip.viewmodel.CanteenViewModel import com.google.android.material.tabs.TabLayoutMediator @@ -25,8 +22,6 @@ class CanteenFragment : Fragment() { // onDestroyView. private val binding get() = _binding!! - private var dates = listOf() - private lateinit var liveData: LiveData> private lateinit var viewPagerAdapter: CanteenOfferPageAdapter @@ -77,7 +72,7 @@ class CanteenFragment : Fragment() { viewPagerAdapter = CanteenOfferPageAdapter(listOf(), 0, getPrefRegex()) binding.viewPager.adapter = viewPagerAdapter - createTabLayoutMediator() + createTabLayoutMediator(listOf()) liveData = viewModel.allOffers liveData.observe(viewLifecycleOwner) { offers -> @@ -85,12 +80,13 @@ class CanteenFragment : Fragment() { val groupedElements = offers.groupElements().distinct() - dates = groupedElements.map { it.date }.distinct() - createTabLayoutMediator() +// dates = groupedElements.map { it.date }.distinct() + val newDates = viewModel.getDates() + createTabLayoutMediator(newDates) - this.dateSize = dates.size + dateSize = newDates.size - viewPagerAdapter.setNewItems(groupedElements, dates.size) + viewPagerAdapter.setNewItems(groupedElements, dateSize) // TODO this must be changed. if an exception is raised, then this will not fire binding.swipeRefreshLayout.isRefreshing = false @@ -105,10 +101,10 @@ class CanteenFragment : Fragment() { } } - private fun createTabLayoutMediator() { + private fun createTabLayoutMediator(dates: List) { if (dates.isNotEmpty()) { TabLayoutMediator(binding.dayTabLayout, binding.viewPager) { tab, position -> - tab.text = dates[position] + tab.text = dates[position].date }.attach() } } @@ -127,7 +123,7 @@ class CanteenFragment : Fragment() { viewModel.getPreference(pref) private fun getPrefRegex(): Regex { - val prefs = viewModel.getDietaryPrefs().deconstruct().replace('f', '.') + val prefs = viewModel.getDietaryPrefs().deconstruct()//.replace('f', '.') val template = ".........." diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt index 528e00f..ad26d52 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/CanteenViewModel.kt @@ -6,6 +6,7 @@ import com.denizk0461.studip.data.StwParser import com.denizk0461.studip.model.CanteenOffer import com.denizk0461.studip.model.DietaryPrefObject import com.denizk0461.studip.model.DietaryPreferences +import com.denizk0461.studip.model.OfferDate class CanteenViewModel(app: Application) : TemplateViewModel(app) { @@ -15,6 +16,8 @@ class CanteenViewModel(app: Application) : TemplateViewModel(app) { fun getDietaryPrefs(): DietaryPrefObject = repo.getDietaryPrefsAsObj() + fun getDates(): List = returnBlocking { repo.getDates() } + fun fetchOffers(onRefreshUpdate: (status: Int) -> Unit, onFinish: () -> Unit) { doAsync { parser.parse(onRefreshUpdate, onFinish) }} fun setPreference(pref: DietaryPreferences, newValue: Boolean) { repo.setPreference(pref, newValue) } diff --git a/app/src/main/res/layout/fragment_canteen.xml b/app/src/main/res/layout/fragment_canteen.xml index db0c503..375798c 100644 --- a/app/src/main/res/layout/fragment_canteen.xml +++ b/app/src/main/res/layout/fragment_canteen.xml @@ -1,5 +1,5 @@ - + android:background="@android:color/transparent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"/> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/day_tab_layout" + app:layout_constraintBottom_toTopOf="@+id/scroll_view_chip"> + android:layout_height="match_parent"/> + android:scrollbars="none" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent"> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 057b739..5961cfa 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -78,12 +78,14 @@ android:paddingVertical="8dp"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/switch_quarter" + android:layout_marginEnd="8dp"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/switch_highlight" + android:layout_marginEnd="8dp"> + + + + + + + + + @@ -24,6 +25,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" + android:layout_marginEnd="4dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/image_view_container" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 82eeea3..5c62ef3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -49,6 +49,8 @@ Wo es passt Markiere meinen nächsten Kurs Funktioniert nur wenn Kurse sich nicht überschneiden! + Was passiert mit meinen Daten? + Stiehlst du meinen Login? App-Verison mit ♡️ aus Bremen-Osterholz\von denizk0461 \\__* diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a9f1af6..0558cb8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -48,7 +48,9 @@ Use academic quarter Where applicable Highlight next course - Only works if courses don\'t overlap! + Only works properly if courses don\'t overlap! + What happens with my data? + Will you steal my login? App Version with ♡️ from Bremen-Osterholz\nmade by denizk0461 \\__*