Some minor fixes for extracted status bar.

- setLightStatusBar() is now updateStatusBar(), with a forceLight
  parameter. We set the status bar to be light if forceLight or
  shouldBeLightStatusBar() (based on wallpaper).
- Force status bar to be light if all apps is open.
- Default to dark status bar, not light (light == dark icons)

Bug: 29452834
Change-Id: I7b102ceff2f1ef2ab8defd4a46c698df4feaf2a5
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index d059da2..245cd71 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -280,7 +280,6 @@
     private boolean mVisible;
     private boolean mHasFocus;
     private boolean mAttached;
-    private boolean mIsLightStatusBar;
 
     /** Maps launcher activity components to their list of shortcut ids. */
     private MultiHashMap<ComponentKey, String> mDeepShortcutMap = new MultiHashMap<>();
@@ -485,33 +484,34 @@
 
     private void loadExtractedColorsAndColorItems() {
         // TODO: do this in pre-N as well, once the extraction part is complete.
-        if (mExtractedColors != null && Utilities.isNycOrAbove()) {
+        if (Utilities.isNycOrAbove()) {
             mExtractedColors.load(this);
             mHotseat.updateColor(mExtractedColors, !mPaused);
             mWorkspace.getPageIndicator().updateColor(mExtractedColors);
-            setLightStatusBar(shouldBeLightStatusBar());
+            // It's possible that All Apps is visible when this is run,
+            // so always use light status bar in that case.
+            activateLightStatusBar(isAllAppsVisible());
         }
     }
 
-    /** Returns whether a light status bar (dark icons) should be used based on the wallpaper. */
-    public boolean shouldBeLightStatusBar() {
-        return mExtractedColors.getColor(ExtractedColors.STATUS_BAR_INDEX,
-                ExtractedColors.DEFAULT_LIGHT) == ExtractedColors.DEFAULT_LIGHT;
-    }
-
-    public void setLightStatusBar(boolean lightStatusBar) {
-        // Already set correctly
-        if (mIsLightStatusBar == lightStatusBar) {
-            return;
-        }
-        mIsLightStatusBar = lightStatusBar;
-        int systemUiFlags = getWindow().getDecorView().getSystemUiVisibility();
+    /**
+     * Sets the status bar to be light or not. Light status bar means dark icons.
+     * @param activate if true, make sure the status bar is light, otherwise base on wallpaper.
+     */
+    public void activateLightStatusBar(boolean activate) {
+        boolean lightStatusBar = activate
+                || mExtractedColors.getColor(ExtractedColors.STATUS_BAR_INDEX,
+                ExtractedColors.DEFAULT_DARK) == ExtractedColors.DEFAULT_LIGHT;
+        int oldSystemUiFlags = getWindow().getDecorView().getSystemUiVisibility();
+        int newSystemUiFlags = oldSystemUiFlags;
         if (lightStatusBar) {
-            systemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
+            newSystemUiFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
         } else {
-            systemUiFlags &= ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+            newSystemUiFlags &= ~(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
         }
-        getWindow().getDecorView().setSystemUiVisibility(systemUiFlags);
+        if (newSystemUiFlags != oldSystemUiFlags) {
+            getWindow().getDecorView().setSystemUiVisibility(newSystemUiFlags);
+        }
     }
 
     private LauncherCallbacks mLauncherCallbacks;