package com.simplecity.amp_library.ui.activities; import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.SystemClock; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.WindowManager; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.jp.wasabeef.glide.transformations.BlurTransformation; import com.simplecity.amp_library.R; import com.simplecity.amp_library.lyrics.LyricsFragment; import com.simplecity.amp_library.model.Playlist; import com.simplecity.amp_library.model.Song; import com.simplecity.amp_library.playback.MusicService; import com.simplecity.amp_library.tagger.TaggerDialog; import com.simplecity.amp_library.ui.fragments.QueueFragment; import com.simplecity.amp_library.ui.fragments.QueuePagerFragment; import com.simplecity.amp_library.ui.views.RepeatingImageButton; import com.simplecity.amp_library.ui.views.SizableSeekBar; import com.simplecity.amp_library.utils.ColorUtils; import com.simplecity.amp_library.utils.DialogUtils; import com.simplecity.amp_library.utils.DrawableUtils; import com.simplecity.amp_library.utils.MusicServiceConnectionUtils; import com.simplecity.amp_library.utils.MusicUtils; import com.simplecity.amp_library.utils.PlaylistUtils; import com.simplecity.amp_library.utils.SettingsManager; import com.simplecity.amp_library.utils.ShuttleUtils; import com.simplecity.amp_library.utils.SleepTimer; import com.simplecity.amp_library.utils.StringUtils; import com.simplecity.amp_library.utils.ThemeUtils; import java.lang.ref.WeakReference; import java.util.Collections; import java.util.List; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; public class PlayerActivity extends BaseCastActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, MusicUtils.Defs, ServiceConnection { private static final String TAG = "PlayerActivity"; private static final int REFRESH = 1; private BroadcastReceiver mStatusListener; private boolean mIsPaused = false; private long mStartSeekPos = 0; private long mLastShortSeekEventTime; private long mLastSeekEventTime; private TimeHandler mTimeHandler; private static final String QUEUE_FRAGMENT = "queue_fragment"; private static final String QUEUE_PAGER_FRAGMENT = "queue_pager_fragment"; private static final String LYRICS_FRAGMENT = "lyrics_fragment"; private ImageButton mPauseButton; private ImageButton mShuffleButton; private ImageButton mRepeatButton; private RepeatingImageButton mNextButton; private RepeatingImageButton mPrevButton; private SizableSeekBar mSeekBar; private TextView mArtist; private TextView mTrack; private TextView mAlbum; private TextView mCurrentTime; private TextView mTotalTime; private TextView mQueuePosition; private ImageView mBackgroundImage; private View mTextViewContainer; private View mButtonContainer; private Toolbar mToolbar; @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onCreate(Bundle savedInstanceState) { ThemeUtils.setTheme(this); if (!ShuttleUtils.hasLollipop() && ShuttleUtils.hasKitKat()) { getWindow().setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS); } if (ShuttleUtils.hasLollipop()) { if (!ShuttleUtils.hasKitKat()) { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); } else { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); getWindow().setStatusBarColor(Color.TRANSPARENT); } } if (SettingsManager.getInstance().canTintNavBar()) { getWindow().setNavigationBarColor(ColorUtils.getPrimaryColorDark(this)); } super.onCreate(savedInstanceState); setContentView(R.layout.activity_player); mToolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(mToolbar); getSupportActionBar().setTitle(null); getSupportActionBar().setDisplayHomeAsUpEnabled(true); ThemeUtils.themeActionBar(this); ThemeUtils.themeStatusBar(this, null); if (!ShuttleUtils.isTablet() && ShuttleUtils.isLandscape()) { getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ColorUtils.getPrimaryColor())); } else { getSupportActionBar().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.parseColor("#20000000"))); } mTimeHandler = new TimeHandler(this); mTrack = (TextView) findViewById(R.id.text1); mAlbum = (TextView) findViewById(R.id.text2); mArtist = (TextView) findViewById(R.id.text3); mCurrentTime = (TextView) findViewById(R.id.current_time); mTotalTime = (TextView) findViewById(R.id.total_time); mQueuePosition = (TextView) findViewById(R.id.queue_position); mQueuePosition = (TextView) findViewById(R.id.queue_position); mPauseButton = (ImageButton) findViewById(R.id.play); mPauseButton.setOnClickListener(this); mNextButton = (RepeatingImageButton) findViewById(R.id.next); mNextButton.setOnClickListener(this); mNextButton.setRepeatListener(mFastForwardListener); mPrevButton = (RepeatingImageButton) findViewById(R.id.prev); mPrevButton.setOnClickListener(this); mPrevButton.setRepeatListener(mRewindListener); mRepeatButton = (ImageButton) findViewById(R.id.repeat); mRepeatButton.setOnClickListener(this); mShuffleButton = (ImageButton) findViewById(R.id.shuffle); mShuffleButton.setOnClickListener(this); mTextViewContainer = findViewById(R.id.textContainer); mButtonContainer = findViewById(R.id.button_container); mSeekBar = (SizableSeekBar) findViewById(R.id.seekbar); mSeekBar.setMax(1000); mSeekBar.setOnSeekBarChangeListener(this); mBackgroundImage = (ImageView) findViewById(R.id.background); themeUIComponents(); if (savedInstanceState == null) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out); ft.replace(R.id.main_container, new QueuePagerFragment(), QUEUE_PAGER_FRAGMENT); if (ShuttleUtils.isTablet()) { ft.replace(R.id.queue_container, QueueFragment.newInstance(), QUEUE_FRAGMENT); } ft.commit(); } Glide.with(this) .load(MusicUtils.getAlbumArtist()) .diskCacheStrategy(DiskCacheStrategy.ALL) .bitmapTransform(new BlurTransformation(this)) .override(500, 500) .into(mBackgroundImage); } @Override protected void onPause() { mTimeHandler.removeMessages(REFRESH); super.onPause(); } @Override protected void onStop() { unregisterReceiver(mStatusListener); super.onStop(); } @Override protected void onStart() { super.onStart(); mStatusListener = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action != null) { switch (action) { case MusicService.InternalIntents.META_CHANGED: updateTrackInfo(); setPauseButtonImage(); queueNextRefresh(1); break; case MusicService.InternalIntents.PLAY_STATE_CHANGED: setPauseButtonImage(); break; case MusicService.InternalIntents.REPEAT_CHANGED: setRepeatButtonImage(); break; case MusicService.InternalIntents.SHUFFLE_CHANGED: setShuffleButtonImage(); break; } } } }; final IntentFilter filter = new IntentFilter(); filter.addAction(MusicService.InternalIntents.PLAY_STATE_CHANGED); filter.addAction(MusicService.InternalIntents.META_CHANGED); filter.addAction(MusicService.InternalIntents.SHUFFLE_CHANGED); filter.addAction(MusicService.InternalIntents.REPEAT_CHANGED); registerReceiver(mStatusListener, new IntentFilter(filter)); } @Override public void onResume() { super.onResume(); final long next = refreshCurrentTime(); queueNextRefresh(next); updateTrackInfo(); setPauseButtonImage(); setShuffleButtonImage(); setRepeatButtonImage(); } @Override protected void onDestroy() { mIsPaused = false; mTimeHandler.removeMessages(REFRESH); super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_player_activity, menu); if (!ShuttleUtils.isUpgraded()) { menu.findItem(R.id.media_route_menu_item).setVisible(false); } else { if (mCastManager != null) { mCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item); } } menu.add(0, OPTIONS, OPTIONS, R.string.settings); menu.add(0, EQUALIZER, 2, R.string.equalizer); menu.add(0, TIMER, TIMER, R.string.timer); if (ShuttleUtils.isUpgraded()) { menu.add(0, TAGGER, 4, R.string.edit_tags); } SubMenu sub = menu.addSubMenu(0, ADD_TO_PLAYLIST, 5, R.string.save_as_playlist); PlaylistUtils.makePlaylistMenu(this, sub, 0); menu.add(0, CLEAR_QUEUE, 6, R.string.clear_queue); menu.add(0, VIEW_INFO, 7, R.string.song_info); menu.add(0, DELETE_ITEM, 8, R.string.delete_item); if (ShuttleUtils.isTablet()) { if (menu.findItem(R.id.menu_list) != null) { menu.removeItem(R.id.menu_list); } } return super.onCreateOptionsMenu(menu); } @Override public boolean onPrepareOptionsMenu(Menu menu) { PlaylistUtils.isFavorite(this, MusicUtils.getSong()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(isFavorite -> { if (isFavorite) { final MenuItem favItem = menu.findItem(R.id.menu_favorite); int[] attrs = new int[]{R.attr.btn_fav_pressed /* index 0 */}; TypedArray ta = obtainStyledAttributes(attrs); if (ta != null) { Drawable drawableFromTheme = ta.getDrawable(0 /* index */); ta.recycle(); if (favItem != null) { favItem.setIcon(drawableFromTheme); } } } }); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } if (item.getItemId() == R.id.menu_favorite) { PlaylistUtils.toggleFavorite(this); supportInvalidateOptionsMenu(); return true; } if (item.getItemId() == R.id.menu_list) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out, R.anim.abc_fade_in, R.anim.abc_fade_out); //Remove the lyrics fragment Fragment lyricsFragment = getSupportFragmentManager().findFragmentByTag(LYRICS_FRAGMENT); if (lyricsFragment != null) { ft.remove(lyricsFragment); } Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.queue_container); if (fragment instanceof QueueFragment) { ft.remove(getSupportFragmentManager().findFragmentByTag(QUEUE_FRAGMENT)); } else { ft.add(R.id.queue_container, QueueFragment.newInstance(), QUEUE_FRAGMENT); } ft.commit(); return true; } switch (item.getItemId()) { case EQUALIZER: { final Intent equalizerIntent = new Intent(this, EqualizerActivity.class); startActivity(equalizerIntent); return true; } case OPTIONS: { startActivity(new Intent(this, SettingsActivity.class)); return true; } case TIMER: { SleepTimer.createTimer(this, MusicUtils.getTimerActive(), MusicUtils.getTimeRemaining()); return true; } case DELETE_ITEM: { new DialogUtils.DeleteDialogBuilder() .context(this) .singleMessageId(R.string.delete_song_desc) .multipleMessage(R.string.delete_song_desc_multiple) .itemNames(Collections.singletonList(MusicUtils.getSongName())) .songsToDelete(Observable.just(Collections.singletonList(MusicUtils.getSong()))) .build() .show(); return true; } case NEW_PLAYLIST: { PlaylistUtils.createPlaylistDialog(this, MusicUtils.getQueue()); return true; } case PLAYLIST_SELECTED: { List<Song> songs = MusicUtils.getQueue(); Playlist playlist = (Playlist) item.getIntent().getSerializableExtra(ShuttleUtils.ARG_PLAYLIST); PlaylistUtils.addToPlaylist(this, playlist, songs); return true; } case CLEAR_QUEUE: { MusicUtils.clearQueue(); Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); return true; } case TAGGER: { TaggerDialog.newInstance(MusicUtils.getSong()) .show(getSupportFragmentManager()); return true; } case VIEW_INFO: { DialogUtils.showSongInfoDialog(this, MusicUtils.getSong()); return true; } } if (item.getItemId() == R.id.menu_share) { String path = MusicUtils.getFilePath(); if (!TextUtils.isEmpty(path)) { DialogUtils.showShareDialog(PlayerActivity.this, MusicUtils.getSong()); } return true; } if (item.getItemId() == R.id.menu_lyrics) { toggleLyrics(); return true; } return false; } public void themeUIComponents() { if (mPauseButton != null) { mPauseButton.setImageDrawable(DrawableUtils.getColoredStateListDrawableWithThemeColor(this, mPauseButton.getDrawable(), ThemeUtils.WHITE)); } if (mNextButton != null) { mNextButton.setImageDrawable(DrawableUtils.getColoredStateListDrawableWithThemeColor(this, mNextButton.getDrawable(), ThemeUtils.WHITE)); } if (mPrevButton != null) { mPrevButton.setImageDrawable(DrawableUtils.getColoredStateListDrawableWithThemeColor(this, mPrevButton.getDrawable(), ThemeUtils.WHITE)); } if (mSeekBar != null) { ThemeUtils.themeSeekBar(this, mSeekBar, true); } if (mTextViewContainer != null) { mTextViewContainer.setBackgroundColor(ColorUtils.getPrimaryColorDark(this)); } if (mButtonContainer != null) { mButtonContainer.setBackgroundColor(ColorUtils.getPrimaryColor()); } setShuffleButtonImage(); setRepeatButtonImage(); } @Override public void onClick(View view) { if (view == mPauseButton) { doPauseResume(); } else if (view == mNextButton) { MusicUtils.next(); } else if (view == mPrevButton) { MusicUtils.previous(true); } else if (view == mRepeatButton) { cycleRepeat(); } else if (view == mShuffleButton) { toggleShuffle(); } } private boolean mFromTouch = false; private long mPosOverride = -1; @Override public void onStartTrackingTouch(SeekBar bar) { mLastSeekEventTime = 0; mFromTouch = true; mCurrentTime.setVisibility(View.VISIBLE); } @Override public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) { if (!fromUser) { return; } final long now = SystemClock.elapsedRealtime(); if (now - mLastSeekEventTime > 250) { mLastSeekEventTime = now; mLastShortSeekEventTime = now; mPosOverride = MusicUtils.getDuration() * progress / 1000; MusicUtils.seekTo(mPosOverride); if (!mFromTouch) { mPosOverride = -1; } } else if (now - mLastShortSeekEventTime > 5) { mLastShortSeekEventTime = now; mPosOverride = MusicUtils.getDuration() * progress / 1000; refreshCurrentTimeText(mPosOverride); } } @Override public void onStopTrackingTouch(SeekBar bar) { if (mPosOverride != -1) { MusicUtils.seekTo(mPosOverride); } mPosOverride = -1; mFromTouch = false; } @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { super.onServiceConnected(componentName, iBinder); updateTrackInfo(); setPauseButtonImage(); QueuePagerFragment queuePagerFragment = (QueuePagerFragment) getSupportFragmentManager().findFragmentByTag(QUEUE_PAGER_FRAGMENT); if (queuePagerFragment != null) { queuePagerFragment.resetAdapter(); queuePagerFragment.updateQueuePosition(); } } @Override public void themeColorChanged() { themeUIComponents(); } private static final class TimeHandler extends Handler { private final WeakReference<PlayerActivity> mNowPlayingActivity; public TimeHandler(final PlayerActivity playingActivity) { mNowPlayingActivity = new WeakReference<>(playingActivity); } @Override public void handleMessage(Message msg) { switch (msg.what) { case REFRESH: PlayerActivity playerActivity = mNowPlayingActivity.get(); if (playerActivity != null) { final long next = playerActivity.refreshCurrentTime(); playerActivity.queueNextRefresh(next); } break; default: break; } } } public void queueNextRefresh(long delay) { if (!mIsPaused) { final Message message = mTimeHandler.obtainMessage(REFRESH); mTimeHandler.removeMessages(REFRESH); mTimeHandler.sendMessageDelayed(message, delay); } } /** * Method refreshCurrentTimeText. * * @param pos the {@link long} position of the current track} */ private void refreshCurrentTimeText(final long pos) { mCurrentTime.setText(StringUtils.makeTimeString(this, pos / 1000)); } /** * Method refreshNow. * * @return long */ long refreshCurrentTime() { try { final long pos = mPosOverride < 0 ? MusicUtils.getPosition() : mPosOverride; if (pos >= 0 && MusicUtils.getDuration() > 0) { refreshCurrentTimeText(pos); final int progress = (int) (1000 * pos / MusicUtils.getDuration()); mSeekBar.setProgress(progress); if (mFromTouch) { return 500; } else if (MusicUtils.isPlaying()) { mCurrentTime.setVisibility(View.VISIBLE); } else { // blink the counter final int vis = mCurrentTime.getVisibility(); mCurrentTime.setVisibility(vis == View.INVISIBLE ? View.VISIBLE : View.INVISIBLE); return 500; } } else { mCurrentTime.setText("--:--"); mSeekBar.setProgress(1000); } // calculate the number of milliseconds until the next full second, // so // the counter can be updated at just the right time final long remaining = 1000 - pos % 1000; // approximate how often we would need to refresh the slider to // move it smoothly int width = mSeekBar.getWidth(); if (width == 0) { width = 320; } final long smoothrefreshtime = MusicUtils.getDuration() / width; if (smoothrefreshtime > remaining) { return remaining; } if (smoothrefreshtime < 20) { return 20; } return smoothrefreshtime; } catch (final Exception ignored) { } return 500; } public void updateTrackInfo() { String totalTime = StringUtils.makeTimeString(this, MusicUtils.getDuration() / 1000); String trackName = MusicUtils.getSongName(); String albumName = MusicUtils.getAlbumName(); String artistName = MusicUtils.getAlbumArtistName(); String currentQueuePos = String.valueOf(MusicUtils.getQueuePosition() + 1); String queueLength = String.valueOf(MusicUtils.getQueue().size()); if (totalTime != null && totalTime.length() != 0) { mTotalTime.setText(" / " + totalTime); } if (trackName != null && trackName.length() != 0) { mTrack.setText(trackName); mTrack.setSelected(true); } if (albumName != null && artistName != null && albumName.length() != 0 && artistName.length() != 0) { if (mArtist == null) { mAlbum.setText(artistName + " - " + albumName); } else { mAlbum.setText(albumName); mArtist.setText(artistName); } } mQueuePosition.setText(currentQueuePos + " / " + queueLength); queueNextRefresh(1); supportInvalidateOptionsMenu(); Glide.with(this) .load(MusicUtils.getAlbumArtist()) .diskCacheStrategy(DiskCacheStrategy.ALL) .bitmapTransform(new BlurTransformation(this)) .override(500, 500) .into(mBackgroundImage); } private final RepeatingImageButton.RepeatListener mRewindListener = (v, howlong, repcnt) -> scanBackward(repcnt, howlong); private final RepeatingImageButton.RepeatListener mFastForwardListener = (v, howlong, repcnt) -> scanForward(repcnt, howlong); public void scanForward(final int repcnt, long delta) { if (repcnt == 0) { mStartSeekPos = MusicUtils.getPosition(); mLastSeekEventTime = 0; } else { if (delta < 5000) { // seek at 10x speed for the first 5 seconds delta = delta * 10; } else { // seek at 40x after that delta = 50000 + (delta - 5000) * 40; } long newpos = mStartSeekPos + delta; final long duration = MusicUtils.getDuration(); if (newpos >= duration) { // move to next track MusicUtils.next(); mStartSeekPos -= duration; // is OK to go negative newpos -= duration; } if (delta - mLastSeekEventTime > 250 || repcnt < 0) { MusicUtils.seekTo(newpos); mLastSeekEventTime = delta; } if (repcnt >= 0) { mPosOverride = newpos; } else { mPosOverride = -1; } refreshCurrentTime(); } } public void scanBackward(final int repcnt, long delta) { if (repcnt == 0) { mStartSeekPos = MusicUtils.getPosition(); mLastSeekEventTime = 0; } else { if (delta < 5000) { // seek at 10x speed for the first 5 seconds delta = delta * 10; } else { // seek at 40x after that delta = 50000 + (delta - 5000) * 40; } long newpos = mStartSeekPos - delta; if (newpos < 0) { // move to previous track MusicUtils.previous(true); final long duration = MusicUtils.getDuration(); mStartSeekPos += duration; newpos += duration; } if (delta - mLastSeekEventTime > 250 || repcnt < 0) { MusicUtils.seekTo(newpos); mLastSeekEventTime = delta; } if (repcnt >= 0) { mPosOverride = newpos; } else { mPosOverride = -1; } refreshCurrentTime(); } } public void setShuffleButtonImage() { if (mShuffleButton == null) { return; } switch (MusicUtils.getShuffleMode()) { case MusicService.ShuffleMode.OFF: mShuffleButton.setImageDrawable(DrawableUtils.getWhiteDrawable(this, R.drawable.ic_shuffle_white)); break; default: mShuffleButton.setImageDrawable(DrawableUtils.getColoredAccentDrawableNonWhite(this, getResources().getDrawable(R.drawable.ic_shuffle_white))); break; } } public void setPauseButtonImage() { if (mPauseButton == null) { return; } if (MusicServiceConnectionUtils.sServiceBinder != null && MusicUtils.isPlaying()) { mPauseButton.setImageDrawable(DrawableUtils.getColoredStateListDrawableWithThemeColor(this, R.drawable.ic_pause_white, ThemeUtils.WHITE)); } else { mPauseButton.setImageDrawable(DrawableUtils.getColoredStateListDrawableWithThemeColor(this, R.drawable.ic_play_white, ThemeUtils.WHITE)); } } public void setRepeatButtonImage() { if (mRepeatButton == null) { return; } switch (MusicUtils.getRepeatMode()) { case MusicService.RepeatMode.ALL: mRepeatButton.setImageDrawable(DrawableUtils.getColoredAccentDrawableNonWhite(this, getResources().getDrawable(R.drawable.ic_repeat_white))); break; case MusicService.RepeatMode.ONE: mRepeatButton.setImageDrawable(DrawableUtils.getColoredAccentDrawableNonWhite(this, getResources().getDrawable(R.drawable.ic_repeat_one_white))); break; default: mRepeatButton.setImageDrawable(DrawableUtils.getWhiteDrawable(this, R.drawable.ic_repeat_white)); break; } } private void doPauseResume() { MusicUtils.playOrPause(); setPauseButtonImage(); } private void cycleRepeat() { MusicUtils.cycleRepeat(); setRepeatButtonImage(); } private void toggleShuffle() { MusicUtils.toggleShuffleMode(); setRepeatButtonImage(); setShuffleButtonImage(); } public void toggleLyrics() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.abc_fade_in, R.anim.abc_fade_out); if (!ShuttleUtils.isTablet()) { Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.queue_container); if (fragment instanceof LyricsFragment) { ft.remove(fragment); } else { ft.replace(R.id.queue_container, new LyricsFragment(), LYRICS_FRAGMENT); } ft.commit(); return; } Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container); if (fragment instanceof LyricsFragment) { ft.remove(fragment); } else { ft.add(R.id.main_container, new LyricsFragment(), LYRICS_FRAGMENT); } ft.commit(); } public void setToolbarBackroundColor(int color) { mToolbar.setBackgroundColor(color); } @Override protected String screenName() { return TAG; } }