From 6a4cebdb4ccc974d04f125847c03fddec18b2b9f Mon Sep 17 00:00:00 2001 From: zachh Date: Tue, 24 Oct 2017 17:10:06 -0700 Subject: Improved dagger support for executor services. By always creating executor services via dagger, we can now bind special versions during espresso tests that can implement idling resources. We should be using idling resources during espresso tests for threads that we create ourselves, because espresso does not know about them. Hopefully this reduces some of the flakiness of espresso tests that we have today. This required converting all existing calls to DialerExecutors to pass a context used to fetch the component, and also required creating new application classes for espresso tests. Test: temporarily added a task which just slept to DialtactsActivity and verified that its integration test failed due to idling resource timeout PiperOrigin-RevId: 173334773 Change-Id: I876a93022d235d62cfc377bf5b06687e21a34758 --- .../calllog/MissedCallNotificationReceiver.java | 2 +- .../calllog/VisualVoicemailCallLogFragment.java | 1 + .../app/calllog/VisualVoicemailUpdateTask.java | 2 +- .../dialer/app/list/RegularSearchFragment.java | 1 + .../app/voicemail/VoicemailPlaybackPresenter.java | 5 +- .../dialer/binary/aosp/testing/AndroidManifest.xml | 24 ------- .../dialer/binary/common/DialerApplication.java | 4 +- .../dialer/callcomposer/CallComposerActivity.java | 1 + .../callcomposer/GalleryComposerFragment.java | 15 +---- .../dialer/callcomposer/camera/CameraManager.java | 1 + .../dialer/common/concurrent/Annotations.java | 38 +++++++++++ .../concurrent/DefaultDialerExecutorFactory.java | 71 +++++++-------------- .../common/concurrent/DialerExecutorComponent.java | 5 ++ .../common/concurrent/DialerExecutorModule.java | 73 +++++++++++++++++++++- .../dialer/common/concurrent/DialerExecutors.java | 43 ++++++------- .../dialer/dialpadview/DialpadFragment.java | 1 + .../dialer/shortcuts/ShortcutRefresher.java | 2 +- .../dialer/simulator/impl/SimulatorMainMenu.java | 6 +- java/com/android/incallui/ContactInfoCache.java | 6 +- java/com/android/incallui/ContactsAsyncHelper.java | 2 +- java/com/android/incallui/InCallPresenter.java | 6 +- 21 files changed, 188 insertions(+), 121 deletions(-) delete mode 100644 java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml create mode 100644 java/com/android/dialer/common/concurrent/Annotations.java (limited to 'java/com') diff --git a/java/com/android/dialer/app/calllog/MissedCallNotificationReceiver.java b/java/com/android/dialer/app/calllog/MissedCallNotificationReceiver.java index a1f1c52cb..744c0de74 100644 --- a/java/com/android/dialer/app/calllog/MissedCallNotificationReceiver.java +++ b/java/com/android/dialer/app/calllog/MissedCallNotificationReceiver.java @@ -53,7 +53,7 @@ public class MissedCallNotificationReceiver extends BroadcastReceiver { PendingResult pendingResult = goAsync(); - DialerExecutors.createNonUiTaskBuilder(MissedCallNotifier.getInstance(context)) + DialerExecutors.createNonUiTaskBuilder(context, MissedCallNotifier.getInstance(context)) .onSuccess( output -> { LogUtil.i( diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java index 8bfd48b05..96d917318 100644 --- a/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java +++ b/java/com/android/dialer/app/calllog/VisualVoicemailCallLogFragment.java @@ -80,6 +80,7 @@ public class VisualVoicemailCallLogFragment extends CallLogFragment { mPreSyncVoicemailStatusCheckExecutor = DialerExecutors.createUiTaskBuilder( + getContext(), getActivity().getFragmentManager(), "fetchVoicemailStatus", new VoicemailStatusWorker()) diff --git a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java index 77b4c1113..fd0be5f54 100644 --- a/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java +++ b/java/com/android/dialer/app/calllog/VisualVoicemailUpdateTask.java @@ -184,7 +184,7 @@ class VisualVoicemailUpdateTask implements Worker { LogUtil.i("VisualVoicemailUpdateTask.scheduleTask", "update successful"); diff --git a/java/com/android/dialer/app/list/RegularSearchFragment.java b/java/com/android/dialer/app/list/RegularSearchFragment.java index 73120c547..ca19432ed 100644 --- a/java/com/android/dialer/app/list/RegularSearchFragment.java +++ b/java/com/android/dialer/app/list/RegularSearchFragment.java @@ -67,6 +67,7 @@ public class RegularSearchFragment extends SearchFragment addContactTask = DialerExecutors.createUiTaskBuilder( + getContext(), getFragmentManager(), "RegularSearchFragment.addContact", new AddContactWorker(getContext().getApplicationContext())) diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java index 685357ace..2d21bd641 100644 --- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java +++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java @@ -221,7 +221,10 @@ public class VoicemailPlaybackPresenter } shareVoicemailExecutor = DialerExecutors.createUiTaskBuilder( - mActivity.getFragmentManager(), "shareVoicemail", new ShareVoicemailWorker()) + mContext, + mActivity.getFragmentManager(), + "shareVoicemail", + new ShareVoicemailWorker()) .onSuccess( output -> { if (output == null) { diff --git a/java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml b/java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml deleted file mode 100644 index 15870cb85..000000000 --- a/java/com/android/dialer/binary/aosp/testing/AndroidManifest.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/java/com/android/dialer/binary/common/DialerApplication.java b/java/com/android/dialer/binary/common/DialerApplication.java index 19af57579..c0e6ae660 100644 --- a/java/com/android/dialer/binary/common/DialerApplication.java +++ b/java/com/android/dialer/binary/common/DialerApplication.java @@ -23,7 +23,7 @@ import android.support.v4.os.BuildCompat; import com.android.dialer.blocking.BlockedNumbersAutoMigrator; import com.android.dialer.blocking.FilteredNumberAsyncQueryHandler; import com.android.dialer.calllog.CallLogComponent; -import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.inject.HasRootComponent; import com.android.dialer.notification.NotificationChannelManager; import com.android.dialer.persistentlog.PersistentLogger; @@ -43,7 +43,7 @@ public abstract class DialerApplication extends Application implements HasRootCo new BlockedNumbersAutoMigrator( this.getApplicationContext(), new FilteredNumberAsyncQueryHandler(this), - new DefaultDialerExecutorFactory()) + DialerExecutorComponent.get(this).dialerExecutorFactory()) .asyncAutoMigrate(); CallLogComponent.get(this).callLogFramework().registerContentObservers(getApplicationContext()); PersistentLogger.initialize(this); diff --git a/java/com/android/dialer/callcomposer/CallComposerActivity.java b/java/com/android/dialer/callcomposer/CallComposerActivity.java index 60826fd5d..bad5d7f54 100644 --- a/java/com/android/dialer/callcomposer/CallComposerActivity.java +++ b/java/com/android/dialer/callcomposer/CallComposerActivity.java @@ -224,6 +224,7 @@ public class CallComposerActivity extends AppCompatActivity copyAndResizeExecutor = DialerExecutors.createUiTaskBuilder( + getApplicationContext(), getFragmentManager(), "copyAndResizeImageToSend", new CopyAndResizeImageWorker(this.getApplicationContext())) diff --git a/java/com/android/dialer/callcomposer/GalleryComposerFragment.java b/java/com/android/dialer/callcomposer/GalleryComposerFragment.java index 2e6a28c33..e604ec1b0 100644 --- a/java/com/android/dialer/callcomposer/GalleryComposerFragment.java +++ b/java/com/android/dialer/callcomposer/GalleryComposerFragment.java @@ -28,7 +28,6 @@ import android.os.Parcelable; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.ContextCompat; import android.support.v4.content.CursorLoader; @@ -40,11 +39,9 @@ import android.view.ViewGroup; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; -import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory; import com.android.dialer.common.concurrent.DialerExecutor; -import com.android.dialer.common.concurrent.DialerExecutorFactory; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.logging.DialerImpression; import com.android.dialer.logging.Logger; import com.android.dialer.util.PermissionsUtil; @@ -62,8 +59,6 @@ public class GalleryComposerFragment extends CallComposerFragment private static final int RESULT_LOAD_IMAGE = 1; private static final int RESULT_OPEN_SETTINGS = 2; - private DialerExecutorFactory executorFactory = new DefaultDialerExecutorFactory(); - private GalleryGridAdapter adapter; private GridView galleryGridView; private View permissionView; @@ -81,11 +76,6 @@ public class GalleryComposerFragment extends CallComposerFragment return new GalleryComposerFragment(); } - @VisibleForTesting - void setExecutorFactory(@NonNull DialerExecutorFactory executorFactory) { - this.executorFactory = Assert.isNotNull(executorFactory); - } - @Nullable @Override public View onCreateView( @@ -123,7 +113,8 @@ public class GalleryComposerFragment extends CallComposerFragment super.onActivityCreated(bundle); copyAndResizeImage = - executorFactory + DialerExecutorComponent.get(getContext()) + .dialerExecutorFactory() .createUiTaskBuilder( getActivity().getFragmentManager(), "copyAndResizeImage", diff --git a/java/com/android/dialer/callcomposer/camera/CameraManager.java b/java/com/android/dialer/callcomposer/camera/CameraManager.java index f79f6548c..9a9577f6f 100644 --- a/java/com/android/dialer/callcomposer/camera/CameraManager.java +++ b/java/com/android/dialer/callcomposer/camera/CameraManager.java @@ -469,6 +469,7 @@ public class CameraManager implements FocusOverlayManager.Listener { LogUtil.i( "CameraManager.onPictureTaken", "taken picture size: " + bytes.length + " bytes"); DialerExecutors.createNonUiTaskBuilder( + mCameraPreview.getContext(), new ImagePersistWorker( width, height, heightPercent, bytes, mCameraPreview.getContext())) .onSuccess( diff --git a/java/com/android/dialer/common/concurrent/Annotations.java b/java/com/android/dialer/common/concurrent/Annotations.java new file mode 100644 index 000000000..eb956c31e --- /dev/null +++ b/java/com/android/dialer/common/concurrent/Annotations.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ +package com.android.dialer.common.concurrent; + +import javax.inject.Qualifier; + +/** Annotations for dagger concurrency bindings. */ +public class Annotations { + + /** Annotation for retrieving the non-UI thread pool. */ + @Qualifier + public @interface NonUiParallel {} + + /** Annotation for retrieving the non-UI serial executor. */ + @Qualifier + public @interface NonUiSerial {} + + /** Annotation for retrieving the UI thread pool. */ + @Qualifier + public @interface UiParallel {} + + /** Annotation for retrieving the UI serial executor. */ + @Qualifier + public @interface UiSerial {} +} diff --git a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java index a87bbceb4..ab01654aa 100644 --- a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java +++ b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java @@ -17,29 +17,43 @@ package com.android.dialer.common.concurrent; import android.app.FragmentManager; -import android.os.AsyncTask; import android.support.annotation.NonNull; import android.support.annotation.Nullable; 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.NonUiSerial; +import com.android.dialer.common.concurrent.Annotations.UiParallel; +import com.android.dialer.common.concurrent.Annotations.UiSerial; import com.android.dialer.common.concurrent.DialerExecutor.Builder; import com.android.dialer.common.concurrent.DialerExecutor.FailureListener; import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener; import com.android.dialer.common.concurrent.DialerExecutor.Worker; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import javax.inject.Inject; /** The production {@link DialerExecutorFactory}. */ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { + private final ExecutorService nonUiThreadPool; + private final ScheduledExecutorService nonUiSerialExecutor; + private final Executor uiThreadPool; + private final ScheduledExecutorService uiSerialExecutor; @Inject - public DefaultDialerExecutorFactory() {} + DefaultDialerExecutorFactory( + @NonUiParallel ExecutorService nonUiThreadPool, + @NonUiSerial ScheduledExecutorService nonUiSerialExecutor, + @UiParallel Executor uiThreadPool, + @UiSerial ScheduledExecutorService uiSerialExecutor) { + this.nonUiThreadPool = nonUiThreadPool; + this.nonUiSerialExecutor = nonUiSerialExecutor; + this.uiThreadPool = uiThreadPool; + this.uiSerialExecutor = uiSerialExecutor; + } @Override @NonNull @@ -48,14 +62,18 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { @NonNull String taskId, @NonNull Worker worker) { return new UiTaskBuilder<>( - Assert.isNotNull(fragmentManager), Assert.isNotNull(taskId), Assert.isNotNull(worker)); + Assert.isNotNull(fragmentManager), + Assert.isNotNull(taskId), + Assert.isNotNull(worker), + uiSerialExecutor, + uiThreadPool); } @Override @NonNull public DialerExecutor.Builder createNonUiTaskBuilder( @NonNull Worker worker) { - return new NonUiTaskBuilder<>(Assert.isNotNull(worker)); + return new NonUiTaskBuilder<>(Assert.isNotNull(worker), nonUiSerialExecutor, nonUiThreadPool); } private abstract static class BaseTaskBuilder @@ -96,34 +114,11 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { /** Convenience class for use by {@link DialerExecutorFactory} implementations. */ public static class UiTaskBuilder extends BaseTaskBuilder { - private static final ScheduledExecutorService defaultSerialExecutorService = - Executors.newSingleThreadScheduledExecutor( - new ThreadFactory() { - @Override - public Thread newThread(Runnable runnable) { - LogUtil.i("UiTaskBuilder.newThread", "creating serial thread"); - Thread thread = new Thread(runnable, "UiTaskBuilder-Serial"); - thread.setPriority(5); // Corresponds to Process.THREAD_PRIORITY_DEFAULT - return thread; - } - }); - - private static final Executor defaultParallelExecutorService = AsyncTask.THREAD_POOL_EXECUTOR; - private final FragmentManager fragmentManager; private final String id; private DialerUiTaskFragment dialerUiTaskFragment; - UiTaskBuilder(FragmentManager fragmentManager, String id, Worker worker) { - this( - fragmentManager, - id, - worker, - defaultSerialExecutorService, - defaultParallelExecutorService); - } - public UiTaskBuilder( FragmentManager fragmentManager, String id, @@ -153,24 +148,6 @@ public class DefaultDialerExecutorFactory implements DialerExecutorFactory { /** Convenience class for use by {@link DialerExecutorFactory} implementations. */ public static class NonUiTaskBuilder extends BaseTaskBuilder { - private static final ScheduledExecutorService defaultSerialExecutorService = - Executors.newSingleThreadScheduledExecutor( - new ThreadFactory() { - @Override - public Thread newThread(Runnable runnable) { - LogUtil.i("NonUiTaskBuilder.newThread", "creating serial thread"); - Thread thread = new Thread(runnable, "NonUiTaskBuilder-Serial"); - thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND - return thread; - } - }); - - private static final Executor defaultParallelExecutor = - DialerExecutors.getLowPriorityThreadPool(); - - NonUiTaskBuilder(Worker worker) { - this(worker, defaultSerialExecutorService, defaultParallelExecutor); - } public NonUiTaskBuilder( Worker worker, diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java b/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java index 25033251f..346fdda56 100644 --- a/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java +++ b/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java @@ -17,8 +17,10 @@ package com.android.dialer.common.concurrent; import android.content.Context; +import com.android.dialer.common.concurrent.Annotations.NonUiParallel; import com.android.dialer.inject.HasRootComponent; import dagger.Subcomponent; +import java.util.concurrent.ExecutorService; /** Dagger component which provides a {@link DialerExecutorFactory}. */ @Subcomponent @@ -26,6 +28,9 @@ public abstract class DialerExecutorComponent { public abstract DialerExecutorFactory dialerExecutorFactory(); + @NonUiParallel + public abstract ExecutorService lowPriorityThreadPool(); + public static DialerExecutorComponent get(Context context) { return ((DialerExecutorComponent.HasComponent) ((HasRootComponent) context.getApplicationContext()).component()) diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorModule.java b/java/com/android/dialer/common/concurrent/DialerExecutorModule.java index 281f88c15..68910fb7a 100644 --- a/java/com/android/dialer/common/concurrent/DialerExecutorModule.java +++ b/java/com/android/dialer/common/concurrent/DialerExecutorModule.java @@ -15,14 +15,85 @@ */ package com.android.dialer.common.concurrent; +import android.os.AsyncTask; +import com.android.dialer.common.LogUtil; +import com.android.dialer.common.concurrent.Annotations.NonUiParallel; +import com.android.dialer.common.concurrent.Annotations.NonUiSerial; +import com.android.dialer.common.concurrent.Annotations.UiParallel; +import com.android.dialer.common.concurrent.Annotations.UiSerial; 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; +import java.util.concurrent.ThreadFactory; +import javax.inject.Singleton; -/** Module which binds the production {@link DialerExecutorFactory}. */ +/** Module which provides concurrency bindings. */ @Module public abstract class DialerExecutorModule { @Binds abstract DialerExecutorFactory bindDialerExecutorFactory( DefaultDialerExecutorFactory defaultDialerExecutorFactory); + + @Provides + @Singleton + @NonUiParallel + static ExecutorService provideNonUiThreadPool() { + return Executors.newFixedThreadPool( + 5, + new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + LogUtil.i("DialerExecutorModule.newThread", "creating low priority thread"); + Thread thread = new Thread(runnable, "DialerExecutors-LowPriority"); + // Java thread priority 4 corresponds to Process.THREAD_PRIORITY_BACKGROUND (10) + thread.setPriority(4); + return thread; + } + }); + } + + @Provides + @Singleton + @NonUiSerial + static ScheduledExecutorService provideNonUiSerialExecutorService() { + return Executors.newSingleThreadScheduledExecutor( + new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + LogUtil.i("NonUiTaskBuilder.newThread", "creating serial thread"); + Thread thread = new Thread(runnable, "DialerExecutors-LowPriority-Serial"); + // Java thread priority 4 corresponds to Process.THREAD_PRIORITY_BACKGROUND (10) + thread.setPriority(4); + return thread; + } + }); + } + + @Provides + @UiParallel + static Executor provideUiThreadPool() { + return AsyncTask.THREAD_POOL_EXECUTOR; + } + + @Provides + @Singleton + @UiSerial + static ScheduledExecutorService provideUiSerialExecutorService() { + return Executors.newSingleThreadScheduledExecutor( + new ThreadFactory() { + @Override + public Thread newThread(Runnable runnable) { + LogUtil.i("DialerExecutorModule.newThread", "creating serial thread"); + Thread thread = new Thread(runnable, "DialerExecutors-HighPriority-Serial"); + // Java thread priority 5 corresponds to Process.THREAD_PRIORITY_DEFAULT (0) + thread.setPriority(5); + return thread; + } + }); + } } diff --git a/java/com/android/dialer/common/concurrent/DialerExecutors.java b/java/com/android/dialer/common/concurrent/DialerExecutors.java index 850c28cdd..4d8331fb6 100644 --- a/java/com/android/dialer/common/concurrent/DialerExecutors.java +++ b/java/com/android/dialer/common/concurrent/DialerExecutors.java @@ -17,13 +17,11 @@ package com.android.dialer.common.concurrent; import android.app.FragmentManager; +import android.content.Context; import android.support.annotation.NonNull; import com.android.dialer.common.Assert; -import com.android.dialer.common.LogUtil; import com.android.dialer.common.concurrent.DialerExecutor.Worker; import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; /** * Factory methods for creating {@link DialerExecutor} objects for doing background work. @@ -118,44 +116,43 @@ import java.util.concurrent.ThreadFactory; */ public final class DialerExecutors { - /** @see DialerExecutorFactory#createUiTaskBuilder(FragmentManager, String, Worker) */ + /** + * @param context any valid context object from which the application context can be retrieved + * @see DialerExecutorFactory#createUiTaskBuilder(FragmentManager, String, Worker) + */ @NonNull public static DialerExecutor.Builder createUiTaskBuilder( + @NonNull Context context, @NonNull FragmentManager fragmentManager, @NonNull String taskId, @NonNull Worker worker) { - return new DefaultDialerExecutorFactory() + return DialerExecutorComponent.get(Assert.isNotNull(context)) + .dialerExecutorFactory() .createUiTaskBuilder( Assert.isNotNull(fragmentManager), Assert.isNotNull(taskId), Assert.isNotNull(worker)); } - /** @see DialerExecutorFactory#createNonUiTaskBuilder(Worker) */ + /** + * @param context any valid context object from which the application context can be retrieved + * @see DialerExecutorFactory#createNonUiTaskBuilder(Worker) + */ @NonNull public static DialerExecutor.Builder createNonUiTaskBuilder( - @NonNull Worker worker) { - return new DefaultDialerExecutorFactory().createNonUiTaskBuilder(Assert.isNotNull(worker)); + Context context, @NonNull Worker worker) { + return DialerExecutorComponent.get(Assert.isNotNull(context)) + .dialerExecutorFactory() + .createNonUiTaskBuilder(Assert.isNotNull(worker)); } - private static final ExecutorService lowPriorityThreadPool = - Executors.newFixedThreadPool( - 5, - new ThreadFactory() { - @Override - public Thread newThread(Runnable runnable) { - LogUtil.i("DialerExecutors.newThread", "creating low priority thread"); - Thread thread = new Thread(runnable, "DialerExecutors-LowPriority"); - thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND - return thread; - } - }); - /** * An application-wide thread pool used for low priority (non-UI) tasks. * *

This exists to prevent each individual dialer component from having to create its own * threads/pools, which would result in the application having more threads than really necessary. + * + * @param context any valid context object from which the application context can be retrieved */ - public static ExecutorService getLowPriorityThreadPool() { - return lowPriorityThreadPool; + public static ExecutorService getLowPriorityThreadPool(@NonNull Context context) { + return DialerExecutorComponent.get(Assert.isNotNull(context)).lowPriorityThreadPool(); } } diff --git a/java/com/android/dialer/dialpadview/DialpadFragment.java b/java/com/android/dialer/dialpadview/DialpadFragment.java index 2316e86d2..7b551f79d 100644 --- a/java/com/android/dialer/dialpadview/DialpadFragment.java +++ b/java/com/android/dialer/dialpadview/DialpadFragment.java @@ -344,6 +344,7 @@ public class DialpadFragment extends Fragment initPhoneNumberFormattingTextWatcherExecutor = DialerExecutors.createUiTaskBuilder( + getContext(), getFragmentManager(), "DialpadFragment.initPhoneNumberFormattingTextWatcher", new InitPhoneNumberFormattingTextWatcherWorker()) diff --git a/java/com/android/dialer/shortcuts/ShortcutRefresher.java b/java/com/android/dialer/shortcuts/ShortcutRefresher.java index 496f3f02a..7fd02a96f 100644 --- a/java/com/android/dialer/shortcuts/ShortcutRefresher.java +++ b/java/com/android/dialer/shortcuts/ShortcutRefresher.java @@ -45,7 +45,7 @@ public final class ShortcutRefresher { return; } - DialerExecutors.createNonUiTaskBuilder(new RefreshWorker(context)) + DialerExecutors.createNonUiTaskBuilder(context, new RefreshWorker(context)) .build() .executeSerial(new ArrayList<>(contacts)); } diff --git a/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java b/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java index d663d584d..1a2cae18b 100644 --- a/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java +++ b/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java @@ -48,13 +48,13 @@ final class SimulatorMainMenu { } private static void populateDatabase(@NonNull Context context) { - DialerExecutors.createNonUiTaskBuilder(new PopulateDatabaseWorker()) + DialerExecutors.createNonUiTaskBuilder(context, new PopulateDatabaseWorker()) .build() .executeSerial(context); } private static void cleanDatabase(@NonNull Context context) { - DialerExecutors.createNonUiTaskBuilder(new CleanDatabaseWorker()) + DialerExecutors.createNonUiTaskBuilder(context, new CleanDatabaseWorker()) .build() .executeSerial(context); } @@ -65,7 +65,7 @@ final class SimulatorMainMenu { } private static void sharePersistentLog(@NonNull Context context) { - DialerExecutors.createNonUiTaskBuilder(new ShareLogWorker()) + DialerExecutors.createNonUiTaskBuilder(context, new ShareLogWorker()) .onSuccess( (String log) -> { Intent intent = new Intent(Intent.ACTION_SEND); diff --git a/java/com/android/incallui/ContactInfoCache.java b/java/com/android/incallui/ContactInfoCache.java index 272c2b776..2735461b2 100644 --- a/java/com/android/incallui/ContactInfoCache.java +++ b/java/com/android/incallui/ContactInfoCache.java @@ -86,8 +86,7 @@ public class ContactInfoCache implements OnImageLoadCompleteListener { private final ConcurrentHashMap mInfoMap = new ConcurrentHashMap<>(); private final Map> mCallBacks = new ArrayMap<>(); private int mQueryId; - private final DialerExecutor cachedNumberLookupExecutor = - DialerExecutors.createNonUiTaskBuilder(new CachedNumberLookupWorker()).build(); + private final DialerExecutor cachedNumberLookupExecutor; private static class CachedNumberLookupWorker implements Worker { @Nullable @@ -126,6 +125,8 @@ public class ContactInfoCache implements OnImageLoadCompleteListener { Trace.beginSection("ContactInfoCache constructor"); mContext = context; mPhoneNumberService = Bindings.get(context).newPhoneNumberService(context); + cachedNumberLookupExecutor = + DialerExecutors.createNonUiTaskBuilder(mContext, new CachedNumberLookupWorker()).build(); Trace.endSection(); } @@ -718,6 +719,7 @@ public class ContactInfoCache implements OnImageLoadCompleteListener { int queryId; /** The phone number without any changes to display to the user (ex: cnap...) */ String originalPhoneNumber; + boolean shouldShowLocation; boolean isBusiness; diff --git a/java/com/android/incallui/ContactsAsyncHelper.java b/java/com/android/incallui/ContactsAsyncHelper.java index 6237ca3e5..2e893b01a 100644 --- a/java/com/android/incallui/ContactsAsyncHelper.java +++ b/java/com/android/incallui/ContactsAsyncHelper.java @@ -94,7 +94,7 @@ public class ContactsAsyncHelper { args.displayPhotoUri = displayPhotoUri; args.listener = listener; - DialerExecutors.createNonUiTaskBuilder(new Worker()) + DialerExecutors.createNonUiTaskBuilder(context, new Worker()) .onSuccess( output -> { if (args.listener != null) { diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java index b8a2baa00..8535cbc3e 100644 --- a/java/com/android/incallui/InCallPresenter.java +++ b/java/com/android/incallui/InCallPresenter.java @@ -45,7 +45,7 @@ import com.android.dialer.blocking.FilteredNumberCompat; import com.android.dialer.blocking.FilteredNumbersUtil; import com.android.dialer.common.Assert; import com.android.dialer.common.LogUtil; -import com.android.dialer.common.concurrent.DefaultDialerExecutorFactory; +import com.android.dialer.common.concurrent.DialerExecutorComponent; import com.android.dialer.enrichedcall.EnrichedCallComponent; import com.android.dialer.location.GeoUtil; import com.android.dialer.logging.InteractionEvent; @@ -373,7 +373,9 @@ public class InCallPresenter implements CallList.Listener { mCallList.addListener(this); // Create spam call list listener and add it to the list of listeners - mSpamCallListListener = new SpamCallListListener(context, new DefaultDialerExecutorFactory()); + mSpamCallListListener = + new SpamCallListListener( + context, DialerExecutorComponent.get(context).dialerExecutorFactory()); mCallList.addListener(mSpamCallListListener); VideoPauseController.getInstance().setUp(this); -- cgit v1.2.3