summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Shabalin <ashabalin@google.com> 2024-12-20 15:18:41 -0800
committer Alex Shabalin <ashabalin@google.com> 2024-12-20 15:18:41 -0800
commitf2662cc18118df4a0ceaeafcc50156ca19af4cdd (patch)
tree6f3d94a73e314c6ad8c6e0771653e92be8c4ea93
parent82e4c14d475d4335f22c4b2faffeb7970548c254 (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.java7
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java54
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