/** * Copyright (c) 2015 unfoldingWord * http://creativecommons.org/licenses/MIT/ * See LICENSE file for details. * Contributors: * PJ Fechner <pj@actsmedia.com> */ package view; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageButton; import android.widget.SeekBar; import android.widget.TextView; import org.unfoldingword.mobile.R; import model.AudioMarker; import model.DownloadState; import singletons.UWAudioPlayer; /** * Created by Fechner on 9/18/15. */ public class AudioPlayerViewGroup implements UWAudioPlayer.UWAudioPlayerListener{ private ViewGroup downloadViewGroup; private ViewGroup downloadingAudioViewGroup; private ViewGroup controlsViewGroup; private ImageButton playPauseButton; private TextView currentTimeTextView; private TextView endTimeTextView; private Button downloadButton; private Context context; private SeekBar seekBar; private AudioPlayerViewGroupListener listener; public AudioPlayerViewGroup(Context context, View containingView, AudioPlayerViewGroupListener listener) { this.context = context; this.listener = listener; getViews(containingView); setupListeners(); updateViews(); } public void onResume(){ UWAudioPlayer.getInstance(context).addListener(this); } public void onPause(){ UWAudioPlayer.getInstance(context).removeListener(this); } private void getViews(View containingView){ playPauseButton = (ImageButton) containingView.findViewById(R.id.audio_player_play_pause_button); currentTimeTextView = (TextView) containingView.findViewById(R.id.audio_player_current_time_text_view); endTimeTextView = (TextView) containingView.findViewById(R.id.audio_player_end_time_text_view); seekBar = (SeekBar) containingView.findViewById(R.id.audio_player_progress); downloadButton = (Button) containingView.findViewById(R.id.reading_audio_download_button); downloadViewGroup = (ViewGroup) containingView.findViewById(R.id.download_audio_layout); downloadingAudioViewGroup = (ViewGroup) containingView.findViewById(R.id.downloading_audio_layout); controlsViewGroup = (ViewGroup) containingView.findViewById(R.id.audio_player_controls); } private void setupListeners(){ downloadButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.downloadClicked(); } }); playPauseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { playPauseClicked(); } }); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { private boolean wasPlaying = false; @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { wasPlaying = UWAudioPlayer.getInstance(context).isPlaying(); UWAudioPlayer.getInstance(context).pause(); } @Override public void onStopTrackingTouch(SeekBar seekBar) { seekChange(); if(wasPlaying) { UWAudioPlayer.getInstance(context).play(); wasPlaying = false; } } }); // seekBar.setOnTouchListener(new View.OnTouchListener() { // @Override // public boolean onTouch(View v, MotionEvent event) { // seekChange(); // return false; // } // }); UWAudioPlayer.getInstance(context).addListener(this); } private void updateViews(){ updateSeekBar(); updatePlayPause(); } private void updateSeekBar(){ AudioMarker marker = UWAudioPlayer.getInstance(context).getCurrentMarker(); int progress = UWAudioPlayer.getInstance(context).getCurrentTime(); if(marker != null && progress >= 0){ seekBar.setMax((int) marker.getDuration()); seekBar.setProgress(progress); updateLabelsForTimes(progress, marker.getDuration()); } } private void updateSeekBar(int duration, int progress){ seekBar.setMax(duration); seekBar.setProgress(progress); updateLabelsForTimes(progress, duration); } private void updatePlayPause(){ boolean playing = UWAudioPlayer.getInstance(context).isPlaying(); playPauseButton.setImageResource((playing) ? R.drawable.pause : R.drawable.play); } private void seekChange(){ UWAudioPlayer.getInstance(context).seekTo(seekBar.getProgress()); } private void playPauseClicked(){ UWAudioPlayer.getInstance(context).togglePlay(); } private void updateLabelsForTimes(long elapsedInMill, long totalInMill){ String currentTime = getTimeStringFromSeconds(elapsedInMill / 1000); currentTimeTextView.setText(currentTime); String endTime = getTimeStringFromSeconds(totalInMill / 1000); endTimeTextView.setText(endTime); } private String getTimeStringFromSeconds(long seconds){ long numOfSeconds = seconds % 60; String secondsText = (numOfSeconds < 10)? "0" + Long.toString(numOfSeconds) : Long.toString(numOfSeconds); return Long.toString((long) Math.floor(seconds / 60.0)) + ":" + secondsText; } public void resetViews(){ controlsViewGroup.setVisibility(View.VISIBLE); downloadViewGroup.setVisibility(View.GONE); } public void handleDownloadState(DownloadState state){ if(state == DownloadState.DOWNLOAD_STATE_DOWNLOADED){ resetViews(); } else{ controlsViewGroup.setVisibility(View.GONE); downloadViewGroup.setVisibility(View.VISIBLE); downloadingAudioViewGroup.setVisibility((state == DownloadState.DOWNLOAD_STATE_DOWNLOADING)? View.VISIBLE : View.GONE); downloadButton.setVisibility((state == DownloadState.DOWNLOAD_STATE_DOWNLOADING)? View.GONE : View.VISIBLE); } } @Override public void paused() { updatePlayPause(); } @Override public void update(long duration, long progress) { updateSeekBar((int)duration, (int) progress); updateLabelsForTimes(progress, duration); } @Override public void started() { updatePlayPause(); } public interface AudioPlayerViewGroupListener{ void downloadClicked(); } }