Added bindings for ListeningExecutorServices.

Use them where appropriate.

Bug: 34672501
Test: existing
PiperOrigin-RevId: 178182298
Change-Id: If454225e0d636c7cb14b5af02d46780d7732abf0
diff --git a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
index de8905d..e5cc3eb 100644
--- a/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
+++ b/java/com/android/dialer/calllog/RefreshAnnotatedCallLogWorker.java
@@ -23,7 +23,8 @@
 import com.android.dialer.calllog.datasources.CallLogMutations;
 import com.android.dialer.calllog.datasources.DataSources;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.Annotations.NonUiParallel;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
+import com.android.dialer.common.concurrent.Annotations.LightweightExecutor;
 import com.android.dialer.common.concurrent.DialerFutureSerializer;
 import com.android.dialer.common.concurrent.DialerFutures;
 import com.android.dialer.inject.ApplicationContext;
@@ -32,10 +33,8 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.ExecutorService;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -46,7 +45,8 @@
   private final Context appContext;
   private final DataSources dataSources;
   private final SharedPreferences sharedPreferences;
-  private final ListeningExecutorService parallelUiListeningExecutorService;
+  private final ListeningExecutorService backgroundExecutorService;
+  private final ListeningExecutorService lightweightExecutorService;
   // Used to ensure that only one refresh flow runs at a time. (Note that
   // RefreshAnnotatedCallLogWorker is a @Singleton.)
   private final DialerFutureSerializer dialerFutureSerializer = new DialerFutureSerializer();
@@ -56,14 +56,13 @@
       @ApplicationContext Context appContext,
       DataSources dataSources,
       @Unencrypted SharedPreferences sharedPreferences,
-      @NonUiParallel ExecutorService parallelUiExecutorService) {
+      @BackgroundExecutor ListeningExecutorService backgroundExecutorService,
+      @LightweightExecutor ListeningExecutorService lightweightExecutorService) {
     this.appContext = appContext;
     this.dataSources = dataSources;
     this.sharedPreferences = sharedPreferences;
-
-    // TODO(zachh): Create and use bindings for ListeningExecutorServices.
-    this.parallelUiListeningExecutorService =
-        MoreExecutors.listeningDecorator(parallelUiExecutorService);
+    this.backgroundExecutorService = backgroundExecutorService;
+    this.lightweightExecutorService = lightweightExecutorService;
   }
 
   /** Checks if the annotated call log is dirty and refreshes it if necessary. */
@@ -78,16 +77,14 @@
 
   private ListenableFuture<Void> refresh(boolean checkDirty) {
     LogUtil.i("RefreshAnnotatedCallLogWorker.refresh", "submitting serialized refresh request");
-    // Note: directExecutor is safe to use here and throughout because all methods are async.
     return dialerFutureSerializer.submitAsync(
-        () -> checkDirtyAndRebuildIfNecessary(appContext, checkDirty),
-        MoreExecutors.directExecutor());
+        () -> checkDirtyAndRebuildIfNecessary(appContext, checkDirty), lightweightExecutorService);
   }
 
   private ListenableFuture<Void> checkDirtyAndRebuildIfNecessary(
       Context appContext, boolean checkDirty) {
     ListenableFuture<Boolean> forceRebuildFuture =
-        parallelUiListeningExecutorService.submit(
+        backgroundExecutorService.submit(
             () -> {
               LogUtil.i(
                   "RefreshAnnotatedCallLogWorker.checkDirtyAndRebuildIfNecessary",
@@ -115,7 +112,7 @@
                 Preconditions.checkNotNull(forceRebuild)
                     ? Futures.immediateFuture(true)
                     : isDirty(appContext),
-            MoreExecutors.directExecutor());
+            lightweightExecutorService);
 
     // After determining isDirty, conditionally call rebuild.
     return Futures.transformAsync(
@@ -124,7 +121,7 @@
             Preconditions.checkNotNull(isDirty)
                 ? rebuild(appContext)
                 : Futures.immediateFuture(null),
-        MoreExecutors.directExecutor());
+        lightweightExecutorService);
   }
 
   private ListenableFuture<Boolean> isDirty(Context appContext) {
@@ -151,7 +148,7 @@
           Futures.transformAsync(
               fillFuture,
               unused -> dataSource.fill(appContext, mutations),
-              MoreExecutors.directExecutor());
+              lightweightExecutorService);
     }
 
     // After all data sources are filled, apply mutations (at this point "fillFuture" is the result
@@ -163,7 +160,7 @@
                 CallLogDatabaseComponent.get(appContext)
                     .mutationApplier()
                     .applyToDatabase(mutations, appContext),
-            MoreExecutors.directExecutor());
+            lightweightExecutorService);
 
     // After mutations applied, call onSuccessfulFill for each data source (in parallel).
     ListenableFuture<List<Void>> onSuccessfulFillFuture =
@@ -177,7 +174,7 @@
               }
               return Futures.allAsList(onSuccessfulFillFutures);
             },
-            MoreExecutors.directExecutor());
+            lightweightExecutorService);
 
     // After onSuccessfulFill is called for every data source, write the shared pref.
     return Futures.transform(
@@ -186,6 +183,6 @@
           sharedPreferences.edit().putBoolean(CallLogFramework.PREF_FORCE_REBUILD, false).apply();
           return null;
         },
-        parallelUiListeningExecutorService);
+        backgroundExecutorService);
   }
 }
diff --git a/java/com/android/dialer/calllog/database/MutationApplier.java b/java/com/android/dialer/calllog/database/MutationApplier.java
index 720daec..eee810e 100644
--- a/java/com/android/dialer/calllog/database/MutationApplier.java
+++ b/java/com/android/dialer/calllog/database/MutationApplier.java
@@ -28,25 +28,23 @@
 import com.android.dialer.calllog.datasources.CallLogMutations;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.Annotations.NonUiParallel;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Map.Entry;
-import java.util.concurrent.ExecutorService;
 import javax.inject.Inject;
 
 /** Applies {@link CallLogMutations} to the annotated call log. */
 public class MutationApplier {
 
-  private final ListeningExecutorService executorService;
+  private final ListeningExecutorService backgroundExecutorService;
 
   @Inject
-  MutationApplier(@NonUiParallel ExecutorService executorService) {
-    this.executorService = MoreExecutors.listeningDecorator(executorService);
+  MutationApplier(@BackgroundExecutor ListeningExecutorService backgroundExecutorService) {
+    this.backgroundExecutorService = backgroundExecutorService;
   }
 
   /** Applies the provided {@link CallLogMutations} to the annotated call log. */
@@ -54,7 +52,7 @@
     if (mutations.isEmpty()) {
       return Futures.immediateFuture(null);
     }
-    return executorService.submit(
+    return backgroundExecutorService.submit(
         () -> {
           applyToDatabaseInternal(mutations, appContext);
           return null;
diff --git a/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java b/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java
index 41eaf2b..9b90ad5 100644
--- a/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/phonelookup/PhoneLookupDataSource.java
@@ -29,7 +29,7 @@
 import com.android.dialer.calllog.datasources.CallLogDataSource;
 import com.android.dialer.calllog.datasources.CallLogMutations;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.Annotations.NonUiParallel;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.android.dialer.phonelookup.PhoneLookup;
 import com.android.dialer.phonelookup.PhoneLookupInfo;
 import com.android.dialer.phonelookup.PhoneLookupSelector;
@@ -40,7 +40,6 @@
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.protobuf.InvalidProtocolBufferException;
 import java.util.Arrays;
@@ -49,7 +48,6 @@
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
 import javax.inject.Inject;
 
 /**
@@ -59,27 +57,29 @@
 public final class PhoneLookupDataSource implements CallLogDataSource {
 
   private final PhoneLookup phoneLookup;
-  private final ListeningExecutorService executorService;
+  private final ListeningExecutorService backgroundExecutorService;
 
   @Inject
-  PhoneLookupDataSource(PhoneLookup phoneLookup, @NonUiParallel ExecutorService executorService) {
+  PhoneLookupDataSource(
+      PhoneLookup phoneLookup,
+      @BackgroundExecutor ListeningExecutorService backgroundExecutorService) {
     this.phoneLookup = phoneLookup;
-    this.executorService = MoreExecutors.listeningDecorator(executorService);
+    this.backgroundExecutorService = backgroundExecutorService;
   }
 
   @Override
   public ListenableFuture<Boolean> isDirty(Context appContext) {
-    return executorService.submit(() -> isDirtyInternal(appContext));
+    return backgroundExecutorService.submit(() -> isDirtyInternal(appContext));
   }
 
   @Override
   public ListenableFuture<Void> fill(Context appContext, CallLogMutations mutations) {
-    return executorService.submit(() -> fillInternal(appContext, mutations));
+    return backgroundExecutorService.submit(() -> fillInternal(appContext, mutations));
   }
 
   @Override
   public ListenableFuture<Void> onSuccessfulFill(Context appContext) {
-    return executorService.submit(this::onSuccessfulFillInternal);
+    return backgroundExecutorService.submit(this::onSuccessfulFillInternal);
   }
 
   @WorkerThread
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index dfc768c..91db915 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -45,7 +45,7 @@
 import com.android.dialer.calllogutils.PhoneAccountUtils;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.Annotations.NonUiParallel;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.android.dialer.common.concurrent.ThreadUtil;
 import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
 import com.android.dialer.storage.StorageComponent;
@@ -53,12 +53,10 @@
 import com.android.dialer.util.PermissionsUtil;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.ExecutorService;
 import javax.inject.Inject;
 
 /**
@@ -71,13 +69,13 @@
   @VisibleForTesting
   static final String PREF_LAST_TIMESTAMP_PROCESSED = "systemCallLogLastTimestampProcessed";
 
-  private final ListeningExecutorService executorService;
+  private final ListeningExecutorService backgroundExecutorService;
 
   @Nullable private Long lastTimestampProcessed;
 
   @Inject
-  SystemCallLogDataSource(@NonUiParallel ExecutorService executorService) {
-    this.executorService = MoreExecutors.listeningDecorator(executorService);
+  SystemCallLogDataSource(@BackgroundExecutor ListeningExecutorService backgroundExecutorService) {
+    this.backgroundExecutorService = backgroundExecutorService;
   }
 
   @MainThread
@@ -105,17 +103,17 @@
 
   @Override
   public ListenableFuture<Boolean> isDirty(Context appContext) {
-    return executorService.submit(() -> isDirtyInternal(appContext));
+    return backgroundExecutorService.submit(() -> isDirtyInternal(appContext));
   }
 
   @Override
   public ListenableFuture<Void> fill(Context appContext, CallLogMutations mutations) {
-    return executorService.submit(() -> fillInternal(appContext, mutations));
+    return backgroundExecutorService.submit(() -> fillInternal(appContext, mutations));
   }
 
   @Override
   public ListenableFuture<Void> onSuccessfulFill(Context appContext) {
-    return executorService.submit(() -> onSuccessfulFillInternal(appContext));
+    return backgroundExecutorService.submit(() -> onSuccessfulFillInternal(appContext));
   }
 
   @WorkerThread
diff --git a/java/com/android/dialer/common/concurrent/Annotations.java b/java/com/android/dialer/common/concurrent/Annotations.java
index 5e3954c..62d5b31 100644
--- a/java/com/android/dialer/common/concurrent/Annotations.java
+++ b/java/com/android/dialer/common/concurrent/Annotations.java
@@ -39,4 +39,12 @@
   /** Annotation for retrieving the UI serial executor. */
   @Qualifier
   public @interface UiSerial {}
+
+  /** Annotation for retrieving the lightweight executor. */
+  @Qualifier
+  public @interface LightweightExecutor {}
+
+  /** Annotation for retrieving the background executor. */
+  @Qualifier
+  public @interface BackgroundExecutor {}
 }
diff --git a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
index ab01654..317807b 100644
--- a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
+++ b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
@@ -40,14 +40,14 @@
 public class DefaultDialerExecutorFactory implements DialerExecutorFactory {
   private final ExecutorService nonUiThreadPool;
   private final ScheduledExecutorService nonUiSerialExecutor;
-  private final Executor uiThreadPool;
+  private final ExecutorService uiThreadPool;
   private final ScheduledExecutorService uiSerialExecutor;
 
   @Inject
   DefaultDialerExecutorFactory(
       @NonUiParallel ExecutorService nonUiThreadPool,
       @NonUiSerial ScheduledExecutorService nonUiSerialExecutor,
-      @UiParallel Executor uiThreadPool,
+      @UiParallel ExecutorService uiThreadPool,
       @UiSerial ScheduledExecutorService uiSerialExecutor) {
     this.nonUiThreadPool = nonUiThreadPool;
     this.nonUiSerialExecutor = nonUiSerialExecutor;
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorModule.java b/java/com/android/dialer/common/concurrent/DialerExecutorModule.java
index 5e0190e..98738ed 100644
--- a/java/com/android/dialer/common/concurrent/DialerExecutorModule.java
+++ b/java/com/android/dialer/common/concurrent/DialerExecutorModule.java
@@ -17,16 +17,18 @@
 
 import android.os.AsyncTask;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
+import com.android.dialer.common.concurrent.Annotations.LightweightExecutor;
 import com.android.dialer.common.concurrent.Annotations.NonUiParallel;
 import com.android.dialer.common.concurrent.Annotations.NonUiSerial;
 import com.android.dialer.common.concurrent.Annotations.Ui;
 import com.android.dialer.common.concurrent.Annotations.UiParallel;
 import com.android.dialer.common.concurrent.Annotations.UiSerial;
 import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
 import dagger.Binds;
 import dagger.Module;
 import dagger.Provides;
-import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -85,8 +87,8 @@
 
   @Provides
   @UiParallel
-  static Executor provideUiThreadPool() {
-    return AsyncTask.THREAD_POOL_EXECUTOR;
+  static ExecutorService provideUiThreadPool() {
+    return (ExecutorService) AsyncTask.THREAD_POOL_EXECUTOR;
   }
 
   @Provides
@@ -105,4 +107,19 @@
           }
         });
   }
+
+  @Provides
+  @Singleton
+  @LightweightExecutor
+  static ListeningExecutorService provideLightweightExecutor(@UiParallel ExecutorService delegate) {
+    return MoreExecutors.listeningDecorator(delegate);
+  }
+
+  @Provides
+  @Singleton
+  @BackgroundExecutor
+  static ListeningExecutorService provideBackgroundExecutor(
+      @NonUiParallel ExecutorService delegate) {
+    return MoreExecutors.listeningDecorator(delegate);
+  }
 }
diff --git a/java/com/android/dialer/phonelookup/PhoneLookupModule.java b/java/com/android/dialer/phonelookup/PhoneLookupModule.java
index 400caff..39b0a50 100644
--- a/java/com/android/dialer/phonelookup/PhoneLookupModule.java
+++ b/java/com/android/dialer/phonelookup/PhoneLookupModule.java
@@ -27,7 +27,12 @@
 public abstract class PhoneLookupModule {
 
   @Provides
-  static PhoneLookup providePhoneLookup(Cp2PhoneLookup cp2PhoneLookup) {
-    return new CompositePhoneLookup(ImmutableList.of(cp2PhoneLookup));
+  static ImmutableList<PhoneLookup> providePhoneLookupList(Cp2PhoneLookup cp2PhoneLookup) {
+    return ImmutableList.of(cp2PhoneLookup);
+  }
+
+  @Provides
+  static PhoneLookup providePhoneLookup(CompositePhoneLookup compositePhoneLookup) {
+    return compositePhoneLookup;
   }
 }
diff --git a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java
index f432e27..abc0c74 100644
--- a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java
@@ -20,6 +20,7 @@
 import android.telecom.Call;
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.Annotations.LightweightExecutor;
 import com.android.dialer.common.concurrent.DialerFutures;
 import com.android.dialer.phonelookup.PhoneLookup;
 import com.android.dialer.phonelookup.PhoneLookupInfo;
@@ -29,9 +30,10 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.ListeningExecutorService;
 import java.util.ArrayList;
 import java.util.List;
+import javax.inject.Inject;
 
 /**
  * {@link PhoneLookup} which delegates to a configured set of {@link PhoneLookup PhoneLookups},
@@ -40,9 +42,14 @@
 public final class CompositePhoneLookup implements PhoneLookup {
 
   private final ImmutableList<PhoneLookup> phoneLookups;
+  private final ListeningExecutorService lightweightExecutorService;
 
-  public CompositePhoneLookup(ImmutableList<PhoneLookup> phoneLookups) {
+  @Inject
+  CompositePhoneLookup(
+      ImmutableList<PhoneLookup> phoneLookups,
+      @LightweightExecutor ListeningExecutorService lightweightExecutorService) {
     this.phoneLookups = phoneLookups;
+    this.lightweightExecutorService = lightweightExecutorService;
   }
 
   /**
@@ -68,7 +75,7 @@
           }
           return mergedInfo.build();
         },
-        MoreExecutors.directExecutor());
+        lightweightExecutorService);
   }
 
   @Override
@@ -117,7 +124,7 @@
           }
           return combinedMap.build();
         },
-        MoreExecutors.directExecutor());
+        lightweightExecutorService);
   }
 
   @Override
@@ -127,6 +134,6 @@
       futures.add(phoneLookup.onSuccessfulBulkUpdate());
     }
     return Futures.transform(
-        Futures.allAsList(futures), unused -> null, MoreExecutors.directExecutor());
+        Futures.allAsList(futures), unused -> null, lightweightExecutorService);
   }
 }
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
index cfb8fb7..cd645a4 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
@@ -30,6 +30,7 @@
 import android.text.TextUtils;
 import com.android.dialer.DialerPhoneNumber;
 import com.android.dialer.common.Assert;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.android.dialer.inject.ApplicationContext;
 import com.android.dialer.phonelookup.PhoneLookup;
 import com.android.dialer.phonelookup.PhoneLookupInfo;
@@ -39,7 +40,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.ListeningExecutorService;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
@@ -71,25 +72,29 @@
 
   private final Context appContext;
   private final SharedPreferences sharedPreferences;
+  private final ListeningExecutorService backgroundExecutorService;
+
   @Nullable private Long currentLastTimestampProcessed;
 
   @Inject
   Cp2PhoneLookup(
-      @ApplicationContext Context appContext, @Unencrypted SharedPreferences sharedPreferences) {
+      @ApplicationContext Context appContext,
+      @Unencrypted SharedPreferences sharedPreferences,
+      @BackgroundExecutor ListeningExecutorService backgroundExecutorService) {
     this.appContext = appContext;
     this.sharedPreferences = sharedPreferences;
+    this.backgroundExecutorService = backgroundExecutorService;
   }
 
   @Override
   public ListenableFuture<PhoneLookupInfo> lookup(@NonNull Call call) {
     // TODO(zachh): Implementation.
-    return MoreExecutors.newDirectExecutorService().submit(PhoneLookupInfo::getDefaultInstance);
+    return backgroundExecutorService.submit(PhoneLookupInfo::getDefaultInstance);
   }
 
   @Override
   public ListenableFuture<Boolean> isDirty(ImmutableSet<DialerPhoneNumber> phoneNumbers) {
-    // TODO(calderwoodra): consider a different thread pool
-    return MoreExecutors.newDirectExecutorService().submit(() -> isDirtyInternal(phoneNumbers));
+    return backgroundExecutorService.submit(() -> isDirtyInternal(phoneNumbers));
   }
 
   private boolean isDirtyInternal(ImmutableSet<DialerPhoneNumber> phoneNumbers) {
@@ -185,8 +190,7 @@
   @Override
   public ListenableFuture<ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>> bulkUpdate(
       ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> existingInfoMap) {
-    return MoreExecutors.newDirectExecutorService()
-        .submit(() -> bulkUpdateInternal(existingInfoMap));
+    return backgroundExecutorService.submit(() -> bulkUpdateInternal(existingInfoMap));
   }
 
   private ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> bulkUpdateInternal(
@@ -234,17 +238,16 @@
 
   @Override
   public ListenableFuture<Void> onSuccessfulBulkUpdate() {
-    return MoreExecutors.newDirectExecutorService()
-        .submit(
-            () -> {
-              if (currentLastTimestampProcessed != null) {
-                sharedPreferences
-                    .edit()
-                    .putLong(PREF_LAST_TIMESTAMP_PROCESSED, currentLastTimestampProcessed)
-                    .apply();
-              }
-              return null;
-            });
+    return backgroundExecutorService.submit(
+        () -> {
+          if (currentLastTimestampProcessed != null) {
+            sharedPreferences
+                .edit()
+                .putLong(PREF_LAST_TIMESTAMP_PROCESSED, currentLastTimestampProcessed)
+                .apply();
+          }
+          return null;
+        });
   }
 
   /**