Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3f9a3fe authored by Roman Birg's avatar Roman Birg
Browse files

SystemUI: visualizer tile improvements



  - Decrease width to match other icons better
  - Don't hide the tile when there's no music playing, instead, just
    show the static image, and don't hide the icon
  - Line up static image and visualizer iamge
  - Move visualizer color overlay to cm_colors for theming discoverability

Change-Id: I22fa55d3f95602b8ad6f486ef83378cde610fe1d
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 55938e6c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -35,4 +35,7 @@
    <color name="navring_check_tint">@android:color/white</color>
    <color name="navring_edit_fill">#FF558B2F</color>
    <color name="navring_edit_tint">#FF689F38</color>

    <!-- tint of the Visualizer tile -->
    <color name="visualizer_fill_color">#96FFFFFF</color>
</resources>
+0 −1
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
    <dimen name="weather_text_size">12sp</dimen>
     <dimen name="detail_radio_group_padding_left">16dp</dimen>
     <dimen name="detail_radio_group_padding">8dp</dimen>
    <dimen name="qs_tile_icon_size_visualizer">40dp</dimen>

    <!-- Themes: radius of the corners of the notification dropshadow
         See also: notification_material_rounded_rect_radius
+5 −4
Original line number Diff line number Diff line
@@ -19,9 +19,6 @@
    <!-- Width of each eq bar -->
    <dimen name="visualizer_path_stroke_width">6dp</dimen>

    <!-- Color for the Equalizer tile -->
    <color name="visualizer_fill_color">#96FFFFFF</color>

    <!-- The amount of divisions to make for eq bars -->
    <integer name="visualizer_divisions">4</integer>

@@ -29,4 +26,8 @@
        ends up being dB = (dB * fuzz_factor + db_fuzz) -->
    <integer name="visualizer_db_fuzz_factor">2</integer>
    <integer name="visualizer_db_fuzz">-10</integer>

    <!-- width of how much of the visualizer should be visible in the tile -->
    <dimen name="qs_tile_icon_size_visualizer_width">36dp</dimen>
    <dimen name="qs_tile_icon_size_visualizer_height">24dp</dimen>
</resources>
+64 −14
Original line number Diff line number Diff line
@@ -30,10 +30,10 @@ import android.media.session.MediaSession;
import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState;
import android.os.AsyncTask;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.android.systemui.R;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTileView;
@@ -52,8 +52,9 @@ public class VisualizerTile extends QSTile<QSTile.State>
    private Map<MediaSession.Token, CallbackInfo> mCallbacks = new HashMap<>();
    private MediaSessionManager mMediaSessionManager;
    private VisualizerView mVisualizer;
    private ImageView mStaticVisualizerIcon;
    private boolean mLinked;
    private boolean mTileVisible;
    private boolean mIsAnythingPlaying;
    private boolean mListening;

    public VisualizerTile(Host host) {
@@ -66,10 +67,15 @@ public class VisualizerTile extends QSTile<QSTile.State>
        for (MediaController activeSession : activeSessions) {
            PlaybackState playbackState = activeSession.getPlaybackState();
            if (playbackState != null && playbackState.getState() == PlaybackState.STATE_PLAYING) {
                mTileVisible = true;
                mIsAnythingPlaying = true;
                break;
            }
        }
        if (mIsAnythingPlaying && !mLinked) {
            AsyncTask.execute(mLinkVisualizer);
        } else if (!mIsAnythingPlaying && mLinked) {
            AsyncTask.execute(mUnlinkVisualizer);
        }
    }

    @Override
@@ -77,10 +83,13 @@ public class VisualizerTile extends QSTile<QSTile.State>
        return new QSTileView(context) {
            @Override
            protected View createIcon() {
                Resources r = mContext.getResources();

                mVisualizer = new VisualizerView(mContext);
                mVisualizer.setEnabled(false);
                mVisualizer.setVisibility(View.VISIBLE);
                mVisualizer.setAlpha(1.f);

                Resources r = mContext.getResources();
                Paint paint = new Paint();
                paint.setStrokeWidth(r.getDimensionPixelSize(
                        R.dimen.visualizer_path_stroke_width));
@@ -96,10 +105,24 @@ public class VisualizerTile extends QSTile<QSTile.State>
                        r.getInteger(R.integer.visualizer_db_fuzz),
                        r.getInteger(R.integer.visualizer_db_fuzz_factor))
                );

                mStaticVisualizerIcon = new ImageView(mContext);
                mStaticVisualizerIcon.setId(android.R.id.icon);
                mStaticVisualizerIcon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
                mStaticVisualizerIcon.setImageResource(R.drawable.ic_qs_visualizer_static);
                mStaticVisualizerIcon.setVisibility(View.VISIBLE);
                mStaticVisualizerIcon.setAlpha(0.f);

                FrameLayout visualizerContainer = new FrameLayout(mContext);
                visualizerContainer.addView(mVisualizer, new FrameLayout.LayoutParams(
                        r.getDimensionPixelSize(R.dimen.qs_tile_icon_size_visualizer),
                        FrameLayout.LayoutParams.MATCH_PARENT, Gravity.RIGHT
                        r.getDimensionPixelSize(R.dimen.qs_tile_icon_size_visualizer_width),
                        r.getDimensionPixelSize(R.dimen.qs_tile_icon_size_visualizer_height),
                        Gravity.TOP | Gravity.CENTER_HORIZONTAL
                ));
                visualizerContainer.addView(mStaticVisualizerIcon, new FrameLayout.LayoutParams(
                        FrameLayout.LayoutParams.MATCH_PARENT,
                        FrameLayout.LayoutParams.MATCH_PARENT,
                        Gravity.CENTER
                ));
                return visualizerContainer;
            }
@@ -119,8 +142,10 @@ public class VisualizerTile extends QSTile<QSTile.State>

    @Override
    protected void handleUpdateState(State state, Object arg) {
        state.visible = mTileVisible;
        state.visible = true;
        state.label = mContext.getString(R.string.quick_settings_visualizer_label);

        mUiHandler.post(mUpdateVisibilities);
    }

    @Override
@@ -129,12 +154,8 @@ public class VisualizerTile extends QSTile<QSTile.State>
        mListening = listening;
        if (listening) {
            mMediaSessionManager.addOnActiveSessionsChangedListener(this, null);
            if (mTileVisible) {
                AsyncTask.execute(mLinkVisualizer);
            }
        } else {
            mMediaSessionManager.removeOnActiveSessionsChangedListener(this);
            AsyncTask.execute(mUnlinkVisualizer);
        }
    }

@@ -158,6 +179,28 @@ public class VisualizerTile extends QSTile<QSTile.State>
        mCallbacks.clear();
    }

    private final Runnable mRefreshStateRunnable = new Runnable() {
        @Override
        public void run() {
            refreshState();
        }
    };

    private final Runnable mUpdateVisibilities = new Runnable() {
        @Override
        public void run() {
            mVisualizer.animate().cancel();
            mVisualizer.animate()
                    .setDuration(200)
                    .alpha(mIsAnythingPlaying ? 1.f : 0.f);

            mStaticVisualizerIcon.animate().cancel();
            mStaticVisualizerIcon.animate()
                    .setDuration(200)
                    .alpha(mIsAnythingPlaying ? 0.f : 1.f);
        }
    };

    private final Runnable mLinkVisualizer = new Runnable() {
        @Override
        public void run() {
@@ -190,9 +233,16 @@ public class VisualizerTile extends QSTile<QSTile.State>
                break;
            }
        }
        if (anythingPlaying != mTileVisible) {
            mTileVisible = anythingPlaying;
            refreshState();
        if (anythingPlaying != mIsAnythingPlaying) {
            mIsAnythingPlaying = anythingPlaying;
            if (mIsAnythingPlaying && !mLinked) {
                AsyncTask.execute(mLinkVisualizer);
            } else if (!mIsAnythingPlaying && mLinked) {
                AsyncTask.execute(mUnlinkVisualizer);
            }

            mHandler.removeCallbacks(mRefreshStateRunnable);
            mHandler.postDelayed(mRefreshStateRunnable, 50);
        }
    }