diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 09bf71dd5d..82316fa984 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -22,6 +22,9 @@
* IMA extension:
* Session:
* UI:
+ * Fallback to include audio track language name if `Locale` cannot
+ identify a display name
+ ([#988](https://github.com/androidx/media/issues/988)).
* Downloads:
* OkHttp Extension:
* Cronet Extension:
diff --git a/libraries/ui/src/main/java/androidx/media3/ui/DefaultTrackNameProvider.java b/libraries/ui/src/main/java/androidx/media3/ui/DefaultTrackNameProvider.java
index 5132b93f38..d83fc54195 100644
--- a/libraries/ui/src/main/java/androidx/media3/ui/DefaultTrackNameProvider.java
+++ b/libraries/ui/src/main/java/androidx/media3/ui/DefaultTrackNameProvider.java
@@ -56,7 +56,13 @@ public class DefaultTrackNameProvider implements TrackNameProvider {
} else {
trackName = buildLanguageOrLabelString(format);
}
- return trackName.length() == 0 ? resources.getString(R.string.exo_track_unknown) : trackName;
+ if (trackName.length() != 0) {
+ return trackName;
+ }
+ @Nullable String language = format.language;
+ return (language == null || language.trim().isEmpty())
+ ? resources.getString(R.string.exo_track_unknown)
+ : resources.getString(R.string.exo_track_unknown_name, language);
}
private String buildResolutionString(Format format) {
diff --git a/libraries/ui/src/main/res/values/strings.xml b/libraries/ui/src/main/res/values/strings.xml
index 7f65a4bb4b..849ca20e05 100644
--- a/libraries/ui/src/main/res/values/strings.xml
+++ b/libraries/ui/src/main/res/values/strings.xml
@@ -100,6 +100,8 @@
Auto
Unknown
+
+ Unknown (%1$s)
%1$d × %2$d
diff --git a/libraries/ui/src/test/java/androidx/media3/ui/DefaultTrackNameProviderTest.java b/libraries/ui/src/test/java/androidx/media3/ui/DefaultTrackNameProviderTest.java
index 2abaa923ff..0c7a9967c4 100644
--- a/libraries/ui/src/test/java/androidx/media3/ui/DefaultTrackNameProviderTest.java
+++ b/libraries/ui/src/test/java/androidx/media3/ui/DefaultTrackNameProviderTest.java
@@ -29,13 +29,46 @@ import org.junit.runner.RunWith;
public class DefaultTrackNameProviderTest {
@Test
- public void getTrackName_handlesInvalidLanguage() {
+ public void getTrackName_withInvalidLanguage_returnsUnknownWithLanguage() {
Resources resources = ApplicationProvider.getApplicationContext().getResources();
DefaultTrackNameProvider provider = new DefaultTrackNameProvider(resources);
Format format = new Format.Builder().setLanguage("```").build();
String name = provider.getTrackName(format);
+ assertThat(name).isEqualTo(resources.getString(R.string.exo_track_unknown_name, "```"));
+ }
+
+ @Test
+ public void getTrackName_withLanguageEmptyString_returnsUnknown() {
+ Resources resources = ApplicationProvider.getApplicationContext().getResources();
+ DefaultTrackNameProvider provider = new DefaultTrackNameProvider(resources);
+ Format format = new Format.Builder().setLanguage("").build();
+
+ String name = provider.getTrackName(format);
+
assertThat(name).isEqualTo(resources.getString(R.string.exo_track_unknown));
}
+
+ @Test
+ public void getTrackName_withLanguageSpacesNewLine_returnsUnknown() {
+ Resources resources = ApplicationProvider.getApplicationContext().getResources();
+ DefaultTrackNameProvider provider = new DefaultTrackNameProvider(resources);
+ Format format = new Format.Builder().setLanguage(" \n ").build();
+
+ String name = provider.getTrackName(format);
+
+ assertThat(name).isEqualTo(resources.getString(R.string.exo_track_unknown));
+ }
+
+ @Test
+ public void getTrackName_withLanguageEmptyStringAndLabel_returnsLabel() {
+ Resources resources = ApplicationProvider.getApplicationContext().getResources();
+ DefaultTrackNameProvider provider = new DefaultTrackNameProvider(resources);
+ Format format = new Format.Builder().setLanguage("").setLabel("Main").build();
+
+ String name = provider.getTrackName(format);
+
+ assertThat(name).isEqualTo("Main");
+ }
}