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

Commit f2662cc1 authored by Alex Shabalin's avatar Alex Shabalin
Browse files

Make the metadata section clickable only if the intent is available.

If there is no application package name provided to the dialog, or if no intent can be generated, don't add a click listener to the metadata section.
Adding a click listener sets `clickable=true` property to the element and makes it discoverable by accessibility instruments like Talkback or Switch Access.

Bug: 377167322
Flag: EXEMPT bugfix
Test: atest MediaOutputAdapterTest
Change-Id: I62c5dd6e465a76e7ae748250ff8c4a564c8d6e55
parent 82e4c14d
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -268,8 +268,11 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog
        // Init bottom buttons
        mDoneButton.setOnClickListener(v -> dismiss());
        mStopButton.setOnClickListener(v -> onStopButtonClick());
        if (mMediaSwitchingController.getAppLaunchIntent() != null) {
            // For a11y purposes only add listener if a section is clickable.
            mMediaMetadataSectionLayout.setOnClickListener(
                    mMediaSwitchingController::tryToLaunchMediaApplication);
        }

        mDismissing = false;
    }
+48 −6
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -27,6 +28,8 @@ import static org.mockito.Mockito.when;

import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.session.MediaController;
@@ -38,6 +41,7 @@ import android.testing.TestableLooper;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.core.graphics.drawable.IconCompat;
@@ -128,6 +132,21 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
        when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE);
        mMediaControllers.add(mMediaController);
        when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers);
        createMediaSwitchingController(TEST_PACKAGE);

        // Using a fake package will cause routing operations to fail, so we intercept
        // scanning-related operations.
        mMediaSwitchingController.mLocalMediaManager = mock(LocalMediaManager.class);
        doNothing().when(mMediaSwitchingController.mLocalMediaManager).startScan();
        doNothing().when(mMediaSwitchingController.mLocalMediaManager).stopScan();

        mMediaOutputBaseDialogImpl =
                new MediaOutputBaseDialogImpl(
                        mContext, mBroadcastSender, mMediaSwitchingController);
        mMediaOutputBaseDialogImpl.onCreate(new Bundle());
    }

    private void createMediaSwitchingController(String testPackage) {
        VolumePanelGlobalStateInteractor volumePanelGlobalStateInteractor =
                VolumePanelGlobalStateInteractorKosmosKt.getVolumePanelGlobalStateInteractor(
                        mKosmos);
@@ -135,7 +154,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
        mMediaSwitchingController =
                new MediaSwitchingController(
                        mContext,
                        TEST_PACKAGE,
                        testPackage,
                        mContext.getUser(),
                        /* token */ null,
                        mMediaSessionManager,
@@ -150,17 +169,40 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
                        mFlags,
                        volumePanelGlobalStateInteractor,
                        mUserTracker);
    }

        // Using a fake package will cause routing operations to fail, so we intercept
        // scanning-related operations.
        mMediaSwitchingController.mLocalMediaManager = mock(LocalMediaManager.class);
        doNothing().when(mMediaSwitchingController.mLocalMediaManager).startScan();
        doNothing().when(mMediaSwitchingController.mLocalMediaManager).stopScan();
    @Test
    public void onCreate_noAppOpenIntent_metadataSectionNonClickable() {
        createMediaSwitchingController(null);

        mMediaOutputBaseDialogImpl =
                new MediaOutputBaseDialogImpl(
                        mContext, mBroadcastSender, mMediaSwitchingController);
        mMediaOutputBaseDialogImpl.onCreate(new Bundle());
        final LinearLayout mediaMetadataSectionLayout =
                mMediaOutputBaseDialogImpl.mDialogView.requireViewById(
                        R.id.media_metadata_section);

        assertThat(mediaMetadataSectionLayout.isClickable()).isFalse();
    }

    @Test
    public void onCreate_appOpenIntentAvailable_metadataSectionClickable() {
        final PackageManager packageManager = mock(PackageManager.class);
        mContext.setMockPackageManager(packageManager);
        Intent intent = new Intent(TEST_PACKAGE);
        doReturn(intent).when(packageManager).getLaunchIntentForPackage(TEST_PACKAGE);
        createMediaSwitchingController(TEST_PACKAGE);

        mMediaOutputBaseDialogImpl =
                new MediaOutputBaseDialogImpl(
                        mContext, mBroadcastSender, mMediaSwitchingController);
        mMediaOutputBaseDialogImpl.onCreate(new Bundle());
        final LinearLayout mediaMetadataSectionLayout =
                mMediaOutputBaseDialogImpl.mDialogView.requireViewById(
                        R.id.media_metadata_section);

        assertThat(mediaMetadataSectionLayout.isClickable()).isTrue();
    }

    @Test