MainActivity.kt
package com.cfsuman.kotlintutorials
import android.app.Activity
import android.content.Context
import android.media.MediaPlayer
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.*
class MainActivity : Activity() {
private lateinit var player: MediaPlayer
private lateinit var runnable:Runnable
private var handler: Handler = Handler(Looper.getMainLooper())
lateinit var seekBar:SeekBar
lateinit var tvPass:TextView
lateinit var tvDue:TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// get the widgets reference from XML layout
val buttonStart = findViewById<Button>(R.id.buttonStart)
val buttonStop = findViewById<Button>(R.id.buttonStop)
seekBar = findViewById(R.id.seekBar)
val tvDuration = findViewById<TextView>(R.id.tvDuration)
tvPass = findViewById(R.id.tvPass)
tvDue = findViewById(R.id.tvDue)
// Start the media player
buttonStart.setOnClickListener{
player = MediaPlayer.create(
applicationContext,
R.raw.test_sound
)
player.start()
tvDuration.text = "${player.seconds} sec"
initializeSeekBar()
it.isEnabled = false
buttonStop.isEnabled = true
player.setOnCompletionListener {
buttonStop.isEnabled = false
buttonStart.isEnabled = true
toast("end")
}
}
// Stop the media player
buttonStop.setOnClickListener{
if(player.isPlaying){
player.stop()
player.reset()
player.release()
handler.removeCallbacks(runnable)
it.isEnabled = false
buttonStart.isEnabled = true
}
}
// Seek bar change listener
seekBar.setOnSeekBarChangeListener(
object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(
seekBar: SeekBar, i: Int, b: Boolean) {
if (b) {
player.seekTo(i * 1000)
}
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
}
})
}
// Method to initialize seek bar and audio stats
private fun initializeSeekBar() {
seekBar.max = player.seconds
runnable = Runnable {
seekBar.progress = player.currentSeconds
tvPass.text = "${player.currentSeconds} sec"
val diff = player.seconds - player.currentSeconds
tvDue.text = "$diff sec"
handler.postDelayed(runnable, 1000)
}
handler.postDelayed(runnable, 1000)
}
}
// Extension property to get
// media player duration in seconds
val MediaPlayer.seconds:Int
get() {
return this.duration / 1000
}
// Extension property to get
// media player current position in seconds
val MediaPlayer.currentSeconds:Int
get() {
return this.currentPosition/1000
}
// Extension function to show toast message quickly
fun Context.toast(message:String){
Toast.makeText(this,message,Toast.LENGTH_SHORT).show()
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#DCDCDC"
android:padding="24dp">
<TextView
android:id="@+id/tvDuration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toTopOf="@+id/seekBar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="Duration" />
<TextView
android:id="@+id/tvDue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
app:layout_constraintBottom_toTopOf="@+id/seekBar"
app:layout_constraintEnd_toEndOf="@+id/seekBar"
tools:text="Due" />
<TextView
android:id="@+id/tvPass"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toTopOf="@+id/seekBar"
app:layout_constraintStart_toStartOf="@+id/seekBar"
tools:text="Pass" />
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:saveEnabled="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Start"
app:layout_constraintEnd_toStartOf="@+id/buttonStop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/seekBar" />
<Button
android:id="@+id/buttonStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stop"
app:layout_constraintBottom_toBottomOf="@+id/buttonStart"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/buttonStart" />
</androidx.constraintlayout.widget.ConstraintLayout>