package com.prateekj.snooper.infra;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class BackgroundManager implements Application.ActivityLifecycleCallbacks {
private static final long BACKGROUND_DELAY = 500;
private static final String TAG = BackgroundManager.class.getSimpleName();
private static BackgroundManager sInstance;
public interface Listener {
void onBecameForeground();
void onBecameBackground();
}
private boolean mInBackground = true;
private final List<Listener> listeners = new ArrayList<>();
private final Handler mBackgroundDelayHandler = new Handler();
private Runnable mBackgroundTransition;
private BackgroundManager(Application application) {
application.registerActivityLifecycleCallbacks(this);
}
public static BackgroundManager getInstance(Application application) {
if (sInstance == null) {
sInstance = new BackgroundManager(application);
}
return sInstance;
}
public void registerListener(Listener listener) {
listeners.add(listener);
}
public void unregisterListener(Listener listener) {
listeners.remove(listener);
}
public boolean isInBackground() {
return mInBackground;
}
@Override
public void onActivityResumed(Activity activity) {
if (mBackgroundTransition != null) {
mBackgroundDelayHandler.removeCallbacks(mBackgroundTransition);
mBackgroundTransition = null;
}
if (mInBackground) {
mInBackground = false;
notifyOnBecameForeground();
Log.d(TAG, "Application went to foreground");
}
}
private void notifyOnBecameForeground() {
for (Listener listener : listeners) {
try {
listener.onBecameForeground();
} catch (Exception e) {
Log.d(TAG, "Listener threw exception!", e);
}
}
}
@Override
public void onActivityPaused(Activity activity) {
if (!mInBackground && mBackgroundTransition == null) {
mBackgroundTransition = new Runnable() {
@Override
public void run() {
mInBackground = true;
mBackgroundTransition = null;
notifyOnBecameBackground();
Log.d(TAG, "Application went to background");
}
};
mBackgroundDelayHandler.postDelayed(mBackgroundTransition, BACKGROUND_DELAY);
}
}
private void notifyOnBecameBackground() {
for (Listener listener : listeners) {
try {
listener.onBecameBackground();
} catch (Exception e) {
Log.e(TAG, "Listener threw exception!", e);
}
}
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}