Loading core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java +35 −37 Original line number Diff line number Diff line Loading @@ -66,18 +66,13 @@ final class IRemoteInputConnectionInvoker { mSessionId = sessionId; } /** * Subclass of {@link ResultReceiver} used by * {@link #performHandwritingGesture(HandwritingGesture, Executor, IntConsumer)} for providing * callback. */ private static final class IntResultReceiver extends ResultReceiver { private abstract static class OnceResultReceiver<C> extends ResultReceiver { @Nullable private IntConsumer mConsumer; private C mConsumer; @Nullable private Executor mExecutor; IntResultReceiver(@NonNull Executor executor, @NonNull IntConsumer consumer) { protected OnceResultReceiver(@NonNull Executor executor, @NonNull C consumer) { super(null); Objects.requireNonNull(executor); Objects.requireNonNull(consumer); Loading @@ -86,9 +81,9 @@ final class IRemoteInputConnectionInvoker { } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { protected final void onReceiveResult(int resultCode, Bundle resultData) { final Executor executor; final IntConsumer consumer; final C consumer; synchronized (this) { executor = mExecutor; consumer = mConsumer; Loading @@ -96,46 +91,49 @@ final class IRemoteInputConnectionInvoker { mConsumer = null; } if (executor != null && consumer != null) { executor.execute(() -> consumer.accept(resultCode)); dispatch(executor, consumer, resultCode, resultData); } } protected abstract void dispatch(@NonNull Executor executor, @NonNull C consumer, int code, Bundle data); } }; /** * Subclass of {@link ResultReceiver} used by * {@link #requestTextBoundsInfo(RectF, Executor, Consumer)} for providing * {@link #performHandwritingGesture(HandwritingGesture, Executor, IntConsumer)} for providing * callback. */ private static final class TextBoundsInfoResultReceiver extends ResultReceiver { @Nullable private Consumer<TextBoundsInfoResult> mConsumer; @Nullable private Executor mExecutor; TextBoundsInfoResultReceiver(@NonNull Executor executor, @NonNull Consumer<TextBoundsInfoResult> consumer) { super(null); mExecutor = executor; mConsumer = consumer; private static final class IntResultReceiver extends OnceResultReceiver<IntConsumer> { IntResultReceiver(@NonNull Executor executor, @NonNull IntConsumer consumer) { super(executor, consumer); } @Override protected void onReceiveResult(@TextBoundsInfoResult.ResultCode int resultCode, @Nullable Bundle resultData) { synchronized (this) { if (mExecutor != null && mConsumer != null) { final TextBoundsInfoResult textBoundsInfoResult = new TextBoundsInfoResult( resultCode, TextBoundsInfo.createFromBundle(resultData)); mExecutor.execute(() -> mConsumer.accept(textBoundsInfoResult)); // provide callback only once. clear(); protected void dispatch(@NonNull Executor executor, @NonNull IntConsumer consumer, int code, Bundle data) { executor.execute(() -> consumer.accept(code)); } } /** * Subclass of {@link ResultReceiver} used by * {@link #requestTextBoundsInfo(RectF, Executor, Consumer)} for providing * callback. */ private static final class TextBoundsInfoResultReceiver extends OnceResultReceiver<Consumer<TextBoundsInfoResult>> { TextBoundsInfoResultReceiver(@NonNull Executor executor, @NonNull Consumer<TextBoundsInfoResult> consumer) { super(executor, consumer); } private void clear() { mExecutor = null; mConsumer = null; @Override protected void dispatch(@NonNull Executor executor, @NonNull Consumer<TextBoundsInfoResult> consumer, int code, Bundle data) { final TextBoundsInfoResult textBoundsInfoResult = new TextBoundsInfoResult( code, TextBoundsInfo.createFromBundle(data)); executor.execute(() -> consumer.accept(textBoundsInfoResult)); } } Loading Loading
core/java/android/inputmethodservice/IRemoteInputConnectionInvoker.java +35 −37 Original line number Diff line number Diff line Loading @@ -66,18 +66,13 @@ final class IRemoteInputConnectionInvoker { mSessionId = sessionId; } /** * Subclass of {@link ResultReceiver} used by * {@link #performHandwritingGesture(HandwritingGesture, Executor, IntConsumer)} for providing * callback. */ private static final class IntResultReceiver extends ResultReceiver { private abstract static class OnceResultReceiver<C> extends ResultReceiver { @Nullable private IntConsumer mConsumer; private C mConsumer; @Nullable private Executor mExecutor; IntResultReceiver(@NonNull Executor executor, @NonNull IntConsumer consumer) { protected OnceResultReceiver(@NonNull Executor executor, @NonNull C consumer) { super(null); Objects.requireNonNull(executor); Objects.requireNonNull(consumer); Loading @@ -86,9 +81,9 @@ final class IRemoteInputConnectionInvoker { } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { protected final void onReceiveResult(int resultCode, Bundle resultData) { final Executor executor; final IntConsumer consumer; final C consumer; synchronized (this) { executor = mExecutor; consumer = mConsumer; Loading @@ -96,46 +91,49 @@ final class IRemoteInputConnectionInvoker { mConsumer = null; } if (executor != null && consumer != null) { executor.execute(() -> consumer.accept(resultCode)); dispatch(executor, consumer, resultCode, resultData); } } protected abstract void dispatch(@NonNull Executor executor, @NonNull C consumer, int code, Bundle data); } }; /** * Subclass of {@link ResultReceiver} used by * {@link #requestTextBoundsInfo(RectF, Executor, Consumer)} for providing * {@link #performHandwritingGesture(HandwritingGesture, Executor, IntConsumer)} for providing * callback. */ private static final class TextBoundsInfoResultReceiver extends ResultReceiver { @Nullable private Consumer<TextBoundsInfoResult> mConsumer; @Nullable private Executor mExecutor; TextBoundsInfoResultReceiver(@NonNull Executor executor, @NonNull Consumer<TextBoundsInfoResult> consumer) { super(null); mExecutor = executor; mConsumer = consumer; private static final class IntResultReceiver extends OnceResultReceiver<IntConsumer> { IntResultReceiver(@NonNull Executor executor, @NonNull IntConsumer consumer) { super(executor, consumer); } @Override protected void onReceiveResult(@TextBoundsInfoResult.ResultCode int resultCode, @Nullable Bundle resultData) { synchronized (this) { if (mExecutor != null && mConsumer != null) { final TextBoundsInfoResult textBoundsInfoResult = new TextBoundsInfoResult( resultCode, TextBoundsInfo.createFromBundle(resultData)); mExecutor.execute(() -> mConsumer.accept(textBoundsInfoResult)); // provide callback only once. clear(); protected void dispatch(@NonNull Executor executor, @NonNull IntConsumer consumer, int code, Bundle data) { executor.execute(() -> consumer.accept(code)); } } /** * Subclass of {@link ResultReceiver} used by * {@link #requestTextBoundsInfo(RectF, Executor, Consumer)} for providing * callback. */ private static final class TextBoundsInfoResultReceiver extends OnceResultReceiver<Consumer<TextBoundsInfoResult>> { TextBoundsInfoResultReceiver(@NonNull Executor executor, @NonNull Consumer<TextBoundsInfoResult> consumer) { super(executor, consumer); } private void clear() { mExecutor = null; mConsumer = null; @Override protected void dispatch(@NonNull Executor executor, @NonNull Consumer<TextBoundsInfoResult> consumer, int code, Bundle data) { final TextBoundsInfoResult textBoundsInfoResult = new TextBoundsInfoResult( code, TextBoundsInfo.createFromBundle(data)); executor.execute(() -> consumer.accept(textBoundsInfoResult)); } } Loading