package com.jug6ernaut.debugdrawer.utils;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

/**
 * Created by williamwebb on 7/3/15.
 */
public abstract class ActivityEventListener {

	private Activity activity;

	public ActivityEventListener(Activity activity) {
		this.activity = activity;
	}

	public void register(Application application) {
		application.registerActivityLifecycleCallbacks(callbacks);
	}

	public void unegister(Application application) {
		application.unregisterActivityLifecycleCallbacks(callbacks);
	}

	// dont expose
	private Application.ActivityLifecycleCallbacks callbacks = new Application.ActivityLifecycleCallbacks() {
		@Override
		public void onActivityCreated(Activity activity, Bundle bundle) {
			if (isThisActivity(activity)) onCreate(activity, bundle);
		}
		@Override
		public void onActivityStarted(Activity activity) {
			if (isThisActivity(activity)) onStart(activity);
		}
		@Override
		public void onActivityResumed(Activity activity) {
			if (isThisActivity(activity)) onResumed(activity);
		}
		@Override
		public void onActivityPaused(Activity activity) {
			if (isThisActivity(activity)) onPaused(activity);
		}
		@Override
		public void onActivityStopped(Activity activity) {
			if (isThisActivity(activity)) onStopped(activity);
		}
		@Override
		public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
			if (isThisActivity(activity)) onSaveInstanceState(activity, bundle);
		}
		@Override
		public void onActivityDestroyed(Activity activity) {
			if (isThisActivity(activity)) {
				onDestroyed(activity);
				activity.getApplication().unregisterActivityLifecycleCallbacks(this);
				ActivityEventListener.this.activity = null; // dereference
			}
		}
	};

	private boolean isThisActivity(Activity activity) {
		return (this.activity.equals(activity));
	}

	public void onCreate(Activity activity, Bundle bundle) { }

	public void onStart(Activity activity) { }

	public void onResumed(Activity activity) { }

	public void onPaused(Activity activity) { }

	public void onStopped(Activity activity) { }

	public void onSaveInstanceState(Activity activity, Bundle bundle){ }
	public void onDestroyed(Activity activity){ }
}