diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/LapAdapter.kt b/app/src/main/java/com/example/bcsd_android_2025_1/LapAdapter.kt new file mode 100644 index 0000000..a9b639f --- /dev/null +++ b/app/src/main/java/com/example/bcsd_android_2025_1/LapAdapter.kt @@ -0,0 +1,41 @@ +package com.example.bcsd_android_2025_1 + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView + +class LapAdapter : RecyclerView.Adapter() { + + private val lapList = mutableListOf() + + inner class LapViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val lapTextView: TextView = itemView.findViewById(R.id.text_lap) + + fun bind(item: LapItem) { + lapTextView.text = item.time + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LapViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_lap, parent, false) + return LapViewHolder(view) + } + + override fun onBindViewHolder(holder: LapViewHolder, position: Int) { + holder.bind(lapList[position]) + } + + override fun getItemCount(): Int = lapList.size + + fun addLap(time: String) { + lapList.add(0, LapItem(time)) + notifyItemInserted(0) + } + + fun clear() { + lapList.clear() + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/LapItem.kt b/app/src/main/java/com/example/bcsd_android_2025_1/LapItem.kt new file mode 100644 index 0000000..a875ecc --- /dev/null +++ b/app/src/main/java/com/example/bcsd_android_2025_1/LapItem.kt @@ -0,0 +1,5 @@ +package com.example.bcsd_android_2025_1 + +data class LapItem( + val time: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt b/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt index 3ffa0eb..5a3baf5 100644 --- a/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt +++ b/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt @@ -5,10 +5,95 @@ import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import android.os.Handler +import android.os.Looper +import android.widget.Button +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { + + private lateinit var timerTextView: TextView + private lateinit var startPauseButton: Button + private lateinit var stopButton: Button + + private lateinit var lapButton: Button + private lateinit var lapRecyclerView: RecyclerView + private lateinit var lapAdapter: LapAdapter + + private var isRunning = false + private var startTime = 0L + private var pauseOffset = 0L + private val handler = Handler(Looper.getMainLooper()) + + + private val updateRunnable = object : Runnable { + override fun run() { + val elapsed = System.currentTimeMillis() - startTime + val minutes = (elapsed / 1000) / 60 + val seconds = (elapsed / 1000) % 60 + val milliseconds = (elapsed % 1000) / 10 + + val timeString = getString(R.string.formatted_timer, minutes, seconds, milliseconds) + timerTextView.text = timeString + + handler.postDelayed(this, 10) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + timerTextView = findViewById(R.id.timer_textview) + startPauseButton = findViewById(R.id.start_pause_button) + stopButton = findViewById(R.id.stop_button) + + val defaultTimeString = getString(R.string.default_timer_text) + + startPauseButton.setOnClickListener { + if (!isRunning) { + startTime = System.currentTimeMillis() - pauseOffset + handler.post(updateRunnable) + isRunning = true + startPauseButton.text = getString(R.string.button_pause) + } else { + pauseOffset = System.currentTimeMillis() - startTime + handler.removeCallbacks(updateRunnable) + isRunning = false + startPauseButton.text = getString(R.string.button_start) + } + } + + stopButton.setOnClickListener { + handler.removeCallbacks(updateRunnable) + isRunning = false + pauseOffset = 0L + timerTextView.text = getString(R.string.default_timer_text) + startPauseButton.text = getString(R.string.button_start) + lapAdapter.clear() + } + + lapButton = findViewById(R.id.lap_button) + lapRecyclerView = findViewById(R.id.lap_recyclerview) + lapAdapter = LapAdapter() + + lapRecyclerView.apply { + adapter = lapAdapter + layoutManager = LinearLayoutManager(this@MainActivity) + } + + lapButton.setOnClickListener { + if (isRunning) { + val elapsed = System.currentTimeMillis() - startTime + val minutes = (elapsed / 1000) / 60 + val seconds = (elapsed / 1000) % 60 + val milliseconds = (elapsed % 1000) / 10 + + val lapTime = getString(R.string.formatted_timer, minutes, seconds, milliseconds) + lapAdapter.addLap(lapTime) + lapRecyclerView.scrollToPosition(0) + } + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 311f3cb..48c4e96 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,15 +5,65 @@ android:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" + android:padding="16dp" tools:context=".MainActivity"> + +