Fix Settings creating too many threads unexpectedly

Limit the number of threads by using the shared thread pool in
ThreadUtils.

Bug: 143434413
Test: manual
Change-Id: I4afe1f641a11e218616772c1d5446efcc99cd1cc
Merged-In: I4afe1f641a11e218616772c1d5446efcc99cd1cc
(cherry picked from commit 3e4c47dbc090310edcf14b1c5094259f74ff0525)
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 6d3649d..5a04143 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -37,12 +37,11 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.utils.AsyncLoaderCompat;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -56,7 +55,6 @@
     private static final String TAG = "ContextualCardLoader";
     private static final long ELIGIBILITY_CHECKER_TIMEOUT_MS = 250;
 
-    private final ExecutorService mExecutorService;
     private final ContentObserver mObserver = new ContentObserver(
             new Handler(Looper.getMainLooper())) {
         @Override
@@ -76,7 +74,6 @@
     ContextualCardLoader(Context context) {
         super(context);
         mContext = context.getApplicationContext();
-        mExecutorService = Executors.newCachedThreadPool();
     }
 
     @Override
@@ -163,8 +160,8 @@
         final List<Future<ContextualCard>> eligibleCards = new ArrayList<>();
 
         for (ContextualCard card : candidates) {
-            final EligibleCardChecker future = new EligibleCardChecker(mContext, card);
-            eligibleCards.add(mExecutorService.submit(future));
+            final EligibleCardChecker checker = new EligibleCardChecker(mContext, card);
+            eligibleCards.add(ThreadUtils.postOnBackgroundThread(checker));
         }
         // Collect future and eligible cards
         for (Future<ContextualCard> cardFuture : eligibleCards) {
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
index 66f6c81..1beac9b 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
@@ -23,13 +23,12 @@
 import androidx.annotation.VisibleForTesting;
 
 import com.android.settings.homepage.contextualcards.ContextualCard;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -42,7 +41,6 @@
 
     private static final long DISPLAYABLE_CHECKER_TIMEOUT_MS = 20;
 
-    private final ExecutorService mExecutorService;
     private final Context mAppContext;
     private final ConditionListener mListener;
 
@@ -50,7 +48,6 @@
 
     public ConditionManager(Context context, ConditionListener listener) {
         mAppContext = context.getApplicationContext();
-        mExecutorService = Executors.newCachedThreadPool();
         mCardControllers = new ArrayList<>();
         mListener = listener;
         initCandidates();
@@ -64,8 +61,8 @@
         final List<Future<ContextualCard>> displayableCards = new ArrayList<>();
         // Check displayable future
         for (ConditionalCardController card : mCardControllers) {
-            final DisplayableChecker future = new DisplayableChecker(getController(card.getId()));
-            displayableCards.add(mExecutorService.submit(future));
+            final DisplayableChecker checker = new DisplayableChecker(getController(card.getId()));
+            displayableCards.add(ThreadUtils.postOnBackgroundThread(checker));
         }
         // Collect future and add displayable cards
         for (Future<ContextualCard> cardFuture : displayableCards) {
diff --git a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
index ff76779..bdf97a8 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/NotificationChannelSlice.java
@@ -20,8 +20,6 @@
 import static android.app.NotificationManager.IMPORTANCE_NONE;
 import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
 
-import static com.android.settings.notification.ChannelListPreferenceController.ARG_FROM_SETTINGS;
-
 import android.app.Application;
 import android.app.NotificationChannel;
 import android.app.NotificationChannelGroup;
@@ -62,13 +60,12 @@
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.utils.ThreadUtils;
 
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -135,7 +132,6 @@
             };
 
     protected final Context mContext;
-    private final ExecutorService mExecutorService;
     @VisibleForTesting
     NotificationBackend mNotificationBackend;
     private NotificationBackend.AppRow mAppRow;
@@ -145,7 +141,6 @@
     public NotificationChannelSlice(Context context) {
         mContext = context;
         mNotificationBackend = new NotificationBackend();
-        mExecutorService = Executors.newCachedThreadPool();
     }
 
     @Override
@@ -376,9 +371,9 @@
         // Create tasks to get notification data for multi-channel packages.
         final List<Future<NotificationBackend.AppRow>> appRowTasks = new ArrayList<>();
         for (PackageInfo packageInfo : packageInfoList) {
-            final NotificationMultiChannelAppRow future = new NotificationMultiChannelAppRow(
+            final NotificationMultiChannelAppRow appRow = new NotificationMultiChannelAppRow(
                     mContext, mNotificationBackend, packageInfo);
-            appRowTasks.add(mExecutorService.submit(future));
+            appRowTasks.add(ThreadUtils.postOnBackgroundThread(appRow));
         }
 
         // Get the package which has sent at least ~10 notifications and not turn off channels.