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

Commit 687a05d3 authored by Adrian Roos's avatar Adrian Roos
Browse files

IntResultReceiver: fix clearing on dispatch

Fixes an issue where mConsumer was cleared too early for any executor
other than Runnable::run, leading to an NPE when the Runnable is invoked
on the Executor.

Fixes: 265457058
Test: atest InputConnectionEndToEndTest
Change-Id: Ifc8e435e02520eb29c9631427daa5a1a1ea0ccf0
parent 110d5124
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -72,30 +72,33 @@ final class IRemoteInputConnectionInvoker {
     * callback.
     */
    private static final class IntResultReceiver extends ResultReceiver {
        @NonNull
        @Nullable
        private IntConsumer mConsumer;
        @NonNull
        @Nullable
        private Executor mExecutor;

        IntResultReceiver(@NonNull Executor executor, @NonNull IntConsumer consumer) {
            super(null);
            Objects.requireNonNull(executor);
            Objects.requireNonNull(consumer);
            mExecutor = executor;
            mConsumer = consumer;
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if (mExecutor != null && mConsumer != null) {
                mExecutor.execute(() -> mConsumer.accept(resultCode));
                // provide callback only once.
                clear();
            }
        }

        private void clear() {
            final Executor executor;
            final IntConsumer consumer;
            synchronized (this) {
                executor = mExecutor;
                consumer = mConsumer;
                mExecutor = null;
                mConsumer = null;
            }
            if (executor != null && consumer != null) {
                executor.execute(() -> consumer.accept(resultCode));
            }
        }
    };

    /**