package im.actor.sdk.controllers.calls.view; import android.content.Context; import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import im.actor.sdk.R; import im.actor.sdk.core.audio.AndroidPlayerActor; import im.actor.sdk.core.audio.AudioPlayerActor; public class AudioActorEx extends AndroidPlayerActor { Context context; public AudioActorEx(Context context, AudioPlayerActor.AudioPlayerCallback callback) { super(context, callback); this.context = context; } private static final int STATE_NONE = 0; private static final int STATE_STARTED = 1; private static final int STATE_PAUSED = 2; @Override protected void onPlayMessage(String fileName) { currentFileName = fileName; destroyPlayer(); state = STATE_NONE; try { if (mplayer == null) { mplayer = new MediaPlayer(); } mplayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); mplayer.setDataSource(context, Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.tone)); mplayer.prepare(); mplayer.start(); mplayer.setOnCompletionListener(mp -> self().send(new Play(""))); mplayer.setOnErrorListener((mp, what, extra) -> { self().send(new Error()); return false; }); } catch (Exception e) { e.printStackTrace(); destroyPlayer(); callback.onError(currentFileName); return; } callback.onStart(currentFileName); schedule(new Notify(), 500); state = STATE_STARTED; } private void destroyPlayer() { if (mplayer != null) { mplayer.stop(); mplayer.reset(); mplayer.release(); mplayer = null; } } }