Play audio files.

This commit is contained in:
B. Petersen
2017-02-28 21:53:49 +01:00
parent 9ee5af9fd2
commit fffc77cc82
10 changed files with 36 additions and 103 deletions
@@ -72,13 +72,11 @@ import com.b44t.ui.ChatActivity;
import com.b44t.ui.PhotoViewer;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
@@ -320,7 +318,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
private ArrayList<MessageObject> shuffledPlaylist = new ArrayList<>();
private int currentPlaylistNum;
private boolean forceLoopCurrentPlaylist;
private boolean downloadingCurrentMessage;
private boolean playMusicAgain;
private AudioInfo audioInfo;
@@ -678,7 +675,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
@Override
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
if (isPlayingAudio(getPlayingMessageObject()) && !isAudioPaused()) {
if (isMessageOnAir(getPlayingMessageObject()) && !isAudioPaused()) {
pauseAudio(getPlayingMessageObject());
} else if (recordStartRunnable != null || recordingAudio != null) {
stopRecording(2);
@@ -703,7 +700,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
if (isPlayingAudio(getPlayingMessageObject()) && !isAudioPaused()) {
if (isMessageOnAir(getPlayingMessageObject()) && !isAudioPaused()) {
pauseAudio(getPlayingMessageObject());
}
hasAudioFocus = 0;
@@ -712,7 +709,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
audioFocus = AUDIO_FOCUSED;
if (resumeAudioOnFocusGain) {
resumeAudioOnFocusGain = false;
if (isPlayingAudio(getPlayingMessageObject()) && isAudioPaused()) {
if (isMessageOnAir(getPlayingMessageObject()) && isAudioPaused()) {
playAudio(getPlayingMessageObject());
}
}
@@ -720,7 +717,7 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
audioFocus = AUDIO_NO_FOCUS_CAN_DUCK;
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
audioFocus = AUDIO_NO_FOCUS_NO_DUCK;
if (isPlayingAudio(getPlayingMessageObject()) && !isAudioPaused()) {
if (isMessageOnAir(getPlayingMessageObject()) && !isAudioPaused()) {
pauseAudio(getPlayingMessageObject());
resumeAudioOnFocusGain = true;
}
@@ -1258,13 +1255,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
} else if (id == NotificationCenter.FileDidLoaded) {
listenerInProgress = true;
String fileName = (String) args[0];
if (downloadingCurrentMessage && playingMessageObject != null) {
String file = FileLoader.getAttachFileName(playingMessageObject.getDocument());
if (file.equals(fileName)) {
playMusicAgain = true;
playAudio(playingMessageObject);
}
}
ArrayList<MessageObject> messageObjects = loadingFileMessagesObservers.get(fileName);
if (messageObjects != null) {
for (int a = 0; a < messageObjects.size(); a++) {
@@ -1835,15 +1825,11 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
buffersWrited = 0;
isPaused = false;
if (playingMessageObject != null) {
if (downloadingCurrentMessage) {
FileLoader.getInstance().cancelLoadFile(playingMessageObject.getDocument());
}
MessageObject lastFile = playingMessageObject;
playingMessageObject.audioProgress = 0.0f;
playingMessageObject.audioProgressSec = 0;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioProgressDidChanged, playingMessageObject.getId(), 0);
playingMessageObject = null;
downloadingCurrentMessage = false;
if (notify) {
NotificationsController.getInstance().audioManager.abandonAudioFocus(this);
hasAudioFocus = 0;
@@ -2187,7 +2173,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
final File cacheFile = file != null ? file : FileLoader.getPathToMessage(messageObject.messageOwner);
if (cacheFile != null && cacheFile != file && !cacheFile.exists() && messageObject.isMusic()) {
FileLoader.getInstance().loadFile(messageObject.getDocument(), false, false);
downloadingCurrentMessage = true;
isPaused = false;
lastProgress = 0;
lastPlayPcm = 0;
@@ -2202,8 +2187,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
}
NotificationCenter.getInstance().postNotificationName(NotificationCenter.audioPlayStateChanged, playingMessageObject.getId());
return true;
} else {
downloadingCurrentMessage = false;
}
if (messageObject.isMusic()) {
checkIsNextMusicFileDownloaded();
@@ -2252,7 +2235,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
audioTrackPlayer = null;
isPaused = false;
playingMessageObject = null;
downloadingCurrentMessage = false;
}
return false;
}
@@ -2293,7 +2275,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
audioPlayer = null;
isPaused = false;
playingMessageObject = null;
downloadingCurrentMessage = false;
}
return false;
}
@@ -2393,7 +2374,6 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
}
stopProgressTimer();
playingMessageObject = null;
downloadingCurrentMessage = false;
isPaused = false;
Intent intent = new Intent(ApplicationLoader.applicationContext, MusicPlayerService.class);
@@ -2488,21 +2468,20 @@ public class MediaController implements AudioManager.OnAudioFocusChangeListener,
return true;
}
public boolean isPlayingAudio(MessageObject messageObject) {
return !(audioTrackPlayer == null && audioPlayer == null || messageObject == null || playingMessageObject == null || playingMessageObject != null && (playingMessageObject.getId() != messageObject.getId() || downloadingCurrentMessage));
public boolean isMessageOnAir(MessageObject messageObject) {
return !( (audioTrackPlayer==null && audioPlayer==null)
|| (messageObject==null)
|| (playingMessageObject==null)
|| (playingMessageObject.getId() != messageObject.getId()) );
}
public boolean isAudioPaused() {
return isPaused || downloadingCurrentMessage;
}
public boolean isDownloadingCurrentMessage() {
return downloadingCurrentMessage;
return isPaused;
}
public void startRecording(final long dialog_id, final MessageObject reply_to_msg) {
boolean paused = false;
if (playingMessageObject != null && isPlayingAudio(playingMessageObject) && !isAudioPaused()) {
if (playingMessageObject != null && isMessageOnAir(playingMessageObject) && !isAudioPaused()) {
paused = true;
pauseAudio(playingMessageObject);
}
@@ -495,11 +495,7 @@ public class MusicBrowserService extends MediaBrowserService implements Notifica
if (playingMessageObject == null) {
state = PlaybackState.STATE_STOPPED;
} else {
if (MediaController.getInstance().isDownloadingCurrentMessage()) {
state = PlaybackState.STATE_BUFFERING;
} else {
state = MediaController.getInstance().isAudioPaused() ? PlaybackState.STATE_PAUSED : PlaybackState.STATE_PLAYING;
}
state = MediaController.getInstance().isAudioPaused() ? PlaybackState.STATE_PAUSED : PlaybackState.STATE_PLAYING;
}
if (error != null) {
@@ -151,20 +151,8 @@ public class MusicPlayerService extends Service implements NotificationCenter.No
notification.bigContentView.setImageViewResource(R.id.player_album_art, R.drawable.nocover_big);
}
}
if (MediaController.getInstance().isDownloadingCurrentMessage()) {
notification.contentView.setViewVisibility(R.id.player_pause, View.GONE);
notification.contentView.setViewVisibility(R.id.player_play, View.GONE);
notification.contentView.setViewVisibility(R.id.player_next, View.GONE);
notification.contentView.setViewVisibility(R.id.player_previous, View.GONE);
notification.contentView.setViewVisibility(R.id.player_progress_bar, View.VISIBLE);
if (supportBigNotifications) {
notification.bigContentView.setViewVisibility(R.id.player_pause, View.GONE);
notification.bigContentView.setViewVisibility(R.id.player_play, View.GONE);
notification.bigContentView.setViewVisibility(R.id.player_next, View.GONE);
notification.bigContentView.setViewVisibility(R.id.player_previous, View.GONE);
notification.bigContentView.setViewVisibility(R.id.player_progress_bar, View.VISIBLE);
}
} else {
{
notification.contentView.setViewVisibility(R.id.player_progress_bar, View.GONE);
notification.contentView.setViewVisibility(R.id.player_next, View.VISIBLE);
notification.contentView.setViewVisibility(R.id.player_previous, View.VISIBLE);
@@ -212,7 +212,6 @@ public class Theme {
}
public static Drawable createBarSelectorDrawable(int color, boolean masked) {
Drawable drawable;
if (Build.VERSION.SDK_INT >= 21) {
Drawable maskDrawable = null;
if (masked) {
@@ -287,9 +287,6 @@ public class AudioPlayerActivity extends BaseFragment implements NotificationCen
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MediaController.getInstance().isDownloadingCurrentMessage()) {
return;
}
if (MediaController.getInstance().isAudioPaused()) {
MediaController.getInstance().playAudio(MediaController.getInstance().getPlayingMessageObject());
} else {
@@ -89,7 +89,7 @@ public class AudioSelectActivity extends BaseFragment implements NotificationCen
super.onFragmentDestroy();
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.audioDidReset);
if (playingAudio != null && MediaController.getInstance().isPlayingAudio(playingAudio)) {
if (playingAudio != null && MediaController.getInstance().isMessageOnAir(playingAudio)) {
MediaController.getInstance().cleanupPlayer(true, true);
}
}
@@ -79,7 +79,7 @@ public class AudioCell extends FrameLayout {
@Override
public void onClick(View v) {
if (audioEntry != null) {
if (MediaController.getInstance().isPlayingAudio(audioEntry.messageObject) && !MediaController.getInstance().isAudioPaused()) {
if (MediaController.getInstance().isMessageOnAir(audioEntry.messageObject) && !MediaController.getInstance().isAudioPaused()) {
MediaController.getInstance().pauseAudio(audioEntry.messageObject);
playButton.setImageResource(R.drawable.attach_audio_inlist_play);
} else {
@@ -154,7 +154,7 @@ public class AudioCell extends FrameLayout {
genreTextView.setText(audioEntry.genre);
authorTextView.setText(audioEntry.author);
timeTextView.setText(String.format("%d:%02d", audioEntry.duration / 60, audioEntry.duration % 60));
playButton.setImageResource(MediaController.getInstance().isPlayingAudio(audioEntry.messageObject) && !MediaController.getInstance().isAudioPaused() ? R.drawable.attach_audio_inlist_pause : R.drawable.attach_audio_inlist_play);
playButton.setImageResource(MediaController.getInstance().isMessageOnAir(audioEntry.messageObject) && !MediaController.getInstance().isAudioPaused() ? R.drawable.attach_audio_inlist_pause : R.drawable.attach_audio_inlist_play);
needDivider = divider;
setWillNotDraw(!divider);
@@ -772,7 +772,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int duration = 0;
if (documentAttachType == DOCUMENT_ATTACH_TYPE_VOICE) {
if (!MediaController.getInstance().isPlayingAudio(currentMessageObject)) {
if (!MediaController.getInstance().isMessageOnAir(currentMessageObject)) {
for (int a = 0; a < documentAttach.attributes.size(); a++) {
TLRPC.DocumentAttribute attribute = documentAttach.attributes.get(a);
if (attribute instanceof TLRPC.TL_documentAttributeAudio) {
@@ -798,7 +798,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
break;
}
}
if (MediaController.getInstance().isPlayingAudio(currentMessageObject)) {
if (MediaController.getInstance().isMessageOnAir(currentMessageObject)) {
currentProgress = currentMessageObject.audioProgressSec;
}
String timeString = String.format("%d:%02d / %d:%02d", currentProgress / 60, currentProgress % 60, duration / 60, duration % 60);
@@ -1943,7 +1943,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (documentAttachType == DOCUMENT_ATTACH_TYPE_GIF || currentMessageObject.type == MessageObject.MO_TYPE8_GIF) {
;
} else if (documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) {
drawIcon = Theme.INLIST_PLAY;
drawIcon = buttonState==BS0_CLICK_TO_PLAY? Theme.INLIST_PLAY : Theme.INLIST_PAUSE;
audioTitlePaint.setColor(Theme.MSG_AUDIO_NAME_COLOR);
audioPerformerPaint.setColor(Theme.MSG_AUDIO_NAME_COLOR);
audioTimePaint.setColor(Theme.MSG_AUDIO_NAME_COLOR);
@@ -1954,7 +1954,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
canvas.restore();
canvas.save();
if (MediaController.getInstance().isPlayingAudio(currentMessageObject)) {
if (MediaController.getInstance().isMessageOnAir(currentMessageObject)) {
canvas.translate(seekBarX, seekBarY);
seekBar.draw(canvas);
} else {
@@ -1969,7 +1969,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
canvas.restore();
} else if (documentAttachType == DOCUMENT_ATTACH_TYPE_VOICE) {
drawIcon = Theme.INLIST_PLAY;
drawIcon = buttonState==BS0_CLICK_TO_PLAY? Theme.INLIST_PLAY : Theme.INLIST_PAUSE;
if (currentMessageObject.isOutOwner()) {
audioTimePaint.setColor(isDrawSelectedBackground() ? Theme.MSG_OUT_AUDIO_DURATION_SELECTED_TEXT_COLOR : Theme.MSG_OUT_AUDIO_DURATION_TEXT_COLOR);
} else {
@@ -2111,35 +2111,14 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
public void updateButtonState() {
String fileName = null;
if (currentMessageObject.type == MessageObject.MO_TYPE1_PHOTO) {
if (currentPhotoObject == null) {
return;
}
fileName = FileLoader.getAttachFileName(currentPhotoObject);
} else if (currentMessageObject.type == MessageObject.MO_TYPE8_GIF || documentAttachType == DOCUMENT_ATTACH_TYPE_VIDEO || currentMessageObject.type == MessageObject.MO_TYPE9_FILE || documentAttachType == DOCUMENT_ATTACH_TYPE_VOICE || documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) {
if (currentMessageObject.attachPathExists) {
fileName = currentMessageObject.messageOwner.attachPath;
} else if (!currentMessageObject.isSendError() || documentAttachType == DOCUMENT_ATTACH_TYPE_VOICE || documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) {
fileName = currentMessageObject.getFileName();
}
} else if (documentAttachType != DOCUMENT_ATTACH_TYPE_NONE) {
fileName = FileLoader.getAttachFileName(documentAttach);
} else if (currentPhotoObject != null) {
fileName = FileLoader.getAttachFileName(currentPhotoObject);
}
if (fileName == null || fileName.length() == 0) {
return;
}
if (documentAttachType == DOCUMENT_ATTACH_TYPE_VOICE || documentAttachType == DOCUMENT_ATTACH_TYPE_MUSIC) {
boolean playing = MediaController.getInstance().isPlayingAudio(currentMessageObject);
if (!playing || playing && MediaController.getInstance().isAudioPaused()) {
buttonState = BS0_CLICK_TO_PLAY;
} else {
buttonState = BS1_CLICK_TO_PAUSE;
}
boolean isMessageOnAir = MediaController.getInstance().isMessageOnAir(currentMessageObject);
boolean paused = MediaController.getInstance().isAudioPaused();
if( isMessageOnAir && !paused ) {
buttonState = BS1_CLICK_TO_PAUSE;
} else {
buttonState = BS0_CLICK_TO_PLAY;
}
updateAudioProgress();
} else if (currentMessageObject.type == MessageObject.MO_TYPE0_TEXT && documentAttachType != DOCUMENT_ATTACH_TYPE_DOCUMENT && documentAttachType != DOCUMENT_ATTACH_TYPE_VIDEO) {
if (currentPhotoObject == null || !drawImageButton) {
@@ -2005,7 +2005,6 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
else if (id == NotificationCenter.audioDidStarted)
{
MessageObject messageObject = (MessageObject) args[0];
if (chatListView != null) {
int count = chatListView.getChildCount();
for (int a = 0; a < count; a++) {
@@ -2668,14 +2667,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
@Override
public boolean needPlayAudio(MessageObject messageObject) {
if (messageObject.isVoice()) {
boolean result = MediaController.getInstance().playAudio(messageObject);
boolean result = MediaController.getInstance().playAudio(messageObject);
/*if (messageObject.isVoice()) {
MediaController.getInstance().setVoiceMessagesPlaylist(result ? createVoiceMessagesPlaylist(messageObject, false) : null, false);
return result;
} /*TODO: else if (messageObject.isMusic()) {
} else if (messageObject.isMusic()) {
return MediaController.getInstance().setPlaylist(messages, messageObject);
}*/
return false;
return result;
}
@Override
@@ -23,7 +23,6 @@
package com.b44t.ui.Components;
import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
@@ -33,7 +32,6 @@ import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
@@ -75,7 +73,6 @@ import com.b44t.messenger.SendMessagesHelper;
import com.b44t.messenger.FileLog;
import com.b44t.messenger.NotificationCenter;
import com.b44t.messenger.R;
import com.b44t.messenger.ConnectionsManager;
import com.b44t.messenger.TLRPC;
import com.b44t.messenger.UserConfig;
import com.b44t.ui.ActionBar.ActionBar;
@@ -729,7 +726,7 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe
if (audioToSend == null) {
return;
}
if (MediaController.getInstance().isPlayingAudio(audioToSendMessageObject) && !MediaController.getInstance().isAudioPaused()) {
if (MediaController.getInstance().isMessageOnAir(audioToSendMessageObject) && !MediaController.getInstance().isAudioPaused()) {
MediaController.getInstance().pauseAudio(audioToSendMessageObject);
recordedAudioPlayButton.setImageResource(R.drawable.s_player_play_states);
} else {
@@ -2129,13 +2126,13 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe
parentActivity.setVolumeControlStream(frontSpeaker ? AudioManager.STREAM_VOICE_CALL : AudioManager.USE_DEFAULT_STREAM_TYPE);
}
} else if (id == NotificationCenter.audioDidReset) {
if (audioToSendMessageObject != null && !MediaController.getInstance().isPlayingAudio(audioToSendMessageObject)) {
if (audioToSendMessageObject != null && !MediaController.getInstance().isMessageOnAir(audioToSendMessageObject)) {
recordedAudioPlayButton.setImageResource(R.drawable.s_player_play_states);
recordedAudioSeekBar.setProgress(0);
}
} else if (id == NotificationCenter.audioProgressDidChanged) {
Integer mid = (Integer) args[0];
if (audioToSendMessageObject != null && MediaController.getInstance().isPlayingAudio(audioToSendMessageObject)) {
if (audioToSendMessageObject != null && MediaController.getInstance().isMessageOnAir(audioToSendMessageObject)) {
MessageObject player = MediaController.getInstance().getPlayingMessageObject();
audioToSendMessageObject.audioProgress = player.audioProgress;
audioToSendMessageObject.audioProgressSec = player.audioProgressSec;