package moe.feng.nevo.decorators.enscreenshot.utils;

import android.os.Build;
import android.os.Handler;
import android.os.Looper;

import java.util.concurrent.Executor;

import android.os.Message;
import androidx.annotation.NonNull;

public final class Executors {

    private static final Executor MAIN_THREAD_EXECUTOR = new AsyncLooperExecutor(Looper.getMainLooper());

    @NonNull
    public static Executor mainThread() {
        return MAIN_THREAD_EXECUTOR;
    }

    private Executors() {
        throw new InstantiationError("Cannot instantiate class Executors");
    }

    private static final class AsyncLooperExecutor implements Executor {

        private final Handler mHandler;

        AsyncLooperExecutor(@NonNull Looper looper) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                mHandler = Handler.createAsync(looper);
            } else {
                mHandler = new Handler(looper);
            }
        }

        @Override
        public void execute(@NonNull Runnable command) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                mHandler.post(command);
            } else {
                Message message = Message.obtain(mHandler, command);
                message.setAsynchronous(true);
                mHandler.sendMessage(message);
            }
        }

    }

    public static class HandlerExecutor implements Executor {

        private final Handler mHandler;

        public HandlerExecutor(@NonNull Handler handler) {
            mHandler = handler;
        }

        @Override
        public void execute(@NonNull Runnable command) {
            mHandler.post(command);
        }
    }
}