Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //package
- import android.media.MediaPlayer
- import android.os.Bundle
- import android.os.Handler
- import android.support.v4.app.Fragment
- import android.util.Log
- import android.view.LayoutInflater
- import android.view.View
- import android.view.ViewGroup
- import android.widget.Button
- import android.widget.ImageView
- import android.widget.SeekBar
- import android.widget.TextView
- import com.example.vitali.musicplayer.R
- import java.text.SimpleDateFormat
- import java.util.*
- import kotlin.properties.Delegates
- class MusicPlayerFragment: Fragment(),
- View.OnClickListener,
- MediaPlayer.OnPreparedListener,
- SeekBar.OnSeekBarChangeListener {
- companion object {
- const val TAG = "MusicPlayerFragment"
- const val STATE_CURRENT_PLAYING_POSITION = "playerPosition"
- const val STATE_IS_PLAYING = "isPlaying"
- const val UPDATE_TIME = 1000.toLong()
- val TIME_FORMATTER = SimpleDateFormat("mm:ss")
- }
- private enum class PlayerSate {
- PLAYING,
- STOPPED
- }
- //region Views
- lateinit var mainView: View
- lateinit var songName: TextView
- lateinit var songCover: ImageView
- lateinit var songCurrentTime: TextView
- lateinit var songEndTime: TextView
- lateinit var songProgressHandler: SeekBar
- lateinit var songPlayPauseButton: Button
- lateinit var songPreviousButton: Button
- lateinit var songNextButton: Button
- //endregion
- //region Properties
- private var mediaPlayer: MediaPlayer? = null
- private var mediaPlayerState: PlayerSate by Delegates.observable(PlayerSate.STOPPED) { _, _, _ ->
- updateState()
- }
- private val handler = Handler()
- private val updateProgressTask: Runnable = object : Runnable {
- override fun run() {
- try {
- updateProgress()
- } finally {
- handler.postDelayed(this, UPDATE_TIME)
- }
- }
- }
- //endregion
- //region Lifecycle methods
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- Log.d(TAG, "onCreateView")
- mainView = inflater.inflate(R.layout.fragment_music_player, container, false)
- return mainView
- }
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- Log.d(TAG, "onViewCreated")
- super.onViewCreated(view, savedInstanceState)
- findViews(mainView)
- setupPlayPause()
- setupSeekBar()
- }
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- Log.d(TAG, "onActivityCreated")
- super.onActivityCreated(savedInstanceState)
- mediaPlayer = MediaPlayer.create(activity, R.raw.lobo_loco_03_streetlife_silentfilm)
- mediaPlayer!!.setOnPreparedListener(this)
- if (savedInstanceState != null){
- restoreState(savedInstanceState)
- }
- }
- override fun onStop() {
- Log.d(TAG, "onStop")
- super.onStop()
- handler.removeCallbacks(updateProgressTask)
- mediaPlayer?.release()
- mediaPlayer = null
- }
- override fun onSaveInstanceState(outState: Bundle) {
- Log.d(TAG, "onSaveInstanceState")
- super.onSaveInstanceState(outState)
- val position = mediaPlayer!!.currentPosition
- outState.putInt(STATE_CURRENT_PLAYING_POSITION, position)
- outState.putBoolean(STATE_IS_PLAYING, mediaPlayer!!.isPlaying)
- }
- //endregion
- //region Initialization and setup methods
- private fun findViews(mainView: View){
- songName = mainView.findViewById(R.id.songNameTextView)
- songCover = mainView.findViewById(R.id.songCoverImageView)
- songCurrentTime = mainView.findViewById(R.id.songCurrentTimeTextView)
- songEndTime = mainView.findViewById(R.id.songDurationTextView)
- songProgressHandler = mainView.findViewById(R.id.songPositionSeekBar)
- songPlayPauseButton = mainView.findViewById(R.id.songPlayPauseButton)
- songPreviousButton = mainView.findViewById(R.id.songPrevButton)
- songNextButton = mainView.findViewById(R.id.songNextButton)
- }
- private fun setupPlayPause() {
- songPlayPauseButton.setOnClickListener(this)
- }
- private fun setupSeekBar(){
- songProgressHandler.setOnSeekBarChangeListener(this)
- }
- private fun setupSongInfoViews(){
- val songDuration = mediaPlayer!!.duration
- updateTimeLabel(songEndTime, songDuration)
- songProgressHandler.max = songDuration
- }
- private fun restoreState(bundle: Bundle){
- val position = bundle.getInt(STATE_CURRENT_PLAYING_POSITION)
- val isPlaying = bundle.getBoolean(STATE_IS_PLAYING)
- mediaPlayer!!.seekTo(position)
- updateProgress()
- mediaPlayerState = if (isPlaying){
- PlayerSate.PLAYING
- } else {
- PlayerSate.STOPPED
- }
- }
- //endregion
- //region OnClickListener
- override fun onClick(v: View?) {
- if (v != null) {
- when (v.id) {
- R.id.songPlayPauseButton -> playPauseClicked()
- R.id.songNextButton -> nextClicked()
- R.id.songPrevButton -> prevClicked()
- }
- }
- }
- //endregion
- //region Click Methods
- private fun playPauseClicked(){
- mediaPlayerState = when (mediaPlayerState) {
- PlayerSate.PLAYING -> PlayerSate.STOPPED
- PlayerSate.STOPPED -> PlayerSate.PLAYING
- }
- }
- private fun prevClicked(){
- throw NotImplementedError()
- }
- private fun nextClicked(){
- throw NotImplementedError()
- }
- //endregion
- private fun updateState(){
- when (mediaPlayerState){
- PlayerSate.PLAYING -> {
- mediaPlayer?.start()
- songPlayPauseButton.text = getString(R.string.music_player_pause_title)
- }
- PlayerSate.STOPPED -> {
- mediaPlayer?.pause()
- songPlayPauseButton.text = getString(R.string.music_player_play_title)
- }
- }
- }
- private fun updateProgress(){
- val currentProgress = mediaPlayer!!.currentPosition
- updateTimeLabel(songCurrentTime, currentProgress)
- songProgressHandler.progress = mediaPlayer!!.currentPosition
- }
- private fun updateTimeLabel(timeLabel: TextView, progress: Int) {
- timeLabel.text = TIME_FORMATTER.format(Date(progress.toLong()))
- }
- //region MediaPlayer.OnPreparedListener
- override fun onPrepared(mp: MediaPlayer?) {
- Log.d(TAG, "onPreparedMediaPlayer, duration " + mediaPlayer!!.duration)
- setupSongInfoViews()
- updateProgressTask.run()
- }
- //endregion
- //region SeekBar.OnSeekBarChangeListener
- override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
- updateTimeLabel(songCurrentTime, progress)
- }
- override fun onStartTrackingTouch(seekBar: SeekBar?) {
- }
- override fun onStopTrackingTouch(seekBar: SeekBar?) {
- updateTimeLabel(songCurrentTime, seekBar!!.progress)
- mediaPlayer!!.seekTo(seekBar!!.progress)
- }
- //endregion
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement