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();
- }
}