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
import java.util.*
import java.util.concurrent.TimeUnit
class MainActivity : AppCompatActivity() {
private var isCancelled = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 60 seconds (1 minute)
val minute:Long = 1000 * 60 // 1000 milliseconds = 1 second
// 1 day 2 hours 35 minutes 50 seconds
val millisInFuture:Long = (minute * 1440) + (minute * 155) + (1000 * 50)
// Count down interval 1 second
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
isCancelled = false
}
// Count down timer stop/cancel button
button_stop.setOnClickListener{
// Start the timer
isCancelled = true
it.isEnabled = false
button_start.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 = timeString(millisUntilFinished)
if (isCancelled){
text_view.text = "${text_view.text}\nStopped.(Cancelled)"
cancel()
}else{
text_view.text = timeRemaining
}
}
override fun onFinish() {
text_view.text = "Done"
button_start.isEnabled = true
button_stop.isEnabled = false
}
}
}
// Method to get days hours minutes seconds from milliseconds
private fun timeString(millisUntilFinished:Long):String{
var millisUntilFinished:Long = millisUntilFinished
val days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished)
millisUntilFinished -= TimeUnit.DAYS.toMillis(days)
val hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished)
millisUntilFinished -= TimeUnit.HOURS.toMillis(hours)
val minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)
millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes)
val seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)
// Format the string
return String.format(
Locale.getDefault(),
"%02d day: %02d hour: %02d min: %02d sec",
days,hours, minutes,seconds
)
}
}
// 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="#dbf2f9"
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"
/>
</LinearLayout>
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#224889"
android:layout_gravity="center_horizontal"
android:textSize="25sp"
android:layout_marginTop="30dp"
android:gravity="center"
android:textStyle="bold"
/>
</LinearLayout>