package com.reactnativenavigation.views.slidingOverlay;
import com.reactnativenavigation.NavigationApplication;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Timer;
import java.util.TimerTask;
public class SlidingOverlaysQueue implements SlidingOverlay.SlidingListener{
private static final int SHORT_SUSTAIN_DURATION = 500;
protected Timer autoDismissTimer = null;
protected boolean pendingHide;
protected Queue<SlidingOverlay> queue = new LinkedList<>();
public void add(final SlidingOverlay slidingOverlay) {
NavigationApplication.instance.runOnMainThread(new Runnable() {
@Override
public void run() {
queue.add(slidingOverlay);
if (queue.size() == 1) {
dispatchNextSlidingOverlay();
}
else {
SlidingOverlay currentOverlay = queue.peek();
if (currentOverlay.isVisible()) {
if (autoDismissTimer != null) {
autoDismissTimer.cancel();
autoDismissTimer = null;
}
currentOverlay.hide();
}
}
}
});
}
public void remove() {
NavigationApplication.instance.runOnMainThread(new Runnable() {
@Override
public void run() {
SlidingOverlay currentOverlay = queue.peek();
if(currentOverlay == null) {
return;
}
if (currentOverlay.isShowing()) {
pendingHide = true;
}
else if (currentOverlay.isVisible()) {
cancelTimer();
currentOverlay.hide();
}
}
});
}
@Override
public void onSlidingOverlayShown() {
Integer autoDismissTimerSec = queue.peek().getAutoDismissTimerSec();
if (autoDismissTimerSec != null || pendingHide || queue.size() > 1) {
int autoDismissDuration = autoDismissTimerSec != null
? autoDismissTimerSec * 1000
: SHORT_SUSTAIN_DURATION;
pendingHide = false;
autoDismissTimer = new Timer();
autoDismissTimer.schedule(new TimerTask() {
@Override
public void run() {
NavigationApplication.instance.runOnMainThread(new Runnable() {
@Override
public void run() {
queue.peek().hide();
}
});
}
}, autoDismissDuration);
}
}
@Override
public void onSlidingOverlayGone() {
queue.poll();
dispatchNextSlidingOverlay();
}
public void destroy() {
SlidingOverlay currentOverlay = queue.poll();
while (!queue.isEmpty()) {
queue.poll();
}
if (currentOverlay != null) {
cancelTimer();
currentOverlay.setSlidingListener(null);
currentOverlay.destroy();
}
}
protected void dispatchNextSlidingOverlay() {
NavigationApplication.instance.runOnMainThread(new Runnable() {
@Override
public void run() {
final SlidingOverlay nextSlidingOverlay = queue.peek();
if (nextSlidingOverlay != null) {
nextSlidingOverlay.setSlidingListener(SlidingOverlaysQueue.this);
nextSlidingOverlay.show();
}
}
});
}
protected void cancelTimer() {
if (autoDismissTimer != null) {
autoDismissTimer.cancel();
autoDismissTimer = null;
}
}
}