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.