Fixed ScheduleUpdateSheet.kt not updating and deleting events... somehow. Also implemented cheat codes hehe

This commit is contained in:
denizk0461
2023-04-26 18:36:32 +02:00
parent d80e85fdbe
commit 450ce92dca
10 changed files with 233 additions and 69 deletions
@@ -135,12 +135,32 @@ class AppRepository(app: Application) {
* Deletes all canteen offers from the database.
*/
fun nukeOffers() {
dao.nukeOfferItems()
dao.nukeOfferCategories()
dao.nukeOfferCanteens()
dao.nukeOfferDates()
nukeOfferItems()
nukeOfferCategories()
nukeOfferCanteens()
nukeOfferDates()
}
/**
* Deletes all canteen items from the database.
*/
fun nukeOfferItems() { dao.nukeOfferItems() }
/**
* Deletes all canteen categories from the database.
*/
fun nukeOfferCategories() { dao.nukeOfferCategories() }
/**
* Deletes all canteens from the database.
*/
fun nukeOfferCanteens() { dao.nukeOfferCanteens() }
/**
* Deletes all canteen dates from the database.
*/
fun nukeOfferDates() { dao.nukeOfferDates() }
/**
* Inserts a date into the database.
*
@@ -107,7 +107,14 @@ class SettingsFragment : AppFragment() {
// Set long click listener for licences button to open dev code sheet
binding.buttonLicences.setOnLongClickListener {
openBottomSheet(DevCodeSheet())
openBottomSheet(DevCodeSheet(
viewModel::nukeEvents,
viewModel::nukeOfferItems,
viewModel::nukeOfferCategories,
viewModel::nukeOfferCanteens,
viewModel::nukeOfferDates,
viewModel::nukeEverything,
))
true
}
@@ -1,10 +1,130 @@
package com.denizk0461.studip.sheet
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Base64
import android.view.View
import android.widget.Toast
import com.denizk0461.studip.R
import com.denizk0461.studip.data.viewBinding
import com.denizk0461.studip.databinding.SheetDevCodeBinding
import java.nio.charset.StandardCharsets
/**
* Sheet that presents the user / developer with a text field to input developer codes / cheat
* codes.
*
* @param nukeEvents deletes all events
* @param nukeOfferItems deletes all canteen items
* @param nukeOfferCategories deletes all canteen categories
* @param nukeOfferCanteens deletes all canteens
* @param nukeOfferDates deletes all canteen dates
* @param nukeEverything deletes everything
*/
class DevCodeSheet : AppSheet(R.layout.sheet_dev_code) {
class DevCodeSheet(
private val nukeEvents: () -> Unit,
private val nukeOfferItems: () -> Unit,
private val nukeOfferCategories: () -> Unit,
private val nukeOfferCanteens: () -> Unit,
private val nukeOfferDates: () -> Unit,
private val nukeEverything: () -> Unit,
) : AppSheet(R.layout.sheet_dev_code) {
// View binding
private val binding: SheetDevCodeBinding by viewBinding(SheetDevCodeBinding::bind)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Execute an action based on the input
binding.buttonConfirm.setOnClickListener {
/*
* Codes are implemented here.
*
* About the inks; they are safe (which is suspicious of me to say), just encoded so
* people can't just look at the file and figure out all the codes! Of course, they're
* easily decoded, but who would go for that? You would have to be a pretty big nerd to
* do that. Then again, I was the one who encoded all of these links in the first place,
* so I suppose the joke's on me...
*
* If you're reading this why?
*/
when (binding.input.text.toString().uppercase()) {
"U1RST0JF".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS90S2k5Wi1mNnFYNA==".d())
"U1BJUklU".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9XN25lMzlEU05TZw==".d())
"Q0xPVURT".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9rbUJ6YTRhNTB2dw==".d())
"NjQxODJL".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9EbTFyZ285UHBUcw==".d())
"U0FJTE9S".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9QUHlDYXZ6OG5NWQ==".d())
"SE9ORVNU".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS9DSEg0OE5LUEFraw==".d())
"QkJVT0s/".d() -> launchLink("aHR0cHM6Ly95b3V0dS5iZS90Rm1PMm1TY0tHNA==".d())
"NEVENT" -> { // nuke events
nukeEvents()
showToast("Nuked all events")
}
"NCANTE" -> { // nuke canteens
nukeOfferCanteens()
showToast("Nuked all canteens")
}
"NDATES" -> { // nuke dates
nukeOfferDates()
showToast("Nuked all dates")
}
"NCATEG" -> { // nuke categories
nukeOfferCategories()
showToast("Nuked all categories")
}
"NITEMS" -> { // nuke items
nukeOfferItems()
showToast("Nuked all items")
}
"NEVERY" -> { // nuke everything
nukeEverything()
showToast("Nuked everything")
}
else -> showToast("code is invalid")
}
dismiss()
}
}
/**
* Present the user with a toast.
*
* @param text text to display
*/
private fun showToast(text: String) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show()
}
/**
* Launches a web link.
*
* @param link link to open
*/
private fun launchLink(link: String) {
// Let the user know they accomplished something with their life
showToast("")
// Give the user a slight dopamine boost
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(link)))
}
/**
* Encodes a string to Base64.
*
* @return the encoded string
*/
private fun String.e(): String = Base64.encodeToString(this.toByteArray(), Base64.DEFAULT)
/**
* Decodes Base64 to a regular string.
*
* @return the decoded string
*/
private fun String.d(): String = String(
Base64.decode(this, Base64.DEFAULT),
StandardCharsets.UTF_8
)
}
@@ -1,6 +1,7 @@
package com.denizk0461.studip.sheet
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.fragment.app.FragmentActivity
import com.denizk0461.studip.R
@@ -104,8 +105,8 @@ class ScheduleUpdateSheet(
* @param isEventStart whether this timestamp is for the start of the course
*/
override fun onTimeSet(hours: Int, minutes: Int, isEventStart: Boolean) {
// Parse the separate ints into a timestamp string
val newTimestamp = "$hours:$minutes"
// Parse the separate ints into a timestamp string. Add a leading zero if necessary.
val newTimestamp = "$hours:${String.format("%02d", minutes)}"
// If start > end, show an error
if ((isEventStart && newTimestamp.parseToMinutes() > timeslotEnd.parseToMinutes()) ||
@@ -10,6 +10,44 @@ import com.denizk0461.studip.model.SettingsPreferences
*/
class SettingsViewModel(app: Application) : AppViewModel(app) {
/**
* Deletes everything from the database.
*/
fun nukeEverything() {
nukeEvents()
nukeOfferItems()
nukeOfferCategories()
nukeOfferCanteens()
nukeOfferDates()
}
/**
* Deletes all Stud.IP events from the database.
*/
fun nukeEvents() { doAsync { repo.nukeEvents() } }
/**
* Deletes all canteen items from the database.
*/
fun nukeOfferItems() { doAsync { repo.nukeOfferItems() } }
/**
* Deletes all canteen categories from the database.
*/
fun nukeOfferCategories() { doAsync { repo.nukeOfferCategories() } }
/**
* Deletes all canteens from the database.
*/
fun nukeOfferCanteens() { doAsync { repo.nukeOfferCanteens() } }
/**
* Deletes all canteen dates from the database.
*/
fun nukeOfferDates() { doAsync { repo.nukeOfferDates() } }
/**
* This value determines whether the user wants to have the next course in their schedule
* highlighted.