package im.actor.core.utils; import im.actor.core.AndroidMessenger; import im.actor.runtime.Log; import im.actor.runtime.actors.Actor; import im.actor.runtime.actors.ActorCancellable; public class AppStateActor extends Actor { private static final String TAG = "AppStateActor"; private static final int CLOSE_TIMEOUT = 100; private final AndroidMessenger messenger; private boolean isAppOpen = false; private boolean isScreenVisible = true; private int activityCount = 0; private ActorCancellable closeCancellable; public AppStateActor(AndroidMessenger messenger) { this.messenger = messenger; } private void onActivityOpened() { Log.d(TAG, "onActivityOpened"); activityCount++; if (isScreenVisible) { onAppProbablyOpened(); } } private void onActivityClosed() { Log.d(TAG, "onActivityClosed"); activityCount--; if (activityCount == 0) { onAppProbablyClosed(); } } private void onAppProbablyClosed() { Log.d(TAG, "onAppProbablyClosed"); if (isAppOpen) { if (closeCancellable != null) { closeCancellable.cancel(); closeCancellable = null; } closeCancellable = schedule(new MarkAppAsClosed(), CLOSE_TIMEOUT); } } private void onAppProbablyOpened() { Log.d(TAG, "onAppProbablyOpened"); onAppOpened(); if (closeCancellable != null) { closeCancellable.cancel(); closeCancellable = null; } } private void onAppOpened() { Log.d(TAG, "onAppOpened"); if (!isAppOpen) { isAppOpen = true; messenger.onAppVisible(); } } private void onAppClosed() { Log.d(TAG, "onAppClosed"); if (isAppOpen) { isAppOpen = false; messenger.onAppHidden(); } } private void onScreenOn() { Log.d(TAG, "onScreenOn"); isScreenVisible = true; if (activityCount > 0) { onAppProbablyOpened(); } } public void onScreenOff() { Log.d(TAG, "onScreenOff"); isScreenVisible = false; onAppProbablyClosed(); } @Override public void onReceive(Object message) { if (message instanceof OnActivityOpened) { onActivityOpened(); } else if (message instanceof OnActivityClosed) { onActivityClosed(); } else if (message instanceof MarkAppAsClosed) { onAppClosed(); } else if (message instanceof OnScreenOn) { onScreenOn(); } else if (message instanceof OnScreenOff) { onScreenOff(); } else { super.onReceive(message); } } private static class MarkAppAsClosed { } public static class OnActivityOpened { } public static class OnActivityClosed { } public static class OnScreenOn { } public static class OnScreenOff { } }