From f2662cc18118df4a0ceaeafcc50156ca19af4cdd Mon Sep 17 00:00:00 2001 From: Alex Shabalin Date: Fri, 20 Dec 2024 15:18:41 -0800 Subject: 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 --- .../media/dialog/MediaOutputBaseDialog.java | 7 ++- .../media/dialog/MediaOutputBaseDialogTest.java | 54 +++++++++++++++++++--- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java index 9e50fb86fda0..64256f97fd78 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java @@ -268,8 +268,11 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog // Init bottom buttons mDoneButton.setOnClickListener(v -> dismiss()); mStopButton.setOnClickListener(v -> onStopButtonClick()); - mMediaMetadataSectionLayout.setOnClickListener( - mMediaSwitchingController::tryToLaunchMediaApplication); + if (mMediaSwitchingController.getAppLaunchIntent() != null) { + // For a11y purposes only add listener if a section is clickable. + mMediaMetadataSectionLayout.setOnClickListener( + mMediaSwitchingController::tryToLaunchMediaApplication); + } mDismissing = false; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java index 47371dfd8895..23282b16d8a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java @@ -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 -- cgit v1.2.3-59-g8ed1b