From 97b01437b28176f4b2d6266f2b8f18852359a55c Mon Sep 17 00:00:00 2001 From: kfj001 Date: Fri, 29 May 2026 20:30:41 -0700 Subject: [PATCH] bug fixes --- .../example/countdowntimer/MainActivity.kt | 37 +++++++++++++++++-- app/src/main/res/color/chip_duration_bg.xml | 4 +- .../main/res/color/chip_duration_stroke.xml | 5 +++ app/src/main/res/color/chip_duration_text.xml | 5 +++ app/src/main/res/layout/activity_main.xml | 21 ++++++++--- 5 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/color/chip_duration_stroke.xml create mode 100644 app/src/main/res/color/chip_duration_text.xml diff --git a/app/src/main/java/com/example/countdowntimer/MainActivity.kt b/app/src/main/java/com/example/countdowntimer/MainActivity.kt index 12f27dc..33a476f 100644 --- a/app/src/main/java/com/example/countdowntimer/MainActivity.kt +++ b/app/src/main/java/com/example/countdowntimer/MainActivity.kt @@ -3,6 +3,9 @@ package com.example.countdowntimer import android.content.Context import android.content.SharedPreferences import android.os.Bundle +import android.os.VibrationEffect +import android.os.Vibrator +import android.os.VibratorManager import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.Button @@ -21,7 +24,9 @@ class MainActivity : AppCompatActivity() { private lateinit var btnDurationLabel: Button private lateinit var hsvDurationOptions: View private lateinit var chipGroup: ChipGroup + private lateinit var vibrator: Vibrator private var selectedDuration: Long = DEFAULT_DURATION + private var lastSelectedChipId: Int = -1 private fun durationToChipId(duration: Long): Int = when (duration) { 5000L -> R.id.chip5s @@ -42,6 +47,16 @@ class MainActivity : AppCompatActivity() { btnDurationLabel.text = "${selectedDuration / 1000}s" } + private fun onChipClicked(chipId: Int) { + if (chipId == lastSelectedChipId) { + // Re-selection: provide feedback so user knows the selection is registered + vibrator.vibrate(VibrationEffect.createOneShot(15, VibrationEffect.DEFAULT_AMPLITUDE)) + val originalText = btnDurationLabel.text + btnDurationLabel.text = "${selectedDuration / 1000}s!" + btnDurationLabel.postDelayed({ btnDurationLabel.text = originalText }, 300) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) @@ -52,6 +67,8 @@ class MainActivity : AppCompatActivity() { btnDurationLabel = findViewById(R.id.btnDurationLabel) hsvDurationOptions = findViewById(R.id.hsvDurationOptions) chipGroup = findViewById(R.id.chipGroup) + val vibratorManager = getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager + vibrator = vibratorManager.defaultVibrator updateDurationLabel() @@ -72,15 +89,27 @@ class MainActivity : AppCompatActivity() { } } - chipGroup.setOnCheckedChangeListener { _, checkedId -> + chipGroup.setOnCheckedStateChangeListener { _, checkedIds -> + val checkedId = if (checkedIds.size > 0) checkedIds[0].toInt() else -1 if (checkedId != -1) { - selectedDuration = chipIdToDuration(checkedId) - prefs.edit().putLong(KEY_SELECTED_DURATION, selectedDuration).apply() - updateDurationLabel() + if (checkedId != lastSelectedChipId) { + // New selection: update duration, save, and refresh label + selectedDuration = chipIdToDuration(checkedId) + prefs.edit().putLong(KEY_SELECTED_DURATION, selectedDuration).apply() + updateDurationLabel() + lastSelectedChipId = checkedId + } + // Always close the panel on any selection hsvDurationOptions.visibility = View.GONE } } + // Set individual click listeners to detect re-selection + findViewById(R.id.chip5s).setOnClickListener { onChipClicked(R.id.chip5s) } + findViewById(R.id.chip10s).setOnClickListener { onChipClicked(R.id.chip10s) } + findViewById(R.id.chip15s).setOnClickListener { onChipClicked(R.id.chip15s) } + findViewById(R.id.chip30s).setOnClickListener { onChipClicked(R.id.chip30s) } + findViewById(R.id.btnStart).setOnClickListener { CountdownDialog(this, selectedDuration, prefs).show() } diff --git a/app/src/main/res/color/chip_duration_bg.xml b/app/src/main/res/color/chip_duration_bg.xml index bdc80ea..1f9170c 100644 --- a/app/src/main/res/color/chip_duration_bg.xml +++ b/app/src/main/res/color/chip_duration_bg.xml @@ -1,5 +1,5 @@ - - + + diff --git a/app/src/main/res/color/chip_duration_stroke.xml b/app/src/main/res/color/chip_duration_stroke.xml new file mode 100644 index 0000000..2c84eb9 --- /dev/null +++ b/app/src/main/res/color/chip_duration_stroke.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/color/chip_duration_text.xml b/app/src/main/res/color/chip_duration_text.xml new file mode 100644 index 0000000..3aedeb2 --- /dev/null +++ b/app/src/main/res/color/chip_duration_text.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e8f44fc..c739343 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -170,17 +170,22 @@ android:layout_height="wrap_content" android:minWidth="56dp" android:text="5s" - app:chipBackgroundColor="@color/chip_duration_bg" /> + app:chipBackgroundColor="@color/chip_duration_bg" + app:chipStrokeColor="@color/chip_duration_stroke" + app:chipStrokeWidth="2dp" + android:textColor="@color/chip_duration_text" /> + app:chipBackgroundColor="@color/chip_duration_bg" + app:chipStrokeColor="@color/chip_duration_stroke" + app:chipStrokeWidth="2dp" + android:textColor="@color/chip_duration_text" /> + app:chipBackgroundColor="@color/chip_duration_bg" + app:chipStrokeColor="@color/chip_duration_stroke" + app:chipStrokeWidth="2dp" + android:textColor="@color/chip_duration_text" /> + app:chipBackgroundColor="@color/chip_duration_bg" + app:chipStrokeColor="@color/chip_duration_stroke" + app:chipStrokeWidth="2dp" + android:textColor="@color/chip_duration_text" />