mirror of
https://github.com/androidx/media.git
synced 2025-05-13 18:50:02 +08:00
Send downStreamFormatChanged notification for embedded streams.
This allows listeners to get notified of any change to the embedded tracks. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=181969023
This commit is contained in:
parent
ebfd5a7fe0
commit
cfed8791b0
@ -46,6 +46,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
public final int primaryTrackType;
|
public final int primaryTrackType;
|
||||||
|
|
||||||
private final int[] embeddedTrackTypes;
|
private final int[] embeddedTrackTypes;
|
||||||
|
private final Format[] embeddedTrackFormats;
|
||||||
private final boolean[] embeddedTracksSelected;
|
private final boolean[] embeddedTracksSelected;
|
||||||
private final T chunkSource;
|
private final T chunkSource;
|
||||||
private final SequenceableLoader.Callback<ChunkSampleStream<T>> callback;
|
private final SequenceableLoader.Callback<ChunkSampleStream<T>> callback;
|
||||||
@ -65,9 +66,10 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
/* package */ boolean loadingFinished;
|
/* package */ boolean loadingFinished;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param primaryTrackType The type of the primary track. One of the {@link C}
|
* @param primaryTrackType The type of the primary track. One of the {@link C} {@code
|
||||||
* {@code TRACK_TYPE_*} constants.
|
* TRACK_TYPE_*} constants.
|
||||||
* @param embeddedTrackTypes The types of any embedded tracks, or null.
|
* @param embeddedTrackTypes The types of any embedded tracks, or null.
|
||||||
|
* @param embeddedTrackFormats The formats of the embedded tracks, or null.
|
||||||
* @param chunkSource A {@link ChunkSource} from which chunks to load are obtained.
|
* @param chunkSource A {@link ChunkSource} from which chunks to load are obtained.
|
||||||
* @param callback An {@link Callback} for the stream.
|
* @param callback An {@link Callback} for the stream.
|
||||||
* @param allocator An {@link Allocator} from which allocations can be obtained.
|
* @param allocator An {@link Allocator} from which allocations can be obtained.
|
||||||
@ -76,11 +78,19 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
* before propagating an error.
|
* before propagating an error.
|
||||||
* @param eventDispatcher A dispatcher to notify of events.
|
* @param eventDispatcher A dispatcher to notify of events.
|
||||||
*/
|
*/
|
||||||
public ChunkSampleStream(int primaryTrackType, int[] embeddedTrackTypes, T chunkSource,
|
public ChunkSampleStream(
|
||||||
Callback<ChunkSampleStream<T>> callback, Allocator allocator, long positionUs,
|
int primaryTrackType,
|
||||||
int minLoadableRetryCount, EventDispatcher eventDispatcher) {
|
int[] embeddedTrackTypes,
|
||||||
|
Format[] embeddedTrackFormats,
|
||||||
|
T chunkSource,
|
||||||
|
Callback<ChunkSampleStream<T>> callback,
|
||||||
|
Allocator allocator,
|
||||||
|
long positionUs,
|
||||||
|
int minLoadableRetryCount,
|
||||||
|
EventDispatcher eventDispatcher) {
|
||||||
this.primaryTrackType = primaryTrackType;
|
this.primaryTrackType = primaryTrackType;
|
||||||
this.embeddedTrackTypes = embeddedTrackTypes;
|
this.embeddedTrackTypes = embeddedTrackTypes;
|
||||||
|
this.embeddedTrackFormats = embeddedTrackFormats;
|
||||||
this.chunkSource = chunkSource;
|
this.chunkSource = chunkSource;
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.eventDispatcher = eventDispatcher;
|
this.eventDispatcher = eventDispatcher;
|
||||||
@ -555,6 +565,8 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
private final SampleQueue sampleQueue;
|
private final SampleQueue sampleQueue;
|
||||||
private final int index;
|
private final int index;
|
||||||
|
|
||||||
|
private boolean formatNotificationSent;
|
||||||
|
|
||||||
public EmbeddedSampleStream(ChunkSampleStream<T> parent, SampleQueue sampleQueue, int index) {
|
public EmbeddedSampleStream(ChunkSampleStream<T> parent, SampleQueue sampleQueue, int index) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.sampleQueue = sampleQueue;
|
this.sampleQueue = sampleQueue;
|
||||||
@ -568,13 +580,20 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int skipData(long positionUs) {
|
public int skipData(long positionUs) {
|
||||||
|
int skipCount;
|
||||||
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
|
if (loadingFinished && positionUs > sampleQueue.getLargestQueuedTimestampUs()) {
|
||||||
return sampleQueue.advanceToEnd();
|
skipCount = sampleQueue.advanceToEnd();
|
||||||
} else {
|
} else {
|
||||||
int skipCount = sampleQueue.advanceTo(positionUs, true, true);
|
skipCount = sampleQueue.advanceTo(positionUs, true, true);
|
||||||
return skipCount == SampleQueue.ADVANCE_FAILED ? 0 : skipCount;
|
if (skipCount == SampleQueue.ADVANCE_FAILED) {
|
||||||
|
skipCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (skipCount > 0) {
|
||||||
|
maybeNotifyTrackFormatChanged();
|
||||||
|
}
|
||||||
|
return skipCount;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void maybeThrowError() throws IOException {
|
public void maybeThrowError() throws IOException {
|
||||||
@ -587,8 +606,13 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
if (isPendingReset()) {
|
if (isPendingReset()) {
|
||||||
return C.RESULT_NOTHING_READ;
|
return C.RESULT_NOTHING_READ;
|
||||||
}
|
}
|
||||||
return sampleQueue.read(formatHolder, buffer, formatRequired, loadingFinished,
|
int result =
|
||||||
lastSeekPositionUs);
|
sampleQueue.read(
|
||||||
|
formatHolder, buffer, formatRequired, loadingFinished, lastSeekPositionUs);
|
||||||
|
if (result == C.RESULT_BUFFER_READ) {
|
||||||
|
maybeNotifyTrackFormatChanged();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void release() {
|
public void release() {
|
||||||
@ -596,6 +620,17 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
|||||||
embeddedTracksSelected[index] = false;
|
embeddedTracksSelected[index] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void maybeNotifyTrackFormatChanged() {
|
||||||
|
if (!formatNotificationSent) {
|
||||||
|
eventDispatcher.downstreamFormatChanged(
|
||||||
|
embeddedTrackTypes[index],
|
||||||
|
embeddedTrackFormats[index],
|
||||||
|
C.SELECTION_REASON_UNKNOWN,
|
||||||
|
/* trackSelectionData= */ null,
|
||||||
|
lastSeekPositionUs);
|
||||||
|
formatNotificationSent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -436,26 +436,33 @@ import java.util.Map;
|
|||||||
}
|
}
|
||||||
|
|
||||||
AdaptationSet firstAdaptationSet = adaptationSets.get(adaptationSetIndices[0]);
|
AdaptationSet firstAdaptationSet = adaptationSets.get(adaptationSetIndices[0]);
|
||||||
int primaryTrackGroupIndex = trackGroupCount;
|
int primaryTrackGroupIndex = trackGroupCount++;
|
||||||
boolean hasEventMessageTrack = primaryGroupHasEventMessageTrackFlags[i];
|
int eventMessageTrackGroupIndex =
|
||||||
boolean hasCea608Track = primaryGroupHasCea608TrackFlags[i];
|
primaryGroupHasEventMessageTrackFlags[i] ? trackGroupCount++ : C.INDEX_UNSET;
|
||||||
|
int cea608TrackGroupIndex =
|
||||||
|
primaryGroupHasCea608TrackFlags[i] ? trackGroupCount++ : C.INDEX_UNSET;
|
||||||
|
|
||||||
trackGroups[trackGroupCount] = new TrackGroup(formats);
|
trackGroups[primaryTrackGroupIndex] = new TrackGroup(formats);
|
||||||
trackGroupInfos[trackGroupCount++] = TrackGroupInfo.primaryTrack(firstAdaptationSet.type,
|
trackGroupInfos[primaryTrackGroupIndex] =
|
||||||
adaptationSetIndices, primaryTrackGroupIndex, hasEventMessageTrack, hasCea608Track);
|
TrackGroupInfo.primaryTrack(
|
||||||
if (hasEventMessageTrack) {
|
firstAdaptationSet.type,
|
||||||
|
adaptationSetIndices,
|
||||||
|
primaryTrackGroupIndex,
|
||||||
|
eventMessageTrackGroupIndex,
|
||||||
|
cea608TrackGroupIndex);
|
||||||
|
if (eventMessageTrackGroupIndex != C.INDEX_UNSET) {
|
||||||
Format format = Format.createSampleFormat(firstAdaptationSet.id + ":emsg",
|
Format format = Format.createSampleFormat(firstAdaptationSet.id + ":emsg",
|
||||||
MimeTypes.APPLICATION_EMSG, null, Format.NO_VALUE, null);
|
MimeTypes.APPLICATION_EMSG, null, Format.NO_VALUE, null);
|
||||||
trackGroups[trackGroupCount] = new TrackGroup(format);
|
trackGroups[eventMessageTrackGroupIndex] = new TrackGroup(format);
|
||||||
trackGroupInfos[trackGroupCount++] = TrackGroupInfo.embeddedEmsgTrack(adaptationSetIndices,
|
trackGroupInfos[eventMessageTrackGroupIndex] =
|
||||||
primaryTrackGroupIndex);
|
TrackGroupInfo.embeddedEmsgTrack(adaptationSetIndices, primaryTrackGroupIndex);
|
||||||
}
|
}
|
||||||
if (hasCea608Track) {
|
if (cea608TrackGroupIndex != C.INDEX_UNSET) {
|
||||||
Format format = Format.createTextSampleFormat(firstAdaptationSet.id + ":cea608",
|
Format format = Format.createTextSampleFormat(firstAdaptationSet.id + ":cea608",
|
||||||
MimeTypes.APPLICATION_CEA608, 0, null);
|
MimeTypes.APPLICATION_CEA608, 0, null);
|
||||||
trackGroups[trackGroupCount] = new TrackGroup(format);
|
trackGroups[cea608TrackGroupIndex] = new TrackGroup(format);
|
||||||
trackGroupInfos[trackGroupCount++] = TrackGroupInfo.embeddedCea608Track(
|
trackGroupInfos[cea608TrackGroupIndex] =
|
||||||
adaptationSetIndices, primaryTrackGroupIndex);
|
TrackGroupInfo.embeddedCea608Track(adaptationSetIndices, primaryTrackGroupIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return trackGroupCount;
|
return trackGroupCount;
|
||||||
@ -476,23 +483,38 @@ import java.util.Map;
|
|||||||
TrackSelection selection, long positionUs) {
|
TrackSelection selection, long positionUs) {
|
||||||
int embeddedTrackCount = 0;
|
int embeddedTrackCount = 0;
|
||||||
int[] embeddedTrackTypes = new int[2];
|
int[] embeddedTrackTypes = new int[2];
|
||||||
boolean enableEventMessageTrack = trackGroupInfo.hasEmbeddedEventMessageTrack;
|
Format[] embeddedTrackFormats = new Format[2];
|
||||||
|
boolean enableEventMessageTrack =
|
||||||
|
trackGroupInfo.embeddedEventMessageTrackGroupIndex != C.INDEX_UNSET;
|
||||||
if (enableEventMessageTrack) {
|
if (enableEventMessageTrack) {
|
||||||
|
embeddedTrackFormats[embeddedTrackCount] =
|
||||||
|
trackGroups.get(trackGroupInfo.embeddedEventMessageTrackGroupIndex).getFormat(0);
|
||||||
embeddedTrackTypes[embeddedTrackCount++] = C.TRACK_TYPE_METADATA;
|
embeddedTrackTypes[embeddedTrackCount++] = C.TRACK_TYPE_METADATA;
|
||||||
}
|
}
|
||||||
boolean enableCea608Track = trackGroupInfo.hasEmbeddedCea608Track;
|
boolean enableCea608Track = trackGroupInfo.embeddedCea608TrackGroupIndex != C.INDEX_UNSET;
|
||||||
if (enableCea608Track) {
|
if (enableCea608Track) {
|
||||||
|
embeddedTrackFormats[embeddedTrackCount] =
|
||||||
|
trackGroups.get(trackGroupInfo.embeddedCea608TrackGroupIndex).getFormat(0);
|
||||||
embeddedTrackTypes[embeddedTrackCount++] = C.TRACK_TYPE_TEXT;
|
embeddedTrackTypes[embeddedTrackCount++] = C.TRACK_TYPE_TEXT;
|
||||||
}
|
}
|
||||||
if (embeddedTrackCount < embeddedTrackTypes.length) {
|
if (embeddedTrackCount < embeddedTrackTypes.length) {
|
||||||
|
embeddedTrackFormats = Arrays.copyOf(embeddedTrackFormats, embeddedTrackCount);
|
||||||
embeddedTrackTypes = Arrays.copyOf(embeddedTrackTypes, embeddedTrackCount);
|
embeddedTrackTypes = Arrays.copyOf(embeddedTrackTypes, embeddedTrackCount);
|
||||||
}
|
}
|
||||||
DashChunkSource chunkSource = chunkSourceFactory.createDashChunkSource(
|
DashChunkSource chunkSource = chunkSourceFactory.createDashChunkSource(
|
||||||
manifestLoaderErrorThrower, manifest, periodIndex, trackGroupInfo.adaptationSetIndices,
|
manifestLoaderErrorThrower, manifest, periodIndex, trackGroupInfo.adaptationSetIndices,
|
||||||
selection, trackGroupInfo.trackType, elapsedRealtimeOffset, enableEventMessageTrack,
|
selection, trackGroupInfo.trackType, elapsedRealtimeOffset, enableEventMessageTrack,
|
||||||
enableCea608Track);
|
enableCea608Track);
|
||||||
ChunkSampleStream<DashChunkSource> stream = new ChunkSampleStream<>(trackGroupInfo.trackType,
|
ChunkSampleStream<DashChunkSource> stream =
|
||||||
embeddedTrackTypes, chunkSource, this, allocator, positionUs, minLoadableRetryCount,
|
new ChunkSampleStream<>(
|
||||||
|
trackGroupInfo.trackType,
|
||||||
|
embeddedTrackTypes,
|
||||||
|
embeddedTrackFormats,
|
||||||
|
chunkSource,
|
||||||
|
this,
|
||||||
|
allocator,
|
||||||
|
positionUs,
|
||||||
|
minLoadableRetryCount,
|
||||||
eventDispatcher);
|
eventDispatcher);
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
@ -578,43 +600,74 @@ import java.util.Map;
|
|||||||
|
|
||||||
public final int eventStreamGroupIndex;
|
public final int eventStreamGroupIndex;
|
||||||
public final int primaryTrackGroupIndex;
|
public final int primaryTrackGroupIndex;
|
||||||
public final boolean hasEmbeddedEventMessageTrack;
|
public final int embeddedEventMessageTrackGroupIndex;
|
||||||
public final boolean hasEmbeddedCea608Track;
|
public final int embeddedCea608TrackGroupIndex;
|
||||||
|
|
||||||
public static TrackGroupInfo primaryTrack(int trackType, int[] adaptationSetIndices,
|
public static TrackGroupInfo primaryTrack(
|
||||||
int primaryTrackGroupIndex, boolean hasEmbeddedEventMessageTrack,
|
int trackType,
|
||||||
boolean hasEmbeddedCea608Track) {
|
int[] adaptationSetIndices,
|
||||||
return new TrackGroupInfo(trackType, CATEGORY_PRIMARY, adaptationSetIndices,
|
int primaryTrackGroupIndex,
|
||||||
primaryTrackGroupIndex, hasEmbeddedEventMessageTrack, hasEmbeddedCea608Track, -1);
|
int embeddedEventMessageTrackGroupIndex,
|
||||||
|
int embeddedCea608TrackGroupIndex) {
|
||||||
|
return new TrackGroupInfo(
|
||||||
|
trackType,
|
||||||
|
CATEGORY_PRIMARY,
|
||||||
|
adaptationSetIndices,
|
||||||
|
primaryTrackGroupIndex,
|
||||||
|
embeddedEventMessageTrackGroupIndex,
|
||||||
|
embeddedCea608TrackGroupIndex,
|
||||||
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TrackGroupInfo embeddedEmsgTrack(int[] adaptationSetIndices,
|
public static TrackGroupInfo embeddedEmsgTrack(int[] adaptationSetIndices,
|
||||||
int primaryTrackGroupIndex) {
|
int primaryTrackGroupIndex) {
|
||||||
return new TrackGroupInfo(C.TRACK_TYPE_METADATA, CATEGORY_EMBEDDED,
|
return new TrackGroupInfo(
|
||||||
adaptationSetIndices, primaryTrackGroupIndex, false, false, -1);
|
C.TRACK_TYPE_METADATA,
|
||||||
|
CATEGORY_EMBEDDED,
|
||||||
|
adaptationSetIndices,
|
||||||
|
primaryTrackGroupIndex,
|
||||||
|
C.INDEX_UNSET,
|
||||||
|
C.INDEX_UNSET,
|
||||||
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TrackGroupInfo embeddedCea608Track(int[] adaptationSetIndices,
|
public static TrackGroupInfo embeddedCea608Track(int[] adaptationSetIndices,
|
||||||
int primaryTrackGroupIndex) {
|
int primaryTrackGroupIndex) {
|
||||||
return new TrackGroupInfo(C.TRACK_TYPE_TEXT, CATEGORY_EMBEDDED,
|
return new TrackGroupInfo(
|
||||||
adaptationSetIndices, primaryTrackGroupIndex, false, false, -1);
|
C.TRACK_TYPE_TEXT,
|
||||||
|
CATEGORY_EMBEDDED,
|
||||||
|
adaptationSetIndices,
|
||||||
|
primaryTrackGroupIndex,
|
||||||
|
C.INDEX_UNSET,
|
||||||
|
C.INDEX_UNSET,
|
||||||
|
-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static TrackGroupInfo mpdEventTrack(int eventStreamIndex) {
|
public static TrackGroupInfo mpdEventTrack(int eventStreamIndex) {
|
||||||
return new TrackGroupInfo(C.TRACK_TYPE_METADATA, CATEGORY_MANIFEST_EVENTS,
|
return new TrackGroupInfo(
|
||||||
null, -1, false, false, eventStreamIndex);
|
C.TRACK_TYPE_METADATA,
|
||||||
|
CATEGORY_MANIFEST_EVENTS,
|
||||||
|
null,
|
||||||
|
-1,
|
||||||
|
C.INDEX_UNSET,
|
||||||
|
C.INDEX_UNSET,
|
||||||
|
eventStreamIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TrackGroupInfo(int trackType, @TrackGroupCategory int trackGroupCategory,
|
private TrackGroupInfo(
|
||||||
int[] adaptationSetIndices, int primaryTrackGroupIndex,
|
int trackType,
|
||||||
boolean hasEmbeddedEventMessageTrack, boolean hasEmbeddedCea608Track,
|
@TrackGroupCategory int trackGroupCategory,
|
||||||
|
int[] adaptationSetIndices,
|
||||||
|
int primaryTrackGroupIndex,
|
||||||
|
int embeddedEventMessageTrackGroupIndex,
|
||||||
|
int embeddedCea608TrackGroupIndex,
|
||||||
int eventStreamGroupIndex) {
|
int eventStreamGroupIndex) {
|
||||||
this.trackType = trackType;
|
this.trackType = trackType;
|
||||||
this.adaptationSetIndices = adaptationSetIndices;
|
this.adaptationSetIndices = adaptationSetIndices;
|
||||||
this.trackGroupCategory = trackGroupCategory;
|
this.trackGroupCategory = trackGroupCategory;
|
||||||
this.primaryTrackGroupIndex = primaryTrackGroupIndex;
|
this.primaryTrackGroupIndex = primaryTrackGroupIndex;
|
||||||
this.hasEmbeddedEventMessageTrack = hasEmbeddedEventMessageTrack;
|
this.embeddedEventMessageTrackGroupIndex = embeddedEventMessageTrackGroupIndex;
|
||||||
this.hasEmbeddedCea608Track = hasEmbeddedCea608Track;
|
this.embeddedCea608TrackGroupIndex = embeddedCea608TrackGroupIndex;
|
||||||
this.eventStreamGroupIndex = eventStreamGroupIndex;
|
this.eventStreamGroupIndex = eventStreamGroupIndex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,8 +207,16 @@ import java.util.ArrayList;
|
|||||||
int streamElementIndex = trackGroups.indexOf(selection.getTrackGroup());
|
int streamElementIndex = trackGroups.indexOf(selection.getTrackGroup());
|
||||||
SsChunkSource chunkSource = chunkSourceFactory.createChunkSource(manifestLoaderErrorThrower,
|
SsChunkSource chunkSource = chunkSourceFactory.createChunkSource(manifestLoaderErrorThrower,
|
||||||
manifest, streamElementIndex, selection, trackEncryptionBoxes);
|
manifest, streamElementIndex, selection, trackEncryptionBoxes);
|
||||||
return new ChunkSampleStream<>(manifest.streamElements[streamElementIndex].type, null,
|
return new ChunkSampleStream<>(
|
||||||
chunkSource, this, allocator, positionUs, minLoadableRetryCount, eventDispatcher);
|
manifest.streamElements[streamElementIndex].type,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
chunkSource,
|
||||||
|
this,
|
||||||
|
allocator,
|
||||||
|
positionUs,
|
||||||
|
minLoadableRetryCount,
|
||||||
|
eventDispatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TrackGroupArray buildTrackGroups(SsManifest manifest) {
|
private static TrackGroupArray buildTrackGroups(SsManifest manifest) {
|
||||||
|
@ -132,8 +132,15 @@ public class FakeAdaptiveMediaPeriod extends FakeMediaPeriod
|
|||||||
protected SampleStream createSampleStream(TrackSelection trackSelection) {
|
protected SampleStream createSampleStream(TrackSelection trackSelection) {
|
||||||
FakeChunkSource chunkSource = chunkSourceFactory.createChunkSource(trackSelection, durationUs);
|
FakeChunkSource chunkSource = chunkSourceFactory.createChunkSource(trackSelection, durationUs);
|
||||||
return new ChunkSampleStream<>(
|
return new ChunkSampleStream<>(
|
||||||
MimeTypes.getTrackType(trackSelection.getSelectedFormat().sampleMimeType), null,
|
MimeTypes.getTrackType(trackSelection.getSelectedFormat().sampleMimeType),
|
||||||
chunkSource, this, allocator, 0, 3, eventDispatcher);
|
null,
|
||||||
|
null,
|
||||||
|
chunkSource,
|
||||||
|
this,
|
||||||
|
allocator,
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
eventDispatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
x
Reference in New Issue
Block a user