1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/* 2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2011 The Android Open Source Project 3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License. 6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at 7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and 14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License. 15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 179779f967ebb9512e5b19090b071572c9c4f0f2a6Eric Erfanianpackage com.android.dialer.common.concurrent; 18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.os.AsyncTask; 20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.support.annotation.MainThread; 219779f967ebb9512e5b19090b071572c9c4f0f2a6Eric Erfanianimport com.android.dialer.common.Assert; 22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.concurrent.Executor; 23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** 25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Factory methods for creating AsyncTaskExecutors. 26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * 27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * <p>All of the factory methods on this class check first to see if you have set a static {@link 28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * AsyncTaskExecutorFactory} set through the {@link #setFactoryForTest(AsyncTaskExecutorFactory)} 29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * method, and if so delegate to that instead, which is one way of injecting dependencies for 30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * testing classes whose construction cannot be controlled such as {@link android.app.Activity}. 31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic final class AsyncTaskExecutors { 33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * A single instance of the {@link AsyncTaskExecutorFactory}, to which we delegate if it is 36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * non-null, for injecting when testing. 37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private static AsyncTaskExecutorFactory mInjectedAsyncTaskExecutorFactory = null; 39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Creates an AsyncTaskExecutor that submits tasks to run with {@link AsyncTask#SERIAL_EXECUTOR}. 42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static AsyncTaskExecutor createAsyncTaskExecutor() { 44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian synchronized (AsyncTaskExecutors.class) { 45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mInjectedAsyncTaskExecutorFactory != null) { 46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mInjectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor(); 47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new SimpleAsyncTaskExecutor(AsyncTask.SERIAL_EXECUTOR); 49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** 53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Creates an AsyncTaskExecutor that submits tasks to run with {@link 54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * AsyncTask#THREAD_POOL_EXECUTOR}. 55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */ 56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static AsyncTaskExecutor createThreadPoolExecutor() { 57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian synchronized (AsyncTaskExecutors.class) { 58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian if (mInjectedAsyncTaskExecutorFactory != null) { 59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return mInjectedAsyncTaskExecutorFactory.createAsyncTaskExeuctor(); 60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return new SimpleAsyncTaskExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public static void setFactoryForTest(AsyncTaskExecutorFactory factory) { 66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian synchronized (AsyncTaskExecutors.class) { 67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mInjectedAsyncTaskExecutorFactory = factory; 68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian /** Interface for creating AsyncTaskExecutor objects. */ 72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public interface AsyncTaskExecutorFactory { 73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian AsyncTaskExecutor createAsyncTaskExeuctor(); 75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 77d8046e520a866b9948ee9ba47cf642b441ca8e23Eric Erfanian static class SimpleAsyncTaskExecutor implements AsyncTaskExecutor { 78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian private final Executor mExecutor; 80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public SimpleAsyncTaskExecutor(Executor executor) { 82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian mExecutor = executor; 83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian 85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @Override 86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian @MainThread 87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian public <T> AsyncTask<T, ?, ?> submit(Object identifer, AsyncTask<T, ?, ?> task, T... params) { 88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian Assert.isMainThread(); 89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian return task.executeOnExecutor(mExecutor, params); 90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian } 92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian} 93