diff --git a/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt b/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt index 84e2eb1..6422fe7 100644 --- a/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt +++ b/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt @@ -24,6 +24,7 @@ class FetcherActivity : FragmentActivity() { // View binding private lateinit var binding: ActivityFetcherBinding + // View model private lateinit var viewModel: FetcherViewModel @@ -36,7 +37,9 @@ class FetcherActivity : FragmentActivity() { super.onCreate(savedInstanceState) // Instantiate view model - viewModel = ViewModelProvider.AndroidViewModelFactory(this.application).create(FetcherViewModel::class.java) + viewModel = ViewModelProvider.AndroidViewModelFactory(application) + .create(FetcherViewModel::class.java) + // Inflate view binding and bind to this activity binding = ActivityFetcherBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/java/com/denizk0461/studip/activity/MainActivity.kt b/app/src/main/java/com/denizk0461/studip/activity/MainActivity.kt index b8f9979..fcf93df 100644 --- a/app/src/main/java/com/denizk0461/studip/activity/MainActivity.kt +++ b/app/src/main/java/com/denizk0461/studip/activity/MainActivity.kt @@ -3,10 +3,13 @@ package com.denizk0461.studip.activity import android.os.Bundle import androidx.core.view.WindowCompat import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import androidx.navigation.ui.setupWithNavController +import com.denizk0461.studip.R import com.denizk0461.studip.databinding.ActivityMainBinding +import com.denizk0461.studip.viewmodel.MainViewModel /** * Main activity that handles all common fragments. This is opened on app launch. @@ -16,10 +19,17 @@ class MainActivity : FragmentActivity() { // View binding private lateinit var binding: ActivityMainBinding + // View model + private lateinit var viewModel: MainViewModel + override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) + // Instantiate view model + viewModel = ViewModelProvider.AndroidViewModelFactory(application) + .create(MainViewModel::class.java) + // Inflate view binding and bind to this activity binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) @@ -28,5 +38,25 @@ class MainActivity : FragmentActivity() { binding.navView.setupWithNavController( binding.navHostFragmentContentMain.getFragment().findNavController() ) + + setNavigationGraph() + } + + /** + * Sets the navigation graph for the fragments. Also sets the start destination. + */ + private fun setNavigationGraph() { + val navHostFragment = supportFragmentManager + .findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment + val navController = navHostFragment.navController + + val navGraph = navController.navInflater.inflate(R.navigation.main_nav_graph) + navGraph.setStartDestination(if (viewModel.preferenceLaunchCanteen) { + R.id.canteen + } else { + R.id.schedule + }) + + navController.graph = navGraph } } \ No newline at end of file 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 1d1850a..c900404 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt @@ -33,9 +33,6 @@ class EventFragment : AppFragment() { // View model reference for providing access to the database private val viewModel: EventViewModel by viewModels() - // Used to determine the current day - private var dayOfWeek: Int = 0 - // Titles for the view pager's tabs private lateinit var weekdays: Array @@ -51,17 +48,6 @@ class EventFragment : AppFragment() { // Get localised weekday names weekdays = context.resources?.getStringArray(R.array.weekdays) ?: arrayOf() - // Determine the current day - dayOfWeek = when (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) { - Calendar.TUESDAY -> 1 - Calendar.WEDNESDAY -> 2 - Calendar.THURSDAY -> 3 - Calendar.FRIDAY -> 4 - Calendar.SATURDAY -> 5 - Calendar.SUNDAY -> 6 - else -> 0 // assume Monday - } - // Set up the view pager's adapter viewPagerAdapter = StudIPEventPageAdapter( childFragmentManager, @@ -76,6 +62,27 @@ class EventFragment : AppFragment() { tab.text = weekdays[position] }.attach() + // Set the view pager's current page to the current day, if the user chose this option + if (viewModel.preferenceCurrentDay) { + + /* + * Determine the current day and go to the respective page. + * BUG: this selects the correct tab and changes the page, but it doesn't highlight + * the tab that has been selected. binding.viewPager.currentPage encounters the same bug + */ + binding.dayTabLayout.getTabAt( + when (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) { + Calendar.TUESDAY -> 1 + Calendar.WEDNESDAY -> 2 + Calendar.THURSDAY -> 3 + Calendar.FRIDAY -> 4 + Calendar.SATURDAY -> 5 + Calendar.SUNDAY -> 6 + else -> 0 // assume Monday + } + )?.select() + } + binding.fabAddEvent.setOnClickListener { openBottomSheet( ScheduleUpdateSheet().also { sheet -> diff --git a/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt index b6da944..ca68729 100644 --- a/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt @@ -58,6 +58,14 @@ class SettingsFragment : AppFragment() { launchWebView() } + // Set up switch for highlighting the next course in the schedule + binding.switchCurrentDay.apply { + isChecked = viewModel.preferenceCurrentDay + setOnCheckedChangeListener { _, newValue -> + viewModel.preferenceCurrentDay = newValue + } + } + // Set up switch for highlighting the next course in the schedule binding.switchHighlight.apply { isChecked = viewModel.preferenceCourseHighlighting diff --git a/app/src/main/java/com/denizk0461/studip/model/SettingsPreferences.kt b/app/src/main/java/com/denizk0461/studip/model/SettingsPreferences.kt index b15e9c2..5337f06 100644 --- a/app/src/main/java/com/denizk0461/studip/model/SettingsPreferences.kt +++ b/app/src/main/java/com/denizk0461/studip/model/SettingsPreferences.kt @@ -18,6 +18,11 @@ enum class SettingsPreferences(val key: String) { */ ALLERGEN("setting_allergen"), + /** + * Whether the user wants their timetable on the current day. + */ + CURRENT_DAY("settings_current_day"), + /** * Whether the user wants the next course in his schedule to be highlighted. */ diff --git a/app/src/main/java/com/denizk0461/studip/sheet/DevCodeSheet.kt b/app/src/main/java/com/denizk0461/studip/sheet/DevCodeSheet.kt index ce13ef9..ee7e6e7 100644 --- a/app/src/main/java/com/denizk0461/studip/sheet/DevCodeSheet.kt +++ b/app/src/main/java/com/denizk0461/studip/sheet/DevCodeSheet.kt @@ -120,7 +120,6 @@ class DevCodeSheet : AppSheet(R.layout.sheet_dev_code) { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(link))) } - /** * Decodes Base64 to a regular string. * diff --git a/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt b/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt index 39fa3df..4a9b89d 100644 --- a/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt +++ b/app/src/main/java/com/denizk0461/studip/sheet/ScheduleUpdateSheet.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.PopupMenu +import androidx.core.widget.addTextChangedListener import androidx.fragment.app.FragmentActivity import androidx.fragment.app.viewModels import androidx.transition.TransitionManager @@ -171,11 +172,20 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update), TimePicker * filter buttons with checkmarks when they're selected maybe? */ - // Set visibility for academic quarter button based on whether the change applies - binding.buttonAcademicQuarter.visibility = getVisibilityForAcademicQuarter( - timeslotsForAcademicQuarter.contains(timeslotStart), - timeslotsForAcademicQuarter.contains(timeslotEnd), - ) + // Set title text field to remove error messages when the user edits the text + binding.editTextTitle.addTextChangedListener { + binding.textLayoutTitle.error = null + } + + // Set lecturers text field to remove error messages when the user edits the text + binding.editTextLecturers.addTextChangedListener { + binding.textLayoutLecturers.error = null + } + + // Set room text field to remove error messages when the user edits the text + binding.editTextRoom.addTextChangedListener { + binding.textLayoutRoom.error = null + } // Retrieve new values for the day of the current event binding.buttonDay.text = getString(when (selectedDay) { @@ -226,6 +236,12 @@ class ScheduleUpdateSheet : AppSheet(R.layout.sheet_schedule_update), TimePicker * * 13:00 - 15:30 -> likely no academic quarter intended */ + binding.buttonAcademicQuarter.visibility = getVisibilityForAcademicQuarter( + timeslotsForAcademicQuarter.contains(timeslotStart), + timeslotsForAcademicQuarter.contains(timeslotEnd), + ) + + // Set up academic quarter button binding.buttonAcademicQuarter.setOnClickListener { try { // Retrieve new timestamps with the academic quarter applied, or throw a tantrum diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt index 405204a..65c68ba 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/EventViewModel.kt @@ -1,10 +1,21 @@ package com.denizk0461.studip.viewmodel import android.app.Application +import com.denizk0461.studip.model.SettingsPreferences /** * View model for [com.denizk0461.studip.fragment.EventFragment] * * @param app reference to the app */ -class EventViewModel(app: Application) : AppViewModel(app) \ No newline at end of file +class EventViewModel(app: Application) : AppViewModel(app) { + + /** + * This value determines whether the user wants their timetable to launch with the current day. + */ + val preferenceCurrentDay: Boolean + get() = repo.getBooleanPreference( + SettingsPreferences.CURRENT_DAY, + defaultValue = true + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/MainViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/MainViewModel.kt new file mode 100644 index 0000000..6331c2b --- /dev/null +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/MainViewModel.kt @@ -0,0 +1,18 @@ +package com.denizk0461.studip.viewmodel + +import android.app.Application +import com.denizk0461.studip.model.SettingsPreferences + +/** + * View model for [com.denizk0461.studip.activity.MainActivity] + * + * @param application reference to the app + */ +class MainViewModel(application: Application) : AppViewModel(application) { + + /** + * This value determines whether the user wants the app to launch with the canteen view. + */ + val preferenceLaunchCanteen: Boolean + get() = repo.getBooleanPreference(SettingsPreferences.LAUNCH_CANTEEN_ON_START) +} \ No newline at end of file diff --git a/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt b/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt index 1b6745a..d2a70b5 100644 --- a/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/com/denizk0461/studip/viewmodel/SettingsViewModel.kt @@ -10,6 +10,15 @@ import com.denizk0461.studip.model.SettingsPreferences */ class SettingsViewModel(app: Application) : AppViewModel(app) { + /** + * This value determines whether the user wants their timetable to launch with the current day. + */ + var preferenceCurrentDay: Boolean + get() = repo.getBooleanPreference( + SettingsPreferences.CURRENT_DAY, + ) + set(newValue) { repo.setPreference(SettingsPreferences.CURRENT_DAY, newValue) } + /** * This value determines whether the user wants to have the next course in their schedule * highlighted. diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 84d6ff0..566047a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -13,11 +13,11 @@ android:layout_width="0dp" android:layout_height="0dp" app:defaultNavHost="true" - app:navGraph="@navigation/main_nav_graph" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/nav_view" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> + + + + + + + + + + + + + + + + Aktualisiere Deinen Stud.IP-Stundenplan Dies wird alle Anpassungen löschen! + Starte Stundenplan am heutigen Tag + Ansonsten wird Montag beim Start angezeigt + Markiere den nächsten Kurs Funktioniert nur, wenn Kurse sich nicht überschneiden! diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index de935e6..147a69e 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -31,6 +31,7 @@ @color/md_theme_dark_error @color/md_theme_dark_onSurfaceVariant + @color/md_theme_dark_primaryContainer @color/md_theme_dark_onSurfaceVariant @color/md_theme_dark_primary @color/md_theme_dark_outlineVariant diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b6a051..54f3be5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -154,6 +154,9 @@ Refresh your Stud.IP schedule This will clear any customisations! + Launch timetable on current day + If unselected, Monday will be shown on launch instead + Highlight next course Only works properly if courses don\'t overlap! @@ -167,10 +170,10 @@ Also applies to additives Colour dietary preferences - This colours the icons similar to how they look the website + Icons will be coloured similarly to how they look the website Show canteen plan on app launch - Otherwise your schedule will be shown at launch; CURRENTLY BROKEN + Otherwise your schedule will be shown at launch Opt-in to sharing crash data Data will be anonymised @@ -203,5 +206,6 @@ if we only had one more day, what is the last thing you\'d say? love with your heart, use your head for everything else trans rights are human rights 🏳️‍⚧️ + i wouldn\'t risk any more than six minutes \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index cf19a89..e4cda17 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -29,6 +29,7 @@ @color/md_theme_light_inversePrimary @color/md_theme_light_onSurfaceVariant + @color/md_theme_light_primaryContainer @color/md_theme_light_onSurfaceVariant @color/md_theme_light_primary @color/md_theme_light_outlineVariant