Added back buttons on all user-facing fragments that show when compact layout is used

This commit is contained in:
denizk0461
2023-06-04 17:42:30 +02:00
parent 6d1ab773dc
commit 8f612d3c31
20 changed files with 328 additions and 48 deletions
@@ -2,6 +2,7 @@ package com.denizk0461.weserplaner.activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -10,6 +11,7 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.setupWithNavController import androidx.navigation.ui.setupWithNavController
import com.denizk0461.weserplaner.R import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.databinding.ActivityMainBinding import com.denizk0461.weserplaner.databinding.ActivityMainBinding
import com.denizk0461.weserplaner.values.AppLayout
import com.denizk0461.weserplaner.viewmodel.MainViewModel import com.denizk0461.weserplaner.viewmodel.MainViewModel
/** /**
@@ -51,6 +53,11 @@ class MainActivity : FragmentActivity() {
startActivity(Intent(this, IntroductionActivity::class.java)) startActivity(Intent(this, IntroductionActivity::class.java))
} }
when (viewModel.preferenceAppLayout) {
AppLayout.DEFAULT -> {
// Ensure that the navigation bar is visible
binding.navView.visibility = View.VISIBLE
// Set up bottom navigation view to navigate between fragments // Set up bottom navigation view to navigate between fragments
binding.navView.setupWithNavController( binding.navView.setupWithNavController(
binding.navHostFragmentContentMain.getFragment<NavHostFragment>().findNavController() binding.navHostFragmentContentMain.getFragment<NavHostFragment>().findNavController()
@@ -63,21 +70,30 @@ class MainActivity : FragmentActivity() {
binding.navView.menu.findItem(R.id.exam_overview).isVisible = showBetaScreens binding.navView.menu.findItem(R.id.exam_overview).isVisible = showBetaScreens
binding.navView.menu.findItem(R.id.room_finder).isVisible = showBetaScreens binding.navView.menu.findItem(R.id.room_finder).isVisible = showBetaScreens
// Set up navigation component // Set up navigation graph for the default layout
setNavigationGraph() (supportFragmentManager
.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment)
.setupDefaultNavigationGraph()
}
AppLayout.COMPACT -> {
// Hide the navigation bar, as it is unnecessary in the compact layout
binding.navView.visibility = View.GONE
// Set up navigation graph for the compact layout
(supportFragmentManager
.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment)
.setupCompactNavigationGraph()
}
}
} }
/** /**
* Sets the navigation graph for the fragments. Also sets the start destination. * Sets the default navigation graph for the fragments. Also sets the start destination, as
* specified by the user.
*/ */
private fun setNavigationGraph() { private fun NavHostFragment.setupDefaultNavigationGraph() {
// Get nav host
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment_content_main) as NavHostFragment
// Inflate new nav graph // Inflate new nav graph
val navGraph = navHostFragment val navGraph = this.navController.navInflater.inflate(R.navigation.nav_graph_default)
.navController.navInflater.inflate(R.navigation.nav_graph_detailed)
// Set the starting fragment for the app // Set the starting fragment for the app
navGraph.setStartDestination(when (viewModel.preferenceLaunchFragment) { navGraph.setStartDestination(when (viewModel.preferenceLaunchFragment) {
@@ -86,6 +102,17 @@ class MainActivity : FragmentActivity() {
}) })
// Set the newly defined nav graph // Set the newly defined nav graph
navHostFragment.navController.graph = navGraph this.navController.graph = navGraph
}
/**
* Sets the compact navigation graph for the fragments.
*/
private fun NavHostFragment.setupCompactNavigationGraph() {
// Inflate new nav graph
val navGraph = this.navController.navInflater.inflate(R.navigation.nav_graph_compact)
// Set the newly defined nav graph
this.navController.graph = navGraph
} }
} }
@@ -9,6 +9,7 @@ import com.denizk0461.weserplaner.values.SettingsPreferences
import com.denizk0461.weserplaner.values.TaskOrder import com.denizk0461.weserplaner.values.TaskOrder
import com.denizk0461.weserplaner.model.* import com.denizk0461.weserplaner.model.*
import com.denizk0461.weserplaner.values.AllergenPreferences import com.denizk0461.weserplaner.values.AllergenPreferences
import com.denizk0461.weserplaner.values.AppLayout
/** /**
* Repository objects that acts as a mediator between view models and the database to retrieve data * Repository objects that acts as a mediator between view models and the database to retrieve data
@@ -396,12 +397,15 @@ class AppRepository(app: Application) {
/** /**
* This value determines which navigation graph will be used for app navigation. * This value determines which navigation graph will be used for app navigation.
*/ */
fun getAppLayout(): Int = getIntPreference( fun getAppLayout(): AppLayout = AppLayout.values()[getIntPreference(
SettingsPreferences.APP_LAYOUT, SettingsPreferences.APP_LAYOUT,
) )]
fun setAppLayout(newValue: Int) { fun setAppLayout(newValue: Int) {
setPreference(SettingsPreferences.APP_LAYOUT, newValue) setPreference(SettingsPreferences.APP_LAYOUT, newValue)
} }
fun setAppLayout(newValue: AppLayout) {
setPreference(SettingsPreferences.APP_LAYOUT, newValue.ordinal)
}
/** /**
* This value determines whether the user opts into submitting crash reports. * This value determines whether the user opts into submitting crash reports.
@@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.denizk0461.weserplaner.R import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.adapter.CanteenOfferPageAdapter import com.denizk0461.weserplaner.adapter.CanteenOfferPageAdapter
@@ -19,6 +20,7 @@ import com.denizk0461.weserplaner.data.showSnackBar
import com.denizk0461.weserplaner.databinding.FragmentCanteenBinding import com.denizk0461.weserplaner.databinding.FragmentCanteenBinding
import com.denizk0461.weserplaner.values.DietaryPreferences import com.denizk0461.weserplaner.values.DietaryPreferences
import com.denizk0461.weserplaner.model.* import com.denizk0461.weserplaner.model.*
import com.denizk0461.weserplaner.values.AppLayout
import com.denizk0461.weserplaner.values.TextSheetContentId import com.denizk0461.weserplaner.values.TextSheetContentId
import com.denizk0461.weserplaner.viewmodel.CanteenViewModel import com.denizk0461.weserplaner.viewmodel.CanteenViewModel
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
@@ -50,6 +52,19 @@ class CanteenFragment : AppFragment<FragmentCanteenBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// Set up back button, if required by the selected layout
when (viewModel.preferenceAppLayout) {
AppLayout.DEFAULT -> {
binding.buttonNavigateBack.visibility = View.GONE
}
AppLayout.COMPACT -> {
binding.buttonNavigateBack.visibility = View.VISIBLE
binding.buttonNavigateBack.setOnClickListener {
findNavController().navigate(R.id.action_canteen_to_compact_overview)
}
}
}
// Set progress circle colours // Set progress circle colours
binding.swipeRefreshLayout.setRainbowProgressCircle() binding.swipeRefreshLayout.setRainbowProgressCircle()
@@ -1,8 +1,26 @@
package com.denizk0461.weserplaner.fragment package com.denizk0461.weserplaner.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.databinding.FragmentCompactOverviewBinding import com.denizk0461.weserplaner.databinding.FragmentCompactOverviewBinding
class CompactOverviewFragment : AppFragment<FragmentCompactOverviewBinding>() { class CompactOverviewFragment : AppFragment<FragmentCompactOverviewBinding>() {
// Instantiate the view binding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentCompactOverviewBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.buttonSettings.setOnClickListener {
findNavController().navigate(R.id.action_compact_overview_to_settings)
}
}
} }
@@ -6,6 +6,7 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import com.denizk0461.weserplaner.R import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.activity.FetcherActivity import com.denizk0461.weserplaner.activity.FetcherActivity
@@ -14,6 +15,7 @@ import com.denizk0461.weserplaner.adapter.StudIPEventPageAdapter
import com.denizk0461.weserplaner.data.showSnackBar import com.denizk0461.weserplaner.data.showSnackBar
import com.denizk0461.weserplaner.databinding.FragmentEventBinding import com.denizk0461.weserplaner.databinding.FragmentEventBinding
import com.denizk0461.weserplaner.sheet.ScheduleUpdateSheet import com.denizk0461.weserplaner.sheet.ScheduleUpdateSheet
import com.denizk0461.weserplaner.values.AppLayout
import com.denizk0461.weserplaner.viewmodel.EventViewModel import com.denizk0461.weserplaner.viewmodel.EventViewModel
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import java.util.* import java.util.*
@@ -41,6 +43,19 @@ class EventFragment : AppFragment<FragmentEventBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// Set up back button, if required by the selected layout
when (viewModel.preferenceAppLayout) {
AppLayout.DEFAULT -> {
binding.buttonNavigateBack.visibility = View.GONE
}
AppLayout.COMPACT -> {
binding.buttonNavigateBack.visibility = View.VISIBLE
binding.buttonNavigateBack.setOnClickListener {
findNavController().navigate(R.id.action_schedule_to_compact_overview)
}
}
}
// Get localised weekday names // Get localised weekday names
weekdays = context.resources?.getStringArray(R.array.weekdays) ?: arrayOf() weekdays = context.resources?.getStringArray(R.array.weekdays) ?: arrayOf()
@@ -13,6 +13,7 @@ import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.setFragmentResultListener
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.denizk0461.weserplaner.BuildConfig import com.denizk0461.weserplaner.BuildConfig
import com.denizk0461.weserplaner.R import com.denizk0461.weserplaner.R
import com.denizk0461.weserplaner.activity.FetcherActivity import com.denizk0461.weserplaner.activity.FetcherActivity
@@ -23,6 +24,7 @@ import com.denizk0461.weserplaner.data.showToast
import com.denizk0461.weserplaner.databinding.FragmentSettingsBinding import com.denizk0461.weserplaner.databinding.FragmentSettingsBinding
import com.denizk0461.weserplaner.model.FormattedDate import com.denizk0461.weserplaner.model.FormattedDate
import com.denizk0461.weserplaner.sheet.AllergenConfigSheet import com.denizk0461.weserplaner.sheet.AllergenConfigSheet
import com.denizk0461.weserplaner.values.AppLayout
import com.denizk0461.weserplaner.viewmodel.SettingsViewModel import com.denizk0461.weserplaner.viewmodel.SettingsViewModel
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.* import java.util.*
@@ -56,6 +58,19 @@ class SettingsFragment : AppFragment<FragmentSettingsBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
// Set up back button, if required by the selected layout
when (viewModel.preferenceAppLayout) {
AppLayout.DEFAULT -> {
binding.buttonNavigateBack.visibility = View.GONE
}
AppLayout.COMPACT -> {
binding.buttonNavigateBack.visibility = View.VISIBLE
binding.buttonNavigateBack.setOnClickListener {
findNavController().navigate(R.id.action_settings_to_compact_overview)
}
}
}
// --- schedule settings --- // // --- schedule settings --- //
// Launch the Stud.IP schedule fetcher activity // Launch the Stud.IP schedule fetcher activity
@@ -419,6 +434,14 @@ class SettingsFragment : AppFragment<FragmentSettingsBinding>() {
viewModel.preferenceFirstLaunch = true viewModel.preferenceFirstLaunch = true
showToast(context, "First launch flag cleared") showToast(context, "First launch flag cleared")
} }
"LAYDEF" -> {
viewModel.preferenceAppLayout = AppLayout.DEFAULT
showToast(context, "App will use default layout")
}
"LAYCOM" -> {
viewModel.preferenceAppLayout = AppLayout.COMPACT
showToast(context, "App will use compact layout")
}
else -> showSnackBar( else -> showSnackBar(
getString(R.string.settings_dev_codes_invalid) getString(R.string.settings_dev_codes_invalid)
) )
@@ -0,0 +1,13 @@
package com.denizk0461.weserplaner.values
/**
* This enum class represents the different layouts the app has to offer.
*/
enum class AppLayout {
// Default app layout.
DEFAULT,
// More compact app layout that attempts to prioritise relevant information.
COMPACT,
;
}
@@ -75,7 +75,7 @@ enum class SettingsPreferences(val key: String) {
BETA_SCREENS_ENABLED("beta_screens"), BETA_SCREENS_ENABLED("beta_screens"),
/** /**
* The user's app layout preference. * The user's app layout preference. Also see [com.denizk0461.weserplaner.values.AppLayout].
*/ */
APP_LAYOUT("app_layout"), APP_LAYOUT("app_layout"),
; ;
@@ -6,6 +6,7 @@ import androidx.lifecycle.viewModelScope
import com.denizk0461.weserplaner.data.StwParser import com.denizk0461.weserplaner.data.StwParser
import com.denizk0461.weserplaner.values.DietaryPreferences import com.denizk0461.weserplaner.values.DietaryPreferences
import com.denizk0461.weserplaner.model.* import com.denizk0461.weserplaner.model.*
import com.denizk0461.weserplaner.values.AppLayout
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -88,4 +89,10 @@ class CanteenViewModel(app: Application) : AppViewModel(app) {
var preferenceHasOpenedCanteen: Boolean var preferenceHasOpenedCanteen: Boolean
get() = repo.getPreferenceHasOpenedCanteen() get() = repo.getPreferenceHasOpenedCanteen()
set(newValue) { repo.setPreferenceHasOpenedCanteen(newValue) } set(newValue) { repo.setPreferenceHasOpenedCanteen(newValue) }
/**
* Determines which layout the user wants the app to use.
*/
val preferenceAppLayout: AppLayout
get() = repo.getAppLayout()
} }
@@ -2,6 +2,7 @@ package com.denizk0461.weserplaner.viewmodel
import android.app.Application import android.app.Application
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.denizk0461.weserplaner.values.AppLayout
/** /**
* View model for [com.denizk0461.weserplaner.fragment.EventFragment] * View model for [com.denizk0461.weserplaner.fragment.EventFragment]
@@ -22,4 +23,10 @@ class EventViewModel(app: Application) : AppViewModel(app) {
*/ */
val preferenceCurrentDay: Boolean val preferenceCurrentDay: Boolean
get() = repo.getPreferenceCurrentDay() get() = repo.getPreferenceCurrentDay()
/**
* Determines which layout the user wants the app to use.
*/
val preferenceAppLayout: AppLayout
get() = repo.getAppLayout()
} }
@@ -1,6 +1,7 @@
package com.denizk0461.weserplaner.viewmodel package com.denizk0461.weserplaner.viewmodel
import android.app.Application import android.app.Application
import com.denizk0461.weserplaner.values.AppLayout
/** /**
* View model for [com.denizk0461.weserplaner.activity.MainActivity] * View model for [com.denizk0461.weserplaner.activity.MainActivity]
@@ -27,4 +28,10 @@ class MainViewModel(application: Application) : AppViewModel(application) {
*/ */
val preferenceFirstLaunch: Boolean val preferenceFirstLaunch: Boolean
get() = repo.getPreferenceFirstLaunch() get() = repo.getPreferenceFirstLaunch()
/**
* Determines which layout the user wants the app to use.
*/
val preferenceAppLayout: AppLayout
get() = repo.getAppLayout()
} }
@@ -1,6 +1,7 @@
package com.denizk0461.weserplaner.viewmodel package com.denizk0461.weserplaner.viewmodel
import android.app.Application import android.app.Application
import com.denizk0461.weserplaner.values.AppLayout
/** /**
* View model for [com.denizk0461.weserplaner.fragment.SettingsFragment] * View model for [com.denizk0461.weserplaner.fragment.SettingsFragment]
@@ -86,7 +87,14 @@ class SettingsViewModel(app: Application) : AppViewModel(app) {
*/ */
var preferenceFirstLaunch: Boolean var preferenceFirstLaunch: Boolean
get() = repo.getPreferenceFirstLaunch() get() = repo.getPreferenceFirstLaunch()
set(value) { repo.setPreferenceFirstLaunch(value) } set(newValue) { repo.setPreferenceFirstLaunch(newValue) }
/**
* Determines which layout the user wants the app to use.
*/
var preferenceAppLayout: AppLayout
get() = repo.getAppLayout()
set(newValue) { repo.setAppLayout(newValue) }
// --- functions for dev codes --- // // --- functions for dev codes --- //
+19 -3
View File
@@ -21,8 +21,23 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginHorizontal="8dp">
android:layout_marginEnd="8dp">
<com.google.android.material.button.MaterialButton
style="@style/Widget.Material3.Button.IconButton"
android:id="@+id/button_navigate_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
app:icon="@drawable/arrow_back"
app:iconPadding="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:layout_constraintTop_toTopOf="@id/app_title_bar"
app:layout_constraintBottom_toBottomOf="@id/app_title_bar"
app:layout_constraintStart_toStartOf="parent"
app:iconTint="?attr/colorOnSurfaceVariant"
tools:ignore="UnusedAttribute"
android:tooltipText="@string/fragment_button_back_to_overview_hint"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/app_title_bar" android:id="@+id/app_title_bar"
@@ -33,6 +48,7 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
app:layout_goneMarginStart="8dp"
app:fontFamily="@font/lato_blackitalic" app:fontFamily="@font/lato_blackitalic"
android:singleLine="true" android:singleLine="true"
android:ellipsize="marquee" android:ellipsize="marquee"
@@ -42,7 +58,7 @@
android:scrollHorizontally="true" android:scrollHorizontally="true"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@id/button_navigate_back"
app:layout_constraintEnd_toStartOf="@id/button_opening_hours"/> app:layout_constraintEnd_toStartOf="@id/button_opening_hours"/>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
@@ -1,6 +1,64 @@
<?xml version="1.0" encoding="utf-8"?> <?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"
android:id="@+id/coordinator_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
tools:context=".fragment.EventFragment">
</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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="8dp"
app:layout_scrollFlags="scroll">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/app_title_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textSize="28sp"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="4dp"
app:fontFamily="@font/lato_blackitalic"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:scrollHorizontally="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/button_settings"/>
<com.google.android.material.button.MaterialButton
style="@style/Widget.Material3.Button.IconButton.Outlined"
android:id="@+id/button_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
app:icon="@drawable/settings"
app:iconPadding="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:layout_constraintTop_toTopOf="@id/app_title_bar"
app:layout_constraintBottom_toBottomOf="@id/app_title_bar"
app:layout_constraintEnd_toEndOf="parent"
app:iconTint="?attr/colorOnSurfaceVariant"
tools:ignore="UnusedAttribute"
android:tooltipText="@string/compact_overview_button_settings_hint"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
+19 -3
View File
@@ -16,10 +16,25 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp" android:layout_marginHorizontal="8dp"
android:layout_marginEnd="8dp"
app:layout_scrollFlags="scroll"> app:layout_scrollFlags="scroll">
<com.google.android.material.button.MaterialButton
style="@style/Widget.Material3.Button.IconButton"
android:id="@+id/button_navigate_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
app:icon="@drawable/arrow_back"
app:iconPadding="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:layout_constraintTop_toTopOf="@id/app_title_bar"
app:layout_constraintBottom_toBottomOf="@id/app_title_bar"
app:layout_constraintStart_toStartOf="parent"
app:iconTint="?attr/colorOnSurfaceVariant"
tools:ignore="UnusedAttribute"
android:tooltipText="@string/fragment_button_back_to_overview_hint"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/app_title_bar" android:id="@+id/app_title_bar"
android:layout_width="0dp" android:layout_width="0dp"
@@ -29,6 +44,7 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
app:layout_goneMarginStart="8dp"
app:fontFamily="@font/lato_blackitalic" app:fontFamily="@font/lato_blackitalic"
android:singleLine="true" android:singleLine="true"
android:ellipsize="marquee" android:ellipsize="marquee"
@@ -38,7 +54,7 @@
android:scrollHorizontally="true" android:scrollHorizontally="true"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@id/button_navigate_back"
app:layout_constraintEnd_toStartOf="@id/button_view_overview"/> app:layout_constraintEnd_toStartOf="@id/button_view_overview"/>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
+34 -6
View File
@@ -14,17 +14,45 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<androidx.appcompat.widget.AppCompatTextView <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/app_title_bar" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="8dp"
app:layout_scrollFlags="scroll">
<com.google.android.material.button.MaterialButton
style="@style/Widget.Material3.Button.IconButton"
android:id="@+id/button_navigate_back"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:minWidth="0dp"
android:layout_marginTop="16dp" app:icon="@drawable/arrow_back"
android:layout_marginBottom="8dp" app:iconPadding="0dp"
app:strokeColor="?attr/colorOutlineVariant"
app:layout_constraintTop_toTopOf="@id/app_title_bar"
app:layout_constraintBottom_toBottomOf="@id/app_title_bar"
app:layout_constraintStart_toStartOf="parent"
app:iconTint="?attr/colorOnSurfaceVariant"
tools:ignore="UnusedAttribute"
android:tooltipText="@string/fragment_button_back_to_overview_hint"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/app_title_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:fontFamily="@font/lato_blackitalic" app:fontFamily="@font/lato_blackitalic"
android:text="@string/title_settings" android:text="@string/title_settings"
android:textSize="28sp"
app:layout_scrollFlags="scroll" app:layout_scrollFlags="scroll"
android:textSize="28sp"/> android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
app:layout_goneMarginStart="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/button_navigate_back"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph_compact" android:id="@+id/nav_graph_compact"
app:startDestination="@id/schedule"> app:startDestination="@id/compact_overview">
<fragment <fragment
android:id="@+id/compact_overview" android:id="@+id/compact_overview"
@@ -26,16 +26,28 @@
android:id="@+id/schedule" android:id="@+id/schedule"
android:name="com.denizk0461.weserplaner.fragment.EventFragment" android:name="com.denizk0461.weserplaner.fragment.EventFragment"
android:label="EventFragment" android:label="EventFragment"
tools:layout="@layout/fragment_event"/> tools:layout="@layout/fragment_event">
<action
android:id="@+id/action_schedule_to_compact_overview"
app:destination="@id/compact_overview" />
</fragment>
<fragment <fragment
android:id="@+id/canteen" android:id="@+id/canteen"
android:name="com.denizk0461.weserplaner.fragment.CanteenFragment" android:name="com.denizk0461.weserplaner.fragment.CanteenFragment"
android:label="CanteenFragment" android:label="CanteenFragment"
tools:layout="@layout/fragment_canteen"/> tools:layout="@layout/fragment_canteen">
<action
android:id="@+id/action_canteen_to_compact_overview"
app:destination="@id/compact_overview" />
</fragment>
<fragment <fragment
android:id="@+id/settings" android:id="@+id/settings"
android:name="com.denizk0461.weserplaner.fragment.SettingsFragment" android:name="com.denizk0461.weserplaner.fragment.SettingsFragment"
android:label="SettingsFragment" android:label="SettingsFragment"
tools:layout="@layout/fragment_settings"/> tools:layout="@layout/fragment_settings">
<action
android:id="@+id/action_settings_to_compact_overview"
app:destination="@id/compact_overview" />
</fragment>
</navigation> </navigation>
@@ -2,7 +2,7 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph_detailed" android:id="@+id/nav_graph_default"
app:startDestination="@id/schedule"> app:startDestination="@id/schedule">
<fragment <fragment
+3
View File
@@ -30,6 +30,9 @@
<string name="introduction_or"> oder </string> <string name="introduction_or"> oder </string>
<string name="introduction_button_continue">Gehe direkt zur App</string> <string name="introduction_button_continue">Gehe direkt zur App</string>
<string name="compact_overview_button_settings_hint">App-Einstellungen</string>
<string name="fragment_button_back_to_overview_hint">Zurück zur Übersicht</string>
<string name="fetch_error_snack">Ein Fehler ist aufgetreten!</string> <string name="fetch_error_snack">Ein Fehler ist aufgetreten!</string>
<string name="fetch_error_webpage_snack">Du musst deinen Stundenplan öffnen!</string> <string name="fetch_error_webpage_snack">Du musst deinen Stundenplan öffnen!</string>
<string name="fetch_error_login_snack">Du musst dich zuerst einloggen!</string> <string name="fetch_error_login_snack">Du musst dich zuerst einloggen!</string>
+3
View File
@@ -31,6 +31,9 @@
<string name="introduction_or"> or </string> <string name="introduction_or"> or </string>
<string name="introduction_button_continue">Continue to the app</string> <string name="introduction_button_continue">Continue to the app</string>
<string name="compact_overview_button_settings_hint">App settings</string>
<string name="fragment_button_back_to_overview_hint">Back to overview</string>
<string name="fetch_error_snack">Something went wrong!</string> <string name="fetch_error_snack">Something went wrong!</string>
<string name="fetch_error_webpage_snack">You must navigate to your schedule!</string> <string name="fetch_error_webpage_snack">You must navigate to your schedule!</string>
<string name="fetch_error_login_snack">You must log in first!</string> <string name="fetch_error_login_snack">You must log in first!</string>