package com.massive import android.app.Service import android.media.MediaPlayer.OnPreparedListener import android.media.MediaPlayer import android.os.Vibrator import androidx.annotation.RequiresApi import android.content.Intent import android.media.AudioAttributes import android.net.Uri import android.os.Build import android.os.VibrationEffect import android.os.IBinder class AlarmService : Service(), OnPreparedListener { var mediaPlayer: MediaPlayer? = null private var vibrator: Vibrator? = null @RequiresApi(api = Build.VERSION_CODES.O) override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { if (intent.action == "stop") { onDestroy() return START_STICKY } val sound = intent.extras?.getString("sound") if (sound == null) { mediaPlayer = MediaPlayer.create(applicationContext, R.raw.argon) mediaPlayer?.start() mediaPlayer?.setOnCompletionListener { vibrator?.cancel() } } else { mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, Uri.parse(sound)) prepare() start() setOnCompletionListener { vibrator?.cancel() } } } val pattern = longArrayOf(0, 300, 1300, 300, 1300, 300) vibrator = applicationContext.getSystemService(VIBRATOR_SERVICE) as Vibrator val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_ALARM) .build() val vibrate = intent.extras!!.getBoolean("vibrate") if (vibrate) vibrator!!.vibrate(VibrationEffect.createWaveform(pattern, 1), audioAttributes) return START_STICKY } override fun onBind(intent: Intent): IBinder? { return null } override fun onPrepared(player: MediaPlayer) { player.start() } override fun onDestroy() { super.onDestroy() mediaPlayer?.stop() mediaPlayer?.release() vibrator?.cancel() } }