From 874dc202f84ddf06545a8c6cc2f7ea11fc59b0ab Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 24 Apr 2018 02:26:07 -0700 Subject: [PATCH] Prevent timeline access in AnalyticsCollector for future windows and periods. Some of the events are emitted by the media periods itself and their index may not be available in the publicly accessible timeline yet. To prevent this, we currently check for timeline.isEmpty() only. But this may also happen for dynamic changes, e.g. when new sources are added in fast succession and a manifest for one of the new sources starts loading before the updated timeline is reported. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=194057401 --- .../analytics/AnalyticsCollector.java | 152 +++++++++++------- library/ui/src/main/res/values-af/strings.xml | 4 +- library/ui/src/main/res/values-am/strings.xml | 4 +- library/ui/src/main/res/values-ar/strings.xml | 4 +- library/ui/src/main/res/values-az/strings.xml | 4 +- .../src/main/res/values-b+sr+Latn/strings.xml | 4 +- library/ui/src/main/res/values-be/strings.xml | 4 +- library/ui/src/main/res/values-bs/strings.xml | 4 +- library/ui/src/main/res/values-ca/strings.xml | 4 +- library/ui/src/main/res/values-cs/strings.xml | 4 +- library/ui/src/main/res/values-da/strings.xml | 4 +- library/ui/src/main/res/values-de/strings.xml | 4 +- library/ui/src/main/res/values-el/strings.xml | 4 +- .../ui/src/main/res/values-es-rUS/strings.xml | 4 +- library/ui/src/main/res/values-es/strings.xml | 4 +- library/ui/src/main/res/values-eu/strings.xml | 4 +- library/ui/src/main/res/values-fa/strings.xml | 4 +- library/ui/src/main/res/values-fi/strings.xml | 4 +- .../ui/src/main/res/values-fr-rCA/strings.xml | 2 +- library/ui/src/main/res/values-fr/strings.xml | 4 +- library/ui/src/main/res/values-gl/strings.xml | 4 +- library/ui/src/main/res/values-hr/strings.xml | 4 +- library/ui/src/main/res/values-hu/strings.xml | 4 +- library/ui/src/main/res/values-is/strings.xml | 4 +- library/ui/src/main/res/values-it/strings.xml | 2 +- library/ui/src/main/res/values-iw/strings.xml | 4 +- library/ui/src/main/res/values-ja/strings.xml | 4 +- library/ui/src/main/res/values-ka/strings.xml | 4 +- library/ui/src/main/res/values-kk/strings.xml | 4 +- library/ui/src/main/res/values-km/strings.xml | 4 +- library/ui/src/main/res/values-ko/strings.xml | 4 +- library/ui/src/main/res/values-ky/strings.xml | 4 +- library/ui/src/main/res/values-lo/strings.xml | 4 +- library/ui/src/main/res/values-mk/strings.xml | 4 +- library/ui/src/main/res/values-mn/strings.xml | 4 +- library/ui/src/main/res/values-ms/strings.xml | 4 +- library/ui/src/main/res/values-nb/strings.xml | 4 +- library/ui/src/main/res/values-nl/strings.xml | 2 +- library/ui/src/main/res/values-pl/strings.xml | 4 +- .../ui/src/main/res/values-pt-rPT/strings.xml | 4 +- library/ui/src/main/res/values-pt/strings.xml | 4 +- library/ui/src/main/res/values-ru/strings.xml | 4 +- library/ui/src/main/res/values-sk/strings.xml | 4 +- library/ui/src/main/res/values-sl/strings.xml | 4 +- library/ui/src/main/res/values-sq/strings.xml | 4 +- library/ui/src/main/res/values-sr/strings.xml | 4 +- library/ui/src/main/res/values-sv/strings.xml | 4 +- library/ui/src/main/res/values-sw/strings.xml | 4 +- library/ui/src/main/res/values-th/strings.xml | 4 +- library/ui/src/main/res/values-tl/strings.xml | 4 +- library/ui/src/main/res/values-tr/strings.xml | 4 +- library/ui/src/main/res/values-uk/strings.xml | 4 +- library/ui/src/main/res/values-uz/strings.xml | 4 +- library/ui/src/main/res/values-vi/strings.xml | 4 +- .../ui/src/main/res/values-zh-rHK/strings.xml | 4 +- .../ui/src/main/res/values-zh-rTW/strings.xml | 4 +- library/ui/src/main/res/values-zu/strings.xml | 4 +- 57 files changed, 200 insertions(+), 170 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java index 4397b945b4..bd6725e804 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/analytics/AnalyticsCollector.java @@ -80,7 +80,6 @@ public class AnalyticsCollector private final CopyOnWriteArraySet listeners; private final Player player; private final Clock clock; - private final Period period; private final Window window; private final MediaPeriodQueueTracker mediaPeriodQueueTracker; @@ -95,7 +94,6 @@ public class AnalyticsCollector this.clock = Assertions.checkNotNull(clock); listeners = new CopyOnWriteArraySet<>(); mediaPeriodQueueTracker = new MediaPeriodQueueTracker(); - period = new Period(); window = new Window(); } @@ -164,13 +162,10 @@ public class AnalyticsCollector */ public final void resetForNewMediaSource() { // Copying the list is needed because onMediaPeriodReleased will modify the list. - List activeMediaPeriods = + List activeMediaPeriods = new ArrayList<>(mediaPeriodQueueTracker.activeMediaPeriods); - Timeline timeline = mediaPeriodQueueTracker.timeline; - for (MediaPeriodId mediaPeriod : activeMediaPeriods) { - int windowIndex = - timeline.isEmpty() ? 0 : timeline.getPeriod(mediaPeriod.periodIndex, period).windowIndex; - onMediaPeriodReleased(windowIndex, mediaPeriod); + for (WindowAndMediaPeriodId mediaPeriod : activeMediaPeriods) { + onMediaPeriodReleased(mediaPeriod.windowIndex, mediaPeriod.mediaPeriodId); } } @@ -309,7 +304,7 @@ public class AnalyticsCollector @Override public final void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) { - mediaPeriodQueueTracker.onMediaPeriodCreated(mediaPeriodId); + mediaPeriodQueueTracker.onMediaPeriodCreated(windowIndex, mediaPeriodId); EventTime eventTime = generateEventTime(windowIndex, mediaPeriodId); for (AnalyticsListener listener : listeners) { listener.onMediaPeriodCreated(eventTime); @@ -318,7 +313,7 @@ public class AnalyticsCollector @Override public final void onMediaPeriodReleased(int windowIndex, MediaPeriodId mediaPeriodId) { - mediaPeriodQueueTracker.onMediaPeriodReleased(mediaPeriodId); + mediaPeriodQueueTracker.onMediaPeriodReleased(windowIndex, mediaPeriodId); EventTime eventTime = generateEventTime(windowIndex, mediaPeriodId); for (AnalyticsListener listener : listeners) { listener.onMediaPeriodReleased(eventTime); @@ -377,7 +372,7 @@ public class AnalyticsCollector @Override public final void onReadingStarted(int windowIndex, MediaPeriodId mediaPeriodId) { - mediaPeriodQueueTracker.onReadingStarted(mediaPeriodId); + mediaPeriodQueueTracker.onReadingStarted(windowIndex, mediaPeriodId); EventTime eventTime = generateEventTime(windowIndex, mediaPeriodId); for (AnalyticsListener listener : listeners) { listener.onReadingStarted(eventTime); @@ -597,7 +592,8 @@ public class AnalyticsCollector // This event is for content in the currently playing window. eventPositionMs = player.getContentPosition(); } - } else if (timeline.isEmpty() || (mediaPeriodId != null && mediaPeriodId.isAd())) { + } else if (windowIndex >= timeline.getWindowCount() + || (mediaPeriodId != null && mediaPeriodId.isAd())) { // This event is for an unknown future window or for an ad in a future window. // Assume start position of zero. eventPositionMs = 0; @@ -617,16 +613,13 @@ public class AnalyticsCollector bufferedDurationMs); } - private EventTime generateEventTime(@Nullable MediaPeriodId mediaPeriodId) { - Timeline timeline = player.getCurrentTimeline(); - if (mediaPeriodId == null) { - mediaPeriodId = mediaPeriodQueueTracker.tryResolveWindowIndex(player.getCurrentWindowIndex()); + private EventTime generateEventTime(@Nullable WindowAndMediaPeriodId mediaPeriod) { + if (mediaPeriod == null) { + int windowIndex = player.getCurrentWindowIndex(); + MediaPeriodId mediaPeriodId = mediaPeriodQueueTracker.tryResolveWindowIndex(windowIndex); + return generateEventTime(windowIndex, mediaPeriodId); } - int windowIndex = - mediaPeriodId == null || timeline.isEmpty() - ? player.getCurrentWindowIndex() - : timeline.getPeriod(mediaPeriodId.periodIndex, period).windowIndex; - return generateEventTime(windowIndex, mediaPeriodId); + return generateEventTime(mediaPeriod.windowIndex, mediaPeriod.mediaPeriodId); } private EventTime generateLastReportedPlayingMediaPeriodEventTime() { @@ -651,11 +644,11 @@ public class AnalyticsCollector // TODO: Investigate reporting MediaPeriodId in renderer events and adding a listener of queue // changes, which would hopefully remove the need to track the queue here. - private final ArrayList activeMediaPeriods; + private final ArrayList activeMediaPeriods; private final Period period; - private MediaPeriodId lastReportedPlayingMediaPeriod; - private MediaPeriodId readingMediaPeriod; + private WindowAndMediaPeriodId lastReportedPlayingMediaPeriod; + private WindowAndMediaPeriodId readingMediaPeriod; private Timeline timeline; private boolean isSeeking; @@ -666,33 +659,34 @@ public class AnalyticsCollector } /** - * Returns the {@link MediaPeriodId} of the media period in the front of the queue. This is the - * playing media period unless the player hasn't started playing yet (in which case it is the - * loading media period or null). While the player is seeking or preparing, this method will - * always return null to reflect the uncertainty about the current playing period. May also be - * null, if the timeline is empty or no media period is active yet. + * Returns the {@link WindowAndMediaPeriodId} of the media period in the front of the queue. + * This is the playing media period unless the player hasn't started playing yet (in which case + * it is the loading media period or null). While the player is seeking or preparing, this + * method will always return null to reflect the uncertainty about the current playing period. + * May also be null, if the timeline is empty or no media period is active yet. */ - public @Nullable MediaPeriodId getPlayingMediaPeriod() { + public @Nullable WindowAndMediaPeriodId getPlayingMediaPeriod() { return activeMediaPeriods.isEmpty() || timeline.isEmpty() || isSeeking ? null : activeMediaPeriods.get(0); } /** - * Returns the {@link MediaPeriodId} of the currently playing media period. This is the publicly - * reported period which should always match {@link Player#getCurrentPeriodIndex()} unless the - * player is currently seeking or being prepared in which case the previous period is reported - * until the seek or preparation is processed. May be null, if no media period is active yet. + * Returns the {@link WindowAndMediaPeriodId} of the currently playing media period. This is the + * publicly reported period which should always match {@link Player#getCurrentPeriodIndex()} + * unless the player is currently seeking or being prepared in which case the previous period is + * reported until the seek or preparation is processed. May be null, if no media period is + * active yet. */ - public @Nullable MediaPeriodId getLastReportedPlayingMediaPeriod() { + public @Nullable WindowAndMediaPeriodId getLastReportedPlayingMediaPeriod() { return lastReportedPlayingMediaPeriod; } /** - * Returns the {@link MediaPeriodId} of the media period currently being read by the player. May - * be null, if the player is not reading a media period. + * Returns the {@link WindowAndMediaPeriodId} of the media period currently being read by the + * player. May be null, if the player is not reading a media period. */ - public @Nullable MediaPeriodId getReadingMediaPeriod() { + public @Nullable WindowAndMediaPeriodId getReadingMediaPeriod() { return readingMediaPeriod; } @@ -701,7 +695,7 @@ public class AnalyticsCollector * currently loading or will be the next one loading. May be null, if no media period is active * yet. */ - public @Nullable MediaPeriodId getLoadingMediaPeriod() { + public @Nullable WindowAndMediaPeriodId getLoadingMediaPeriod() { return activeMediaPeriods.isEmpty() ? null : activeMediaPeriods.get(activeMediaPeriods.size() - 1); @@ -713,20 +707,23 @@ public class AnalyticsCollector } /** - * Tries to find an existing media period from the specified window index. Only returns a + * Tries to find an existing media period id from the specified window index. Only returns a * non-null media period id if there is a unique, unambiguous match. */ public @Nullable MediaPeriodId tryResolveWindowIndex(int windowIndex) { MediaPeriodId match = null; - if (timeline != null && !timeline.isEmpty()) { + if (timeline != null) { + int timelinePeriodCount = timeline.getPeriodCount(); for (int i = 0; i < activeMediaPeriods.size(); i++) { - MediaPeriodId mediaPeriodId = activeMediaPeriods.get(i); - if (timeline.getPeriod(mediaPeriodId.periodIndex, period).windowIndex == windowIndex) { + WindowAndMediaPeriodId mediaPeriod = activeMediaPeriods.get(i); + int periodIndex = mediaPeriod.mediaPeriodId.periodIndex; + if (periodIndex < timelinePeriodCount + && timeline.getPeriod(periodIndex, period).windowIndex == windowIndex) { if (match != null) { // Ambiguous match. return null; } - match = mediaPeriodId; + match = mediaPeriod.mediaPeriodId; } } } @@ -742,10 +739,10 @@ public class AnalyticsCollector public void onTimelineChanged(Timeline timeline) { for (int i = 0; i < activeMediaPeriods.size(); i++) { activeMediaPeriods.set( - i, updateMediaPeriodIdToNewTimeline(activeMediaPeriods.get(i), timeline)); + i, updateMediaPeriodToNewTimeline(activeMediaPeriods.get(i), timeline)); } if (readingMediaPeriod != null) { - readingMediaPeriod = updateMediaPeriodIdToNewTimeline(readingMediaPeriod, timeline); + readingMediaPeriod = updateMediaPeriodToNewTimeline(readingMediaPeriod, timeline); } this.timeline = timeline; updateLastReportedPlayingMediaPeriod(); @@ -763,24 +760,25 @@ public class AnalyticsCollector } /** Updates the queue with a newly created media period. */ - public void onMediaPeriodCreated(MediaPeriodId mediaPeriodId) { - activeMediaPeriods.add(mediaPeriodId); + public void onMediaPeriodCreated(int windowIndex, MediaPeriodId mediaPeriodId) { + activeMediaPeriods.add(new WindowAndMediaPeriodId(windowIndex, mediaPeriodId)); if (activeMediaPeriods.size() == 1 && !timeline.isEmpty()) { updateLastReportedPlayingMediaPeriod(); } } /** Updates the queue with a released media period. */ - public void onMediaPeriodReleased(MediaPeriodId mediaPeriodId) { - activeMediaPeriods.remove(mediaPeriodId); - if (mediaPeriodId.equals(readingMediaPeriod)) { + public void onMediaPeriodReleased(int windowIndex, MediaPeriodId mediaPeriodId) { + WindowAndMediaPeriodId mediaPeriod = new WindowAndMediaPeriodId(windowIndex, mediaPeriodId); + activeMediaPeriods.remove(mediaPeriod); + if (mediaPeriod.equals(readingMediaPeriod)) { readingMediaPeriod = activeMediaPeriods.isEmpty() ? null : activeMediaPeriods.get(0); } } /** Update the queue with a change in the reading media period. */ - public void onReadingStarted(MediaPeriodId mediaPeriodId) { - readingMediaPeriod = mediaPeriodId; + public void onReadingStarted(int windowIndex, MediaPeriodId mediaPeriodId) { + readingMediaPeriod = new WindowAndMediaPeriodId(windowIndex, mediaPeriodId); } private void updateLastReportedPlayingMediaPeriod() { @@ -789,16 +787,48 @@ public class AnalyticsCollector } } - private MediaPeriodId updateMediaPeriodIdToNewTimeline( - MediaPeriodId mediaPeriodId, Timeline newTimeline) { + private WindowAndMediaPeriodId updateMediaPeriodToNewTimeline( + WindowAndMediaPeriodId mediaPeriod, Timeline newTimeline) { if (newTimeline.isEmpty() || timeline.isEmpty()) { - return mediaPeriodId; + return mediaPeriod; } - Object uid = timeline.getPeriod(mediaPeriodId.periodIndex, period, /* setIds= */ true).uid; - int newIndex = newTimeline.getIndexOfPeriod(uid); - return newIndex == C.INDEX_UNSET - ? mediaPeriodId - : mediaPeriodId.copyWithPeriodIndex(newIndex); + Object uid = + timeline.getPeriod(mediaPeriod.mediaPeriodId.periodIndex, period, /* setIds= */ true).uid; + int newPeriodIndex = newTimeline.getIndexOfPeriod(uid); + if (newPeriodIndex == C.INDEX_UNSET) { + return mediaPeriod; + } + int newWindowIndex = newTimeline.getPeriod(newPeriodIndex, period).windowIndex; + return new WindowAndMediaPeriodId( + newWindowIndex, mediaPeriod.mediaPeriodId.copyWithPeriodIndex(newPeriodIndex)); + } + } + + private static final class WindowAndMediaPeriodId { + + public final int windowIndex; + public final MediaPeriodId mediaPeriodId; + + public WindowAndMediaPeriodId(int windowIndex, MediaPeriodId mediaPeriodId) { + this.windowIndex = windowIndex; + this.mediaPeriodId = mediaPeriodId; + } + + @Override + public boolean equals(@Nullable Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + WindowAndMediaPeriodId that = (WindowAndMediaPeriodId) other; + return windowIndex == that.windowIndex && mediaPeriodId.equals(that.mediaPeriodId); + } + + @Override + public int hashCode() { + return 31 * windowIndex + mediaPeriodId.hashCode(); } } } diff --git a/library/ui/src/main/res/values-af/strings.xml b/library/ui/src/main/res/values-af/strings.xml index 1d82cff039..1e82c1fae2 100644 --- a/library/ui/src/main/res/values-af/strings.xml +++ b/library/ui/src/main/res/values-af/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Geen + Outo diff --git a/library/ui/src/main/res/values-am/strings.xml b/library/ui/src/main/res/values-am/strings.xml index e79a9c3aec..f9809608fc 100644 --- a/library/ui/src/main/res/values-am/strings.xml +++ b/library/ui/src/main/res/values-am/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + ምንም + ራስ-ሰር diff --git a/library/ui/src/main/res/values-ar/strings.xml b/library/ui/src/main/res/values-ar/strings.xml index 8d4c235156..d8ca87007e 100644 --- a/library/ui/src/main/res/values-ar/strings.xml +++ b/library/ui/src/main/res/values-ar/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + بدون اختيار + تلقائي diff --git a/library/ui/src/main/res/values-az/strings.xml b/library/ui/src/main/res/values-az/strings.xml index f0dfe7182a..57fb794676 100644 --- a/library/ui/src/main/res/values-az/strings.xml +++ b/library/ui/src/main/res/values-az/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Yoxdur + Avtomatik diff --git a/library/ui/src/main/res/values-b+sr+Latn/strings.xml b/library/ui/src/main/res/values-b+sr+Latn/strings.xml index 93bdc0a510..edf607b099 100644 --- a/library/ui/src/main/res/values-b+sr+Latn/strings.xml +++ b/library/ui/src/main/res/values-b+sr+Latn/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Nijedna + Automatski diff --git a/library/ui/src/main/res/values-be/strings.xml b/library/ui/src/main/res/values-be/strings.xml index ce8140a566..eadc80da6d 100644 --- a/library/ui/src/main/res/values-be/strings.xml +++ b/library/ui/src/main/res/values-be/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Няма + Аўтаматычна diff --git a/library/ui/src/main/res/values-bs/strings.xml b/library/ui/src/main/res/values-bs/strings.xml index 2916342452..6a246bd405 100644 --- a/library/ui/src/main/res/values-bs/strings.xml +++ b/library/ui/src/main/res/values-bs/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ništa + Automatski diff --git a/library/ui/src/main/res/values-ca/strings.xml b/library/ui/src/main/res/values-ca/strings.xml index 36cf6e8a06..4bbabc2138 100644 --- a/library/ui/src/main/res/values-ca/strings.xml +++ b/library/ui/src/main/res/values-ca/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Cap + Automàtica diff --git a/library/ui/src/main/res/values-cs/strings.xml b/library/ui/src/main/res/values-cs/strings.xml index 5a04b58826..6c747a31f7 100644 --- a/library/ui/src/main/res/values-cs/strings.xml +++ b/library/ui/src/main/res/values-cs/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Žádné + Automaticky diff --git a/library/ui/src/main/res/values-da/strings.xml b/library/ui/src/main/res/values-da/strings.xml index b7282603e7..a0697cd457 100644 --- a/library/ui/src/main/res/values-da/strings.xml +++ b/library/ui/src/main/res/values-da/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ingen + Automatisk diff --git a/library/ui/src/main/res/values-de/strings.xml b/library/ui/src/main/res/values-de/strings.xml index 70b43ae17b..27c6b55205 100644 --- a/library/ui/src/main/res/values-de/strings.xml +++ b/library/ui/src/main/res/values-de/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Keine + Automatisch diff --git a/library/ui/src/main/res/values-el/strings.xml b/library/ui/src/main/res/values-el/strings.xml index 929c33e619..78904fc1d4 100644 --- a/library/ui/src/main/res/values-el/strings.xml +++ b/library/ui/src/main/res/values-el/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Κανένα + Αυτόματο diff --git a/library/ui/src/main/res/values-es-rUS/strings.xml b/library/ui/src/main/res/values-es-rUS/strings.xml index 2d81309e17..e538c35161 100644 --- a/library/ui/src/main/res/values-es-rUS/strings.xml +++ b/library/ui/src/main/res/values-es-rUS/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ninguna + Automática diff --git a/library/ui/src/main/res/values-es/strings.xml b/library/ui/src/main/res/values-es/strings.xml index c12cd2b702..2eef2157ac 100644 --- a/library/ui/src/main/res/values-es/strings.xml +++ b/library/ui/src/main/res/values-es/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ninguna + Automático diff --git a/library/ui/src/main/res/values-eu/strings.xml b/library/ui/src/main/res/values-eu/strings.xml index 07e6a96bb5..571d5ff6b1 100644 --- a/library/ui/src/main/res/values-eu/strings.xml +++ b/library/ui/src/main/res/values-eu/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Bat ere ez + Automatikoa diff --git a/library/ui/src/main/res/values-fa/strings.xml b/library/ui/src/main/res/values-fa/strings.xml index 6d112d42c0..29f270d4a1 100644 --- a/library/ui/src/main/res/values-fa/strings.xml +++ b/library/ui/src/main/res/values-fa/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + هیچ‌کدام + خودکار diff --git a/library/ui/src/main/res/values-fi/strings.xml b/library/ui/src/main/res/values-fi/strings.xml index 5abe9d0bb8..575c30da20 100644 --- a/library/ui/src/main/res/values-fi/strings.xml +++ b/library/ui/src/main/res/values-fi/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + + Automaattinen diff --git a/library/ui/src/main/res/values-fr-rCA/strings.xml b/library/ui/src/main/res/values-fr-rCA/strings.xml index 05987d0add..4b12b0db3d 100644 --- a/library/ui/src/main/res/values-fr-rCA/strings.xml +++ b/library/ui/src/main/res/values-fr-rCA/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None + Aucun Auto diff --git a/library/ui/src/main/res/values-fr/strings.xml b/library/ui/src/main/res/values-fr/strings.xml index 82fec7a224..ddc0670734 100644 --- a/library/ui/src/main/res/values-fr/strings.xml +++ b/library/ui/src/main/res/values-fr/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Aucun + Automatique diff --git a/library/ui/src/main/res/values-gl/strings.xml b/library/ui/src/main/res/values-gl/strings.xml index 039a95cb9d..42f3000865 100644 --- a/library/ui/src/main/res/values-gl/strings.xml +++ b/library/ui/src/main/res/values-gl/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ningunha pista + Pista automática diff --git a/library/ui/src/main/res/values-hr/strings.xml b/library/ui/src/main/res/values-hr/strings.xml index 8c8c0d378b..c58e0e96a0 100644 --- a/library/ui/src/main/res/values-hr/strings.xml +++ b/library/ui/src/main/res/values-hr/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ništa + Automatski diff --git a/library/ui/src/main/res/values-hu/strings.xml b/library/ui/src/main/res/values-hu/strings.xml index 03a8d4559b..f466c3c712 100644 --- a/library/ui/src/main/res/values-hu/strings.xml +++ b/library/ui/src/main/res/values-hu/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Nincs + Automatikus diff --git a/library/ui/src/main/res/values-is/strings.xml b/library/ui/src/main/res/values-is/strings.xml index c900176b32..c4534d43a1 100644 --- a/library/ui/src/main/res/values-is/strings.xml +++ b/library/ui/src/main/res/values-is/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ekkert + Sjálfvirkt diff --git a/library/ui/src/main/res/values-it/strings.xml b/library/ui/src/main/res/values-it/strings.xml index 7ec420959b..e4e7e58cb6 100644 --- a/library/ui/src/main/res/values-it/strings.xml +++ b/library/ui/src/main/res/values-it/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None + Nessuno Auto diff --git a/library/ui/src/main/res/values-iw/strings.xml b/library/ui/src/main/res/values-iw/strings.xml index 01d82b99c8..23f8bb91a9 100644 --- a/library/ui/src/main/res/values-iw/strings.xml +++ b/library/ui/src/main/res/values-iw/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + ללא + אוטומטי diff --git a/library/ui/src/main/res/values-ja/strings.xml b/library/ui/src/main/res/values-ja/strings.xml index b303fdf85c..cffbd06865 100644 --- a/library/ui/src/main/res/values-ja/strings.xml +++ b/library/ui/src/main/res/values-ja/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + なし + 自動 diff --git a/library/ui/src/main/res/values-ka/strings.xml b/library/ui/src/main/res/values-ka/strings.xml index a697c6732d..2f1f1b233a 100644 --- a/library/ui/src/main/res/values-ka/strings.xml +++ b/library/ui/src/main/res/values-ka/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + არცერთი + ავტომატური diff --git a/library/ui/src/main/res/values-kk/strings.xml b/library/ui/src/main/res/values-kk/strings.xml index fecb1f50dc..ae3998ba23 100644 --- a/library/ui/src/main/res/values-kk/strings.xml +++ b/library/ui/src/main/res/values-kk/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ешқайсысы + Автоматты diff --git a/library/ui/src/main/res/values-km/strings.xml b/library/ui/src/main/res/values-km/strings.xml index 65653c06ad..a7a22b8972 100644 --- a/library/ui/src/main/res/values-km/strings.xml +++ b/library/ui/src/main/res/values-km/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + គ្មាន + ស្វ័យប្រវត្តិ diff --git a/library/ui/src/main/res/values-ko/strings.xml b/library/ui/src/main/res/values-ko/strings.xml index 1fdefd6942..07492a7b0e 100644 --- a/library/ui/src/main/res/values-ko/strings.xml +++ b/library/ui/src/main/res/values-ko/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + 없음 + 자동 diff --git a/library/ui/src/main/res/values-ky/strings.xml b/library/ui/src/main/res/values-ky/strings.xml index 4f80da69ad..ece255b02a 100644 --- a/library/ui/src/main/res/values-ky/strings.xml +++ b/library/ui/src/main/res/values-ky/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Жок + Авто diff --git a/library/ui/src/main/res/values-lo/strings.xml b/library/ui/src/main/res/values-lo/strings.xml index b6bb11252a..8140dd0a22 100644 --- a/library/ui/src/main/res/values-lo/strings.xml +++ b/library/ui/src/main/res/values-lo/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + ບໍ່ມີ + ອັດຕະໂນມັດ diff --git a/library/ui/src/main/res/values-mk/strings.xml b/library/ui/src/main/res/values-mk/strings.xml index 58a6fbf352..67040de9ef 100644 --- a/library/ui/src/main/res/values-mk/strings.xml +++ b/library/ui/src/main/res/values-mk/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Нема + Автоматскa diff --git a/library/ui/src/main/res/values-mn/strings.xml b/library/ui/src/main/res/values-mn/strings.xml index cafee2a5ae..0b8b9036f0 100644 --- a/library/ui/src/main/res/values-mn/strings.xml +++ b/library/ui/src/main/res/values-mn/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Байхгүй + Автомат diff --git a/library/ui/src/main/res/values-ms/strings.xml b/library/ui/src/main/res/values-ms/strings.xml index af641063ce..8fda8f7a5e 100644 --- a/library/ui/src/main/res/values-ms/strings.xml +++ b/library/ui/src/main/res/values-ms/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Tiada + Automatik diff --git a/library/ui/src/main/res/values-nb/strings.xml b/library/ui/src/main/res/values-nb/strings.xml index 0d817d33fb..c214d619a8 100644 --- a/library/ui/src/main/res/values-nb/strings.xml +++ b/library/ui/src/main/res/values-nb/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ingen + Automatisk diff --git a/library/ui/src/main/res/values-nl/strings.xml b/library/ui/src/main/res/values-nl/strings.xml index 65f762bfb5..6f3a408868 100644 --- a/library/ui/src/main/res/values-nl/strings.xml +++ b/library/ui/src/main/res/values-nl/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None + Geen Auto diff --git a/library/ui/src/main/res/values-pl/strings.xml b/library/ui/src/main/res/values-pl/strings.xml index b082b086e5..febd9ba864 100644 --- a/library/ui/src/main/res/values-pl/strings.xml +++ b/library/ui/src/main/res/values-pl/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Brak + Automatycznie diff --git a/library/ui/src/main/res/values-pt-rPT/strings.xml b/library/ui/src/main/res/values-pt-rPT/strings.xml index ebd1c872fb..674f559546 100644 --- a/library/ui/src/main/res/values-pt-rPT/strings.xml +++ b/library/ui/src/main/res/values-pt-rPT/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Nenhuma + Automático diff --git a/library/ui/src/main/res/values-pt/strings.xml b/library/ui/src/main/res/values-pt/strings.xml index 337fab759c..8a9c8c381f 100644 --- a/library/ui/src/main/res/values-pt/strings.xml +++ b/library/ui/src/main/res/values-pt/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Nenhuma + Automática diff --git a/library/ui/src/main/res/values-ru/strings.xml b/library/ui/src/main/res/values-ru/strings.xml index aaa2c1c610..ed8db945d3 100644 --- a/library/ui/src/main/res/values-ru/strings.xml +++ b/library/ui/src/main/res/values-ru/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Нет + Авто diff --git a/library/ui/src/main/res/values-sk/strings.xml b/library/ui/src/main/res/values-sk/strings.xml index f86b08c86d..34caa5af0e 100644 --- a/library/ui/src/main/res/values-sk/strings.xml +++ b/library/ui/src/main/res/values-sk/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Žiadne + Automaticky diff --git a/library/ui/src/main/res/values-sl/strings.xml b/library/ui/src/main/res/values-sl/strings.xml index 495c8d6580..e02e592bdd 100644 --- a/library/ui/src/main/res/values-sl/strings.xml +++ b/library/ui/src/main/res/values-sl/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Nič + Samodejno diff --git a/library/ui/src/main/res/values-sq/strings.xml b/library/ui/src/main/res/values-sq/strings.xml index 22a56af7d4..f8dbfd80cb 100644 --- a/library/ui/src/main/res/values-sq/strings.xml +++ b/library/ui/src/main/res/values-sq/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Asnjë + Automatike diff --git a/library/ui/src/main/res/values-sr/strings.xml b/library/ui/src/main/res/values-sr/strings.xml index 65d59e97ea..de5de4e507 100644 --- a/library/ui/src/main/res/values-sr/strings.xml +++ b/library/ui/src/main/res/values-sr/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ниједна + Аутоматски diff --git a/library/ui/src/main/res/values-sv/strings.xml b/library/ui/src/main/res/values-sv/strings.xml index 70a0aaaf40..b32176766e 100644 --- a/library/ui/src/main/res/values-sv/strings.xml +++ b/library/ui/src/main/res/values-sv/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Ingen + Automatiskt diff --git a/library/ui/src/main/res/values-sw/strings.xml b/library/ui/src/main/res/values-sw/strings.xml index 0e5a57d9aa..1aaa719a1f 100644 --- a/library/ui/src/main/res/values-sw/strings.xml +++ b/library/ui/src/main/res/values-sw/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Hamna + Otomatiki diff --git a/library/ui/src/main/res/values-th/strings.xml b/library/ui/src/main/res/values-th/strings.xml index 026763bbc3..99c3dfaf60 100644 --- a/library/ui/src/main/res/values-th/strings.xml +++ b/library/ui/src/main/res/values-th/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + ไม่มี + ยานยนต์ diff --git a/library/ui/src/main/res/values-tl/strings.xml b/library/ui/src/main/res/values-tl/strings.xml index 5b14f58233..81cdeafb20 100644 --- a/library/ui/src/main/res/values-tl/strings.xml +++ b/library/ui/src/main/res/values-tl/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Wala + Awtomatiko diff --git a/library/ui/src/main/res/values-tr/strings.xml b/library/ui/src/main/res/values-tr/strings.xml index e0e2dd84af..03a6b06b78 100644 --- a/library/ui/src/main/res/values-tr/strings.xml +++ b/library/ui/src/main/res/values-tr/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Yok + Otomatik diff --git a/library/ui/src/main/res/values-uk/strings.xml b/library/ui/src/main/res/values-uk/strings.xml index 1ddb3cc1db..b9e7377f4e 100644 --- a/library/ui/src/main/res/values-uk/strings.xml +++ b/library/ui/src/main/res/values-uk/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Нічого + Автоматично diff --git a/library/ui/src/main/res/values-uz/strings.xml b/library/ui/src/main/res/values-uz/strings.xml index e03682babc..c4ac394b5d 100644 --- a/library/ui/src/main/res/values-uz/strings.xml +++ b/library/ui/src/main/res/values-uz/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Hech biri + Avtomatik diff --git a/library/ui/src/main/res/values-vi/strings.xml b/library/ui/src/main/res/values-vi/strings.xml index 55c2d5c5c0..0ea5bbe6c0 100644 --- a/library/ui/src/main/res/values-vi/strings.xml +++ b/library/ui/src/main/res/values-vi/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Bỏ chọn tất cả + Tự động diff --git a/library/ui/src/main/res/values-zh-rHK/strings.xml b/library/ui/src/main/res/values-zh-rHK/strings.xml index e672e1b415..3e6f893573 100644 --- a/library/ui/src/main/res/values-zh-rHK/strings.xml +++ b/library/ui/src/main/res/values-zh-rHK/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + + 自動 diff --git a/library/ui/src/main/res/values-zh-rTW/strings.xml b/library/ui/src/main/res/values-zh-rTW/strings.xml index 4a2114973c..9703f98370 100644 --- a/library/ui/src/main/res/values-zh-rTW/strings.xml +++ b/library/ui/src/main/res/values-zh-rTW/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + + 自動 diff --git a/library/ui/src/main/res/values-zu/strings.xml b/library/ui/src/main/res/values-zu/strings.xml index c8fafcaae3..c5002dd1d9 100644 --- a/library/ui/src/main/res/values-zu/strings.xml +++ b/library/ui/src/main/res/values-zu/strings.xml @@ -20,6 +20,6 @@ Video Audio Text - None - Auto + Lutho + Okuzenzakalelayo