blob: 981389583d2d54f53ab373e5ed591e14b93846cb [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugins.videoplayer;
import io.flutter.plugin.common.EventChannel;
import java.util.ArrayList;
/**
* And implementation of {@link EventChannel.EventSink} which can wrap an underlying sink.
*
* <p>It delivers messages immediately when downstream is available, but it queues messages before
* the delegate event sink is set with setDelegate.
*
* <p>This class is not thread-safe. All calls must be done on the same thread or synchronized
* externally.
*/
final class QueuingEventSink implements EventChannel.EventSink {
private EventChannel.EventSink delegate;
private ArrayList<Object> eventQueue = new ArrayList<>();
private boolean done = false;
public void setDelegate(EventChannel.EventSink delegate) {
this.delegate = delegate;
maybeFlush();
}
@Override
public void endOfStream() {
enqueue(new EndOfStreamEvent());
maybeFlush();
done = true;
}
@Override
public void error(String code, String message, Object details) {
enqueue(new ErrorEvent(code, message, details));
maybeFlush();
}
@Override
public void success(Object event) {
enqueue(event);
maybeFlush();
}
private void enqueue(Object event) {
if (done) {
return;
}
eventQueue.add(event);
}
private void maybeFlush() {
if (delegate == null) {
return;
}
for (Object event : eventQueue) {
if (event instanceof EndOfStreamEvent) {
delegate.endOfStream();
} else if (event instanceof ErrorEvent) {
ErrorEvent errorEvent = (ErrorEvent) event;
delegate.error(errorEvent.code, errorEvent.message, errorEvent.details);
} else {
delegate.success(event);
}
}
eventQueue.clear();
}
private static class EndOfStreamEvent {}
private static class ErrorEvent {
String code;
String message;
Object details;
ErrorEvent(String code, String message, Object details) {
this.code = code;
this.message = message;
this.details = details;
}
}
}