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

Commit e31bd50c authored by Lucas Dupin's avatar Lucas Dupin Committed by android-build-merger
Browse files

Merge "Hide media on AOD when not playing" into qt-dev

am: 5c3320d7

Change-Id: I28ab2ca482c2fbbca048f87a3daf9d01524916eb
parents 580e5b89 5c3320d7
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);