package com.ponyvillelive.pvlmobile.ui; import android.media.session.PlaybackState; import android.os.Bundle; import android.os.RemoteException; import android.support.v4.media.MediaMetadataCompat; import android.support.v4.media.session.MediaControllerCompat; import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; import com.ponyvillelive.pvlmobile.R; import com.ponyvillelive.pvlmobile.util.NetworkHelper; import timber.log.Timber; /** * Created by berwyn on 23/03/15. */ public abstract class BaseActivity extends ActionBarCastActivity { public static final String TAG = BaseActivity.class.getSimpleName(); private PlaybackControlsFragment controlsFragment; private final MediaControllerCompat.Callback mediaControllerCallback = new MediaControllerCompat.Callback() { @Override public void onPlaybackStateChanged(PlaybackStateCompat state) { if (shouldShowControls()) { showPlaybackControls(); } else { Timber.d(TAG, "mediaControllerCallback.onPlaybackStateChanged: " + "hiding controls because state is ", state == null ? "null" : state.getState()); hidePlaybackControls(); } } @Override public void onMetadataChanged(MediaMetadataCompat metadata) { if (shouldShowControls()) { showPlaybackControls(); } else { Timber.d(TAG, "mediaControllerCallback.onMetadataChanged: " + "hiding controls because metadata is null"); hidePlaybackControls(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Timber.d(TAG, "Activity onCreate"); } @Override protected void onStart() { super.onStart(); Timber.d(TAG, "Activity onStart"); controlsFragment = (PlaybackControlsFragment) getSupportFragmentManager() .findFragmentById(R.id.fragment_playback_controls); if (controlsFragment == null) { throw new IllegalStateException("Missing fragment with id `controls`, cannot continue."); } hidePlaybackControls(); } protected void hidePlaybackControls() { Timber.d(TAG, "hidePlaybackControls"); getSupportFragmentManager().beginTransaction() .hide(controlsFragment) .commit(); } @Override protected void onStop() { super.onStop(); Timber.d(TAG, "Activity onStop"); } private void connectToMediaSession(MediaSessionCompat.Token token) { MediaControllerCompat mediaController; try { mediaController = new MediaControllerCompat(this, token); } catch (RemoteException e) { Timber.e(TAG, "connectToMediaSession failed", e); throw new RuntimeException(e); } mediaController.registerCallback(mediaControllerCallback); setMediaControllerCompat(mediaController); if (shouldShowControls()) { showPlaybackControls(); } else { Timber.d(TAG, "connectionCallback.onConnected: " + "hiding controls because metadata is null"); hidePlaybackControls(); } if (controlsFragment != null) { controlsFragment.onConnected(); } onMediaControllerConnected(); } protected boolean shouldShowControls() { MediaControllerCompat mediaController = getMediaControllerCompat(); if (mediaController == null || mediaController.getMetadata() == null || mediaController.getPlaybackState() == null) { return false; } switch (mediaController.getPlaybackState().getState()) { case PlaybackState.STATE_ERROR: case PlaybackState.STATE_NONE: case PlaybackState.STATE_STOPPED: return false; default: return true; } } protected void showPlaybackControls() { Timber.d(TAG, "showPlaybackControls"); if (NetworkHelper.isOnline(this)) { getSupportFragmentManager().beginTransaction() .setCustomAnimations( R.animator.slide_in_from_bottom, R.animator.slide_out_to_bottom, R.animator.slide_in_from_bottom, R.animator.slide_out_to_bottom) .show(controlsFragment) .commit(); } } protected abstract void onMediaControllerConnected(); }