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"> + +