package org.qii.weiciyuan.othercomponent;
import org.qii.weiciyuan.support.debug.AppLogger;
import org.qii.weiciyuan.support.lib.LogOnExceptionScheduledExecutor;
import org.qii.weiciyuan.support.utils.GlobalContext;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class AppActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
private static final int SCHEDULE_DELAY_MILLS = 3000;
private static final int FETCH_PERIOD_SECONDS = 30;
private int visibleActivityCount = 0;
private Handler uiHandler = new Handler(Looper.getMainLooper());
private LogOnExceptionScheduledExecutor logOnExceptionScheduledExecutor;
private ScheduledFuture scheduledFuture;
public AppActivityLifecycleCallbacks() {
logOnExceptionScheduledExecutor = new LogOnExceptionScheduledExecutor(1);
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
AppLogger.i("Activity is created, class name : " + activity.getClass().getSimpleName());
}
@Override
public void onActivityStarted(Activity activity) {
AppLogger.i("Activity is started, class name : " + activity.getClass()
.getSimpleName());
if (visibleActivityCount == 0) {
startFetchUnread();
}
visibleActivityCount++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
AppLogger.i("Activity is stopped, class name : " + activity.getClass()
.getSimpleName());
visibleActivityCount--;
if (visibleActivityCount == 0) {
stopFetchUnread();
}
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
AppLogger.i("Activity saved instance state, class name : " + activity.getClass()
.getSimpleName());
}
@Override
public void onActivityDestroyed(Activity activity) {
AppLogger.i("Activity is destroyed, class name : " + activity.getClass().getSimpleName());
}
private void startFetchUnread() {
uiHandler.postDelayed(scheduleFetchUnreadRunnable, SCHEDULE_DELAY_MILLS);
uiHandler.removeCallbacks(unScheduleFetchUnreadRunnable);
}
private void stopFetchUnread() {
uiHandler.postDelayed(unScheduleFetchUnreadRunnable, SCHEDULE_DELAY_MILLS);
uiHandler.removeCallbacks(scheduleFetchUnreadRunnable);
}
private Runnable scheduleFetchUnreadRunnable = new Runnable() {
@Override
public void run() {
AppLogger.i("Schedule fetch unread message");
if (scheduledFuture != null) {
scheduledFuture.cancel(true);
}
scheduledFuture = logOnExceptionScheduledExecutor
.scheduleAtFixedRate(fetchRunnable, 0,
FETCH_PERIOD_SECONDS, TimeUnit.SECONDS);
}
};
private Runnable unScheduleFetchUnreadRunnable = new Runnable() {
@Override
public void run() {
AppLogger.i("Stop schedule fetch unread message");
if (scheduledFuture != null) {
scheduledFuture.cancel(true);
}
}
};
private Runnable fetchRunnable = new Runnable() {
@Override
public void run() {
AppLogger.i("Start fetch unread message service");
GlobalContext.getInstance().startService(FetchNewMsgService.newIntentFromOpenApp());
}
};
}