/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.common.executors;
import javax.annotation.Nullable;
import java.util.List;
import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.Callable;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import android.os.Handler;
/**
* A {@link HandlerExecutorService} implementation.
*/
public class HandlerExecutorServiceImpl extends AbstractExecutorService
implements HandlerExecutorService {
private final Handler mHandler;
public HandlerExecutorServiceImpl(Handler handler) {
mHandler = handler;
}
@Override
public void shutdown() {
throw new UnsupportedOperationException();
}
@Override
public List<Runnable> shutdownNow() {
throw new UnsupportedOperationException();
}
@Override
public boolean isShutdown() {
return false;
}
@Override
public boolean isTerminated() {
return false;
}
@Override
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
throw new UnsupportedOperationException();
}
@Override
public void execute(Runnable command) {
mHandler.post(command);
}
@Override
protected <T> ScheduledFutureImpl<T> newTaskFor(Runnable runnable, T value) {
return new ScheduledFutureImpl<T>(mHandler, runnable, value);
}
@Override
protected <T> ScheduledFutureImpl<T> newTaskFor(Callable<T> callable) {
return new ScheduledFutureImpl<T>(mHandler, callable);
}
@Override
public ScheduledFuture<?> submit(Runnable task) {
return submit(task, (Void) null);
}
@Override
public <T> ScheduledFuture<T> submit(Runnable task, @Nullable T result) {
if (task == null) throw new NullPointerException();
ScheduledFutureImpl<T> future = newTaskFor(task, result);
execute(future);
return future;
}
@Override
public <T> ScheduledFuture<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
ScheduledFutureImpl<T> future = newTaskFor(task);
execute(future);
return future;
}
@Override
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
ScheduledFutureImpl<?> future = newTaskFor(command, null);
mHandler.postDelayed(future, unit.toMillis(delay));
return future;
}
@Override
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
ScheduledFutureImpl<V> future = newTaskFor(callable);
mHandler.postDelayed(future, unit.toMillis(delay));
return future;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(
Runnable command, long initialDelay, long period, TimeUnit unit) {
throw new UnsupportedOperationException();
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(
Runnable command, long initialDelay, long delay, TimeUnit unit) {
throw new UnsupportedOperationException();
}
@Override
public void quit() {
mHandler.getLooper().quit();
}
@Override
public boolean isHandlerThread() {
return Thread.currentThread() == mHandler.getLooper().getThread();
}
}