MainActivity.kt
package com.cfsuman.kotlinexamples
import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import android.os.CountDownTimer
class MainActivity : AppCompatActivity() {
private var isPaused = false
private var isCancelled = false
private var resumeFromMillis:Long = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val millisInFuture:Long = 50000
val countDownInterval:Long = 1000
// Count down timer start button
button_start.setOnClickListener{
// Start the timer
timer(millisInFuture,countDownInterval).start()
it.isEnabled = false
button_stop.isEnabled = true
button_pause.isEnabled = true
isCancelled = false
isPaused = false
}
// Count down timer stop/cancel button
button_stop.setOnClickListener{
// Start the timer
isCancelled = true
isPaused = false
it.isEnabled = false
button_start.isEnabled = true
button_pause.isEnabled = false
}
// Count down timer pause button
button_pause.setOnClickListener{
isPaused = true
isCancelled = false
it.isEnabled = false
button_start.isEnabled = false
button_stop.isEnabled = false
button_resume.isEnabled = true
}
// Count down timer resume button
button_resume.setOnClickListener{
// Resume the timer
timer(resumeFromMillis,countDownInterval).start()
isPaused = false
isCancelled = false
it.isEnabled = false
button_pause.isEnabled = true
button_start.isEnabled = false
button_stop.isEnabled = true
}
}
// Method to configure and return an instance of CountDownTimer object
private fun timer(millisInFuture:Long,countDownInterval:Long):CountDownTimer{
return object: CountDownTimer(millisInFuture,countDownInterval){
override fun onTick(millisUntilFinished: Long){
val timeRemaining = "Seconds remaining\n${millisUntilFinished/1000}"
if (isPaused){
text_view.text = "${text_view.text}\nPaused"
// To ensure start timer from paused time
resumeFromMillis = millisUntilFinished
cancel()
}else if (isCancelled){
text_view.text = "${text_view.text}\nStopped.(Cancelled)"
cancel()
}else{
text_view.text = timeRemaining
}
}
override fun onFinish() {
text_view.text = "Done"
}
}
}
}
// Extension function to show toast message
fun Context.toast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root_layout"
android:background="#b8d7bf"
android:padding="16dp"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
>
<Button
android:id="@+id/button_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
/>
<Button
android:id="@+id/button_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop(Cancel)"
android:enabled="false"
/>
<Button
android:id="@+id/button_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pause"
android:enabled="false"
/>
<Button
android:id="@+id/button_resume"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Resume"
android:enabled="false"
/>
</LinearLayout>
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff0011"
android:layout_gravity="center_horizontal"
android:textSize="25sp"
android:layout_margin="25dp"
android:gravity="center"
/>
</LinearLayout>