1 /*
2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 // @exportToFramework:skipFile()
17 package androidx.appsearch.localstorage.util;
18 
19 import androidx.annotation.RestrictTo;
20 import androidx.concurrent.futures.ResolvableFuture;
21 import androidx.core.util.Preconditions;
22 
23 import com.google.common.util.concurrent.ListenableFuture;
24 
25 import org.jspecify.annotations.NonNull;
26 
27 import java.util.concurrent.Callable;
28 import java.util.concurrent.Executor;
29 
30 /**
31  * Utilities for working with {@link com.google.common.util.concurrent.ListenableFuture}.
32  * @exportToFramework:hide
33  */
34 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
35 public final class FutureUtil {
FutureUtil()36     private FutureUtil() {}
37 
38     /** Executes the given lambda on the given executor and returns a {@link ListenableFuture}. */
execute( @onNull Executor executor, @NonNull Callable<T> callable)39     public static <T> @NonNull ListenableFuture<T> execute(
40             @NonNull Executor executor,
41             @NonNull Callable<T> callable) {
42         Preconditions.checkNotNull(executor);
43         Preconditions.checkNotNull(callable);
44 
45         ResolvableFuture<T> future = ResolvableFuture.create();
46         executor.execute(() -> {
47             if (!future.isCancelled()) {
48                 try {
49                     future.set(callable.call());
50                 } catch (Throwable t) {
51                     future.setException(t);
52                 }
53             }
54         });
55         return future;
56     }
57 }
58