Updating fallback activity

> Wallpaper based theme support
> Light/dark system UI
> Swipe gestures to start and dismiss a task
> Fixing insets and task preview size

Bug: 75979063
Change-Id: Id402e6ac50551a7c0849742e3a0e77df3ead5aa2
diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java
index 34819af..4c11fe6 100644
--- a/src/com/android/launcher3/BaseDraggingActivity.java
+++ b/src/com/android/launcher3/BaseDraggingActivity.java
@@ -34,13 +34,15 @@
 import com.android.launcher3.LauncherSettings.Favorites;
 import com.android.launcher3.badge.BadgeInfo;
 import com.android.launcher3.compat.LauncherAppsCompat;
+import com.android.launcher3.dynamicui.WallpaperColorInfo;
 import com.android.launcher3.shortcuts.DeepShortcutManager;
 import com.android.launcher3.views.BaseDragLayer;
 
 /**
  * Extension of BaseActivity allowing support for drag-n-drop
  */
-public abstract class BaseDraggingActivity extends BaseActivity {
+public abstract class BaseDraggingActivity extends BaseActivity
+        implements WallpaperColorInfo.OnChangeListener {
 
     private static final String TAG = "BaseDraggingActivity";
 
@@ -57,10 +59,38 @@
 
     private OnStartCallback mOnStartCallback;
 
+    private int mThemeRes = R.style.LauncherTheme;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mIsSafeModeEnabled = getPackageManager().isSafeMode();
+
+        // Update theme
+        WallpaperColorInfo wallpaperColorInfo = WallpaperColorInfo.getInstance(this);
+        wallpaperColorInfo.addOnChangeListener(this);
+        int themeRes = getThemeRes(wallpaperColorInfo);
+        if (themeRes != mThemeRes) {
+            mThemeRes = themeRes;
+            setTheme(themeRes);
+        }
+    }
+
+    @Override
+    public void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo) {
+        if (mThemeRes != getThemeRes(wallpaperColorInfo)) {
+            recreate();
+        }
+    }
+
+    protected int getThemeRes(WallpaperColorInfo wallpaperColorInfo) {
+        if (wallpaperColorInfo.isDark()) {
+            return R.style.LauncherThemeDark;
+        } else if (wallpaperColorInfo.supportsDarkText()) {
+            return R.style.LauncherThemeDarkText;
+        } else {
+            return R.style.LauncherTheme;
+        }
     }
 
     @Override
@@ -203,6 +233,12 @@
         }
     }
 
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        WallpaperColorInfo.getInstance(this).removeOnChangeListener(this);
+    }
+
     public <T extends BaseDraggingActivity> void setOnStartCallback(OnStartCallback<T> callback) {
         mOnStartCallback = callback;
     }
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 056404e..e2f7488 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -135,8 +135,8 @@
 /**
  * Default launcher application.
  */
-public class Launcher extends BaseDraggingActivity implements LauncherExterns, LauncherModel.Callbacks,
-        LauncherProviderChangeListener, WallpaperColorInfo.OnThemeChangeListener {
+public class Launcher extends BaseDraggingActivity
+        implements LauncherExterns, LauncherModel.Callbacks, LauncherProviderChangeListener {
     public static final String TAG = "Launcher";
     static final boolean LOGD = false;
 
@@ -266,10 +266,6 @@
         }
         TraceHelper.beginSection("Launcher-onCreate");
 
-        WallpaperColorInfo wallpaperColorInfo = WallpaperColorInfo.getInstance(this);
-        wallpaperColorInfo.setOnThemeChangeListener(this);
-        overrideTheme(wallpaperColorInfo.isDark(), wallpaperColorInfo.supportsDarkText());
-
         super.onCreate(savedInstanceState);
         TraceHelper.partitionSection("Launcher-onCreate", "super call");
 
@@ -402,23 +398,10 @@
         return mRotationHelper;
     }
 
-    @Override
-    public void onThemeChanged() {
-        recreate();
-    }
-
     public LauncherStateManager getStateManager() {
         return mStateManager;
     }
 
-    protected void overrideTheme(boolean isDark, boolean supportsDarkText) {
-        if (isDark) {
-            setTheme(R.style.LauncherThemeDark);
-        } else if (supportsDarkText) {
-            setTheme(R.style.LauncherThemeDarkText);
-        }
-    }
-
     @Override
     public <T extends View> T findViewById(int id) {
         return mLauncherView.findViewById(id);
@@ -1367,7 +1350,6 @@
         }
 
         TextKeyListener.getInstance().release();
-        WallpaperColorInfo.getInstance(this).setOnThemeChangeListener(null);
 
         LauncherAnimUtils.onDestroyActivity();
 
diff --git a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java
index 267e930..32605a2 100644
--- a/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java
+++ b/src/com/android/launcher3/dynamicui/WallpaperColorInfo.java
@@ -33,7 +33,8 @@
     private int mSecondaryColor;
     private boolean mIsDark;
     private boolean mSupportsDarkText;
-    private OnThemeChangeListener mOnThemeChangeListener;
+
+    private OnChangeListener[] mTempListeners;
 
     private WallpaperColorInfo(Context context) {
         mWallpaperManager = WallpaperManagerCompat.getInstance(context);
@@ -61,10 +62,8 @@
     @Override
     public void onColorsChanged(WallpaperColorsCompat colors, int which) {
         if ((which & FLAG_SYSTEM) != 0) {
-            boolean wasDarkTheme = mIsDark;
-            boolean didSupportDarkText = mSupportsDarkText;
             update(colors);
-            notifyChange(wasDarkTheme != mIsDark || didSupportDarkText != mSupportsDarkText);
+            notifyChange();
         }
     }
 
@@ -85,10 +84,6 @@
                     & WallpaperColorsCompat.HINT_SUPPORTS_DARK_THEME) > 0 : false;
     }
 
-    public void setOnThemeChangeListener(OnThemeChangeListener onThemeChangeListener) {
-        this.mOnThemeChangeListener = onThemeChangeListener;
-    }
-
     public void addOnChangeListener(OnChangeListener listener) {
         mListeners.add(listener);
     }
@@ -97,23 +92,19 @@
         mListeners.remove(listener);
     }
 
-    public void notifyChange(boolean themeChanged) {
-        if (themeChanged) {
-            if (mOnThemeChangeListener != null) {
-                mOnThemeChangeListener.onThemeChanged();
-            }
-        } else {
-            for (OnChangeListener listener : mListeners) {
-                listener.onExtractedColorsChanged(this);
-            }
+    private void notifyChange() {
+        OnChangeListener[] copy =
+                mTempListeners != null && mTempListeners.length == mListeners.size() ?
+                        mTempListeners : new OnChangeListener[mListeners.size()];
+
+        // Create a new array to avoid concurrent modification when the activity destroys itself.
+        mTempListeners = mListeners.toArray(copy);
+        for (OnChangeListener listener : mTempListeners) {
+            listener.onExtractedColorsChanged(this);
         }
     }
 
     public interface OnChangeListener {
         void onExtractedColorsChanged(WallpaperColorInfo wallpaperColorInfo);
     }
-
-    public interface OnThemeChangeListener {
-        void onThemeChanged();
-    }
 }