import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
+import android.graphics.Outline;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
+import android.os.PowerManager;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.text.Html;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.cyanogenmod.eleven.menu.DeleteDialog;
import com.cyanogenmod.eleven.menu.FragmentMenuItems;
import com.cyanogenmod.eleven.ui.activities.HomeActivity;
-import com.cyanogenmod.eleven.ui.activities.SlidingPanelActivity;
import com.cyanogenmod.eleven.utils.ApolloUtils;
import com.cyanogenmod.eleven.utils.MusicUtils;
import com.cyanogenmod.eleven.utils.NavUtils;
import com.cyanogenmod.eleven.utils.PreferenceUtils;
import com.cyanogenmod.eleven.widgets.BrowseButton;
-import com.cyanogenmod.eleven.widgets.EqualizerView;
import com.cyanogenmod.eleven.widgets.LoadingEmptyContainer;
import com.cyanogenmod.eleven.widgets.NoResultsContainer;
import com.cyanogenmod.eleven.widgets.PlayPauseProgressButton;
import com.cyanogenmod.eleven.widgets.RepeatButton;
import com.cyanogenmod.eleven.widgets.RepeatingImageButton;
import com.cyanogenmod.eleven.widgets.ShuffleButton;
-import com.cyanogenmod.eleven.widgets.theme.HoloSelector;
+import com.cyanogenmod.eleven.widgets.VisualizerView;
import java.lang.ref.WeakReference;
import static com.cyanogenmod.eleven.utils.MusicUtils.mService;
-public class AudioPlayerFragment extends Fragment implements ServiceConnection,
- SlidingPanelActivity.ISlidingPanelListener {
+public class AudioPlayerFragment extends Fragment implements ServiceConnection {
private static final String TAG = AudioPlayerFragment.class.getSimpleName();
/**
// Next button
private RepeatingImageButton mNextButton;
- private BrowseButton mBrowseButton;
- private QueueButton mQueueButton;
-
// Album art ListView
private ViewPager mAlbumArtViewPager;
private LoadingEmptyContainer mQueueEmpty;
// Total time
private TextView mTotalTime;
- // Equalizer View
- private EqualizerView mEqualizerView;
-
- // Equalizer Gradient
- private View mEqualizerGradient;
+ // Visualizer View
+ private VisualizerView mVisualizerView;
// Broadcast receiver
private PlaybackStatus mPlaybackStatus;
private boolean mIsPaused = false;
- private boolean mFromTouch = false;
-
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Initialize the broadcast receiver
mPlaybackStatus = new PlaybackStatus(this);
-
- // add a listener for the sliding
- ((SlidingPanelActivity)getActivity()).addSlidingPanelListener(this);
}
/**
initPlaybackControls();
- mEqualizerView = (EqualizerView) mRootView.findViewById(R.id.equalizerView);
- mEqualizerView.initialize(getActivity());
- mEqualizerGradient = mRootView.findViewById(R.id.equalizerGradient);
+ mVisualizerView = (VisualizerView) mRootView.findViewById(R.id.visualizerView);
+ mVisualizerView.initialize(getActivity());
+ updateVisualizerPowerSaveMode();
mLyricsText = (TextView) mRootView.findViewById(R.id.audio_player_lyrics);
filter.addAction(MusicPlaybackService.QUEUE_CHANGED);
// Listen for lyrics text for the audio track
filter.addAction(MusicPlaybackService.NEW_LYRICS);
+ // Listen for power save mode changed
+ filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
// Register the intent filters
getActivity().registerReceiver(mPlaybackStatus, filter);
// Refresh the current time
// resumes the update callback for the play pause progress button
mPlayPauseProgressButton.resume();
-
- mEqualizerView.onStart();
}
@Override
mPlayPauseProgressButton.pause();
mImageFetcher.flush();
-
- mEqualizerView.onStop();
}
@Override
mToken = null;
}
- ((SlidingPanelActivity)getActivity()).removeSlidingPanelListener(this);
-
// Unregister the receiver
try {
getActivity().unregisterReceiver(mPlaybackStatus);
* Initializes the header bar
*/
private void initHeaderBar() {
+ View headerBar = mRootView.findViewById(R.id.audio_player_header);
+ final int bottomActionBarHeight =
+ getResources().getDimensionPixelSize(R.dimen.bottom_action_bar_height);
+
+ headerBar.setOutlineProvider(new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ // since we only want the top and bottom shadows, pad the horizontal width
+ // to hide the shadows. Can't seem to find a better way to do this
+ int padWidth = (int)(0.2f * view.getWidth());
+ outline.setRect(-padWidth, -bottomActionBarHeight, view.getWidth() + padWidth,
+ view.getHeight());
+ }
+ });
+
// Title text
mSongTitle = (TextView) mRootView.findViewById(R.id.header_bar_song_title);
mArtistName = (TextView) mRootView.findViewById(R.id.header_bar_artist_title);
// Buttons
// Search Button
View v = mRootView.findViewById(R.id.header_bar_search_button);
- v.setBackground(new HoloSelector(getActivity()));
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Add to Playlist Button
// Setup the playlist button - add a click listener to show the context
mAddToPlaylistButton = (ImageView) mRootView.findViewById(R.id.header_bar_add_button);
- mAddToPlaylistButton.setBackground(new HoloSelector(getActivity()));
// Create the context menu when requested
mAddToPlaylistButton.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {
// Add the menu button
// menu button
mMenuButton = (ImageView) mRootView.findViewById(R.id.header_bar_menu_button);
- mMenuButton.setBackground(new HoloSelector(getActivity()));
mMenuButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
*/
private void initPlaybackControls() {
mPlayPauseProgressButton = (PlayPauseProgressButton)mRootView.findViewById(R.id.playPauseProgressButton);
+ mPlayPauseProgressButton.setDragEnabled(true);
mShuffleButton = (ShuffleButton)mRootView.findViewById(R.id.action_button_shuffle);
mRepeatButton = (RepeatButton)mRootView.findViewById(R.id.action_button_repeat);
mPreviousButton = (RepeatingImageButton)mRootView.findViewById(R.id.action_button_previous);
mNextButton = (RepeatingImageButton)mRootView.findViewById(R.id.action_button_next);
- mBrowseButton = (BrowseButton)mRootView.findViewById(R.id.action_button_browse);
- mBrowseButton.setActivity(getActivity());
- mQueueButton = (QueueButton)mRootView.findViewById(R.id.action_button_queue);
- mQueueButton.setActivity(getActivity());
// Album art view pager
mAlbumArtViewPager = (ViewPager)mRootView.findViewById(R.id.audio_player_album_art_viewpager);
if(queueSize == 0) {
mAlbumArtViewPager.setVisibility(View.GONE);
mQueueEmpty.showNoResults();
- mEqualizerGradient.setVisibility(View.GONE);
- mEqualizerView.checkStateChanged();
mAddToPlaylistButton.setVisibility(View.GONE);
} else {
mAlbumArtViewPager.setVisibility(View.VISIBLE);
mQueueEmpty.hideAll();
- if (PreferenceUtils.getInstance(getActivity()).getShowVisualizer()) {
- mEqualizerGradient.setVisibility(View.VISIBLE);
- } else {
- mEqualizerGradient.setVisibility(View.GONE);
- }
- mEqualizerView.checkStateChanged();
mAddToPlaylistButton.setVisibility(View.VISIBLE);
}
}
}
private void refreshCurrentTimeText(final long pos) {
- mCurrentTime.setText(MusicUtils.makeShortTimeString(getActivity(), pos / 1000));
+ if (mPlayPauseProgressButton.isDragging()) {
+ mCurrentTime.setText(MusicUtils.makeShortTimeString(getActivity(),
+ mPlayPauseProgressButton.getDragProgressInMs() / 1000));
+ } else {
+ mCurrentTime.setText(MusicUtils.makeShortTimeString(getActivity(), pos / 1000));
+ }
}
/* Used to update the current time string */
private long refreshCurrentTime() {
if (mService == null) {
- return 500;
+ return MusicUtils.UPDATE_FREQUENCY_MS;
}
try {
final long pos = MusicUtils.position();
if (pos >= 0 && MusicUtils.duration() > 0) {
refreshCurrentTimeText(pos);
- if (mFromTouch) {
- return 500;
+ if (mPlayPauseProgressButton.isDragging()) {
+ mCurrentTime.setVisibility(View.VISIBLE);
+ return MusicUtils.UPDATE_FREQUENCY_FAST_MS;
} else if (MusicUtils.isPlaying()) {
mCurrentTime.setVisibility(View.VISIBLE);
+
+ // calculate the number of milliseconds until the next full second,
+ // so the counter can be updated at just the right time
+ return Math.max(20, 1000 - pos % 1000);
} else {
// blink the counter
final int vis = mCurrentTime.getVisibility();
mCurrentTime.setVisibility(vis == View.INVISIBLE ? View.VISIBLE
: View.INVISIBLE);
- return 500;
}
} else {
mCurrentTime.setText("--:--");
}
-
- // 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;
- if (remaining < 20) {
- return 20;
- }
-
- return remaining;
} catch (final Exception ignored) {
if (ignored.getMessage() != null) {
Log.e(TAG, ignored.getMessage());
}
}
- return 500;
+ return MusicUtils.UPDATE_FREQUENCY_MS;
}
/**
}
}
- @Override
- public void onBeginSlide() {
- mEqualizerView.setPanelVisible(false);
+ public void setVisualizerVisible(boolean visible) {
+ if (visible && PreferenceUtils.getInstance(getActivity()).getShowVisualizer()) {
+ mVisualizerView.setVisible(true);
+ } else {
+ mVisualizerView.setVisible(false);
+ }
}
- @Override
- public void onFinishSlide(SlidingPanelActivity.Panel visiblePanel) {
- if (visiblePanel == SlidingPanelActivity.Panel.MusicPlayer) {
- mEqualizerView.setPanelVisible(true);
- }
+ public void updateVisualizerPowerSaveMode() {
+ PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
+ mVisualizerView.setPowerSaveMode(pm.isPowerSaveMode());
+ }
+
+ public void setVisualizerColor(int color) {
+ mVisualizerView.setColor(color);
}
/**
} else if (action.equals(MusicPlaybackService.PLAYSTATE_CHANGED)) {
// Set the play and pause image
audioPlayerFragment.mPlayPauseProgressButton.getPlayPauseButton().updateState();
+ audioPlayerFragment.mVisualizerView.setPlaying(MusicUtils.isPlaying());
} else if (action.equals(MusicPlaybackService.REPEATMODE_CHANGED)
|| action.equals(MusicPlaybackService.SHUFFLEMODE_CHANGED)) {
// Set the repeat image
audioPlayerFragment.createAndSetAdapter();
} else if (action.equals(MusicPlaybackService.NEW_LYRICS)) {
audioPlayerFragment.onLyrics(intent.getStringExtra("lyrics"));
+ } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {
+ audioPlayerFragment.updateVisualizerPowerSaveMode();
}
}
}