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

Commit 7a06b6ae authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Limit number of notification actions created" into tm-dev

parents 5ed1be6c 1861abe8
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -611,12 +611,11 @@ public class MediaControlPanel {

    private void bindActionButtons(MediaData data) {
        MediaButton semanticActions = data.getSemanticActions();
        ImageButton[] genericButtons = new ImageButton[]{
                mMediaViewHolder.getAction0(),
                mMediaViewHolder.getAction1(),
                mMediaViewHolder.getAction2(),
                mMediaViewHolder.getAction3(),
                mMediaViewHolder.getAction4()};

        List<ImageButton> genericButtons = new ArrayList<>();
        for (int id : MediaViewHolder.Companion.getGenericButtonIds()) {
            genericButtons.add(mMediaViewHolder.getAction(id));
        }

        ConstraintSet expandedSet = mMediaViewController.getExpandedLayout();
        ConstraintSet collapsedSet = mMediaViewController.getCollapsedLayout();
@@ -643,19 +642,19 @@ public class MediaControlPanel {
            List<Integer> actionsWhenCollapsed = data.getActionsToShowInCompact();
            List<MediaAction> actions = data.getActions();
            int i = 0;
            for (; i < actions.size(); i++) {
            for (; i < actions.size() && i < genericButtons.size(); i++) {
                boolean showInCompact = actionsWhenCollapsed.contains(i);
                setGenericButton(
                        genericButtons[i],
                        genericButtons.get(i),
                        actions.get(i),
                        collapsedSet,
                        expandedSet,
                        showInCompact);
            }
            for (; i < 5; i++) {
            for (; i < genericButtons.size(); i++) {
                // Hide any unused buttons
                setGenericButton(
                        genericButtons[i],
                        genericButtons.get(i),
                        /* mediaAction= */ null,
                        collapsedSet,
                        expandedSet,
+9 −0
Original line number Diff line number Diff line
@@ -161,6 +161,10 @@ class MediaDataManager(
        @JvmField
        val MAX_COMPACT_ACTIONS = 3

        // Maximum number of actions allowed in expanded view
        @JvmField
        val MAX_NOTIFICATION_ACTIONS = MediaViewHolder.genericButtonIds.size

        /** Maximum number of [PlaybackState.CustomAction] buttons supported */
        @JvmField
        val MAX_CUSTOM_ACTIONS = 4
@@ -727,6 +731,11 @@ class MediaDataManager(

        if (actions != null) {
            for ((index, action) in actions.withIndex()) {
                if (index == MAX_NOTIFICATION_ACTIONS) {
                    Log.w(TAG, "Too many notification actions for ${sbn.key}," +
                        " limiting to first $MAX_NOTIFICATION_ACTIONS")
                    break
                }
                if (action.getIcon() == null) {
                    if (DEBUG) Log.i(TAG, "No icon for action $index ${action.title}")
                    actionsToShowCollapsed.remove(index)
+9 −0
Original line number Diff line number Diff line
@@ -178,5 +178,14 @@ class MediaViewHolder constructor(itemView: View) {
                R.id.dismiss,
                R.id.settings
        )

        // Buttons used for notification-based actions
        val genericButtonIds = setOf(
            R.id.action0,
            R.id.action1,
            R.id.action2,
            R.id.action3,
            R.id.action4
        )
    }
}
 No newline at end of file
+31 −0
Original line number Diff line number Diff line
package com.android.systemui.media

import android.app.Notification
import android.app.Notification.MediaStyle
import android.app.PendingIntent
import android.app.smartspace.SmartspaceAction
@@ -620,6 +621,36 @@ class MediaDataManagerTest : SysuiTestCase() {
                MediaDataManager.MAX_COMPACT_ACTIONS)
    }

    @Test
    fun testTooManyNotificationActions_isTruncated() {
        // GIVEN a notification where too many notification actions are added
        val action = Notification.Action(R.drawable.ic_android, "action", null)
        val notif = SbnBuilder().run {
            setPkg(PACKAGE_NAME)
            modifyNotification(context).also {
                it.setSmallIcon(android.R.drawable.ic_media_pause)
                it.setStyle(MediaStyle().apply {
                    setMediaSession(session.sessionToken)
                })
                for (i in 0..MediaDataManager.MAX_NOTIFICATION_ACTIONS) {
                    it.addAction(action)
                }
            }
            build()
        }

        // WHEN the notification is loaded
        mediaDataManager.onNotificationAdded(KEY, notif)
        assertThat(backgroundExecutor.runAllReady()).isEqualTo(1)
        assertThat(foregroundExecutor.runAllReady()).isEqualTo(1)

        // THEN only the first MAX_NOTIFICATION_ACTIONS are actually included
        verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true),
            eq(0), eq(false))
        assertThat(mediaDataCaptor.value.actions.size).isEqualTo(
            MediaDataManager.MAX_NOTIFICATION_ACTIONS)
    }

    @Test
    fun testPlaybackActions_noState_usesNotification() {
        val desc = "Notification Action"