Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80f89bbd authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Implement message handling in ExecutorImpl"

parents dffdb984 afed0351
Loading
Loading
Loading
Loading
+10 −5
Original line number Original line Diff line number Diff line
@@ -83,17 +83,19 @@ public abstract class ConcurrencyModule {
     * Provide a Background-Thread Executor by default.
     * Provide a Background-Thread Executor by default.
     */
     */
    @Provides
    @Provides
    @Singleton
    public static Executor provideExecutor(@Background Looper looper) {
    public static Executor provideExecutor(@Background Looper looper) {
        return new ExecutorImpl(new Handler(looper));
        return new ExecutorImpl(looper);
    }
    }


    /**
    /**
     * Provide a Background-Thread Executor.
     * Provide a Background-Thread Executor.
     */
     */
    @Provides
    @Provides
    @Singleton
    @Background
    @Background
    public static Executor provideBackgroundExecutor(@Background Looper looper) {
    public static Executor provideBackgroundExecutor(@Background Looper looper) {
        return new ExecutorImpl(new Handler(looper));
        return new ExecutorImpl(looper);
    }
    }


    /**
    /**
@@ -109,26 +111,29 @@ public abstract class ConcurrencyModule {
     * Provide a Background-Thread Executor by default.
     * Provide a Background-Thread Executor by default.
     */
     */
    @Provides
    @Provides
    @Singleton
    public static DelayableExecutor provideDelayableExecutor(@Background Looper looper) {
    public static DelayableExecutor provideDelayableExecutor(@Background Looper looper) {
        return new ExecutorImpl(new Handler(looper));
        return new ExecutorImpl(looper);
    }
    }


    /**
    /**
     * Provide a Background-Thread Executor.
     * Provide a Background-Thread Executor.
     */
     */
    @Provides
    @Provides
    @Singleton
    @Background
    @Background
    public static DelayableExecutor provideBackgroundDelayableExecutor(@Background Looper looper) {
    public static DelayableExecutor provideBackgroundDelayableExecutor(@Background Looper looper) {
        return new ExecutorImpl(new Handler(looper));
        return new ExecutorImpl(looper);
    }
    }


    /**
    /**
     * Provide a Main-Thread Executor.
     * Provide a Main-Thread Executor.
     */
     */
    @Provides
    @Provides
    @Singleton
    @Main
    @Main
    public static DelayableExecutor provideMainDelayableExecutor(@Main Looper looper) {
    public static DelayableExecutor provideMainDelayableExecutor(@Main Looper looper) {
        return new ExecutorImpl(new Handler(looper));
        return new ExecutorImpl(looper);
    }
    }


    /**
    /**
+43 −11
Original line number Original line Diff line number Diff line
@@ -17,37 +17,69 @@
package com.android.systemui.util.concurrency;
package com.android.systemui.util.concurrency;


import android.os.Handler;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.os.Message;
import android.os.Message;


import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;


/**
/**
 * Implementations of {@link DelayableExecutor} for SystemUI.
 * Implementations of {@link DelayableExecutor} for SystemUI.
 */
 */
public class ExecutorImpl extends HandlerExecutor implements DelayableExecutor {
public class ExecutorImpl implements DelayableExecutor {
    private final Handler mHandler;
    private final Handler mHandler;


    public ExecutorImpl(Handler handler) {
    ExecutorImpl(Looper looper) {
        super(handler);
        mHandler = new Handler(looper, this::onHandleMessage);
        mHandler = handler;
    }

    @Override
    public void execute(Runnable command) {
        if (!mHandler.post(command)) {
            throw new RejectedExecutionException(mHandler + " is shutting down");
        }
    }
    }


    @Override
    @Override
    public Runnable executeDelayed(Runnable r, long delay, TimeUnit unit) {
    public Runnable executeDelayed(Runnable r, long delay, TimeUnit unit) {
        Object token = new Object();
        ExecutionToken token = new ExecutionToken(r);
        Message m = mHandler.obtainMessage(0, token);
        Message m = mHandler.obtainMessage(MSG_EXECUTE_RUNNABLE, token);
        mHandler.sendMessageDelayed(m, unit.toMillis(delay));
        mHandler.sendMessageDelayed(m, unit.toMillis(delay));


        return () -> mHandler.removeCallbacksAndMessages(token);
        return token;
    }
    }


    @Override
    @Override
    public Runnable executeAtTime(Runnable r, long uptimeMillis, TimeUnit unit) {
    public Runnable executeAtTime(Runnable r, long uptimeMillis, TimeUnit unit) {
        Object token = new Object();
        ExecutionToken token = new ExecutionToken(r);
        Message m = mHandler.obtainMessage(0, token);
        Message m = mHandler.obtainMessage(MSG_EXECUTE_RUNNABLE, token);
        mHandler.sendMessageAtTime(m, unit.toMillis(uptimeMillis));
        mHandler.sendMessageAtTime(m, unit.toMillis(uptimeMillis));


        return () -> mHandler.removeCallbacksAndMessages(token);
        return token;
    }
    }

    private boolean onHandleMessage(Message msg) {
        if (msg.what == MSG_EXECUTE_RUNNABLE) {
            ExecutionToken token = (ExecutionToken) msg.obj;
            token.runnable.run();
        } else {
            throw new IllegalStateException("Unrecognized message: " + msg.what);
        }
        return true;
    }

    private class ExecutionToken implements Runnable {
        public final Runnable runnable;

        private ExecutionToken(Runnable runnable) {
            this.runnable = runnable;
        }

        @Override
        public void run() {
            mHandler.removeCallbacksAndMessages(this);
        }
    }

    private static final int MSG_EXECUTE_RUNNABLE = 0;
}
}