diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml
new file mode 100644
index 0000000..4a53bee
--- /dev/null
+++ b/.idea/AndroidProjectSystem.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..b86273d
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..639c779
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..c224ad5
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/migrations.xml b/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..02a7102
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000..16660f1
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt b/app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt
new file mode 100644
index 0000000..4010377
--- /dev/null
+++ b/app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt
@@ -0,0 +1,3 @@
+package com.example.bcsd_android_2025_1
+
+data class ListData(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..87bf46d 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
@@ -1,14 +1,96 @@
package com.example.bcsd_android_2025_1
import android.os.Bundle
-import androidx.activity.enableEdgeToEdge
+import android.os.SystemClock
+import android.widget.Button
+import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
-import androidx.core.view.ViewCompat
-import androidx.core.view.WindowInsetsCompat
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.lifecycle.lifecycleScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
+ private lateinit var timeTextView: TextView
+ private lateinit var startPauseButton:Button
+ private lateinit var stopButton:Button
+ private lateinit var lapButton:Button
+ private lateinit var recyclerViewAdapter: RecyclerViewAdapter
+ private lateinit var recyclerView:RecyclerView
+
+ private var isRunning = false
+ private var startTime = 0L
+ private var pauseOffset = 0L
+ private var timerJob: Job? = null
+
+
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
+
+ timeTextView = findViewById(R.id.time_textview)
+ startPauseButton = findViewById(R.id.start_pause_toggle_button)
+ stopButton = findViewById(R.id.stop_button)
+ lapButton = findViewById(R.id.lap_button)
+ recyclerView = findViewById(R.id.recycler_view)
+ recyclerViewAdapter = RecyclerViewAdapter()
+ recyclerView.adapter = recyclerViewAdapter
+ recyclerView.layoutManager = LinearLayoutManager(this)
+
+ startPauseButton.setOnClickListener {
+ if(!isRunning){
+ startPauseButton.text = getString(R.string.pause_text)
+ startTime = SystemClock.elapsedRealtime() - pauseOffset
+ startTimer()
+ isRunning=true
+ }else{
+ startPauseButton.text=getString(R.string.start_text)
+ pauseOffset = SystemClock.elapsedRealtime() - startTime
+ stopTimer()
+ isRunning=false
+ }
+ }
+
+ stopButton.setOnClickListener {
+ stopTimer()
+ timeTextView.text = getString(R.string.default_time_text)
+ startPauseButton.text = getString(R.string.start_text)
+ isRunning = false
+ pauseOffset = 0L
+ recyclerViewAdapter.removeAllItems()
+ }
+
+ lapButton.setOnClickListener {
+ if(isRunning){
+ val elapsed = SystemClock.elapsedRealtime() - startTime
+ val min = (elapsed / 1000) / 60
+ val sec = (elapsed / 1000) % 60
+ val mil = (elapsed % 1000) / 10
+ val nowTime = getString(R.string.time_text, min, sec, mil)
+
+ recyclerViewAdapter.addLapItem(nowTime)
+ recyclerView.scrollToPosition(0)
+ }
+ }
+ }
+
+ private fun startTimer(){
+ timerJob = lifecycleScope.launch{
+ while(true){
+ val elapsed = SystemClock.elapsedRealtime()-startTime
+ val min = (elapsed/1000)/60
+ val sec = (elapsed/1000)%60
+ val mil = (elapsed%1000)/10
+ timeTextView.text = getString(R.string.time_text, min, sec, mil)
+ delay(10L)
+ }
+ }
+ }
+
+ private fun stopTimer(){
+ timerJob?.cancel()
+ timerJob = null
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt b/app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt
new file mode 100644
index 0000000..2e829f8
--- /dev/null
+++ b/app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt
@@ -0,0 +1,42 @@
+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 RecyclerViewAdapter:RecyclerView.Adapter(){
+ private val items = mutableListOf()
+
+ inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ private val lapItemTextView: TextView = view.findViewById(R.id.lap_item_textview)
+
+ fun bind(item: ListData) {
+ lapItemTextView.text = item.time
+ }
+ }
+
+ fun addLapItem(time:String){
+ items.add(0, ListData(time))
+ notifyItemInserted(0)
+ }
+
+ fun removeAllItems(){
+ items.clear()
+ notifyDataSetChanged()
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val inflatedView = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview, parent, false)
+ return ViewHolder(inflatedView)
+ }
+
+ override fun getItemCount(): Int{
+ return items.size
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.bind(items[position])
+ }
+}
\ 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..9ea7123 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -8,12 +8,59 @@
tools:context=".MainActivity">
+
+
+
+
+
+
+
+
+ app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+ tools:listitem="@layout/item_recyclerview"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_recyclerview.xml b/app/src/main/res/layout/item_recyclerview.xml
new file mode 100644
index 0000000..58a43dc
--- /dev/null
+++ b/app/src/main/res/layout/item_recyclerview.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ 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 c6c4daf..07c8b45 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,9 @@
BCSD_Android_2025-1
+ START
+ PAUSE
+ STOP
+ LAP
+ 00:00:00
+ %02d:%02d:%02d
\ No newline at end of file