OSDN Git Service

Visualizer tweaks
authorUtkarsh Gupta <utkarsh.eminem@gmail.com>
Thu, 23 Jul 2015 05:53:46 +0000 (11:23 +0530)
committerUtkarsh Gupta <utkarsh.eminem@gmail.com>
Sat, 8 Aug 2015 06:46:39 +0000 (12:16 +0530)
- Show visualizer even when sliding panels
- Hide visualizer in power save mode
- Ignore first 2 bytes of FFT Data - they are quite random
- Hide visualizer in landscape mode
- Reduce color update delay

Change-Id: I90f1a442db2f56f0e4075ff096711c163626731b
Signed-off-by: Utkarsh Gupta <utkarsh.eminem@gmail.com>
src/com/cyanogenmod/eleven/ui/activities/HomeActivity.java
src/com/cyanogenmod/eleven/ui/activities/SlidingPanelActivity.java
src/com/cyanogenmod/eleven/ui/fragments/AudioPlayerFragment.java
src/com/cyanogenmod/eleven/widgets/VisualizerView.java

index 68819b1..d946039 100644 (file)
@@ -171,8 +171,6 @@ public class HomeActivity extends SlidingPanelActivity implements
 
     @Override
     protected void onSlide(float slideOffset) {
-        super.onSlide(slideOffset);
-
         boolean isInBrowser = getCurrentPanel() == Panel.Browse && slideOffset < 0.7f;
         if (isInBrowser != mBrowsePanelActive) {
             mBrowsePanelActive = isInBrowser;
index ace0947..b0bedf1 100644 (file)
@@ -30,8 +30,6 @@ import com.cyanogenmod.eleven.utils.ApolloUtils;
 import com.cyanogenmod.eleven.utils.MusicUtils;
 import com.cyanogenmod.eleven.widgets.BlurScrimImage;
 
-import java.util.HashSet;
-
 /**
  * This class is used to display the {@link ViewPager} used to swipe between the
  * main {@link Fragment}s used to browse the user's music.
@@ -47,18 +45,11 @@ public abstract class SlidingPanelActivity extends BaseActivity {
         None,
     }
 
-    public static interface ISlidingPanelListener {
-        public void onBeginSlide();
-        public void onFinishSlide(SlidingPanelActivity.Panel visiblePanel);
-    }
-
     private static final String STATE_KEY_CURRENT_PANEL = "CurrentPanel";
 
     private SlidingUpPanelLayout mFirstPanel;
     private SlidingUpPanelLayout mSecondPanel;
     protected Panel mTargetNavigatePanel;
-    private HashSet<ISlidingPanelListener> mSlidingPanelListeners
-            = new HashSet<ISlidingPanelListener>();
 
     private final ShowPanelClickListener mShowBrowse = new ShowPanelClickListener(Panel.Browse);
     private final ShowPanelClickListener mShowMusicPlayer = new ShowPanelClickListener(Panel.MusicPlayer);
@@ -141,11 +132,13 @@ public abstract class SlidingPanelActivity extends BaseActivity {
             @Override
             public void onPanelExpanded(View panel) {
                 checkTargetNavigation();
+                getAudioPlayerFragment().setVisualizerVisible(true);
             }
 
             @Override
             public void onPanelCollapsed(View panel) {
                 checkTargetNavigation();
+                getAudioPlayerFragment().setVisualizerVisible(false);
             }
         });
     }
@@ -252,27 +245,15 @@ public abstract class SlidingPanelActivity extends BaseActivity {
     }
 
     protected void onSlide(float slideOffset) {
-        for (ISlidingPanelListener listener : mSlidingPanelListeners) {
-            listener.onBeginSlide();
-        }
     }
 
     /**
      * This checks if we are at our target panel and resets our flag if we are there
      */
     protected void checkTargetNavigation() {
-        final Panel currentPanel = getCurrentPanel();
-        // This checks if we are at our target panel and resets our flag if we are there
-        if (mTargetNavigatePanel == currentPanel) {
+        if (mTargetNavigatePanel == getCurrentPanel()) {
             mTargetNavigatePanel = Panel.None;
         }
-
-        // if we are at the target panel
-        if (mTargetNavigatePanel == Panel.None) {
-            for (ISlidingPanelListener listener : mSlidingPanelListeners) {
-                listener.onFinishSlide(currentPanel);
-            }
-        }
     }
 
     public Panel getCurrentPanel() {
@@ -339,12 +320,4 @@ public abstract class SlidingPanelActivity extends BaseActivity {
             showPanel(mTargetPanel);
         }
     }
-
-    public void addSlidingPanelListener(final ISlidingPanelListener listener) {
-        mSlidingPanelListeners.add(listener);
-    }
-
-    public void removeSlidingPanelListener(final ISlidingPanelListener listener) {
-        mSlidingPanelListeners.remove(listener);
-    }
 }
index 4ecce67..efeaa62 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,7 +56,6 @@ 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;
@@ -74,8 +74,7 @@ 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();
 
     /**
@@ -177,9 +176,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);
     }
 
     /**
@@ -198,6 +194,8 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
 
         mVisualizerView = (VisualizerView) mRootView.findViewById(R.id.visualizerView);
         mVisualizerView.initialize(getActivity());
+        updateVisualizerPowerSaveMode();
+
         mEqualizerGradient = mRootView.findViewById(R.id.equalizerGradient);
 
         mLyricsText = (TextView) mRootView.findViewById(R.id.audio_player_lyrics);
@@ -240,6 +238,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
@@ -272,8 +272,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
             mToken = null;
         }
 
-        ((SlidingPanelActivity)getActivity()).removeSlidingPanelListener(this);
-
         // Unregister the receiver
         try {
             getActivity().unregisterReceiver(mPlaybackStatus);
@@ -733,16 +731,6 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         }
     }
 
-    @Override
-    public void onBeginSlide() {
-        mVisualizerView.setVisible(false);
-    }
-
-    @Override
-    public void onFinishSlide(SlidingPanelActivity.Panel visiblePanel) {
-        setVisualizerVisible(visiblePanel == SlidingPanelActivity.Panel.MusicPlayer);
-    }
-
     public void setVisualizerVisible(boolean visible) {
         if (visible && PreferenceUtils.getInstance(getActivity()).getShowVisualizer()) {
             mVisualizerView.setVisible(true);
@@ -751,6 +739,11 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
         }
     }
 
+    public void updateVisualizerPowerSaveMode() {
+        PowerManager pm = (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
+        mVisualizerView.setPowerSaveMode(pm.isPowerSaveMode());
+    }
+
     public void setVisualizerColor(int color) {
         mVisualizerView.setColor(color);
     }
@@ -813,9 +806,9 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection,
                 audioPlayerFragment.updateNowPlayingInfo();
                 audioPlayerFragment.dismissPopupMenu();
             } else if (action.equals(MusicPlaybackService.PLAYSTATE_CHANGED)) {
-                audioPlayerFragment.mVisualizerView.setPlaying(MusicUtils.isPlaying());
                 // 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
@@ -829,6 +822,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();
             }
         }
     }
index a176bda..0c8a979 100644 (file)
@@ -38,6 +38,7 @@ public class VisualizerView extends View {
 
     private boolean mVisible = false;
     private boolean mPlaying = false;
+    private boolean mPowerSaveMode = false;
     private int mColor;
 
     private Visualizer.OnDataCaptureListener mVisualizerListener =
@@ -55,13 +56,13 @@ public class VisualizerView extends View {
             for (int i = 0; i < 32; i++) {
                 mValueAnimators[i].cancel();
 
-                rfk = fft[i * 2];
-                ifk = fft[i * 2 + 1];
+                rfk = fft[i * 2 + 2];
+                ifk = fft[i * 2 + 3];
                 magnitude = rfk * rfk + ifk * ifk;
                 dbValue = magnitude > 0 ? (int) (10 * Math.log10(magnitude)) : 0;
 
                 mValueAnimators[i].setFloatValues(mFFTPoints[i * 4 + 1],
-                        mFFTPoints[i * 4 + 3] - (dbValue * 16f));
+                        mFFTPoints[3] - (dbValue * 16f));
                 mValueAnimators[i].start();
             }
         }
@@ -77,7 +78,7 @@ public class VisualizerView extends View {
             }
 
             mVisualizer.setEnabled(false);
-            mVisualizer.setCaptureSize(64);
+            mVisualizer.setCaptureSize(66);
             mVisualizer.setDataCaptureListener(mVisualizerListener, Visualizer.getMaxCaptureRate(),
                     false, true);
             mVisualizer.setEnabled(true);
@@ -109,14 +110,18 @@ public class VisualizerView extends View {
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         super.onSizeChanged(w, h, oldw, oldh);
 
-        float barUnit = w / 32f;
-        float barWidth = barUnit * 8f / 9f;
-        barUnit = barWidth + (barUnit - barWidth) * 32f / 31f;
-        mPaint.setStrokeWidth(barWidth);
+        if (h > w) {
+            float barUnit = w / 32f;
+            float barWidth = barUnit * 8f / 9f;
+            barUnit = barWidth + (barUnit - barWidth) * 32f / 31f;
+            mPaint.setStrokeWidth(barWidth);
 
-        for (int i = 0; i < 32; i++) {
-            mFFTPoints[i * 4] = mFFTPoints[i * 4 + 2] = i * barUnit + (barWidth / 2);
-            mFFTPoints[i * 4 + 3] = h;
+            for (int i = 0; i < 32; i++) {
+                mFFTPoints[i * 4] = mFFTPoints[i * 4 + 2] = i * barUnit + (barWidth / 2);
+                mFFTPoints[i * 4 + 3] = h;
+            }
+        } else {
+            setVisible(false);
         }
     }
 
@@ -170,6 +175,13 @@ public class VisualizerView extends View {
         }
     }
 
+    public void setPowerSaveMode(boolean powerSaveMode) {
+        if (mPowerSaveMode != powerSaveMode) {
+            mPowerSaveMode = powerSaveMode;
+            checkStateChanged();
+        }
+    }
+
     public void setColor(int color) {
         color = Color.argb(191, Color.red(color), Color.green(color), Color.blue(color));
 
@@ -183,7 +195,7 @@ public class VisualizerView extends View {
 
                 mVisualizerColorAnimator = ObjectAnimator.ofArgb(mPaint, "color",
                         mPaint.getColor(), mColor);
-                mVisualizerColorAnimator.setStartDelay(900);
+                mVisualizerColorAnimator.setStartDelay(600);
                 mVisualizerColorAnimator.setDuration(1200);
                 mVisualizerColorAnimator.start();
             } else {
@@ -193,7 +205,7 @@ public class VisualizerView extends View {
     }
 
     private void checkStateChanged() {
-        if (mVisible && mPlaying) {
+        if (mVisible && mPlaying && !mPowerSaveMode) {
             if (mVisualizer == null) {
                 AsyncTask.execute(mLinkVisualizer);
                 animate().alpha(1f).setDuration(300);