New fragments can now be accessed via an experimental setting. They tell the user via snack message that their functionality is not yet implemented

This commit is contained in:
denizk0461
2023-05-20 23:01:53 +02:00
parent ff930b89c0
commit fb155550b3
21 changed files with 285 additions and 57 deletions
@@ -39,6 +39,13 @@ class MainActivity : FragmentActivity() {
binding.navHostFragmentContentMain.getFragment<NavHostFragment>().findNavController()
)
// Check whether the user has enabled beta screens
val showBetaScreens = viewModel.preferenceBetaScreensEnabled
// Set the visibility for the navigation bar items for beta screens accordingly
binding.navView.menu.findItem(R.id.exam_overview).isVisible = showBetaScreens
binding.navView.menu.findItem(R.id.room_finder).isVisible = showBetaScreens
// Set up navigation component
setNavigationGraph()
}
@@ -390,6 +390,16 @@ class AppRepository(app: Application) {
setPreference(SettingsPreferences.EXPERIMENTAL_ENABLED, newValue)
}
/**
* This value determines whether beta screens should be shown.
*/
fun getPreferenceBetaScreensEnabled(): Boolean = getBooleanPreference(
SettingsPreferences.BETA_SCREENS_ENABLED,
)
fun setPreferenceBetaScreensEnabled(newValue: Boolean) {
setPreference(SettingsPreferences.BETA_SCREENS_ENABLED, newValue)
}
// --- private preference handlers preferences --- //
/**
@@ -1,24 +0,0 @@
package com.denizk0461.weserplaner.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import com.denizk0461.weserplaner.databinding.FragmentExamOverviewBinding
import com.denizk0461.weserplaner.viewmodel.ExamOverviewViewModel
/**
* Fragment that shows the user an overview of their exams.
*/
class ExamOverviewFragment : AppFragment<FragmentExamOverviewBinding>() {
// View model reference for providing access to the database
private val viewModel: ExamOverviewViewModel by viewModels()
// Instantiate the view binding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentExamOverviewBinding.inflate(inflater, container, false)
return binding.root
}
}
@@ -5,6 +5,8 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.data.showSnackBar
import com.denizk0461.weserplaner.databinding.FragmentRoomFinderBinding
import com.denizk0461.weserplaner.viewmodel.RoomFinderViewModel
@@ -21,4 +23,14 @@ class RoomFinderFragment : AppFragment<FragmentRoomFinderBinding>() {
_binding = FragmentRoomFinderBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Tell the user that this fragment's functionality is not yet implemented
context.theme.showSnackBar(
binding.coordinatorLayout,
getString(R.string.room_finder_snack_unimplemented),
)
}
}
@@ -322,6 +322,14 @@ class SettingsFragment : AppFragment<FragmentSettingsBinding>() {
.format(Date(BuildConfig.BUILD_TIME_MILLIS))
}"
// Set up switch for showing beta screens
binding.switchBetaNav.apply {
isChecked = viewModel.preferenceBetaScreensEnabled
setOnCheckedChangeListener { _, newValue ->
viewModel.preferenceBetaScreensEnabled = newValue
}
}
binding.buttonDevCodes.setOnClickListener {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
@@ -418,7 +426,8 @@ class SettingsFragment : AppFragment<FragmentSettingsBinding>() {
/**
* Decodes Base64 to a regular string.
*
* @return the decoded string
* @receiver encoded string to decode
* @return decoded string
*/
private val String.d64: String get() = String(
Base64.decode(this, Base64.DEFAULT),
@@ -0,0 +1,36 @@
package com.denizk0461.weserplaner.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.data.showSnackBar
import com.denizk0461.weserplaner.databinding.FragmentTaskOverviewBinding
import com.denizk0461.weserplaner.viewmodel.TaskOverviewViewModel
/**
* Fragment that shows the user an overview of their tasks and exams.
*/
class TaskOverviewFragment : AppFragment<FragmentTaskOverviewBinding>() {
// View model reference for providing access to the database
private val viewModel: TaskOverviewViewModel by viewModels()
// Instantiate the view binding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentTaskOverviewBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Tell the user that this fragment's functionality is not yet implemented
context.theme.showSnackBar(
binding.coordinatorLayout,
getString(R.string.task_overview_snack_unimplemented),
)
}
}
@@ -68,5 +68,10 @@ enum class SettingsPreferences(val key: String) {
* Whether the user has enabled experimental settings.
*/
EXPERIMENTAL_ENABLED("experimental_enabled"),
/**
* Whether beta screens should be shown.
*/
BETA_SCREENS_ENABLED("beta_screens"),
;
}
@@ -1,11 +0,0 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
/**
* View model class for [com.denizk0461.weserplaner.fragment.ExamOverviewFragment].
*/
class ExamOverviewViewModel(application: Application) : AppViewModel(application) {
}
@@ -15,4 +15,10 @@ class MainViewModel(application: Application) : AppViewModel(application) {
*/
val preferenceLaunchFragment: Int
get() = repo.getPreferenceLaunchFragment()
/**
* This value determines whether the user has enabled experimental settings.
*/
val preferenceBetaScreensEnabled: Boolean
get() = repo.getPreferenceBetaScreensEnabled()
}
@@ -74,6 +74,13 @@ class SettingsViewModel(app: Application) : AppViewModel(app) {
get() = repo.getPreferenceExperimentalSettingsEnabled()
set(newValue) { repo.setPreferenceExperimentalSettingsEnabled(newValue) }
/**
* This value determines whether beta screens should be shown.
*/
var preferenceBetaScreensEnabled: Boolean
get() = repo.getPreferenceBetaScreensEnabled()
set(newValue) { repo.setPreferenceBetaScreensEnabled(newValue) }
// --- functions for dev codes --- //
/**
@@ -0,0 +1,11 @@
package com.denizk0461.weserplaner.viewmodel
import android.app.Application
/**
* View model class for [com.denizk0461.weserplaner.fragment.TaskOverviewFragment].
*/
class TaskOverviewViewModel(application: Application) : AppViewModel(application) {
}
+5
View File
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM20.94,11c-0.46,-4.17 -3.77,-7.48 -7.94,-7.94L13,1h-2v2.06C6.83,3.52 3.52,6.83 3.06,11L1,11v2h2.06c0.46,4.17 3.77,7.48 7.94,7.94L11,23h2v-2.06c4.17,-0.46 7.48,-3.77 7.94,-7.94L23,13v-2h-2.06zM12,19c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7z"/>
</vector>
+5
View File
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M22,5.18L10.59,16.6l-4.24,-4.24l1.41,-1.41l2.83,2.83l10,-10L22,5.18zM19.79,10.22C19.92,10.79 20,11.39 20,12c0,4.42 -3.58,8 -8,8s-8,-3.58 -8,-8c0,-4.42 3.58,-8 8,-8c1.58,0 3.04,0.46 4.28,1.25l1.44,-1.44C16.1,2.67 14.13,2 12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10s10,-4.48 10,-10c0,-1.19 -0.22,-2.33 -0.6,-3.39L19.79,10.22z"/>
</vector>
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -1,6 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".fragment.RoomFinderFragment"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<TextView
android:id="@+id/app_title_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:fontFamily="@font/lato_blackitalic"
android:text="@string/title_room_finder"
app:layout_scrollFlags="scroll"
android:textSize="28sp"/>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
+46 -1
View File
@@ -32,6 +32,9 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:paddingBottom="52dp"
android:clipToPadding="false"
android:scrollbarStyle="outsideOverlay"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.appcompat.widget.LinearLayoutCompat
@@ -684,6 +687,49 @@
</androidx.appcompat.widget.LinearLayoutCompat>
<!-- Show beta nav icons -->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout_beta_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/switch_beta_nav"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/lato_bolditalic"
android:text="@string/settings_beta_nav_title"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_beta_nav_subtitle"
android:textSize="16sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/switch_beta_nav"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- Dev codes -->
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
@@ -722,7 +768,6 @@
android:id="@+id/input_dev_code"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:fontFamily="@font/ibm_regular"
android:inputType="textNoSuggestions"/>
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".fragment.TaskOverviewFragment"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<TextView
android:id="@+id/app_title_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:fontFamily="@font/lato_blackitalic"
android:text="@string/title_exam_overview"
app:layout_scrollFlags="scroll"
android:textSize="28sp"/>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
+11 -1
View File
@@ -5,10 +5,20 @@
android:icon="@drawable/design"
android:title="@string/nav_schedule"
android:enabled="true"/>
<item
android:id="@+id/exam_overview"
android:icon="@drawable/task"
android:title="@string/nav_exam_overview"
android:enabled="true"/>
<item
android:id="@+id/canteen"
android:icon="@drawable/restaurant"
android:title="@string/nav_food"
android:title="@string/nav_canteen"
android:enabled="true"/>
<item
android:id="@+id/room_finder"
android:icon="@drawable/location"
android:title="@string/nav_room_finder"
android:enabled="true"/>
<item
android:id="@+id/settings"
+12 -1
View File
@@ -10,10 +10,21 @@
android:name="com.denizk0461.weserplaner.fragment.EventFragment"
android:label="EventFragment"
tools:layout="@layout/fragment_event"/>
<fragment
android:id="@+id/exam_overview"
android:name="com.denizk0461.weserplaner.fragment.TaskOverviewFragment"
android:label="ExamOverviewFragment"
tools:layout="@layout/fragment_task_overview"/>
<fragment
android:id="@+id/canteen"
android:name="com.denizk0461.weserplaner.fragment.CanteenFragment"
android:label="CanteenFragment"/>
android:label="CanteenFragment"
tools:layout="@layout/fragment_canteen"/>
<fragment
android:id="@+id/room_finder"
android:name="com.denizk0461.weserplaner.fragment.RoomFinderFragment"
android:label="RoomFinderFragment"
tools:layout="@layout/fragment_room_finder"/>
<fragment
android:id="@+id/settings"
android:name="com.denizk0461.weserplaner.fragment.SettingsFragment"
+23 -2
View File
@@ -73,6 +73,8 @@
<string name="sheet_schedule_update_time_dialog_start_hint">Startzeit der Veranstaltung</string>
<string name="sheet_schedule_update_time_dialog_end_hint">Schlusszeit der Veranstaltung</string>
<string name="task_overview_snack_unimplemented">Aufgaben sind noch nicht implementiert!</string>
<string name="canteen_button_opening_hours_hint">Siehe Öffnungszeiten der Mensa</string>
<string name="canteen_button_notifications_hint">Siehe Neuigkeiten der Mensa</string>
@@ -85,18 +87,23 @@
<string name="canteen_fab_refresh_content_desc">Aktualisiere Angebote</string>
<string name="canteen_fab_refresh_text">Aktualisieren</string>
<!-- TODO replace 'this canteen' with %s -->
<string name="text_sheet_opening_hours_title">%s Öffnungszeiten</string>
<string name="text_sheet_opening_hours_empty">Die Öffnungszeiten können nicht angezeigt werden.</string>
<string name="text_sheet_news_title">%s Neuigkeiten</string>
<string name="text_sheet_news_empty">Es sind keine Neuigkeiten verfügbar.</string>
<string name="room_finder_snack_unimplemented">Der Raumfinder ist noch nicht implementiert!</string>
<string name="sheet_licences_header">Lizenzen</string>
<string name="title_schedule">Dein Stundenplan</string>
<string name="title_schedule_short">Stundenplan</string>
<string name="title_exam_overview">Aufgaben &amp; Prüfungen</string>
<string name="title_exam_overview_short">Aufgaben</string>
<string name="title_canteen">Mensenangebote</string>
<string name="title_canteen_short">Mensa</string>
<string name="title_room_finder">Raumfinder</string>
<string name="title_room_finder_short">Räume</string>
<string name="title_canteen_template">%s Angebote</string>
<string name="title_settings">App-Einstellungen</string>
@@ -178,7 +185,9 @@
<string name="canteen_page_allergen_sheet_error">Beim Laden dieses Angebots ist ein Fehler aufgetreten.</string>
<string name="nav_schedule">Stundenplan</string>
<string name="nav_food">Mensa</string>
<string name="nav_exam_overview">Aufgaben</string>
<string name="nav_canteen">Mensa</string>
<string name="nav_room_finder">Raumfinder</string>
<string name="nav_settings">Einstellungen</string>
<string name="settings_general">Allgemein</string>
@@ -233,5 +242,17 @@
<string name="settings_app_version">App-Version</string>
<string name="settings_hide_experiments_title">Verstecke experimentelle Einstellungen</string>
<string name="settings_hide_experiments_subtitle">Rufe sie wieder über den Lizenzen-Knopf auf</string>
<string name="settings_build_time">Gradle Build-Code &amp; Zeit</string>
<string name="settings_beta_nav_title">Zeige Beta-Bildschirme</string>
<string name="settings_beta_nav_subtitle">Erfordert einen App-Neustart</string>
<string name="settings_dev_codes_title">Entwicklercodes</string>
<string name="settings_dev_codes_hint">6 Zeichen</string>
<string name="settings_dev_codes_invalid">Dieser Code konnte nicht gefunden werden.</string>
<string name="settings_app_version_15">klick weiter</string>
</resources>
+20 -7
View File
@@ -75,6 +75,8 @@
<string name="sheet_schedule_update_time_dialog_start_hint">Event start time</string>
<string name="sheet_schedule_update_time_dialog_end_hint">Event end time</string>
<string name="task_overview_snack_unimplemented">Tasks are not yet implemented!</string>
<string name="canteen_button_opening_hours_hint">View canteen opening hours</string>
<string name="canteen_button_notifications_hint">View canteen notifications</string>
@@ -92,13 +94,19 @@
<string name="text_sheet_news_title">%s news</string>
<string name="text_sheet_news_empty">No news are available.</string>
<string name="room_finder_snack_unimplemented">Room finder is not yet implemented!</string>
<string name="sheet_licences_header">Licences</string>
<string name="sheet_licences_content" translatable="false">Android, Material Design Resources © 2014 %1$s Google, licenced under the Apache 2.0 License.\nhttps://developer.android.com\nhttps://material.io\n\nSeveral icons © 2013 %1$s Flaticon, licenced under the Flaticon Basic Free License.\nhttps://www.flaticon.com\n\nLato © 2010 %1$s Łukasz Dziedzic, licenced under the SIL Open Font License.\nhttps://fonts.google.com/specimen/Lato\n\njsoup HTML parser © 2009 %1$s Jonathan Hedley, licenced under the MIT License.\nhttps://jsoup.org\n\nApp developed by Deniz Düzgören.\ndenizk0461@gmail.com\ndeniz7@uni-bremen.de</string>
<string name="title_schedule">Your Schedule</string>
<string name="title_schedule_short">Schedule</string>
<string name="title_exam_overview">Tasks &amp; Exams</string>
<string name="title_exam_overview_short">Tasks</string>
<string name="title_canteen">Canteen Offers</string>
<string name="title_canteen_short">Canteen</string>
<string name="title_room_finder">Room Finder</string>
<string name="title_room_finder_short">Rooms</string>
<string name="title_canteen_template">%s Offers</string>
<string name="title_settings">App Settings</string>
@@ -182,7 +190,9 @@
<string name="canteen_page_allergen_sheet_error">An error occurred while trying to retrieve this offer.</string>
<string name="nav_schedule">Schedule</string>
<string name="nav_food">Canteens</string>
<string name="nav_exam_overview">Tasks</string>
<string name="nav_canteen">Canteens</string>
<string name="nav_room_finder">Room Finder</string>
<string name="nav_settings">Settings</string>
<string name="settings_general">General</string>
@@ -241,15 +251,18 @@
<string name="settings_app_version">App Version</string>
<string name="settings_hide_experiments_title" translatable="false">Hide experimental settings</string>
<string name="settings_hide_experiments_subtitle" translatable="false">Show them again via licences button</string>
<string name="settings_hide_experiments_title">Hide experimental settings</string>
<string name="settings_hide_experiments_subtitle">Show them again via licences button</string>
<string name="settings_build_time" translatable="false">Gradle build code &amp; time</string>
<string name="settings_build_time">Gradle build code &amp; time</string>
<string name="settings_dev_codes_title" translatable="false">Development codes</string>
<string name="settings_dev_codes_hint" translatable="false">6 chars</string>
<string name="settings_beta_nav_title">Show beta screens</string>
<string name="settings_beta_nav_subtitle">Requires an app restart</string>
<string name="settings_dev_codes_title">Development codes</string>
<string name="settings_dev_codes_hint">6 chars</string>
<string name="settings_dev_codes_button" translatable="false"></string>
<string name="settings_dev_codes_invalid" translatable="false">This code could not be found.</string>
<string name="settings_dev_codes_invalid">This code could not be found.</string>
<string name="settings_app_version_15">keep clicking</string>
<string name="settings_app_version_20" translatable="false">^_^</string>