android kotlin - Get alarm, ringtone, notification sound list

MainActivity.kt

package com.cfsuman.kotlintutorials

import android.app.Activity
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.widget.*


class MainActivity : Activity() {
    lateinit var listView: ListView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // get the widgets reference from XML layout
        val buttonAlarm = findViewById<Button>(R.id.buttonAlarm)
        val buttonNotification = findViewById<Button>(R.id.buttonNotification)
        val buttonRingtone = findViewById<Button>(R.id.buttonRingtone)
        listView = findViewById<ListView>(R.id.listView)


        // Get the alarm sound list
        buttonAlarm.setOnClickListener{
            populateListView(sounds(MediaStore.Audio.Media.IS_ALARM))
        }


        // Get the notification sound list
        buttonNotification.setOnClickListener{
            populateListView(
                sounds(MediaStore.Audio.Media.IS_NOTIFICATION))
        }


        // Get the ringtone sound list
        buttonRingtone.setOnClickListener{
            populateListView(
                sounds(MediaStore.Audio.Media.IS_RINGTONE))
        }
    }


    // Display the specific sound list on list view
    private fun populateListView(list:MutableList<Sound>){
        // Get specific sound titles list
        val titles = mutableListOf<String>()
        for (music in list){titles.add(music.title)}

        // Display sound list on list view
        val adapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,titles
        )
        listView.adapter = adapter
    }
}



// Extension method to get all specific type audio/sound files list
fun Context.sounds(type:String):MutableList<Sound>{
    // Initialize an empty mutable list of sounds
    val list:MutableList<Sound> = mutableListOf()


    // Get the internal storage media store audio uri
    //val uri: Uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
    val uri: Uri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI


    // Non-zero if the audio file type match
    val selection = "$type != 0"


    // Sort the audio
    val sortOrder = MediaStore.Audio.Media.TITLE + " ASC"
    //val sortOrder = MediaStore.Audio.Media.TITLE + " DESC"


    // Query the storage for specific type audio files
    val cursor: Cursor? = this.contentResolver.query(
        uri, // Uri
        null, // Projection
        selection, // Selection
        null, // Selection arguments
        sortOrder // Sort order
    )


    // If query result is not empty
    cursor?.apply {
        if (this.moveToFirst()){
            val id:Int = this.getColumnIndex(
                MediaStore.Audio.Media._ID)
            val title:Int = this.getColumnIndex(
                MediaStore.Audio.Media.TITLE)

            // Now loop through the audio files
            do {
                val audioId:Long = this.getLong(id)
                val audioTitle:String = this.getString(title)

                // Add the current audio/sound to the list
                list.add(Sound(audioId,audioTitle))
            }while (this.moveToNext())
        }
    }


    // Finally, return the audio files list
    return  list
}



// Initialize a new data class to hold audio data
data class Sound(val id:Long, val title:String)
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">

    <Button
        android:id="@+id/buttonAlarm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Alarms"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/buttonNotification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:text="Notifications"
        app:layout_constraintBottom_toBottomOf="@+id/buttonAlarm"
        app:layout_constraintStart_toEndOf="@+id/buttonAlarm" />

    <Button
        android:id="@+id/buttonRingtone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:text="Ringtones"
        app:layout_constraintBottom_toBottomOf="@+id/buttonNotification"
        app:layout_constraintStart_toEndOf="@+id/buttonNotification" />

    <ListView
        android:id="@+id/listView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/buttonAlarm" />

</androidx.constraintlayout.widget.ConstraintLayout>