Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +37 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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. Loading Loading @@ -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); } /** Loading Loading @@ -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); Loading @@ -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 Loading Loading @@ -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(); } Loading packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +12 −4 Original line number Diff line number Diff line Loading @@ -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 */); } } Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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); } } packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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 Loading @@ -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); Loading Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +37 −21 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -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. Loading Loading @@ -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); } /** Loading Loading @@ -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); Loading @@ -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 Loading Loading @@ -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(); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +12 −4 Original line number Diff line number Diff line Loading @@ -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 */); } } Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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); } }
packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading Loading @@ -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 Loading @@ -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); Loading