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

Commit 6b40d5ed authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Hide media on AOD when not playing

Media seems stuck on AOD if paused or stopped and still visible.

Test: play pause with bluetooth headphones
Test: play pause on lock screen
Test: skip songs on lock screen, go to aod
Fixes: 131314881
Change-Id: I3574bbf628b708d2f9d4c4363a912de5ded951ac
parent 8575ede8
Loading
Loading
Loading
Loading
+37 −21
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.graphics.drawable.Icon;
import android.icu.text.DateFormat;
import android.icu.text.DisplayContext;
import android.media.MediaMetadata;
import android.media.session.PlaybackState;
import android.net.Uri;
import android.os.Handler;
import android.os.Trace;
@@ -57,6 +58,7 @@ import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.policy.ZenModeControllerImpl;

import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
@@ -98,6 +100,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
    private final Date mCurrentTime = new Date();
    private final Handler mHandler;
    private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm;
    private final HashSet<Integer> mMediaInvisibleStates;
    private ZenModeController mZenModeController;
    private String mDatePattern;
    private DateFormat mDateFormat;
@@ -113,6 +116,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
    private StatusBarStateController mStatusBarStateController;
    protected MediaMetadata mMediaMetaData;
    protected boolean mDozing;
    private boolean mMediaIsVisible;

    /**
     * Receiver responsible for time ticking and updating the date format.
@@ -169,6 +173,11 @@ public class KeyguardSliceProvider extends SliceProvider implements
        mAlarmUri = Uri.parse(KEYGUARD_NEXT_ALARM_URI);
        mDndUri = Uri.parse(KEYGUARD_DND_URI);
        mMediaUri = Uri.parse(KEYGUARD_MEDIA_URI);

        mMediaInvisibleStates = new HashSet<>();
        mMediaInvisibleStates.add(PlaybackState.STATE_NONE);
        mMediaInvisibleStates.add(PlaybackState.STATE_STOPPED);
        mMediaInvisibleStates.add(PlaybackState.STATE_PAUSED);
    }

    /**
@@ -209,11 +218,14 @@ public class KeyguardSliceProvider extends SliceProvider implements
    }

    protected boolean needsMediaLocked() {
        return mMediaMetaData != null && mDozing;
        return mMediaMetaData != null && mMediaIsVisible && mDozing;
    }

    protected void addMediaLocked(ListBuilder listBuilder) {
        if (mMediaMetaData != null) {
        if (mMediaMetaData == null) {
            return;
        }

        CharSequence title = mMediaMetaData.getText(MediaMetadata.METADATA_KEY_TITLE);
        if (TextUtils.isEmpty(title)) {
            title = getContext().getResources().getString(R.string.music_controls_no_title);
@@ -235,7 +247,6 @@ public class KeyguardSliceProvider extends SliceProvider implements
            listBuilder.addRow(albumBuilder);
        }
    }
    }

    protected void addPrimaryActionLocked(ListBuilder builder) {
        // Add simple action because API requires it; Keyguard handles presenting
@@ -411,9 +422,14 @@ public class KeyguardSliceProvider extends SliceProvider implements
     * @param metadata New metadata.
     */
    @Override
    public void onMetadataChanged(MediaMetadata metadata) {
    public void onMetadataOrStateChanged(MediaMetadata metadata, @PlaybackState.State int state) {
        synchronized (this) {
            boolean nextVisible = !mMediaInvisibleStates.contains(state);
            if (nextVisible == mMediaIsVisible && metadata == mMediaMetaData) {
                return;
            }
            mMediaMetaData = metadata;
            mMediaIsVisible = nextVisible;
        }
        notifyChange();
    }
+12 −4
Original line number Diff line number Diff line
@@ -150,8 +150,8 @@ public class NotificationMediaManager implements Dumpable {
            if (state != null) {
                if (!isPlaybackActive(state.getState())) {
                    clearCurrentMediaNotification();
                    dispatchUpdateMediaMetaData(true /* changed */, true /* allowAnimation */);
                }
                dispatchUpdateMediaMetaData(true /* changed */, true /* allowAnimation */);
            }
        }

@@ -242,7 +242,8 @@ public class NotificationMediaManager implements Dumpable {

    public void addCallback(MediaListener callback) {
        mMediaListeners.add(callback);
        callback.onMetadataChanged(mMediaMetadata);
        callback.onMetadataOrStateChanged(mMediaMetadata,
                getMediaControllerPlaybackState(mMediaController));
    }

    public void removeCallback(MediaListener callback) {
@@ -357,9 +358,10 @@ public class NotificationMediaManager implements Dumpable {
        if (mPresenter != null) {
            mPresenter.updateMediaMetaData(changed, allowEnterAnimation);
        }
        @PlaybackState.State int state = getMediaControllerPlaybackState(mMediaController);
        ArrayList<MediaListener> callbacks = new ArrayList<>(mMediaListeners);
        for (int i = 0; i < callbacks.size(); i++) {
            callbacks.get(i).onMetadataChanged(mMediaMetadata);
            callbacks.get(i).onMetadataOrStateChanged(mMediaMetadata, state);
        }
    }

@@ -698,6 +700,12 @@ public class NotificationMediaManager implements Dumpable {
    }

    public interface MediaListener {
        void onMetadataChanged(MediaMetadata metadata);
        /**
         * Called whenever there's new metadata or playback state.
         * @param metadata Current metadata.
         * @param state Current playback state
         * @see PlaybackState.State
         */
        void onMetadataOrStateChanged(MediaMetadata metadata, @PlaybackState.State int state);
    }
}
+4 −3
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.content.ContentResolver;
import android.media.MediaMetadata;
import android.media.session.PlaybackState;
import android.net.Uri;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
@@ -105,7 +106,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
        MediaMetadata metadata = mock(MediaMetadata.class);
        when(metadata.getText(any())).thenReturn("metadata");
        mProvider.onDozingChanged(true);
        mProvider.onMetadataChanged(metadata);
        mProvider.onMetadataOrStateChanged(metadata, PlaybackState.STATE_PLAYING);
        mProvider.onBindSlice(mProvider.getUri());
        verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE));
        verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_ARTIST));
@@ -170,7 +171,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
    public void onMetadataChanged_updatesSlice() {
        mProvider.onDozingChanged(true);
        reset(mContentResolver);
        mProvider.onMetadataChanged(mock(MediaMetadata.class));
        mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING);
        verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null));

        // Hides after waking up
@@ -181,7 +182,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {

    @Test
    public void onDozingChanged_updatesSliceIfMedia() {
        mProvider.onMetadataChanged(mock(MediaMetadata.class));
        mProvider.onMetadataOrStateChanged(mock(MediaMetadata.class), PlaybackState.STATE_PLAYING);
        reset(mContentResolver);
        // Show media when dozing
        mProvider.onDozingChanged(true);