OSDN Git Service

Load wallpaper colors in a background thread.
authorYi-Ling Chuang <emilychuang@google.com>
Tue, 28 May 2019 08:14:08 +0000 (16:14 +0800)
committerYi-Ling Chuang <emilychuang@google.com>
Wed, 29 May 2019 04:02:12 +0000 (12:02 +0800)
In WallpaperManagerService, it takes some time to load wallpaper colors
from image wallpapers since bitmap decoding will be involved. This will
block the UI thread and lead to app launch latency. So here we are
making it in another thread to avoid this.

Bug: 133396959
Test: robotest, reboot phone and look at boot trace
Change-Id: Ibd1952a4bf10431ba4be4dd69634d64354670daa

src/com/android/settings/FallbackHome.java

index 59347ad..e3944a6 100644 (file)
@@ -25,6 +25,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ResolveInfo;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -65,7 +66,7 @@ public class FallbackHome extends Activity {
         @Override
         public void onColorsChanged(WallpaperColors colors, int which) {
             if (colors != null) {
-                View decorView = getWindow().getDecorView();
+                final View decorView = getWindow().getDecorView();
                 decorView.setSystemUiVisibility(
                         updateVisibilityFlagsFromColors(colors, decorView.getSystemUiVisibility()));
                 mWallManager.removeOnColorsChangedListener(this);
@@ -81,7 +82,7 @@ public class FallbackHome extends Activity {
         // we don't flash the wallpaper before SUW
         mProvisioned = Settings.Global.getInt(getContentResolver(),
                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
-        int flags;
+        final int flags;
         if (!mProvisioned) {
             setTheme(R.style.FallbackHome_SetupWizard);
             flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
@@ -91,18 +92,11 @@ public class FallbackHome extends Activity {
                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
         }
 
-        // Set the system ui flags to light status bar if the wallpaper supports dark text to match
-        // current system ui color tints. Use a listener to wait for colors if not ready yet.
         mWallManager = getSystemService(WallpaperManager.class);
         if (mWallManager == null) {
             Log.w(TAG, "Wallpaper manager isn't ready, can't listen to color changes!");
         } else {
-            WallpaperColors colors = mWallManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
-            if (colors == null) {
-                mWallManager.addOnColorsChangedListener(mColorsChangedListener, null /* handler */);
-            } else {
-                flags = updateVisibilityFlagsFromColors(colors, flags);
-            }
+            loadWallpaperColors(flags);
         }
         getWindow().getDecorView().setSystemUiVisibility(flags);
 
@@ -139,6 +133,33 @@ public class FallbackHome extends Activity {
         }
     };
 
+    private void loadWallpaperColors(int flags) {
+        final AsyncTask loadWallpaperColorsTask = new AsyncTask<Object, Void, Integer>() {
+            @Override
+            protected Integer doInBackground(Object... params) {
+                final WallpaperColors colors =
+                        mWallManager.getWallpaperColors(WallpaperManager.FLAG_SYSTEM);
+
+                // Use a listener to wait for colors if not ready yet.
+                if (colors == null) {
+                    mWallManager.addOnColorsChangedListener(mColorsChangedListener,
+                            null /* handler */);
+                    return null;
+                }
+                return updateVisibilityFlagsFromColors(colors, flags);
+            }
+
+            @Override
+            protected void onPostExecute(Integer flagsToUpdate) {
+                if (flagsToUpdate == null) {
+                    return;
+                }
+                getWindow().getDecorView().setSystemUiVisibility(flagsToUpdate);
+            }
+        };
+        loadWallpaperColorsTask.execute();
+    }
+
     private void maybeFinish() {
         if (getSystemService(UserManager.class).isUserUnlocked()) {
             final Intent homeIntent = new Intent(Intent.ACTION_MAIN)
@@ -162,6 +183,8 @@ public class FallbackHome extends Activity {
         }
     }
 
+    // Set the system ui flags to light status bar if the wallpaper supports dark text to match
+    // current system ui color tints.
     private int updateVisibilityFlagsFromColors(WallpaperColors colors, int flags) {
         if ((colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0) {
             return flags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR