package com.ponyvillelive.pvlmobile.ui; import android.content.Intent; import android.graphics.PorterDuff; import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.PlaybackStateCompat; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.ponyvillelive.pvlmobile.R; import com.ponyvillelive.pvlmobile.service.MusicService; import com.squareup.picasso.Picasso; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import timber.log.Timber; /** * Created by berwyn on 29/03/15. */ public class PlaybackControlsFragment extends Fragment { private static String TAG = PlaybackControlsFragment.class.getSimpleName(); @InjectView(R.id.play_pause) ImageButton playPause; @InjectView(R.id.title) TextView title; @InjectView(R.id.artist) TextView subtitle; @InjectView(R.id.extra_info) TextView extraInfo; @InjectView(R.id.album_art) ImageView albumArt; String artUrl; private MediaControllerCompat.Callback callback = new MediaControllerCompat.Callback() { @Override public void onPlaybackStateChanged(PlaybackStateCompat state) { if (state == null) { return; } Timber.d(TAG, "Received playback state change to state ", state.getState()); PlaybackControlsFragment.this.onPlaybackStateChanged(state); } @Override public void onMetadataChanged(MediaMetadataCompat metadata) { if (metadata == null) { return; } Timber.d(TAG, "Received metadata state change to mediaId=", metadata.getDescription().getMediaId(), " song=", metadata.getDescription().getTitle()); PlaybackControlsFragment.this.onMetadataChanged(metadata); } }; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_playback_controls, container, false); ButterKnife.inject(this, rootView); playPause.setEnabled(true); if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { playPause.getDrawable().setTint(R.color.colorAccent); playPause.getDrawable().setTintMode(PorterDuff.Mode.SRC_IN); } rootView.setOnClickListener((v) -> { Intent intent = new Intent(getActivity(), FullScreenPlayerActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); MediaMetadataCompat metadata = ((BaseActivity) getActivity()).getMediaControllerCompat().getMetadata(); if (metadata != null) { intent.putExtra(MediaPlayerActivity.EXTRA_CURRENT_MEDIA_DESCRIPTION, metadata.getDescription()); } startActivity(intent); }); return rootView; } @Override public void onStart() { super.onStart(); Timber.d(TAG, "fragment.onStart"); if (((BaseActivity) getActivity()).getMediaControllerCompat() != null) { onConnected(); } } public void onConnected() { MediaControllerCompat mediaController = ((BaseActivity) getActivity()).getMediaControllerCompat(); Timber.d(TAG, "onConnected, mediaController==null?", mediaController == null); if (mediaController != null) { onMetadataChanged(mediaController.getMetadata()); onPlaybackStateChanged(mediaController.getPlaybackState()); mediaController.registerCallback(callback); } } private void onMetadataChanged(MediaMetadataCompat metadata) { Timber.d(TAG, "onMetadataChanged ", metadata); if (getActivity() == null) { Timber.d(TAG, "onMetadataChanged called when getActivity null," + "this should not happen if the callback was properly unregistered. Ignoring."); return; } if (metadata == null) { return; } title.setText(metadata.getDescription().getTitle()); subtitle.setText(metadata.getDescription().getSubtitle()); String artUrl = metadata.getDescription().getIconUri().toString(); if (!TextUtils.equals(artUrl, this.artUrl)) { this.artUrl = artUrl; Picasso.with(getActivity()) .load(artUrl) .centerCrop() .into(albumArt); } } private void onPlaybackStateChanged(PlaybackStateCompat state) { Timber.d(TAG, "onPlaybackStateChanged ", state); if (getActivity() == null) { Timber.d(TAG, "onPlaybackStateChanged called when getActivity null," + "this should not happen if the callback was properly unregistered. Ignoring."); return; } if (state == null) { return; } boolean enablePlay = false; switch (state.getState()) { case PlaybackStateCompat.STATE_PAUSED: case PlaybackStateCompat.STATE_STOPPED: enablePlay = true; break; case PlaybackStateCompat.STATE_ERROR: Timber.d(TAG, "error playbackstate: ", state.getErrorMessage()); break; } if (enablePlay) { playPause.setImageDrawable( getActivity().getDrawable(R.drawable.ic_play_arrow_black_36dp)); } else { playPause.setImageDrawable( getActivity().getDrawable(R.drawable.ic_pause_black_36dp)); } MediaControllerCompat controller = ((BaseActivity) getActivity()).getMediaControllerCompat(); String extraInfo = null; if (controller != null && controller.getExtras() != null) { String castName = controller.getExtras().getString(MusicService.EXTRA_CONNECTED_CAST); if (castName != null) { extraInfo = getResources().getString(R.string.casting_to_device, castName); } } setExtraInfo(extraInfo); } public void setExtraInfo(String extraInfo) { if (extraInfo == null) { this.extraInfo.setVisibility(View.GONE); } else { this.extraInfo.setText(extraInfo); this.extraInfo.setVisibility(View.VISIBLE); } } @Override public void onStop() { super.onStop(); Timber.d(TAG, "fragment.onStop"); if (((BaseActivity) getActivity()).getMediaControllerCompat() != null) { ((BaseActivity) getActivity()).getMediaControllerCompat().unregisterCallback(callback); } } @OnClick(R.id.play_pause) void playPauseClickListener(View v) { PlaybackStateCompat stateObj = ((BaseActivity) getActivity()) .getMediaControllerCompat().getPlaybackState(); final int state = stateObj == null ? PlaybackStateCompat.STATE_NONE : stateObj.getState(); Timber.d(TAG, "Button pressed, in state " + state); switch (v.getId()) { case R.id.play_pause: if (state == PlaybackStateCompat.STATE_PAUSED || state == PlaybackStateCompat.STATE_STOPPED || state == PlaybackStateCompat.STATE_NONE) { playMedia(); } else if (state == PlaybackStateCompat.STATE_PLAYING || state == PlaybackStateCompat.STATE_BUFFERING || state == PlaybackStateCompat.STATE_CONNECTING) { pauseMedia(); } break; } } private void playMedia() { MediaControllerCompat controller = ((BaseActivity) getActivity()).getMediaControllerCompat(); if (controller != null) { controller.getTransportControls().play(); } } private void pauseMedia() { MediaControllerCompat controller = ((BaseActivity) getActivity()).getMediaControllerCompat(); if (controller != null) { controller.getTransportControls().pause(); } } }