diff options
| author | 2024-12-20 15:18:41 -0800 | |
|---|---|---|
| committer | 2024-12-20 15:18:41 -0800 | |
| commit | f2662cc18118df4a0ceaeafcc50156ca19af4cdd (patch) | |
| tree | 6f3d94a73e314c6ad8c6e0771653e92be8c4ea93 | |
| parent | 82e4c14d475d4335f22c4b2faffeb7970548c254 (diff) | |
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
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseDialog.java | 7 | ||||
| -rw-r--r-- | packages/SystemUI/tests/src/com/android/systemui/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 |