I then converted the wakelock dance to coroutine f...
# codereview
u
I then converted the wakelock dance to coroutine for better readability (and again for exercise):
Copy code
package de.musoft.elch.media

import android.content.Context
import android.media.AudioManager
import android.media.MediaPlayer
import android.os.PowerManager
import de.musoft.elch.app.R
import de.musoft.elch.extensions.powerManager
import de.musoft.elch.extensions.uriForRessource
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.launch
import kotlin.coroutines.experimental.suspendCoroutine

/**
 * Created by luckas on 15.09.16.
 */

private const val volume = 1.0f

suspend fun MediaPlayer.prepareSuspending(): Unit =
        suspendCoroutine<Unit> { cont ->
            try {
                setOnPreparedListener {
                    cont.resume(Unit)
                }
                prepareAsync()
            } catch (t: Throwable) {
                cont.resumeWithException(t)
            }
        }

fun ring(context: Context) {
    val uri = context.uriForRessource(R.raw.ring)
    val mediaPlayer = MediaPlayer()
    val pm = context.powerManager
    val wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AlarmHandover")

    mediaPlayer.setOnCompletionListener { it.release() }
    mediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK)
    mediaPlayer.setDataSource(context, uri)
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM)
    mediaPlayer.setVolume(volume, volume)
    launch(UI) {
        wakeLock.acquire()
        try {
            mediaPlayer.prepareSuspending()
            mediaPlayer.start()
        } finally {
            wakeLock.release()
        }
    }
}
Does that make sense to you guys? Do you think I am safe with regards to wakelocks?