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

Commit 13a7879f authored by Roman Birg's avatar Roman Birg
Browse files

SystemUI: Visualizer tile improvements



* Set the initial visibility state, so if music is playing and the user
adds the tile, it will show up properly.

* Fix tile not hiding after pausing or closing the media player.

* Fix ConcurrentModificationException when removing tile while music is
playing

Change-Id: Ia2b246879458c05a3637266ba35d55897a76b296
Signed-off-by: default avatarRoman Birg <roman@cyngn.com>
parent 39bbfda9
Loading
Loading
Loading
Loading
+22 −11
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Rect;
import android.media.audiofx.AudioEffect;
@@ -34,9 +33,7 @@ import android.os.AsyncTask;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

import com.android.systemui.R;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTileView;
@@ -45,7 +42,6 @@ import com.pheelicks.visualizer.FFTData;
import com.pheelicks.visualizer.VisualizerView;
import com.pheelicks.visualizer.renderer.Renderer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -58,11 +54,22 @@ public class VisualizerTile extends QSTile<QSTile.State>
    private VisualizerView mVisualizer;
    private boolean mLinked;
    private boolean mTileVisible;
    private boolean mListening;

    public VisualizerTile(Host host) {
        super(host);
        mMediaSessionManager = (MediaSessionManager)
                mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);

        // initialize state
        List<MediaController> activeSessions = mMediaSessionManager.getActiveSessions(null);
        for (MediaController activeSession : activeSessions) {
            PlaybackState playbackState = activeSession.getPlaybackState();
            if (playbackState != null && playbackState.getState() == PlaybackState.STATE_PLAYING) {
                mTileVisible = true;
                break;
            }
        }
    }

    @Override
@@ -118,6 +125,8 @@ public class VisualizerTile extends QSTile<QSTile.State>

    @Override
    public void setListening(boolean listening) {
        if (mListening == listening) return;
        mListening = listening;
        if (listening) {
            mMediaSessionManager.addOnActiveSessionsChangedListener(this, null);
            AsyncTask.execute(mLinkVisualizer);
@@ -139,13 +148,12 @@ public class VisualizerTile extends QSTile<QSTile.State>
    }

    @Override
    public void destroy() {
        super.destroy();
    protected void handleDestroy() {
        super.handleDestroy();
        for (Map.Entry<MediaSession.Token, CallbackInfo> entry : mCallbacks.entrySet()) {
            entry.getValue().destroy();
            entry.getValue().unregister();
        }
        mCallbacks.clear();
        mCallbacks = null;
    }

    private final Runnable mLinkVisualizer = new Runnable() {
@@ -196,14 +204,12 @@ public class VisualizerTile extends QSTile<QSTile.State>
            mCallback = new MediaController.Callback() {
                @Override
                public void onSessionDestroyed() {
                    super.onSessionDestroyed();
                    destroy();
                    checkIfPlaying();
                }

                @Override
                public void onPlaybackStateChanged(@NonNull PlaybackState state) {
                    super.onPlaybackStateChanged(state);
                    mIsPlaying = state.getState() == PlaybackState.STATE_PLAYING;
                    checkIfPlaying();
                }
@@ -215,8 +221,13 @@ public class VisualizerTile extends QSTile<QSTile.State>
            return mIsPlaying;
        }

        public void destroy() {
        public void unregister() {
            mController.unregisterCallback(mCallback);
            mIsPlaying = false;
        }

        public void destroy() {
            unregister();
            mCallbacks.remove(mController.getSessionToken());
            mController = null;
            mCallback = null;