package org.briarproject.android;

import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import org.briarproject.api.android.AndroidExecutor;

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

import javax.inject.Inject;

class AndroidExecutorImpl implements AndroidExecutor {

	private final Handler handler;

	@Inject
	AndroidExecutorImpl(Application app) {
		Context ctx = app.getApplicationContext();
		handler = new FutureTaskHandler(ctx.getMainLooper());
	}

	public <V> Future<V> submit(Callable<V> c) {
		Future<V> f = new FutureTask<V>(c);
		handler.sendMessage(Message.obtain(handler, 0, f));
		return f;
	}

	public void execute(Runnable r) {
		handler.post(r);
	}

	private static class FutureTaskHandler extends Handler {

		private FutureTaskHandler(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message m) {
			((FutureTask<?>) m.obj).run();
		}
	}
}