Monday, May 14, 2018

android kotlin - Get alarm, ringtone, notification sound list

MainActivity.kt

package com.cfsuman.test

import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.provider.MediaStore
import android.widget.ArrayAdapter
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity() {

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

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

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

        // Get the ringtone sound list
        button_ringtone.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)
        list_view.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
    if (cursor!= null && cursor.moveToFirst()){
        val id:Int = cursor.getColumnIndex(MediaStore.Audio.Media._ID)
        val title:Int = cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)

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

            // Add the current audio/sound to the list
            list.add(Sound(audioId,audioTitle))
        }while (cursor.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"?>
<LinearLayout
    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"
    tools:context="com.cfsuman.test.MainActivity"
    android:orientation="vertical"
    android:padding="16dp"
    android:background="#ffd0eb"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <Button
            android:id="@+id/button_alarm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Alarms"
            />
        <Button
            android:id="@+id/button_notification"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Notifications"
            />
        <Button
            android:id="@+id/button_ringtone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Ringtones"
            />
    </LinearLayout>
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>