diff --git a/app/build.gradle b/app/build.gradle
index d0ae180..c284e90 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
applicationId "com.denizk0461.weserplaner"
minSdk 24
targetSdk 33
- versionCode 4
- versionName "1.0.1"
+ versionCode 5
+ versionName "1.0.2"
resourceConfigurations += ["en", "de"]
diff --git a/app/src/main/java/com/denizk0461/weserplaner/activity/FetcherActivity.kt b/app/src/main/java/com/denizk0461/weserplaner/activity/FetcherActivity.kt
index 4b3372c..9274c86 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/activity/FetcherActivity.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/activity/FetcherActivity.kt
@@ -12,6 +12,7 @@ import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.data.showErrorSnackBar
import com.denizk0461.weserplaner.data.showToast
import com.denizk0461.weserplaner.databinding.ActivityFetcherBinding
+import com.denizk0461.weserplaner.model.TextSheetContentId
import com.denizk0461.weserplaner.sheet.TextSheet
import com.denizk0461.weserplaner.viewmodel.FetcherViewModel
import java.io.IOException
@@ -98,6 +99,7 @@ class FetcherActivity : FragmentActivity() {
bundle.putString("header", getString(R.string.fetch_bar_help_sheet_title))
bundle.putString("content", getString(R.string.fetch_bar_help_sheet_content))
bundle.putBoolean("isCancellable", true)
+ bundle.putInt("contentId", TextSheetContentId.PASS_RAW_STRING)
sheet.arguments = bundle
}.show(supportFragmentManager, TextSheet::class.java.simpleName)
true
@@ -112,8 +114,6 @@ class FetcherActivity : FragmentActivity() {
*/
binding.webview.loadUrl("https://elearning.uni-bremen.de/index.php?again=yes")
- binding.webview
-
binding.fab.setOnClickListener {
if (binding.webview.url?.contains(
diff --git a/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt b/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt
index 4e22b6d..229d9f5 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/data/StudIPParser.kt
@@ -2,6 +2,7 @@ package com.denizk0461.weserplaner.data
import android.app.Application
import com.denizk0461.weserplaner.db.AppRepository
+import com.denizk0461.weserplaner.model.SettingsPreferences
import com.denizk0461.weserplaner.model.StudIPEvent
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
@@ -109,6 +110,9 @@ class StudIPParser(application: Application) {
// After fetching has finished, save the list of new items into persistent storage
repo.insertEvents(newEvents)
+ // Set that the user has modified their schedule
+ repo.setPreference(SettingsPreferences.HAS_MODIFIED_SCHEDULE, true)
+
// Return the count of elements that were not able to be fetched
return elementsNotFetched
}
diff --git a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt
index 81f7bc6..684a286 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/fragment/EventFragment.kt
@@ -1,11 +1,14 @@
package com.denizk0461.weserplaner.fragment
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.fragment.app.setFragmentResultListener
import androidx.fragment.app.viewModels
import com.denizk0461.weserplaner.R
+import com.denizk0461.weserplaner.activity.FetcherActivity
import com.denizk0461.weserplaner.adapter.StudIPEventPageAdapter
import com.denizk0461.weserplaner.databinding.FragmentEventBinding
import com.denizk0461.weserplaner.sheet.ScheduleUpdateSheet
@@ -79,6 +82,19 @@ class EventFragment : AppFragment() {
)
}
+ // Launch the Stud.IP fetcher on click of the fetch button
+ binding.buttonFetchSchedule.setOnClickListener {
+ startActivity(Intent(context, FetcherActivity::class.java))
+ }
+
+ /*
+ * Set the fetch button to be visible if the user has not previously modified their schedule
+ * in any way (added an event manually or used the Stud.IP fetcher).
+ */
+ if (!viewModel.preferenceHasModifiedSchedule) {
+ binding.buttonFetchSchedule.visibility = View.VISIBLE
+ }
+
// Set up button for adding a new event
binding.fabAddEvent.setOnClickListener {
/*
@@ -90,6 +106,16 @@ class EventFragment : AppFragment() {
val bundle = Bundle()
bundle.putBoolean("isEditing", false)
sheet.arguments = bundle
+
+ /*
+ * Receive fragment result to update the button visibility.
+ * TODO doesn't work after configuration change (change into or out of multi
+ * window)
+ */
+ setFragmentResultListener("eventAdded") { _, _ ->
+ // Hide the fetch button
+ binding.buttonFetchSchedule.visibility = View.GONE
+ }
}
)
}
diff --git a/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt b/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt
index bead8d2..6c34441 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/model/SettingsPreferences.kt
@@ -63,5 +63,10 @@ enum class SettingsPreferences(val key: String) {
* Whether the user has opened the canteen fragment before.
*/
HAS_OPENED_CANTEEN("has_opened_canteen"),
+
+ /**
+ * Whether the user has done something to modify their schedule.
+ */
+ HAS_MODIFIED_SCHEDULE("has_modified_schedule"),
;
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt b/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt
index f9577b7..97555d3 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/sheet/ScheduleUpdateSheet.kt
@@ -5,6 +5,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu
import androidx.core.widget.addTextChangedListener
+import androidx.fragment.app.setFragmentResult
import androidx.fragment.app.viewModels
import androidx.transition.TransitionManager
import com.denizk0461.weserplaner.R
@@ -93,7 +94,8 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) {
dismiss()
} else {
// Update the text to show the user that they clicked the button once
- TransitionManager.beginDelayedTransition(binding.buttonContainer as ViewGroup)
+ TransitionManager
+ .beginDelayedTransition(binding.buttonContainer as ViewGroup)
binding.buttonDelete.text =
getString(R.string.sheet_schedule_update_delete_confirm)
hasClickedDelete = true
@@ -186,6 +188,13 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update) {
colour = colour,
)
)
+
+ /*
+ * Send an empty bundle to tell the parent fragment that it should update its view
+ * according to the changes made here.
+ */
+ parentFragment?.setFragmentResult("eventAdded", Bundle())
+
// Dismiss the sheet upon update
dismiss()
}
diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt
index 72aa766..7041803 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/EventViewModel.kt
@@ -19,10 +19,19 @@ class EventViewModel(app: Application) : AppViewModel(app) {
defaultValue = true,
)
+ /**
+ * Determines whether the user is launching the app for the first time.
+ */
var preferenceFirstLaunch: Boolean
get() = repo.getBooleanPreference(
SettingsPreferences.FIRST_LAUNCH,
defaultValue = true,
)
set(value) { repo.setPreference(SettingsPreferences.FIRST_LAUNCH, value) }
+
+ /**
+ * Determines whether the user has done something to modify their schedule.
+ */
+ val preferenceHasModifiedSchedule: Boolean
+ get() = repo.getBooleanPreference(SettingsPreferences.HAS_MODIFIED_SCHEDULE)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt
index d1500a2..4ea9a98 100644
--- a/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt
+++ b/app/src/main/java/com/denizk0461/weserplaner/viewmodel/ScheduleUpdateViewModel.kt
@@ -1,6 +1,7 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
+import com.denizk0461.weserplaner.model.SettingsPreferences
import com.denizk0461.weserplaner.model.StudIPEvent
class ScheduleUpdateViewModel(application: Application) : AppViewModel(application) {
@@ -10,7 +11,13 @@ class ScheduleUpdateViewModel(application: Application) : AppViewModel(applicati
*
* @param event the event to save
*/
- fun insert(event: StudIPEvent) { doAsync { repo.insert(event) } }
+ fun insert(event: StudIPEvent) {
+ // Inser the event
+ doAsync { repo.insert(event) }
+
+ // Set that the user has modified their schedule
+ repo.setPreference(SettingsPreferences.HAS_MODIFIED_SCHEDULE, true)
+ }
/**
* Updates a schedule element.
diff --git a/app/src/main/res/drawable/cloud_download.xml b/app/src/main/res/drawable/cloud_download.xml
new file mode 100644
index 0000000..1572e34
--- /dev/null
+++ b/app/src/main/res/drawable/cloud_download.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/fragment_event.xml b/app/src/main/res/layout/fragment_event.xml
index 872cbbc..2a7312d 100644
--- a/app/src/main/res/layout/fragment_event.xml
+++ b/app/src/main/res/layout/fragment_event.xml
@@ -39,6 +39,16 @@
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
+
+
Du musst deinen Stundenplan öffnen!
Mensaplan konnte nicht heruntergeladen werden!
+ Lade Deinen Stundenplan von Stud.IP herunter
+
Dein Stundenplan wurde aktualisiert!
Dein Stundenplan wurde aktualisiert, doch eine Veranstaltung konnte nicht heruntergeladen werden.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ef41c63..513b644 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,6 +25,8 @@
You must navigate to your schedule!
Couldn\'t retrieve the canteen plan!
+ Download your schedule from Stud.IP
+
Your schedule has been refreshed!
Your schedule has been refreshed, but one item could not be saved.