check if wake lock needs reinit when pressing start/pause in audio player

This commit is contained in:
Daniel Gultsch 2018-09-23 11:47:13 +02:00
parent 2d206122a5
commit 5cf64826ac
1 changed files with 363 additions and 359 deletions

View File

@ -35,398 +35,402 @@ import eu.siacs.conversations.utils.WeakReferenceSet;
public class AudioPlayer implements View.OnClickListener, MediaPlayer.OnCompletionListener, SeekBar.OnSeekBarChangeListener, Runnable, SensorEventListener { public class AudioPlayer implements View.OnClickListener, MediaPlayer.OnCompletionListener, SeekBar.OnSeekBarChangeListener, Runnable, SensorEventListener {
private static final int REFRESH_INTERVAL = 250; private static final int REFRESH_INTERVAL = 250;
private static final Object LOCK = new Object(); private static final Object LOCK = new Object();
private static MediaPlayer player = null; private static MediaPlayer player = null;
private static Message currentlyPlayingMessage = null; private static Message currentlyPlayingMessage = null;
private final MessageAdapter messageAdapter; private static PowerManager.WakeLock wakeLock;
private final WeakReferenceSet<RelativeLayout> audioPlayerLayouts = new WeakReferenceSet<>(); private final MessageAdapter messageAdapter;
private final SensorManager sensorManager; private final WeakReferenceSet<RelativeLayout> audioPlayerLayouts = new WeakReferenceSet<>();
private final Sensor proximitySensor; private final SensorManager sensorManager;
private static PowerManager.WakeLock wakeLock; private final Sensor proximitySensor;
private final PendingItem<WeakReference<ImageButton>> pendingOnClickView = new PendingItem<>();
private final PendingItem<WeakReference<ImageButton>> pendingOnClickView = new PendingItem<>(); private final Handler handler = new Handler();
private final Handler handler = new Handler(); public AudioPlayer(MessageAdapter adapter) {
final Context context = adapter.getContext();
this.messageAdapter = adapter;
this.sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
this.proximitySensor = this.sensorManager == null ? null : this.sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
initializeProximityWakeLock(context);
synchronized (AudioPlayer.LOCK) {
if (AudioPlayer.player != null) {
AudioPlayer.player.setOnCompletionListener(this);
if (AudioPlayer.player.isPlaying() && sensorManager != null) {
sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
}
}
public AudioPlayer(MessageAdapter adapter) { private static String formatTime(int ms) {
final Context context = adapter.getContext(); return String.format(Locale.ENGLISH, "%d:%02d", ms / 60000, Math.min(Math.round((ms % 60000) / 1000f), 59));
this.messageAdapter = adapter; }
this.sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
this.proximitySensor = this.sensorManager == null ? null : this.sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
if (Build.VERSION.SDK_INT >= 21) {
synchronized (AudioPlayer.LOCK) {
if (AudioPlayer.wakeLock == null) {
final PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
AudioPlayer.wakeLock = powerManager == null ? null : powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, AudioPlayer.class.getSimpleName());
AudioPlayer.wakeLock.setReferenceCounted(false);
}
}
} else {
AudioPlayer.wakeLock = null;
}
synchronized (AudioPlayer.LOCK) {
if (AudioPlayer.player != null) {
AudioPlayer.player.setOnCompletionListener(this);
if (AudioPlayer.player.isPlaying() && sensorManager != null) {
sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
}
}
private static String formatTime(int ms) { private void initializeProximityWakeLock(Context context) {
return String.format(Locale.ENGLISH, "%d:%02d", ms / 60000, Math.min(Math.round((ms % 60000) / 1000f), 59)); if (Build.VERSION.SDK_INT >= 21) {
} synchronized (AudioPlayer.LOCK) {
if (AudioPlayer.wakeLock == null) {
final PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
AudioPlayer.wakeLock = powerManager == null ? null : powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, AudioPlayer.class.getSimpleName());
AudioPlayer.wakeLock.setReferenceCounted(false);
}
}
} else {
AudioPlayer.wakeLock = null;
}
}
public void init(RelativeLayout audioPlayer, Message message) { public void init(RelativeLayout audioPlayer, Message message) {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
audioPlayer.setTag(message); audioPlayer.setTag(message);
if (init(ViewHolder.get(audioPlayer), message)) { if (init(ViewHolder.get(audioPlayer), message)) {
this.audioPlayerLayouts.addWeakReferenceTo(audioPlayer); this.audioPlayerLayouts.addWeakReferenceTo(audioPlayer);
this.stopRefresher(true); this.stopRefresher(true);
} else { } else {
this.audioPlayerLayouts.removeWeakReferenceTo(audioPlayer); this.audioPlayerLayouts.removeWeakReferenceTo(audioPlayer);
} }
} }
} }
private boolean init(ViewHolder viewHolder, Message message) { private boolean init(ViewHolder viewHolder, Message message) {
if (viewHolder.darkBackground) { if (viewHolder.darkBackground) {
viewHolder.runtime.setTextAppearance(this.messageAdapter.getContext(), R.style.TextAppearance_Conversations_Caption_OnDark); viewHolder.runtime.setTextAppearance(this.messageAdapter.getContext(), R.style.TextAppearance_Conversations_Caption_OnDark);
} else { } else {
viewHolder.runtime.setTextAppearance(this.messageAdapter.getContext(), R.style.TextAppearance_Conversations_Caption); viewHolder.runtime.setTextAppearance(this.messageAdapter.getContext(), R.style.TextAppearance_Conversations_Caption);
} }
viewHolder.progress.setOnSeekBarChangeListener(this); viewHolder.progress.setOnSeekBarChangeListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ColorStateList color = ContextCompat.getColorStateList(messageAdapter.getContext(), viewHolder.darkBackground ? R.color.white70 : R.color.green700_desaturated); ColorStateList color = ContextCompat.getColorStateList(messageAdapter.getContext(), viewHolder.darkBackground ? R.color.white70 : R.color.green700_desaturated);
viewHolder.progress.setThumbTintList(color); viewHolder.progress.setThumbTintList(color);
viewHolder.progress.setProgressTintList(color); viewHolder.progress.setProgressTintList(color);
} }
viewHolder.playPause.setAlpha(viewHolder.darkBackground ? 0.7f : 0.57f); viewHolder.playPause.setAlpha(viewHolder.darkBackground ? 0.7f : 0.57f);
viewHolder.playPause.setOnClickListener(this); viewHolder.playPause.setOnClickListener(this);
if (message == currentlyPlayingMessage) { if (message == currentlyPlayingMessage) {
if (AudioPlayer.player != null && AudioPlayer.player.isPlaying()) { if (AudioPlayer.player != null && AudioPlayer.player.isPlaying()) {
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_pause_white_36dp : R.drawable.ic_pause_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_pause_white_36dp : R.drawable.ic_pause_black_36dp);
viewHolder.progress.setEnabled(true); viewHolder.progress.setEnabled(true);
} else { } else {
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp);
viewHolder.progress.setEnabled(false); viewHolder.progress.setEnabled(false);
} }
return true; return true;
} else { } else {
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp);
viewHolder.runtime.setText(formatTime(message.getFileParams().runtime)); viewHolder.runtime.setText(formatTime(message.getFileParams().runtime));
viewHolder.progress.setProgress(0); viewHolder.progress.setProgress(0);
viewHolder.progress.setEnabled(false); viewHolder.progress.setEnabled(false);
return false; return false;
} }
} }
@Override @Override
public synchronized void onClick(View v) { public synchronized void onClick(View v) {
if (v.getId() == R.id.play_pause) { if (v.getId() == R.id.play_pause) {
synchronized (LOCK) { synchronized (LOCK) {
startStop((ImageButton) v); startStop((ImageButton) v);
} }
} }
} }
private void startStop(ImageButton playPause) { private void startStop(ImageButton playPause) {
if (ContextCompat.checkSelfPermission(messageAdapter.getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ContextCompat.checkSelfPermission(messageAdapter.getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
pendingOnClickView.push(new WeakReference<>(playPause)); pendingOnClickView.push(new WeakReference<>(playPause));
ActivityCompat.requestPermissions(messageAdapter.getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, ConversationsActivity.REQUEST_PLAY_PAUSE); ActivityCompat.requestPermissions(messageAdapter.getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, ConversationsActivity.REQUEST_PLAY_PAUSE);
return; return;
} }
final RelativeLayout audioPlayer = (RelativeLayout) playPause.getParent(); initializeProximityWakeLock(playPause.getContext());
final ViewHolder viewHolder = ViewHolder.get(audioPlayer); final RelativeLayout audioPlayer = (RelativeLayout) playPause.getParent();
final Message message = (Message) audioPlayer.getTag(); final ViewHolder viewHolder = ViewHolder.get(audioPlayer);
if (startStop(viewHolder, message)) { final Message message = (Message) audioPlayer.getTag();
this.audioPlayerLayouts.clear(); if (startStop(viewHolder, message)) {
this.audioPlayerLayouts.addWeakReferenceTo(audioPlayer); this.audioPlayerLayouts.clear();
stopRefresher(true); this.audioPlayerLayouts.addWeakReferenceTo(audioPlayer);
} stopRefresher(true);
} }
}
private boolean playPauseCurrent(ViewHolder viewHolder) { private boolean playPauseCurrent(ViewHolder viewHolder) {
viewHolder.playPause.setAlpha(viewHolder.darkBackground ? 0.7f : 0.57f); viewHolder.playPause.setAlpha(viewHolder.darkBackground ? 0.7f : 0.57f);
if (player.isPlaying()) { if (player.isPlaying()) {
viewHolder.progress.setEnabled(false); viewHolder.progress.setEnabled(false);
player.pause(); player.pause();
messageAdapter.flagScreenOff(); messageAdapter.flagScreenOff();
releaseProximityWakeLock(); releaseProximityWakeLock();
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp);
} else { } else {
viewHolder.progress.setEnabled(true); viewHolder.progress.setEnabled(true);
player.start(); player.start();
messageAdapter.flagScreenOn(); messageAdapter.flagScreenOn();
acquireProximityWakeLock(); acquireProximityWakeLock();
this.stopRefresher(true); this.stopRefresher(true);
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_pause_white_36dp : R.drawable.ic_pause_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_pause_white_36dp : R.drawable.ic_pause_black_36dp);
} }
return false; return false;
} }
private void play(ViewHolder viewHolder, Message message, boolean earpiece, double progress) { private void play(ViewHolder viewHolder, Message message, boolean earpiece, double progress) {
if (play(viewHolder, message, earpiece)) { if (play(viewHolder, message, earpiece)) {
AudioPlayer.player.seekTo((int) (AudioPlayer.player.getDuration() * progress)); AudioPlayer.player.seekTo((int) (AudioPlayer.player.getDuration() * progress));
} }
} }
private boolean play(ViewHolder viewHolder, Message message, boolean earpiece) { private boolean play(ViewHolder viewHolder, Message message, boolean earpiece) {
AudioPlayer.player = new MediaPlayer(); AudioPlayer.player = new MediaPlayer();
try { try {
AudioPlayer.currentlyPlayingMessage = message; AudioPlayer.currentlyPlayingMessage = message;
AudioPlayer.player.setAudioStreamType(earpiece ? AudioManager.STREAM_VOICE_CALL : AudioManager.STREAM_MUSIC); AudioPlayer.player.setAudioStreamType(earpiece ? AudioManager.STREAM_VOICE_CALL : AudioManager.STREAM_MUSIC);
AudioPlayer.player.setDataSource(messageAdapter.getFileBackend().getFile(message).getAbsolutePath()); AudioPlayer.player.setDataSource(messageAdapter.getFileBackend().getFile(message).getAbsolutePath());
AudioPlayer.player.setOnCompletionListener(this); AudioPlayer.player.setOnCompletionListener(this);
AudioPlayer.player.prepare(); AudioPlayer.player.prepare();
AudioPlayer.player.start(); AudioPlayer.player.start();
messageAdapter.flagScreenOn(); messageAdapter.flagScreenOn();
acquireProximityWakeLock(); acquireProximityWakeLock();
viewHolder.progress.setEnabled(true); viewHolder.progress.setEnabled(true);
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_pause_white_36dp : R.drawable.ic_pause_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_pause_white_36dp : R.drawable.ic_pause_black_36dp);
sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL); sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
messageAdapter.flagScreenOff(); messageAdapter.flagScreenOff();
releaseProximityWakeLock(); releaseProximityWakeLock();
AudioPlayer.currentlyPlayingMessage = null; AudioPlayer.currentlyPlayingMessage = null;
sensorManager.unregisterListener(this); sensorManager.unregisterListener(this);
return false; return false;
} }
} }
public void startStopPending() { public void startStopPending() {
WeakReference<ImageButton> reference = pendingOnClickView.pop(); WeakReference<ImageButton> reference = pendingOnClickView.pop();
if (reference != null) { if (reference != null) {
ImageButton imageButton = reference.get(); ImageButton imageButton = reference.get();
if (imageButton != null) { if (imageButton != null) {
startStop(imageButton); startStop(imageButton);
} }
} }
} }
private boolean startStop(ViewHolder viewHolder, Message message) { private boolean startStop(ViewHolder viewHolder, Message message) {
if (message == currentlyPlayingMessage && player != null) { if (message == currentlyPlayingMessage && player != null) {
return playPauseCurrent(viewHolder); return playPauseCurrent(viewHolder);
} }
if (AudioPlayer.player != null) { if (AudioPlayer.player != null) {
stopCurrent(); stopCurrent();
} }
return play(viewHolder, message, false); return play(viewHolder, message, false);
} }
private void stopCurrent() { private void stopCurrent() {
if (AudioPlayer.player.isPlaying()) { if (AudioPlayer.player.isPlaying()) {
AudioPlayer.player.stop(); AudioPlayer.player.stop();
} }
AudioPlayer.player.release(); AudioPlayer.player.release();
messageAdapter.flagScreenOff(); messageAdapter.flagScreenOff();
releaseProximityWakeLock(); releaseProximityWakeLock();
AudioPlayer.player = null; AudioPlayer.player = null;
resetPlayerUi(); resetPlayerUi();
} }
private void resetPlayerUi() { private void resetPlayerUi() {
for (WeakReference<RelativeLayout> audioPlayer : audioPlayerLayouts) { for (WeakReference<RelativeLayout> audioPlayer : audioPlayerLayouts) {
resetPlayerUi(audioPlayer.get()); resetPlayerUi(audioPlayer.get());
} }
} }
private void resetPlayerUi(RelativeLayout audioPlayer) { private void resetPlayerUi(RelativeLayout audioPlayer) {
if (audioPlayer == null) { if (audioPlayer == null) {
return; return;
} }
final ViewHolder viewHolder = ViewHolder.get(audioPlayer); final ViewHolder viewHolder = ViewHolder.get(audioPlayer);
final Message message = (Message) audioPlayer.getTag(); final Message message = (Message) audioPlayer.getTag();
viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp); viewHolder.playPause.setImageResource(viewHolder.darkBackground ? R.drawable.ic_play_arrow_white_36dp : R.drawable.ic_play_arrow_black_36dp);
if (message != null) { if (message != null) {
viewHolder.runtime.setText(formatTime(message.getFileParams().runtime)); viewHolder.runtime.setText(formatTime(message.getFileParams().runtime));
} }
viewHolder.progress.setProgress(0); viewHolder.progress.setProgress(0);
viewHolder.progress.setEnabled(false); viewHolder.progress.setEnabled(false);
} }
@Override @Override
public void onCompletion(android.media.MediaPlayer mediaPlayer) { public void onCompletion(android.media.MediaPlayer mediaPlayer) {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
this.stopRefresher(false); this.stopRefresher(false);
if (AudioPlayer.player == mediaPlayer) { if (AudioPlayer.player == mediaPlayer) {
AudioPlayer.currentlyPlayingMessage = null; AudioPlayer.currentlyPlayingMessage = null;
AudioPlayer.player = null; AudioPlayer.player = null;
} }
mediaPlayer.release(); mediaPlayer.release();
messageAdapter.flagScreenOff(); messageAdapter.flagScreenOff();
releaseProximityWakeLock(); releaseProximityWakeLock();
resetPlayerUi(); resetPlayerUi();
sensorManager.unregisterListener(this); sensorManager.unregisterListener(this);
} }
} }
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
final RelativeLayout audioPlayer = (RelativeLayout) seekBar.getParent(); final RelativeLayout audioPlayer = (RelativeLayout) seekBar.getParent();
final Message message = (Message) audioPlayer.getTag(); final Message message = (Message) audioPlayer.getTag();
if (fromUser && message == AudioPlayer.currentlyPlayingMessage) { if (fromUser && message == AudioPlayer.currentlyPlayingMessage) {
float percent = progress / 100f; float percent = progress / 100f;
int duration = AudioPlayer.player.getDuration(); int duration = AudioPlayer.player.getDuration();
int seekTo = Math.round(duration * percent); int seekTo = Math.round(duration * percent);
AudioPlayer.player.seekTo(seekTo); AudioPlayer.player.seekTo(seekTo);
} }
} }
} }
@Override @Override
public void onStartTrackingTouch(SeekBar seekBar) { public void onStartTrackingTouch(SeekBar seekBar) {
} }
@Override @Override
public void onStopTrackingTouch(SeekBar seekBar) { public void onStopTrackingTouch(SeekBar seekBar) {
} }
public void stop() { public void stop() {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
stopRefresher(false); stopRefresher(false);
if (AudioPlayer.player != null) { if (AudioPlayer.player != null) {
stopCurrent(); stopCurrent();
} }
AudioPlayer.currentlyPlayingMessage = null; AudioPlayer.currentlyPlayingMessage = null;
sensorManager.unregisterListener(this); sensorManager.unregisterListener(this);
if (wakeLock != null && wakeLock.isHeld()) { if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release(); wakeLock.release();
} }
wakeLock = null; wakeLock = null;
} }
} }
private void stopRefresher(boolean runOnceMore) { private void stopRefresher(boolean runOnceMore) {
this.handler.removeCallbacks(this); this.handler.removeCallbacks(this);
if (runOnceMore) { if (runOnceMore) {
this.handler.post(this); this.handler.post(this);
} }
} }
public void unregisterListener() { public void unregisterListener() {
if (sensorManager != null) { if (sensorManager != null) {
sensorManager.unregisterListener(this); sensorManager.unregisterListener(this);
} }
} }
@Override @Override
public void run() { public void run() {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
if (AudioPlayer.player != null) { if (AudioPlayer.player != null) {
boolean renew = false; boolean renew = false;
final int current = player.getCurrentPosition(); final int current = player.getCurrentPosition();
final int duration = player.getDuration(); final int duration = player.getDuration();
for (WeakReference<RelativeLayout> audioPlayer : audioPlayerLayouts) { for (WeakReference<RelativeLayout> audioPlayer : audioPlayerLayouts) {
renew |= refreshAudioPlayer(audioPlayer.get(), current, duration); renew |= refreshAudioPlayer(audioPlayer.get(), current, duration);
} }
if (renew && AudioPlayer.player.isPlaying()) { if (renew && AudioPlayer.player.isPlaying()) {
handler.postDelayed(this, REFRESH_INTERVAL); handler.postDelayed(this, REFRESH_INTERVAL);
} }
} }
} }
} }
private boolean refreshAudioPlayer(RelativeLayout audioPlayer, int current, int duration) { private boolean refreshAudioPlayer(RelativeLayout audioPlayer, int current, int duration) {
if (audioPlayer == null || audioPlayer.getVisibility() != View.VISIBLE) { if (audioPlayer == null || audioPlayer.getVisibility() != View.VISIBLE) {
return false; return false;
} }
final ViewHolder viewHolder = ViewHolder.get(audioPlayer); final ViewHolder viewHolder = ViewHolder.get(audioPlayer);
viewHolder.progress.setProgress(current * 100 / duration); viewHolder.progress.setProgress(current * 100 / duration);
viewHolder.runtime.setText(formatTime(current) + " / " + formatTime(duration)); viewHolder.runtime.setText(formatTime(current) + " / " + formatTime(duration));
return true; return true;
} }
@Override @Override
public void onSensorChanged(SensorEvent event) { public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_PROXIMITY) { if (event.sensor.getType() != Sensor.TYPE_PROXIMITY) {
return; return;
} }
if (AudioPlayer.player == null || !AudioPlayer.player.isPlaying()) { if (AudioPlayer.player == null || !AudioPlayer.player.isPlaying()) {
return; return;
} }
int streamType; int streamType;
if (event.values[0] < 5f && event.values[0] != proximitySensor.getMaximumRange()) { if (event.values[0] < 5f && event.values[0] != proximitySensor.getMaximumRange()) {
streamType = AudioManager.STREAM_VOICE_CALL; streamType = AudioManager.STREAM_VOICE_CALL;
} else { } else {
streamType = AudioManager.STREAM_MUSIC; streamType = AudioManager.STREAM_MUSIC;
} }
double position = AudioPlayer.player.getCurrentPosition(); double position = AudioPlayer.player.getCurrentPosition();
double duration = AudioPlayer.player.getDuration(); double duration = AudioPlayer.player.getDuration();
double progress = position / duration; double progress = position / duration;
if (AudioPlayer.player.getAudioStreamType() != streamType) { if (AudioPlayer.player.getAudioStreamType() != streamType) {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
AudioPlayer.player.stop(); AudioPlayer.player.stop();
AudioPlayer.player.release(); AudioPlayer.player.release();
AudioPlayer.player = null; AudioPlayer.player = null;
try { try {
ViewHolder currentViewHolder = getCurrentViewHolder(); ViewHolder currentViewHolder = getCurrentViewHolder();
if (currentViewHolder != null) { if (currentViewHolder != null) {
play(currentViewHolder, currentlyPlayingMessage, streamType == AudioManager.STREAM_VOICE_CALL, progress); play(currentViewHolder, currentlyPlayingMessage, streamType == AudioManager.STREAM_VOICE_CALL, progress);
} }
} catch (Exception e) { } catch (Exception e) {
Log.w(Config.LOGTAG, e); Log.w(Config.LOGTAG, e);
} }
} }
} }
} }
@Override @Override
public void onAccuracyChanged(Sensor sensor, int i) { public void onAccuracyChanged(Sensor sensor, int i) {
} }
private void acquireProximityWakeLock() { private void acquireProximityWakeLock() {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
if (wakeLock != null) { if (wakeLock != null) {
wakeLock.acquire(); wakeLock.acquire();
} }
} }
} }
private void releaseProximityWakeLock() { private void releaseProximityWakeLock() {
synchronized (AudioPlayer.LOCK) { synchronized (AudioPlayer.LOCK) {
if (wakeLock != null && wakeLock.isHeld()) { if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release(); wakeLock.release();
} }
} }
} }
private ViewHolder getCurrentViewHolder() { private ViewHolder getCurrentViewHolder() {
for (WeakReference<RelativeLayout> audioPlayer : audioPlayerLayouts) { for (WeakReference<RelativeLayout> audioPlayer : audioPlayerLayouts) {
final Message message = (Message) audioPlayer.get().getTag(); final Message message = (Message) audioPlayer.get().getTag();
if (message == currentlyPlayingMessage) { if (message == currentlyPlayingMessage) {
return ViewHolder.get(audioPlayer.get()); return ViewHolder.get(audioPlayer.get());
} }
} }
return null; return null;
} }
public static class ViewHolder { public static class ViewHolder {
private TextView runtime; private TextView runtime;
private SeekBar progress; private SeekBar progress;
private ImageButton playPause; private ImageButton playPause;
private boolean darkBackground = false; private boolean darkBackground = false;
public static ViewHolder get(RelativeLayout audioPlayer) { public static ViewHolder get(RelativeLayout audioPlayer) {
ViewHolder viewHolder = (ViewHolder) audioPlayer.getTag(R.id.TAG_AUDIO_PLAYER_VIEW_HOLDER); ViewHolder viewHolder = (ViewHolder) audioPlayer.getTag(R.id.TAG_AUDIO_PLAYER_VIEW_HOLDER);
if (viewHolder == null) { if (viewHolder == null) {
viewHolder = new ViewHolder(); viewHolder = new ViewHolder();
viewHolder.runtime = audioPlayer.findViewById(R.id.runtime); viewHolder.runtime = audioPlayer.findViewById(R.id.runtime);
viewHolder.progress = audioPlayer.findViewById(R.id.progress); viewHolder.progress = audioPlayer.findViewById(R.id.progress);
viewHolder.playPause = audioPlayer.findViewById(R.id.play_pause); viewHolder.playPause = audioPlayer.findViewById(R.id.play_pause);
audioPlayer.setTag(R.id.TAG_AUDIO_PLAYER_VIEW_HOLDER, viewHolder); audioPlayer.setTag(R.id.TAG_AUDIO_PLAYER_VIEW_HOLDER, viewHolder);
} }
return viewHolder; return viewHolder;
} }
public void setDarkBackground(boolean darkBackground) { public void setDarkBackground(boolean darkBackground) {
this.darkBackground = darkBackground; this.darkBackground = darkBackground;
} }
} }
} }