package im.actor.core.js.modules;
import im.actor.core.js.JsMessenger;
import im.actor.core.js.providers.electron.JsElectronApp;
import im.actor.core.modules.AbsModule;
import im.actor.core.modules.ModuleActor;
import im.actor.core.modules.ModuleContext;
import im.actor.runtime.actors.ActorCancellable;
import im.actor.runtime.actors.ActorRef;
import static im.actor.runtime.actors.ActorSystem.system;
public class JsIdleModule extends AbsModule {
private static final long TIMEOUT = 3 * 60 * 1000/*3 min*/;
private JsMessenger messenger;
private ActorRef idleActor;
public JsIdleModule(final JsMessenger messenger, final ModuleContext context) {
super(context);
this.messenger = messenger;
this.messenger.onAppVisible();
idleActor = system().actorOf("js/idle_timer", () -> new IdleActor(messenger, context));
}
public void onHidden() {
idleActor.send(new IdleActor.OnHidden());
}
public void onVisible() {
idleActor.send(new IdleActor.OnVisible());
}
private static class IdleActor extends ModuleActor implements JsIdleCallback {
private boolean isAppVisible = true;
private JsMessenger messenger;
private ActorCancellable flushCancellable;
private boolean isElectron = JsElectronApp.isElectron();
public IdleActor(JsMessenger messenger, ModuleContext context) {
super(context);
this.messenger = messenger;
}
@Override
public void preStart() {
if (!isElectron) {
JsIdleDetection.subscribe(this);
scheduleFlush();
}
}
public void onActionDetected() {
if (!isAppVisible) {
isAppVisible = true;
messenger.onAppVisible();
}
if (!isElectron) {
scheduleFlush();
}
}
void scheduleFlush() {
if (flushCancellable != null) {
flushCancellable.cancel();
flushCancellable = null;
}
flushCancellable = schedule(new FlushTimeout(), TIMEOUT);
}
public void onTimeoutDetected() {
if (isAppVisible) {
isAppVisible = false;
messenger.onAppHidden();
}
}
public void onHidden() {
onTimeoutDetected();
}
public void onVisible() {
onActionDetected();
}
@Override
public void onReceive(Object message) {
if (message instanceof FlushTimeout) {
onTimeoutDetected();
} else if (message instanceof OnHidden) {
onHidden();
} else if (message instanceof OnVisible) {
onVisible();
} else {
super.onReceive(message);
}
}
private class FlushTimeout {
}
public static class OnHidden {
}
public static class OnVisible {
}
}
}