From 335c1d13af9762b7c37160a341b6b8b88786544e Mon Sep 17 00:00:00 2001 From: Moritz Warning Date: Mon, 29 Sep 2025 03:31:16 +0200 Subject: [PATCH] add signature setting For multiple users it helps to keep track about who did what. --- .../lunatracker/MainActivity.kt | 32 +++++++++++++------ .../lunatracker/SettingsActivity.kt | 6 ++++ .../lunatracker/entities/LunaEvent.kt | 12 +++++-- .../repository/LocalSettingsRepository.kt | 9 ++++++ app/src/main/res/layout/activity_settings.xml | 22 +++++++++++++ .../main/res/layout/dialog_event_detail.xml | 21 ++++++++++++ app/src/main/res/values/strings.xml | 3 ++ 7 files changed, 94 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt b/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt index c853d40..c8b3817 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/MainActivity.kt @@ -13,6 +13,7 @@ import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.EditText +import android.widget.LinearLayout import android.widget.NumberPicker import android.widget.PopupWindow import android.widget.Spinner @@ -57,6 +58,7 @@ class MainActivity : AppCompatActivity() { lateinit var buttonsContainer: ViewGroup lateinit var recyclerView: RecyclerView lateinit var handler: Handler + var signature = "" var savingEvent = false val updateListRunnable: Runnable = Runnable { if (logbook != null && !pauseLogbookUpdate) @@ -168,6 +170,8 @@ class MainActivity : AppCompatActivity() { logbookRepo = FileLogbookRepository() } + signature = settingsRepository.loadSignature() + val noBreastfeeding = settingsRepository.loadNoBreastfeeding() findViewById(R.id.layout_nipples).visibility = when (noBreastfeeding) { true -> View.GONE @@ -207,7 +211,7 @@ class MainActivity : AppCompatActivity() { numberPicker.wrapSelectorWheel = false numberPicker.value = localSettings.loadBabyBottleContent() d.setPositiveButton(android.R.string.ok) { dialogInterface, i -> - logEvent(LunaEvent(LunaEvent.TYPE_BABY_BOTTLE, numberPicker.value * 10)) + logEvent(LunaEvent(LunaEvent.TYPE_BABY_BOTTLE, signature, numberPicker.value * 10)) localSettings.saveBabyBottleContent(numberPicker.value) } d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() } @@ -226,7 +230,7 @@ class MainActivity : AppCompatActivity() { d.setPositiveButton(android.R.string.ok) { dialogInterface, i -> val weight = weightET.text.toString().toIntOrNull() if (weight != null) - logEvent(LunaEvent(LunaEvent.TYPE_WEIGHT, weight)) + logEvent(LunaEvent(LunaEvent.TYPE_WEIGHT, signature, weight)) else Toast.makeText(this, R.string.toast_integer_error, Toast.LENGTH_SHORT).show() } @@ -252,7 +256,7 @@ class MainActivity : AppCompatActivity() { tempSlider.addOnChangeListener({s, v, b -> tempTextView.text = v.toString()}) d.setPositiveButton(android.R.string.ok) { dialogInterface, i -> val temperature = (tempSlider.value * 10).toInt() // In tenth of a grade - logEvent(LunaEvent(LunaEvent.TYPE_TEMPERATURE, temperature)) + logEvent(LunaEvent(LunaEvent.TYPE_TEMPERATURE, signature, temperature)) } d.setNegativeButton(android.R.string.cancel) { dialogInterface, i -> dialogInterface.dismiss() } val alertDialog = d.create() @@ -386,6 +390,14 @@ class MainActivity : AppCompatActivity() { pauseLogbookUpdate = false }) + // show optional signature + dialogView.findViewById(R.id.dialog_event_detail_type_signature).text = event.signature + dialogView.findViewById(R.id.dialog_event_signature_layout).visibility = if (event.signature.isNotEmpty()) { + View.VISIBLE + } else { + View.GONE + } + // create next/previous links to events of the same type val previousTextView = dialogView.findViewById(R.id.dialog_event_previous) @@ -769,15 +781,15 @@ class MainActivity : AppCompatActivity() { val inflater = LayoutInflater.from(anchor.context) contentView = inflater.inflate(R.layout.more_events_popup, null) contentView.findViewById(R.id.button_medicine).setOnClickListener { - askNotes(LunaEvent(LunaEvent.TYPE_MEDICINE)) + askNotes(LunaEvent(LunaEvent.TYPE_MEDICINE, signature)) dismiss() } contentView.findViewById(R.id.button_enema).setOnClickListener({ - logEvent(LunaEvent(LunaEvent.TYPE_ENEMA)) + logEvent(LunaEvent(LunaEvent.TYPE_ENEMA, signature)) dismiss() }) contentView.findViewById(R.id.button_note).setOnClickListener({ - askNotes(LunaEvent(LunaEvent.TYPE_NOTE)) + askNotes(LunaEvent(LunaEvent.TYPE_NOTE, signature)) dismiss() }) contentView.findViewById(R.id.button_temperature).setOnClickListener({ @@ -785,12 +797,14 @@ class MainActivity : AppCompatActivity() { dismiss() }) contentView.findViewById(R.id.button_puke).setOnClickListener({ - askNotes(LunaEvent(LunaEvent.TYPE_PUKE)) + logEvent( + LunaEvent(LunaEvent.TYPE_PUKE, signature) + ) dismiss() }) contentView.findViewById(R.id.button_colic).setOnClickListener({ logEvent( - LunaEvent(LunaEvent.TYPE_COLIC) + LunaEvent(LunaEvent.TYPE_COLIC, signature) ) dismiss() }) @@ -800,7 +814,7 @@ class MainActivity : AppCompatActivity() { }) contentView.findViewById(R.id.button_bath).setOnClickListener({ logEvent( - LunaEvent(LunaEvent.TYPE_BATH) + LunaEvent(LunaEvent.TYPE_BATH, signature) ) dismiss() }) diff --git a/app/src/main/java/it/danieleverducci/lunatracker/SettingsActivity.kt b/app/src/main/java/it/danieleverducci/lunatracker/SettingsActivity.kt index 7d03b4e..8006986 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/SettingsActivity.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/SettingsActivity.kt @@ -2,6 +2,7 @@ package it.danieleverducci.lunatracker import android.os.Bundle import android.view.View +import android.widget.EditText import android.widget.RadioButton import android.widget.TextView import android.widget.Toast @@ -24,6 +25,7 @@ open class SettingsActivity : AppCompatActivity() { protected lateinit var textViewWebDAVPass: TextView protected lateinit var progressIndicator: LinearProgressIndicator protected lateinit var switchNoBreastfeeding: SwitchMaterial + protected lateinit var textViewSignature: EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -36,6 +38,7 @@ open class SettingsActivity : AppCompatActivity() { textViewWebDAVPass = findViewById(R.id.settings_data_webdav_pass) progressIndicator = findViewById(R.id.progress_indicator) switchNoBreastfeeding = findViewById(R.id.switch_no_breastfeeding) + textViewSignature = findViewById(R.id.settings_signature) findViewById(R.id.settings_save).setOnClickListener({ validateAndSave() @@ -52,12 +55,14 @@ open class SettingsActivity : AppCompatActivity() { val dataRepo = settingsRepository.loadDataRepository() val webDavCredentials = settingsRepository.loadWebdavCredentials() val noBreastfeeding = settingsRepository.loadNoBreastfeeding() + val signature = settingsRepository.loadSignature() when (dataRepo) { LocalSettingsRepository.DATA_REPO.LOCAL_FILE -> radioDataLocal.isChecked = true LocalSettingsRepository.DATA_REPO.WEBDAV -> radioDataWebDAV.isChecked = true } + textViewSignature.setText(signature) switchNoBreastfeeding.isChecked = noBreastfeeding if (webDavCredentials != null) { @@ -156,6 +161,7 @@ open class SettingsActivity : AppCompatActivity() { else LocalSettingsRepository.DATA_REPO.LOCAL_FILE ) settingsRepository.saveNoBreastfeeding(switchNoBreastfeeding.isChecked) + settingsRepository.saveSignature(textViewSignature.text.toString()) settingsRepository.saveWebdavCredentials( textViewWebDAVUrl.text.toString(), textViewWebDAVUser.text.toString(), diff --git a/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt b/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt index f00f64a..0ffd6b6 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/entities/LunaEvent.kt @@ -55,6 +55,12 @@ class LunaEvent: Comparable { set(value) { jo.put("notes", value) } + var signature: String + get(): String = jo.optString("signature") + set(value) { + if (value.isNotEmpty()) + jo.put("signature", value) + } constructor(jo: JSONObject) { this.jo = jo @@ -63,16 +69,18 @@ class LunaEvent: Comparable { throw IllegalArgumentException("JSONObject is not a LunaEvent") } - constructor(type: String) { + constructor(type: String, signature: String) { this.jo = JSONObject() this.time = System.currentTimeMillis() / 1000 + this.signature = signature this.type = type } - constructor(type: String, quantity: Int) { + constructor(type: String, signature: String, quantity: Int) { this.jo = JSONObject() this.time = System.currentTimeMillis() / 1000 this.type = type + this.signature = signature this.quantity = quantity } diff --git a/app/src/main/java/it/danieleverducci/lunatracker/repository/LocalSettingsRepository.kt b/app/src/main/java/it/danieleverducci/lunatracker/repository/LocalSettingsRepository.kt index 577d8f5..1462820 100644 --- a/app/src/main/java/it/danieleverducci/lunatracker/repository/LocalSettingsRepository.kt +++ b/app/src/main/java/it/danieleverducci/lunatracker/repository/LocalSettingsRepository.kt @@ -14,6 +14,7 @@ class LocalSettingsRepository(val context: Context) { const val SHARED_PREFS_DAV_USER = "webdav_user" const val SHARED_PREFS_DAV_PASS = "webdav_password" const val SHARED_PREFS_NO_BREASTFEEDING = "no_breastfeeding" + const val SHARED_PREFS_SIGNATURE = "signature" } enum class DATA_REPO {LOCAL_FILE, WEBDAV} val sharedPreferences: SharedPreferences @@ -30,6 +31,14 @@ class LocalSettingsRepository(val context: Context) { return sharedPreferences.getInt(SHARED_PREFS_BB_CONTENT, 1) } + fun saveSignature(content: String) { + sharedPreferences.edit { putString(SHARED_PREFS_SIGNATURE, content) } + } + + fun loadSignature(): String { + return sharedPreferences.getString(SHARED_PREFS_SIGNATURE, "") ?: "" + } + fun saveNoBreastfeeding(content: Boolean) { sharedPreferences.edit { putBoolean(SHARED_PREFS_NO_BREASTFEEDING, content) } } diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index a4cfb2d..4e84cbb 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -119,6 +119,28 @@ android:visibility="invisible"/> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9240807..60b8177 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,6 +78,8 @@ Retry Settings + Signature + Attach a signature to each event your create and for others to see. Useful if multiple people add events. Choose where to save data On device Most privacy-friendly solution: data doesn\'t leave your device @@ -129,6 +131,7 @@ Delete Quantity Notes + Created By Add logbook 👶 Logbook name