OSDN Git Service

Eleven: much material
[android-x86/packages-apps-Eleven.git] / src / com / cyanogenmod / eleven / ui / fragments / AudioPlayerFragment.java
index 877cda4..e5dfde6 100644 (file)
@@ -27,6 +27,7 @@ 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;
@@ -55,13 +56,11 @@ import com.cyanogenmod.eleven.menu.CreateNewPlaylist;
 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;
@@ -69,13 +68,13 @@ import com.cyanogenmod.eleven.widgets.QueueButton;
 import com.cyanogenmod.eleven.widgets.RepeatButton;
 import com.cyanogenmod.eleven.widgets.RepeatingImageButton;
 import com.cyanogenmod.eleven.widgets.ShuffleButton;
+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();
 
     /**
@@ -117,9 +116,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
     // Next button
     private RepeatingImageButton mNextButton;
 
-    private BrowseButton mBrowseButton;
-    private QueueButton mQueueButton;
-
     // Album art ListView
     private ViewPager mAlbumArtViewPager;
     private LoadingEmptyContainer mQueueEmpty;
@@ -132,11 +128,8 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
     // 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;
@@ -157,8 +150,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
 
     private boolean mIsPaused = false;
 
-    private boolean mFromTouch = false;
-
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
@@ -177,9 +168,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
 
         // Initialize the broadcast receiver
         mPlaybackStatus = new PlaybackStatus(this);
-
-        // add a listener for the sliding
-        ((SlidingPanelActivity)getActivity()).addSlidingPanelListener(this);
     }
 
     /**
@@ -196,9 +184,9 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
 
         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);
 
@@ -240,6 +228,8 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         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
@@ -248,8 +238,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
 
         // resumes the update callback for the play pause progress button
         mPlayPauseProgressButton.resume();
-
-        mEqualizerView.onStart();
     }
 
     @Override
@@ -260,8 +248,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         mPlayPauseProgressButton.pause();
 
         mImageFetcher.flush();
-
-        mEqualizerView.onStop();
     }
 
     @Override
@@ -276,8 +262,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
             mToken = null;
         }
 
-        ((SlidingPanelActivity)getActivity()).removeSlidingPanelListener(this);
-
         // Unregister the receiver
         try {
             getActivity().unregisterReceiver(mPlaybackStatus);
@@ -297,7 +281,11 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         headerBar.setOutlineProvider(new ViewOutlineProvider() {
             @Override
             public void getOutline(View view, Outline outline) {
-                outline.setRect(0, -bottomActionBarHeight, view.getWidth(), view.getHeight());
+                // 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());
             }
         });
 
@@ -354,14 +342,11 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
      */
     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);
@@ -475,18 +460,10 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         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);
         }
     }
@@ -542,49 +519,48 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
     }
 
     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;
     }
 
     /**
@@ -735,16 +711,21 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         }
     }
 
-    @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);
     }
 
     /**
@@ -807,6 +788,7 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
             } 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
@@ -820,6 +802,8 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
                 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();
             }
         }
     }