diff --git a/app/build.gradle b/app/build.gradle
index debb400..8ed568b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,6 +15,8 @@ android {
versionCode 1
versionName "0.4.61"
+ resourceConfigurations += ["en", "de"]
+
buildConfigField "long", "TIMESTAMP", System.currentTimeMillis() + "L"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 639819f..6788a84 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,7 +13,8 @@
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.StudIPTimetable"
- tools:targetApi="31">
+ tools:targetApi="33"
+ android:localeConfig="@xml/locales_config">
+
+
+
\ No newline at end of file
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 3b9a353..2a82018 100644
--- a/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt
+++ b/app/src/main/java/com/denizk0461/studip/activity/FetcherActivity.kt
@@ -1,12 +1,12 @@
package com.denizk0461.studip.activity
import android.annotation.SuppressLint
-import android.app.Activity
import android.os.Bundle
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.denizk0461.studip.R
import com.denizk0461.studip.data.showErrorSnackBar
@@ -19,7 +19,7 @@ import java.net.URLDecoder
* Activity for allowing the user to log in to access and fetch their schedule from their Stud.IP
* profile. Launched through a button in the app's settings.
*/
-class FetcherActivity : Activity() {
+class FetcherActivity : AppCompatActivity() {
// View binding
private lateinit var binding: ActivityFetcherBinding
diff --git a/app/src/main/java/com/denizk0461/studip/activity/ImageActivity.kt b/app/src/main/java/com/denizk0461/studip/activity/ImageActivity.kt
new file mode 100644
index 0000000..67c8178
--- /dev/null
+++ b/app/src/main/java/com/denizk0461/studip/activity/ImageActivity.kt
@@ -0,0 +1,32 @@
+package com.denizk0461.studip.activity
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.WindowCompat
+import com.denizk0461.studip.R
+import com.denizk0461.studip.databinding.ActivityImageBinding
+
+/**
+ * Activity used solely to display a single image. Not a critical part of the app.
+ */
+class ImageActivity : AppCompatActivity() {
+
+ // View binding
+ private lateinit var binding: ActivityImageBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+ super.onCreate(savedInstanceState)
+
+ // Inflate view binding and bind to this activity
+ binding = ActivityImageBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ // Set the image of the view
+ binding.imageView.setImageResource(when (intent.extras?.getString("img") ?: "") {
+ "bojack" -> { R.drawable.man }
+ "garbage" -> { R.drawable.garbage }
+ else -> { R.drawable.engineering }
+ })
+ }
+}
\ No newline at end of file
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 05ac569..739c89f 100644
--- a/app/src/main/java/com/denizk0461/studip/activity/MainActivity.kt
+++ b/app/src/main/java/com/denizk0461/studip/activity/MainActivity.kt
@@ -41,20 +41,6 @@ class MainActivity : FragmentActivity() {
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
- // Open the fragment that the user specified to open on app start
- if (
- AppRepository.getRepositoryInstance(application)
- .getBooleanPreference(SettingsPreferences.LAUNCH_CANTEEN_ON_START)
- ) {
- // Open canteen fragment
- binding.contentMain.navView.selectedItemId = R.id.food
- currentFragment = "canteen"
- } else {
- // Open event fragment
- binding.contentMain.navView.selectedItemId = R.id.plan
- currentFragment = "event"
- }
-
// Set up navigation view bar to launch fragments
binding.contentMain.navView.setOnItemSelectedListener { item ->
// Launch fragment based on the item that has been clicked
@@ -65,8 +51,24 @@ class MainActivity : FragmentActivity() {
})
}
- // Launch the fragment defined in currentFragment
- loadFragment(currentFragment)
+ // Set up bottom nav bar and the initial fragment when the app launches
+ if (savedInstanceState == null) {
+ // Open the fragment that the user specified to open on app start
+ if (AppRepository.getRepositoryInstance(application)
+ .getBooleanPreference(SettingsPreferences.LAUNCH_CANTEEN_ON_START)
+ ) {
+ // Open canteen fragment
+ binding.contentMain.navView.selectedItemId = R.id.food
+ currentFragment = "canteen"
+ } else {
+ // Open event fragment
+ binding.contentMain.navView.selectedItemId = R.id.plan
+ currentFragment = "event"
+ }
+
+ // Launch the fragment defined in currentFragment
+ loadFragment(currentFragment)
+ }
}
/**
diff --git a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt
index 05475b1..1b65228 100644
--- a/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt
+++ b/app/src/main/java/com/denizk0461/studip/adapter/CanteenOfferPageAdapter.kt
@@ -1,19 +1,22 @@
package com.denizk0461.studip.adapter
+import android.os.Bundle
import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.denizk0461.studip.fragment.CanteenPageFragment
-
/**
* Custom ViewPager adapter for managing multiple pages of canteen offers.
*
- * @param fragmentActivity parent fragment activity
+ * @param childFragmentManager child fragment manager of the parent fragment
+ * @param lifecycle parent fragment lifecycle
*/
class CanteenOfferPageAdapter(
- fragmentActivity: FragmentActivity,
-) : FragmentStateAdapter(fragmentActivity) {
+ childFragmentManager: FragmentManager,
+ lifecycle: Lifecycle,
+) : FragmentStateAdapter(childFragmentManager, lifecycle) {
private var count: Int = 0
@@ -21,9 +24,11 @@ class CanteenOfferPageAdapter(
override fun getItemCount(): Int = count
override fun createFragment(position: Int): Fragment =
- CanteenPageFragment(
- position,
- )
+ CanteenPageFragment().also { f ->
+ val bundle = Bundle()
+ bundle.putInt("currentDay", position)
+ f.arguments = bundle
+ }
fun setItemCount(newCount: Int) {
count = newCount
diff --git a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt
index aa95431..949117b 100644
--- a/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt
+++ b/app/src/main/java/com/denizk0461/studip/adapter/StudIPEventPageAdapter.kt
@@ -1,18 +1,22 @@
package com.denizk0461.studip.adapter
+import android.os.Bundle
import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
+import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.denizk0461.studip.fragment.EventPageFragment
/**
* Custom ViewPager adapter for managing multiple pages of Stud.IP events.
*
- * @param fragmentActivity parent fragment activity
+ * @param childFragmentManager child fragment manager of the parent fragment
+ * @param lifecycle parent fragment lifecycle
*/
class StudIPEventPageAdapter(
- fragmentActivity: FragmentActivity,
-) : FragmentStateAdapter(fragmentActivity) {
+ childFragmentManager: FragmentManager,
+ lifecycle: Lifecycle,
+) : FragmentStateAdapter(childFragmentManager, lifecycle) {
/*
* Assume that there will always be 7 pages, for 7 days - Monday through Sunday.
@@ -20,5 +24,9 @@ class StudIPEventPageAdapter(
override fun getItemCount(): Int = 7
override fun createFragment(position: Int): Fragment =
- EventPageFragment(position)
+ EventPageFragment().also { f ->
+ val bundle = Bundle()
+ bundle.putInt("currentDay", position)
+ f.arguments = bundle
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt
index 1771eee..3c6471c 100644
--- a/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt
+++ b/app/src/main/java/com/denizk0461/studip/fragment/AppFragment.kt
@@ -1,5 +1,6 @@
package com.denizk0461.studip.fragment
+import android.content.Context
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.denizk0461.studip.sheet.AppSheet
@@ -10,6 +11,19 @@ import com.denizk0461.studip.sheet.AppSheet
*/
open class AppFragment : Fragment() {
+ // Internal context object
+ private lateinit var _context: Context
+
+ /**
+ * Get non-null context. Only valid after onAttach().
+ */
+ override fun getContext(): Context = _context
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ _context = context
+ }
+
/**
* Opens a bottom sheet. Sheet must be a subclass of [com.denizk0461.studip.sheet.AppSheet].
*
diff --git a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt
index 34008df..c99a137 100644
--- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt
+++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenFragment.kt
@@ -5,7 +5,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.PopupMenu
-import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.viewModels
import com.denizk0461.studip.R
import com.denizk0461.studip.adapter.CanteenOfferPageAdapter
@@ -137,7 +136,10 @@ class CanteenFragment : AppFragment() {
}
// Set up the view pager's adapter
- viewPagerAdapter = CanteenOfferPageAdapter(activity as FragmentActivity)
+ viewPagerAdapter = CanteenOfferPageAdapter(
+ childFragmentManager,
+ lifecycle,
+ )
// Date count is observed to correctly set the amount of pages and the corresponding tabs
viewModel.getDates().observe(viewLifecycleOwner) { newDates ->
@@ -225,7 +227,7 @@ class CanteenFragment : AppFragment() {
binding.swipeRefreshLayout.isRefreshing = false
}, onError = {
- context?.theme?.showErrorSnackBar(
+ context.theme?.showErrorSnackBar(
binding.snackbarContainer,
getString(R.string.canteen_fetch_error)
)
diff --git a/app/src/main/java/com/denizk0461/studip/fragment/CanteenPageFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/CanteenPageFragment.kt
index e9d5d7e..162748a 100644
--- a/app/src/main/java/com/denizk0461/studip/fragment/CanteenPageFragment.kt
+++ b/app/src/main/java/com/denizk0461/studip/fragment/CanteenPageFragment.kt
@@ -19,12 +19,8 @@ import com.denizk0461.studip.viewmodel.CanteenPageViewModel
/**
* Fragment that is instantiated by [StudIPEventPageAdapter] to display individual days' pages and
* their events.
- *
- * @param currentDay day to display
*/
-class CanteenPageFragment(
- private val currentDay: Int,
-) : AppFragment(), CanteenOfferItemAdapter.OnClickListener {
+class CanteenPageFragment : AppFragment(), CanteenOfferItemAdapter.OnClickListener {
// Nullable view binding reference
private var _binding: RecyclerViewBinding? = null
@@ -42,8 +38,18 @@ class CanteenPageFragment(
private val offerList: MutableList = mutableListOf()
+ /**
+ * Current day that is used to show only events of a given day (0 = Monday, 4 = Friday)
+ */
+ private var currentDay: Int = -1
+
// Instantiate the view binding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+
+ // Retrieve current day to fetch items specifically for that day
+ currentDay = arguments?.getInt("currentDay") ?: -1
+
+ // Inflate view binding
_binding = RecyclerViewBinding.inflate(inflater, container, false)
return binding.root
}
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 24287e1..0a91e2f 100644
--- a/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt
+++ b/app/src/main/java/com/denizk0461/studip/fragment/EventFragment.kt
@@ -1,11 +1,9 @@
package com.denizk0461.studip.fragment
import android.os.Bundle
-import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.viewModels
import com.denizk0461.studip.R
import com.denizk0461.studip.adapter.StudIPEventPageAdapter
@@ -40,11 +38,6 @@ class EventFragment : AppFragment() {
// Titles for the view pager's tabs
private lateinit var weekdays: Array
-// private var viewPagerScrollPosition: Parcelable? = null
- private var viewPagerPosition = -1
-
- private var hasFragmentStarted = false
-
// Instantiate the view binding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentEventBinding.inflate(inflater, container, false)
@@ -55,7 +48,7 @@ class EventFragment : AppFragment() {
super.onViewCreated(view, savedInstanceState)
// Get localised weekday names
- weekdays = context?.resources?.getStringArray(R.array.weekdays) ?: arrayOf()
+ weekdays = context.resources?.getStringArray(R.array.weekdays) ?: arrayOf()
// Determine the current day
dayOfWeek = when (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) {
@@ -69,7 +62,10 @@ class EventFragment : AppFragment() {
}
// Set up the view pager's adapter
- viewPagerAdapter = StudIPEventPageAdapter(activity as FragmentActivity)
+ viewPagerAdapter = StudIPEventPageAdapter(
+ childFragmentManager,
+ lifecycle,
+ )
// Assign the adapter to the view pager
binding.viewPager.adapter = viewPagerAdapter
@@ -78,75 +74,33 @@ class EventFragment : AppFragment() {
TabLayoutMediator(binding.dayTabLayout, binding.viewPager) { tab, position ->
tab.text = weekdays[position]
}.attach()
-
- // Set up LiveData observer to refresh the view on update
-// viewModel.allEvents.observe(viewLifecycleOwner) { events ->
-//
-// Log.d("AAAbA?", events.toString())
-//
-// // Update the item list in the view pager's adapter
-// viewPagerAdapter.setNewItems(events)
-//
-// if (!hasFragmentStarted) {
-// // Scroll to the current day, if no page has been stored to be scrolled to
-// switchToCurrentDayView()
-// hasFragmentStarted = true
-//// } else {
-//// /*
-//// * If a page was previously saved, scroll to that one instead. This is meant to
-//// * prevent jumping from
-//// */
-//// binding.viewPager.currentItem = viewPagerPosition
-// }
-// }
- }
-
- override fun onPause() {
-// viewPagerPosition = binding.viewPager.currentItem
-// Log.d("AAA?", "onpause: $viewPagerPosition")
- super.onPause()
- }
-
- override fun onResume() {
- super.onResume()
- binding.viewPager.currentItem = viewPagerPosition
- Log.d("AAA?", "onresume: pos: $viewPagerPosition; vpp: ${binding.viewPager.currentItem}")
-
- // Scroll to the current day
-// switchToCurrentDayView()
}
/**
* Called when the layout changes (e.g. device rotation) but NOT when the fragment is selected
* from the bottom navigation view.
*/
- override fun onSaveInstanceState(outState: Bundle) {
- super.onSaveInstanceState(outState)
- Log.d("AAA?", "${binding.viewPager.currentItem}")
- outState.putInt(
- "viewPagerCurrentPage",
- binding.viewPager.currentItem
- )
- }
-
- override fun onViewStateRestored(savedInstanceState: Bundle?) {
- super.onViewStateRestored(savedInstanceState)
- val restoredPage = savedInstanceState?.getInt("viewPagerCurrentPage") ?: 0
- viewPagerPosition = restoredPage
-
- }
+// override fun onSaveInstanceState(outState: Bundle) {
+// super.onSaveInstanceState(outState)
+//
+// outState.putInt(
+// "viewPagerCurrentPage",
+// binding.viewPager.currentItem
+// )
+// }
+//
+// override fun onViewStateRestored(savedInstanceState: Bundle?) {
+// super.onViewStateRestored(savedInstanceState)
+//
+// // Retrieve
+// val restoredPage = savedInstanceState?.getInt("viewPagerCurrentPage") ?: 0
+//
+//// binding.viewPager.currentItem = restoredPage
+// }
// Invalidate the view binding
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
-
- /**
- * Scroll to the current day. Current day is determined after the fragment's view has been
- * created.
- */
- private fun switchToCurrentDayView() {
- binding.viewPager.currentItem = dayOfWeek
- }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/denizk0461/studip/fragment/EventPageFragment.kt b/app/src/main/java/com/denizk0461/studip/fragment/EventPageFragment.kt
index 3d9866b..9fc2930 100644
--- a/app/src/main/java/com/denizk0461/studip/fragment/EventPageFragment.kt
+++ b/app/src/main/java/com/denizk0461/studip/fragment/EventPageFragment.kt
@@ -16,13 +16,8 @@ import com.denizk0461.studip.viewmodel.EventPageViewModel
/**
* Fragment that is instantiated by [StudIPEventPageAdapter] to display individual days' pages and
* their events.
- *
- * @param currentDay current day that is used to show only events of a given day (0 = Monday,
- * 4 = Friday)
*/
-class EventPageFragment(
- private val currentDay: Int,
-) : AppFragment(), StudIPEventItemAdapter.OnClickListener {
+class EventPageFragment : AppFragment(), StudIPEventItemAdapter.OnClickListener {
// Nullable view binding reference
private var _binding: RecyclerViewBinding? = null
@@ -39,10 +34,23 @@ class EventPageFragment(
/**
* Adapter that manages the page's items
*/
- private val eventAdapter = StudIPEventItemAdapter(currentDay, this)
+ private lateinit var eventAdapter: StudIPEventItemAdapter
+
+ /**
+ * Current day that is used to show only events of a given day (0 = Monday, 4 = Friday)
+ */
+ private var currentDay = -1
// Instantiate the view binding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+
+ // Retrieve current day to fetch items specifically for that day
+ currentDay = arguments?.getInt("currentDay") ?: -1
+
+ // Instantiate event adapter with the current day
+ eventAdapter = StudIPEventItemAdapter(currentDay, this)
+
+ // Inflate view binding
_binding = RecyclerViewBinding.inflate(inflater, container, false)
return binding.root
}
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 245c376..a4c55df 100644
--- a/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt
+++ b/app/src/main/java/com/denizk0461/studip/fragment/SettingsFragment.kt
@@ -11,6 +11,8 @@ import androidx.fragment.app.viewModels
import com.denizk0461.studip.BuildConfig
import com.denizk0461.studip.R
import com.denizk0461.studip.activity.FetcherActivity
+import com.denizk0461.studip.activity.ImageActivity
+import com.denizk0461.studip.data.showToast
import com.denizk0461.studip.databinding.FragmentSettingsBinding
import com.denizk0461.studip.sheet.DevCodeSheet
import com.denizk0461.studip.sheet.TextSheet
@@ -36,7 +38,7 @@ class SettingsFragment : AppFragment() {
private val viewModel: SettingsViewModel by viewModels()
// Click counter on the app version button
- private var appVersionClick = 0
+ private var appVersionClick = 1
// 222
private val mysteryLink = "https://www.youtube.com/watch?v=nhIQMCXJzLI"
@@ -129,7 +131,39 @@ class SettingsFragment : AppFragment() {
// Set click listener for the app version button
binding.buttonAppVersion.setOnClickListener {
when (appVersionClick) {
- 22 -> {
+ 3 -> {
+ startActivity(Intent(context, ImageActivity::class.java).also { intent ->
+ val bundle = Bundle()
+ bundle.putString("img", "garbage")
+ intent.putExtras(bundle)
+ })
+ appVersionClick += 1
+ }
+ 10 -> {
+ showToast(context, "ahhh yes")
+ appVersionClick += 1
+ }
+ 15 -> {
+ showToast(context, "keep clicking")
+ appVersionClick += 1
+ }
+ 20 -> {
+ showToast(context, "^_^")
+ appVersionClick += 1
+ }
+ 30 -> {
+ showToast(context, "^_____^")
+ appVersionClick += 1
+ }
+ 121 -> {
+ showToast(context, "Shouldn't you study for your exam?")
+ appVersionClick += 1
+ }
+ 200 -> {
+ showToast(context, "\\__*")
+ appVersionClick += 1
+ }
+ 222 -> {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(mysteryLink)))
appVersionClick = 0
}
@@ -145,7 +179,8 @@ class SettingsFragment : AppFragment() {
binding.appVersionText.text =
"${BuildConfig.VERSION_NAME}-${
if (BuildConfig.DEBUG)
- "dev-[${SimpleDateFormat("yyyy-MM-dd, HH:mm:ss.SSS", Locale.GERMANY).format(Date(BuildConfig.TIMESTAMP))}]"
+ "dev-[${SimpleDateFormat("yyyy-MM-dd, HH:mm:ss.SSS", Locale.GERMANY)
+ .format(Date(BuildConfig.TIMESTAMP))}]"
else
"release"
}"
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 1b7427a..b47c5bf 100644
--- a/app/src/main/java/com/denizk0461/studip/sheet/DevCodeSheet.kt
+++ b/app/src/main/java/com/denizk0461/studip/sheet/DevCodeSheet.kt
@@ -6,6 +6,7 @@ import android.os.Bundle
import android.util.Base64
import android.view.View
import com.denizk0461.studip.R
+import com.denizk0461.studip.activity.ImageActivity
import com.denizk0461.studip.data.showToast
import com.denizk0461.studip.data.viewBinding
import com.denizk0461.studip.databinding.SheetDevCodeBinding
@@ -63,6 +64,14 @@ class DevCodeSheet(
"X0RSV05f".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9SUVpUUy1CWjhtcw==".d64)
"TUFSR0Uh".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS8tbHFxRHZXRjQ1dw==".d64)
"UE9XRUxM".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9XUGMtVkVxQlBISQ==".d64)
+ "Q0FMTE1F".d64 -> launchLink("aHR0cHM6Ly95b3V0dS5iZS8xbTV1WnJNMnktMA==".d64)
+ "Qk9KQUNL".d64 -> {
+ startActivity(Intent(context, ImageActivity::class.java).also { intent ->
+ val bundle = Bundle()
+ bundle.putString("img", "bojack")
+ intent.putExtras(bundle)
+ })
+ }
"NEVENT" -> { // nuke events
nukeEvents()
showToast(context, "Nuked all events")
diff --git a/app/src/main/res/drawable/garbage.png b/app/src/main/res/drawable/garbage.png
new file mode 100644
index 0000000..27017f3
Binary files /dev/null and b/app/src/main/res/drawable/garbage.png differ
diff --git a/app/src/main/res/drawable/man.png b/app/src/main/res/drawable/man.png
new file mode 100644
index 0000000..713c2af
Binary files /dev/null and b/app/src/main/res/drawable/man.png differ
diff --git a/app/src/main/res/layout/activity_image.xml b/app/src/main/res/layout/activity_image.xml
new file mode 100644
index 0000000..863de3c
--- /dev/null
+++ b/app/src/main/res/layout/activity_image.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_canteen.xml b/app/src/main/res/layout/fragment_canteen.xml
index 202005d..4c9ab76 100644
--- a/app/src/main/res/layout/fragment_canteen.xml
+++ b/app/src/main/res/layout/fragment_canteen.xml
@@ -104,6 +104,9 @@
android:id="@+id/chip_pref_fair"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ app:chipIcon="@drawable/handshake"
+ app:chipIconEnabled="true"
+ app:chipIconTint="?attr/colorText"
android:text="@string/pref_fair"/>
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index cadce76..7f27273 100644
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -1,471 +1,480 @@
-
+ android:orientation="vertical">
-
-
-
+ android:layout_height="wrap_content"
+ android:fitsSystemWindows="true">
+ android:layout_marginTop="16dp"
+ android:fontFamily="@font/lato_bolditalic"
+ android:text="@string/title_settings"
+ android:textSize="32sp" />
-
+
-
-
+
+
+ android:orientation="vertical">
-
+
+ android:layout_marginHorizontal="8dp"
+ android:layout_marginVertical="4dp">
-
-
-
-
-
+ android:paddingBottom="8dp">
+ android:text="@string/settings_schedule"
+ android:textSize="22sp" />
-
-
-
-
-
-
+ android:layout_marginHorizontal="16dp" />
+
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp">
+ android:text="@string/refresh_schedule_title"
+ android:textSize="16sp" />
+ android:text="@string/refresh_schedule_subtitle"
+ android:textSize="16sp" />
-
+
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp">
-
+
-
+
-
+
-
-
+
-
+
+
+
+
+
+
+
+
+
+ android:layout_marginHorizontal="8dp"
+ android:layout_marginVertical="4dp">
-
-
-
+ android:orientation="vertical"
+ android:paddingBottom="8dp">
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_marginHorizontal="16dp"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="8dp"
+ android:fontFamily="@font/lato_bolditalic"
+ android:text="@string/settings_canteen"
+ android:textSize="22sp" />
-
-
-
-
-
-
+ android:layout_marginHorizontal="16dp" />
-
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
-
+
-
+
-
+
-
-
-
-
-
-
-
-
+
+ android:layout_marginHorizontal="8dp"
+ android:layout_marginVertical="4dp">
-
-
-
+ android:orientation="vertical"
+ android:paddingBottom="8dp">
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp">
+ android:text="@string/settings_data_title"
+ android:textSize="16sp" />
+ android:text="@string/settings_data_subtitle"
+ android:textSize="16sp" />
-
-
-
-
-
-
-
+
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp">
+ android:text="@string/settings_licences_title"
+ android:textSize="16sp" />
+ android:text="@string/settings_licences_subtitle"
+ android:textSize="16sp" />
-
+
+ android:background="?android:attr/selectableItemBackground"
+ android:clickable="true"
+ android:focusable="true"
+ android:orientation="vertical"
+ android:paddingHorizontal="16dp"
+ android:paddingVertical="8dp">
-
+
-
-
+
-
-
-
+
-
-
+
-
+
-
+
-
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_event.xml b/app/src/main/res/layout/item_event.xml
index 68d48e9..6e3a42e 100644
--- a/app/src/main/res/layout/item_event.xml
+++ b/app/src/main/res/layout/item_event.xml
@@ -1,5 +1,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 5a71dc6..de935e6 100644
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -32,7 +32,7 @@
- @color/md_theme_dark_onSurfaceVariant
- @color/md_theme_dark_onSurfaceVariant
- - @color/md_theme_dark_onSurfaceVariant
+ - @color/md_theme_dark_primary
- @color/md_theme_dark_outlineVariant
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 100aa2c..9a69859 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -30,7 +30,7 @@
- @color/md_theme_light_onSurfaceVariant
- @color/md_theme_light_onSurfaceVariant
- - @color/md_theme_light_onSurfaceVariant
+ - @color/md_theme_light_primary
- @color/md_theme_light_outlineVariant
- @color/md_theme_light_error
diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml
new file mode 100644
index 0000000..d94d268
--- /dev/null
+++ b/app/src/main/res/xml/locales_config.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file