mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Cleanup: Remove DynamicConcatenatingMediaSource
PiperOrigin-RevId: 255410268
This commit is contained in:
parent
cf68d4eb47
commit
1bd73eb70e
2 changed files with 28 additions and 75 deletions
|
|
@ -46,7 +46,7 @@ import java.util.Set;
|
||||||
* during playback. It is valid for the same {@link MediaSource} instance to be present more than
|
* during playback. It is valid for the same {@link MediaSource} instance to be present more than
|
||||||
* once in the concatenation. Access to this class is thread-safe.
|
* once in the concatenation. Access to this class is thread-safe.
|
||||||
*/
|
*/
|
||||||
public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHolder> {
|
public final class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHolder> {
|
||||||
|
|
||||||
private static final int MSG_ADD = 0;
|
private static final int MSG_ADD = 0;
|
||||||
private static final int MSG_REMOVE = 1;
|
private static final int MSG_REMOVE = 1;
|
||||||
|
|
@ -149,7 +149,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
*
|
*
|
||||||
* @param mediaSource The {@link MediaSource} to be added to the list.
|
* @param mediaSource The {@link MediaSource} to be added to the list.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSource(MediaSource mediaSource) {
|
public synchronized void addMediaSource(MediaSource mediaSource) {
|
||||||
addMediaSource(mediaSourcesPublic.size(), mediaSource);
|
addMediaSource(mediaSourcesPublic.size(), mediaSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -161,7 +161,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
||||||
* source has been added to the playlist.
|
* source has been added to the playlist.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSource(
|
public synchronized void addMediaSource(
|
||||||
MediaSource mediaSource, Handler handler, Runnable onCompletionAction) {
|
MediaSource mediaSource, Handler handler, Runnable onCompletionAction) {
|
||||||
addMediaSource(mediaSourcesPublic.size(), mediaSource, handler, onCompletionAction);
|
addMediaSource(mediaSourcesPublic.size(), mediaSource, handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
@ -173,7 +173,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* be in the range of 0 <= index <= {@link #getSize()}.
|
* be in the range of 0 <= index <= {@link #getSize()}.
|
||||||
* @param mediaSource The {@link MediaSource} to be added to the list.
|
* @param mediaSource The {@link MediaSource} to be added to the list.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSource(int index, MediaSource mediaSource) {
|
public synchronized void addMediaSource(int index, MediaSource mediaSource) {
|
||||||
addPublicMediaSources(
|
addPublicMediaSources(
|
||||||
index,
|
index,
|
||||||
Collections.singletonList(mediaSource),
|
Collections.singletonList(mediaSource),
|
||||||
|
|
@ -191,7 +191,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
||||||
* source has been added to the playlist.
|
* source has been added to the playlist.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSource(
|
public synchronized void addMediaSource(
|
||||||
int index, MediaSource mediaSource, Handler handler, Runnable onCompletionAction) {
|
int index, MediaSource mediaSource, Handler handler, Runnable onCompletionAction) {
|
||||||
addPublicMediaSources(
|
addPublicMediaSources(
|
||||||
index, Collections.singletonList(mediaSource), handler, onCompletionAction);
|
index, Collections.singletonList(mediaSource), handler, onCompletionAction);
|
||||||
|
|
@ -203,7 +203,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param mediaSources A collection of {@link MediaSource}s to be added to the list. The media
|
* @param mediaSources A collection of {@link MediaSource}s to be added to the list. The media
|
||||||
* sources are added in the order in which they appear in this collection.
|
* sources are added in the order in which they appear in this collection.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSources(Collection<MediaSource> mediaSources) {
|
public synchronized void addMediaSources(Collection<MediaSource> mediaSources) {
|
||||||
addPublicMediaSources(
|
addPublicMediaSources(
|
||||||
mediaSourcesPublic.size(),
|
mediaSourcesPublic.size(),
|
||||||
mediaSources,
|
mediaSources,
|
||||||
|
|
@ -221,7 +221,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
||||||
* sources have been added to the playlist.
|
* sources have been added to the playlist.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSources(
|
public synchronized void addMediaSources(
|
||||||
Collection<MediaSource> mediaSources, Handler handler, Runnable onCompletionAction) {
|
Collection<MediaSource> mediaSources, Handler handler, Runnable onCompletionAction) {
|
||||||
addPublicMediaSources(mediaSourcesPublic.size(), mediaSources, handler, onCompletionAction);
|
addPublicMediaSources(mediaSourcesPublic.size(), mediaSources, handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
@ -234,7 +234,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param mediaSources A collection of {@link MediaSource}s to be added to the list. The media
|
* @param mediaSources A collection of {@link MediaSource}s to be added to the list. The media
|
||||||
* sources are added in the order in which they appear in this collection.
|
* sources are added in the order in which they appear in this collection.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSources(int index, Collection<MediaSource> mediaSources) {
|
public synchronized void addMediaSources(int index, Collection<MediaSource> mediaSources) {
|
||||||
addPublicMediaSources(index, mediaSources, /* handler= */ null, /* onCompletionAction= */ null);
|
addPublicMediaSources(index, mediaSources, /* handler= */ null, /* onCompletionAction= */ null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -249,7 +249,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
||||||
* sources have been added to the playlist.
|
* sources have been added to the playlist.
|
||||||
*/
|
*/
|
||||||
public final synchronized void addMediaSources(
|
public synchronized void addMediaSources(
|
||||||
int index,
|
int index,
|
||||||
Collection<MediaSource> mediaSources,
|
Collection<MediaSource> mediaSources,
|
||||||
Handler handler,
|
Handler handler,
|
||||||
|
|
@ -269,7 +269,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param index The index at which the media source will be removed. This index must be in the
|
* @param index The index at which the media source will be removed. This index must be in the
|
||||||
* range of 0 <= index < {@link #getSize()}.
|
* range of 0 <= index < {@link #getSize()}.
|
||||||
*/
|
*/
|
||||||
public final synchronized void removeMediaSource(int index) {
|
public synchronized void removeMediaSource(int index) {
|
||||||
removePublicMediaSources(index, index + 1, /* handler= */ null, /* onCompletionAction= */ null);
|
removePublicMediaSources(index, index + 1, /* handler= */ null, /* onCompletionAction= */ null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -288,7 +288,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
||||||
* source has been removed from the playlist.
|
* source has been removed from the playlist.
|
||||||
*/
|
*/
|
||||||
public final synchronized void removeMediaSource(
|
public synchronized void removeMediaSource(
|
||||||
int index, Handler handler, Runnable onCompletionAction) {
|
int index, Handler handler, Runnable onCompletionAction) {
|
||||||
removePublicMediaSources(index, index + 1, handler, onCompletionAction);
|
removePublicMediaSources(index, index + 1, handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
@ -307,7 +307,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @throws IndexOutOfBoundsException When the range is malformed, i.e. {@code fromIndex} < 0,
|
* @throws IndexOutOfBoundsException When the range is malformed, i.e. {@code fromIndex} < 0,
|
||||||
* {@code toIndex} > {@link #getSize()}, {@code fromIndex} > {@code toIndex}
|
* {@code toIndex} > {@link #getSize()}, {@code fromIndex} > {@code toIndex}
|
||||||
*/
|
*/
|
||||||
public final synchronized void removeMediaSourceRange(int fromIndex, int toIndex) {
|
public synchronized void removeMediaSourceRange(int fromIndex, int toIndex) {
|
||||||
removePublicMediaSources(
|
removePublicMediaSources(
|
||||||
fromIndex, toIndex, /* handler= */ null, /* onCompletionAction= */ null);
|
fromIndex, toIndex, /* handler= */ null, /* onCompletionAction= */ null);
|
||||||
}
|
}
|
||||||
|
|
@ -329,7 +329,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @throws IllegalArgumentException When the range is malformed, i.e. {@code fromIndex} < 0,
|
* @throws IllegalArgumentException When the range is malformed, i.e. {@code fromIndex} < 0,
|
||||||
* {@code toIndex} > {@link #getSize()}, {@code fromIndex} > {@code toIndex}
|
* {@code toIndex} > {@link #getSize()}, {@code fromIndex} > {@code toIndex}
|
||||||
*/
|
*/
|
||||||
public final synchronized void removeMediaSourceRange(
|
public synchronized void removeMediaSourceRange(
|
||||||
int fromIndex, int toIndex, Handler handler, Runnable onCompletionAction) {
|
int fromIndex, int toIndex, Handler handler, Runnable onCompletionAction) {
|
||||||
removePublicMediaSources(fromIndex, toIndex, handler, onCompletionAction);
|
removePublicMediaSources(fromIndex, toIndex, handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
@ -342,7 +342,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param newIndex The target index of the media source in the playlist. This index must be in the
|
* @param newIndex The target index of the media source in the playlist. This index must be in the
|
||||||
* range of 0 <= index < {@link #getSize()}.
|
* range of 0 <= index < {@link #getSize()}.
|
||||||
*/
|
*/
|
||||||
public final synchronized void moveMediaSource(int currentIndex, int newIndex) {
|
public synchronized void moveMediaSource(int currentIndex, int newIndex) {
|
||||||
movePublicMediaSource(
|
movePublicMediaSource(
|
||||||
currentIndex, newIndex, /* handler= */ null, /* onCompletionAction= */ null);
|
currentIndex, newIndex, /* handler= */ null, /* onCompletionAction= */ null);
|
||||||
}
|
}
|
||||||
|
|
@ -359,13 +359,13 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the media
|
||||||
* source has been moved.
|
* source has been moved.
|
||||||
*/
|
*/
|
||||||
public final synchronized void moveMediaSource(
|
public synchronized void moveMediaSource(
|
||||||
int currentIndex, int newIndex, Handler handler, Runnable onCompletionAction) {
|
int currentIndex, int newIndex, Handler handler, Runnable onCompletionAction) {
|
||||||
movePublicMediaSource(currentIndex, newIndex, handler, onCompletionAction);
|
movePublicMediaSource(currentIndex, newIndex, handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Clears the playlist. */
|
/** Clears the playlist. */
|
||||||
public final synchronized void clear() {
|
public synchronized void clear() {
|
||||||
removeMediaSourceRange(0, getSize());
|
removeMediaSourceRange(0, getSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -376,12 +376,12 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the playlist
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the playlist
|
||||||
* has been cleared.
|
* has been cleared.
|
||||||
*/
|
*/
|
||||||
public final synchronized void clear(Handler handler, Runnable onCompletionAction) {
|
public synchronized void clear(Handler handler, Runnable onCompletionAction) {
|
||||||
removeMediaSourceRange(0, getSize(), handler, onCompletionAction);
|
removeMediaSourceRange(0, getSize(), handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the number of media sources in the playlist. */
|
/** Returns the number of media sources in the playlist. */
|
||||||
public final synchronized int getSize() {
|
public synchronized int getSize() {
|
||||||
return mediaSourcesPublic.size();
|
return mediaSourcesPublic.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -391,7 +391,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param index An index in the range of 0 <= index <= {@link #getSize()}.
|
* @param index An index in the range of 0 <= index <= {@link #getSize()}.
|
||||||
* @return The {@link MediaSource} at this index.
|
* @return The {@link MediaSource} at this index.
|
||||||
*/
|
*/
|
||||||
public final synchronized MediaSource getMediaSource(int index) {
|
public synchronized MediaSource getMediaSource(int index) {
|
||||||
return mediaSourcesPublic.get(index).mediaSource;
|
return mediaSourcesPublic.get(index).mediaSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -400,7 +400,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
*
|
*
|
||||||
* @param shuffleOrder A {@link ShuffleOrder}.
|
* @param shuffleOrder A {@link ShuffleOrder}.
|
||||||
*/
|
*/
|
||||||
public final synchronized void setShuffleOrder(ShuffleOrder shuffleOrder) {
|
public synchronized void setShuffleOrder(ShuffleOrder shuffleOrder) {
|
||||||
setPublicShuffleOrder(shuffleOrder, /* handler= */ null, /* onCompletionAction= */ null);
|
setPublicShuffleOrder(shuffleOrder, /* handler= */ null, /* onCompletionAction= */ null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -412,7 +412,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
* @param onCompletionAction A {@link Runnable} which is executed immediately after the shuffle
|
* @param onCompletionAction A {@link Runnable} which is executed immediately after the shuffle
|
||||||
* order has been changed.
|
* order has been changed.
|
||||||
*/
|
*/
|
||||||
public final synchronized void setShuffleOrder(
|
public synchronized void setShuffleOrder(
|
||||||
ShuffleOrder shuffleOrder, Handler handler, Runnable onCompletionAction) {
|
ShuffleOrder shuffleOrder, Handler handler, Runnable onCompletionAction) {
|
||||||
setPublicShuffleOrder(shuffleOrder, handler, onCompletionAction);
|
setPublicShuffleOrder(shuffleOrder, handler, onCompletionAction);
|
||||||
}
|
}
|
||||||
|
|
@ -426,8 +426,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final synchronized void prepareSourceInternal(
|
public synchronized void prepareSourceInternal(@Nullable TransferListener mediaTransferListener) {
|
||||||
@Nullable TransferListener mediaTransferListener) {
|
|
||||||
super.prepareSourceInternal(mediaTransferListener);
|
super.prepareSourceInternal(mediaTransferListener);
|
||||||
playbackThreadHandler = new Handler(/* callback= */ this::handleMessage);
|
playbackThreadHandler = new Handler(/* callback= */ this::handleMessage);
|
||||||
if (mediaSourcesPublic.isEmpty()) {
|
if (mediaSourcesPublic.isEmpty()) {
|
||||||
|
|
@ -447,8 +446,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final MediaPeriod createPeriod(
|
public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator, long startPositionUs) {
|
||||||
MediaPeriodId id, Allocator allocator, long startPositionUs) {
|
|
||||||
Object mediaSourceHolderUid = getMediaSourceHolderUid(id.periodUid);
|
Object mediaSourceHolderUid = getMediaSourceHolderUid(id.periodUid);
|
||||||
MediaSourceHolder holder = mediaSourceByUid.get(mediaSourceHolderUid);
|
MediaSourceHolder holder = mediaSourceByUid.get(mediaSourceHolderUid);
|
||||||
if (holder == null) {
|
if (holder == null) {
|
||||||
|
|
@ -471,7 +469,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void releasePeriod(MediaPeriod mediaPeriod) {
|
public void releasePeriod(MediaPeriod mediaPeriod) {
|
||||||
MediaSourceHolder holder =
|
MediaSourceHolder holder =
|
||||||
Assertions.checkNotNull(mediaSourceByMediaPeriod.remove(mediaPeriod));
|
Assertions.checkNotNull(mediaSourceByMediaPeriod.remove(mediaPeriod));
|
||||||
((MaskingMediaPeriod) mediaPeriod).releasePeriod();
|
((MaskingMediaPeriod) mediaPeriod).releasePeriod();
|
||||||
|
|
@ -480,7 +478,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final synchronized void releaseSourceInternal() {
|
public synchronized void releaseSourceInternal() {
|
||||||
super.releaseSourceInternal();
|
super.releaseSourceInternal();
|
||||||
mediaSourceHolders.clear();
|
mediaSourceHolders.clear();
|
||||||
mediaSourceByUid.clear();
|
mediaSourceByUid.clear();
|
||||||
|
|
@ -497,7 +495,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected final void onChildSourceInfoRefreshed(
|
protected void onChildSourceInfoRefreshed(
|
||||||
MediaSourceHolder mediaSourceHolder,
|
MediaSourceHolder mediaSourceHolder,
|
||||||
MediaSource mediaSource,
|
MediaSource mediaSource,
|
||||||
Timeline timeline,
|
Timeline timeline,
|
||||||
|
|
@ -506,7 +504,8 @@ public class ConcatenatingMediaSource extends CompositeMediaSource<MediaSourceHo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected @Nullable MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(
|
@Nullable
|
||||||
|
protected MediaPeriodId getMediaPeriodIdForChildMediaPeriodId(
|
||||||
MediaSourceHolder mediaSourceHolder, MediaPeriodId mediaPeriodId) {
|
MediaSourceHolder mediaSourceHolder, MediaPeriodId mediaPeriodId) {
|
||||||
for (int i = 0; i < mediaSourceHolder.activeMediaPeriods.size(); i++) {
|
for (int i = 0; i < mediaSourceHolder.activeMediaPeriods.size(); i++) {
|
||||||
// Ensure the reported media period id has the same window sequence number as the one created
|
// Ensure the reported media period id has the same window sequence number as the one created
|
||||||
|
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.google.android.exoplayer2.source;
|
|
||||||
|
|
||||||
/** @deprecated Use {@link ConcatenatingMediaSource} instead. */
|
|
||||||
@Deprecated
|
|
||||||
public final class DynamicConcatenatingMediaSource extends ConcatenatingMediaSource {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link ConcatenatingMediaSource#ConcatenatingMediaSource(MediaSource...)}
|
|
||||||
* instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public DynamicConcatenatingMediaSource() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link ConcatenatingMediaSource#ConcatenatingMediaSource(boolean,
|
|
||||||
* MediaSource...)} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public DynamicConcatenatingMediaSource(boolean isAtomic) {
|
|
||||||
super(isAtomic);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link ConcatenatingMediaSource#ConcatenatingMediaSource(boolean, ShuffleOrder,
|
|
||||||
* MediaSource...)} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public DynamicConcatenatingMediaSource(boolean isAtomic, ShuffleOrder shuffleOrder) {
|
|
||||||
super(isAtomic, shuffleOrder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue