/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.modules.presence; import im.actor.core.api.rpc.RequestSetOnline; import im.actor.core.api.rpc.ResponseVoid; import im.actor.core.modules.Modules; import im.actor.core.events.AppVisibleChanged; import im.actor.core.modules.ModuleActor; import im.actor.core.network.RpcCallback; import im.actor.core.network.RpcException; import im.actor.runtime.actors.ActorCancellable; import im.actor.runtime.eventbus.BusSubscriber; import im.actor.runtime.eventbus.Event; /** * Actor for processing current user's online status. * TODO: Implement correct request timeout */ public class OwnPresenceActor extends ModuleActor implements BusSubscriber { private static final int RESEND_TIMEOUT = 60 * 1000; // 1 min private static final int TIMEOUT = 90 * 1000; private boolean isAlwaysOnline = false; private boolean isVisible = false; private long prevRid = 0; private ActorCancellable performCancellable; public OwnPresenceActor(Modules messenger) { super(messenger); } @Override public void preStart() { // isAlwaysOnline = config().getDeviceCategory() == DeviceCategory.DESKTOP; isAlwaysOnline = false; if (isAlwaysOnline) { schedulePerform(0); } else { context().getEvents().subscribe(this, AppVisibleChanged.EVENT); } } private void onAppVisible() { isVisible = true; schedulePerform(0); } private void onAppHidden() { isVisible = false; schedulePerform(0); } private void performOnline() { if (prevRid != 0) { cancelRequest(prevRid); prevRid = 0; } boolean isOnline = isVisible || isAlwaysOnline; prevRid = request(new RequestSetOnline(isOnline, TIMEOUT, null, null), new RpcCallback<ResponseVoid>() { @Override public void onResult(ResponseVoid response) { } @Override public void onError(RpcException e) { } }); if (isOnline) { schedulePerform(RESEND_TIMEOUT); } } private void schedulePerform(long delay) { if (performCancellable != null) { performCancellable.cancel(); performCancellable = null; } performCancellable = schedule(new PerformOnline(), delay); } // Messages @Override public void onReceive(Object message) { if (message instanceof OnAppVisible) { onAppVisible(); } else if (message instanceof OnAppHidden) { onAppHidden(); } else if (message instanceof PerformOnline) { performOnline(); } else { super.onReceive(message); } } @Override public void onBusEvent(Event event) { if (event instanceof AppVisibleChanged) { AppVisibleChanged visibleChanged = (AppVisibleChanged) event; if (visibleChanged.isVisible()) { self().send(new OwnPresenceActor.OnAppVisible()); } else { self().send(new OwnPresenceActor.OnAppHidden()); } } } private static class OnAppVisible { } private static class OnAppHidden { } private static class PerformOnline { } }