Merge "Improve theme application transition." into qt-dev
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 6552a77..583103c 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1064,6 +1064,7 @@
         }
 
         public void scheduleApplicationInfoChanged(ApplicationInfo ai) {
+            mH.removeMessages(H.APPLICATION_INFO_CHANGED);
             sendMessage(H.APPLICATION_INFO_CHANGED, ai);
         }
 
@@ -5126,6 +5127,7 @@
      * handling current transaction item before relaunching the activity.
      */
     void scheduleRelaunchActivity(IBinder token) {
+        mH.removeMessages(H.RELAUNCH_ACTIVITY, token);
         sendMessage(H.RELAUNCH_ACTIVITY, token);
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
index f318f8f..8380b19 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayController.java
@@ -24,6 +24,7 @@
 import android.content.pm.UserInfo;
 import android.database.ContentObserver;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -66,6 +67,7 @@
         mUserManager = mContext.getSystemService(UserManager.class);
         mThemeManager = new ThemeOverlayManager(
                 mContext.getSystemService(OverlayManager.class),
+                AsyncTask.THREAD_POOL_EXECUTOR,
                 mContext.getString(R.string.launcher_overlayable_package));
         final Handler bgHandler = Dependency.get(Dependency.BG_HANDLER);
         final IntentFilter filter = new IntentFilter();
diff --git a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java
index 51ae70b..27e3b2b 100644
--- a/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java
+++ b/packages/SystemUI/src/com/android/systemui/theme/ThemeOverlayManager.java
@@ -31,6 +31,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Executor;
 import java.util.stream.Collectors;
 
 class ThemeOverlayManager {
@@ -91,10 +92,13 @@
     /* Target package for each overlay category. */
     private final Map<String, String> mCategoryToTargetPackage = new ArrayMap<>();
     private final OverlayManager mOverlayManager;
+    private final Executor mExecutor;
     private final String mLauncherPackage;
 
-    ThemeOverlayManager(OverlayManager overlayManager, String launcherPackage) {
+    ThemeOverlayManager(OverlayManager overlayManager, Executor executor,
+            String launcherPackage) {
         mOverlayManager = overlayManager;
+        mExecutor = executor;
         mLauncherPackage = launcherPackage;
         mTargetPackageToCategories.put(ANDROID_PACKAGE, Sets.newHashSet(
                 OVERLAY_CATEGORY_COLOR, OVERLAY_CATEGORY_FONT,
@@ -149,19 +153,21 @@
     private void setEnabled(
             String packageName, String category, Set<UserHandle> handles, boolean enabled) {
         for (UserHandle userHandle : handles) {
-            setEnabled(packageName, userHandle, enabled);
+            setEnabledAsync(packageName, userHandle, enabled);
         }
         if (!handles.contains(UserHandle.SYSTEM) && SYSTEM_USER_CATEGORIES.contains(category)) {
-            setEnabled(packageName, UserHandle.SYSTEM, enabled);
+            setEnabledAsync(packageName, UserHandle.SYSTEM, enabled);
         }
     }
 
-    private void setEnabled(String pkg, UserHandle userHandle, boolean enabled) {
-        if (DEBUG) Log.d(TAG, String.format("setEnabled: %s %s %b", pkg, userHandle, enabled));
-        if (enabled) {
-            mOverlayManager.setEnabledExclusiveInCategory(pkg, userHandle);
-        } else {
-            mOverlayManager.setEnabled(pkg, false, userHandle);
-        }
+    private void setEnabledAsync(String pkg, UserHandle userHandle, boolean enabled) {
+        mExecutor.execute(() -> {
+            if (DEBUG) Log.d(TAG, String.format("setEnabled: %s %s %b", pkg, userHandle, enabled));
+            if (enabled) {
+                mOverlayManager.setEnabledExclusiveInCategory(pkg, userHandle);
+            } else {
+                mOverlayManager.setEnabled(pkg, false, userHandle);
+            }
+        });
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java
index a904704..4659afc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayManagerTest.java
@@ -47,13 +47,12 @@
 import com.google.android.collect.Maps;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.MoreExecutors;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.InOrder;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import java.util.HashMap;
@@ -87,7 +86,8 @@
     @Before
     public void setup() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mManager = new ThemeOverlayManager(mOverlayManager, LAUNCHER_PACKAGE);
+        mManager = new ThemeOverlayManager(mOverlayManager, MoreExecutors.directExecutor(),
+                LAUNCHER_PACKAGE);
         when(mOverlayManager.getOverlayInfosForTarget(ANDROID_PACKAGE, UserHandle.SYSTEM))
                 .thenReturn(Lists.newArrayList(
                         createOverlayInfo(TEST_DISABLED_PREFIX + OVERLAY_CATEGORY_COLOR,
@@ -136,17 +136,6 @@
     }
 
     @Test
-    public void allCategoriesSpecified_enabledInOrder() {
-        mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, TEST_USER_HANDLES);
-
-        InOrder inOrder = Mockito.inOrder(mOverlayManager);
-        for (String category : THEME_CATEGORIES) {
-            inOrder.verify(mOverlayManager)
-                    .setEnabledExclusiveInCategory(ALL_CATEGORIES_MAP.get(category), TEST_USER);
-        }
-    }
-
-    @Test
     public void allCategoriesSpecified_sysuiCategoriesAlsoAppliedToSysuiUser() {
         mManager.applyCurrentUserOverlays(ALL_CATEGORIES_MAP, TEST_USER_HANDLES);