Loading src/com/android/launcher3/BaseDraggingActivity.java +9 −16 Original line number Diff line number Diff line Loading @@ -17,12 +17,7 @@ package com.android.launcher3; import static com.android.launcher3.util.DisplayController.CHANGE_ROTATION; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.app.WallpaperManager.OnColorsChangedListener; import android.content.Context; import android.content.res.Configuration; import android.graphics.Point; Loading @@ -32,6 +27,7 @@ import android.view.ActionMode; import android.view.Display; import android.view.View; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading @@ -41,9 +37,11 @@ import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.OnColorHintListener; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.Themes; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.util.WallpaperColorHints; import com.android.launcher3.util.WindowBounds; /** Loading @@ -51,7 +49,7 @@ import com.android.launcher3.util.WindowBounds; */ @SuppressWarnings("NewApi") public abstract class BaseDraggingActivity extends BaseActivity implements OnColorsChangedListener, DisplayInfoChangeListener { implements OnColorHintListener, DisplayInfoChangeListener { private static final String TAG = "BaseDraggingActivity"; Loading @@ -63,8 +61,7 @@ public abstract class BaseDraggingActivity extends BaseActivity protected boolean mIsSafeModeEnabled; private Runnable mOnStartCallback; private RunnableList mOnResumeCallbacks = new RunnableList(); private final RunnableList mOnResumeCallbacks = new RunnableList(); private int mThemeRes = R.style.AppTheme; @Override Loading @@ -76,10 +73,7 @@ public abstract class BaseDraggingActivity extends BaseActivity DisplayController.INSTANCE.get(this).addChangeListener(this); // Update theme if (Utilities.ATLEAST_P) { THREAD_POOL_EXECUTOR.execute(() -> getSystemService(WallpaperManager.class) .addOnColorsChangedListener(this, MAIN_EXECUTOR.getHandler())); } WallpaperColorHints.get(this).registerOnColorHintsChangedListener(this); int themeRes = Themes.getActivityThemeRes(this); if (themeRes != mThemeRes) { mThemeRes = themeRes; Loading @@ -97,8 +91,9 @@ public abstract class BaseDraggingActivity extends BaseActivity mOnResumeCallbacks.add(callback); } @MainThread @Override public void onColorsChanged(WallpaperColors wallpaperColors, int which) { public void onColorHintsChanged(int colorHints) { updateTheme(); } Loading Loading @@ -175,10 +170,8 @@ public abstract class BaseDraggingActivity extends BaseActivity @Override protected void onDestroy() { super.onDestroy(); if (Utilities.ATLEAST_P) { getSystemService(WallpaperManager.class).removeOnColorsChangedListener(this); } DisplayController.INSTANCE.get(this).removeChangeListener(this); WallpaperColorHints.get(this).unregisterOnColorsChangedListener(this); } public void runOnceOnStart(Runnable action) { Loading src/com/android/launcher3/util/Themes.java +2 −11 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ import static android.app.WallpaperColors.HINT_SUPPORTS_DARK_THEME; import static com.android.launcher3.LauncherPrefs.THEMED_ICONS; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; Loading @@ -48,16 +46,9 @@ public class Themes { public static final String KEY_THEMED_ICONS = "themed_icons"; /** Gets the WallpaperColorHints and then uses those to get the correct activity theme res. */ public static int getActivityThemeRes(Context context) { final int colorHints; if (Utilities.ATLEAST_P) { WallpaperColors colors = context.getSystemService(WallpaperManager.class) .getWallpaperColors(WallpaperManager.FLAG_SYSTEM); colorHints = colors == null ? 0 : colors.getColorHints(); } else { colorHints = 0; } return getActivityThemeRes(context, colorHints); return getActivityThemeRes(context, WallpaperColorHints.get(context).getHints()); } public static int getActivityThemeRes(Context context, int wallpaperColorHints) { Loading src/com/android/launcher3/util/WallpaperColorHints.kt 0 → 100644 +95 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util import android.app.WallpaperColors import android.app.WallpaperManager import android.app.WallpaperManager.FLAG_SYSTEM import android.app.WallpaperManager.OnColorsChangedListener import android.content.Context import androidx.annotation.MainThread import androidx.annotation.VisibleForTesting import com.android.launcher3.Utilities import com.android.launcher3.util.Executors.MAIN_EXECUTOR import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR /** * This class caches the system's wallpaper color hints for use by other classes as a performance * enhancer. It also centralizes all the WallpaperManager color hint code in one location. */ class WallpaperColorHints(private val context: Context) : SafeCloseable { var hints: Int = 0 private set private val wallpaperManager get() = context.getSystemService(WallpaperManager::class.java)!! private val onColorHintsChangedListeners = mutableListOf<OnColorHintListener>() private val onClose: SafeCloseable init { if (Utilities.ATLEAST_S) { hints = wallpaperManager.getWallpaperColors(FLAG_SYSTEM)?.colorHints ?: 0 val onColorsChangedListener = OnColorsChangedListener { colors, which -> onColorsChanged(colors, which) } UI_HELPER_EXECUTOR.execute { wallpaperManager.addOnColorsChangedListener( onColorsChangedListener, MAIN_EXECUTOR.handler ) } onClose = SafeCloseable { UI_HELPER_EXECUTOR.execute { wallpaperManager.removeOnColorsChangedListener(onColorsChangedListener) } } } else { onClose = SafeCloseable {} } } @MainThread private fun onColorsChanged(colors: WallpaperColors?, which: Int) { if ((which and FLAG_SYSTEM) != 0 && Utilities.ATLEAST_S) { val newHints = colors?.colorHints ?: 0 if (newHints != hints) { hints = newHints onColorHintsChangedListeners.forEach { it.onColorHintsChanged(newHints) } } } } override fun close() = onClose.close() fun registerOnColorHintsChangedListener(listener: OnColorHintListener) { onColorHintsChangedListeners.add(listener) } fun unregisterOnColorsChangedListener(listener: OnColorHintListener) { onColorHintsChangedListeners.remove(listener) } companion object { @VisibleForTesting @JvmField val INSTANCE = MainThreadInitializedObject { WallpaperColorHints(it) } @JvmStatic fun get(context: Context): WallpaperColorHints = INSTANCE.get(context) } } interface OnColorHintListener { fun onColorHintsChanged(colorHints: Int) } tests/src/com/android/launcher3/util/LauncherModelHelper.java +2 −1 Original line number Diff line number Diff line Loading @@ -227,7 +227,8 @@ public class LauncherModelHelper { UserCache.INSTANCE, InstallSessionHelper.INSTANCE, LauncherPrefs.INSTANCE, LauncherAppState.INSTANCE, InvariantDeviceProfile.INSTANCE, DisplayController.INSTANCE, CustomWidgetManager.INSTANCE, SettingsCache.INSTANCE, PluginManagerWrapper.INSTANCE, LockedUserState.INSTANCE, SettingsCache.INSTANCE, PluginManagerWrapper.INSTANCE, LockedUserState.INSTANCE, WallpaperColorHints.INSTANCE, ItemInstallQueue.INSTANCE, WindowManagerProxy.INSTANCE); // System settings cache content provider. Ensure that they are statically initialized Loading Loading
src/com/android/launcher3/BaseDraggingActivity.java +9 −16 Original line number Diff line number Diff line Loading @@ -17,12 +17,7 @@ package com.android.launcher3; import static com.android.launcher3.util.DisplayController.CHANGE_ROTATION; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.app.WallpaperManager.OnColorsChangedListener; import android.content.Context; import android.content.res.Configuration; import android.graphics.Point; Loading @@ -32,6 +27,7 @@ import android.view.ActionMode; import android.view.Display; import android.view.View; import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; Loading @@ -41,9 +37,11 @@ import com.android.launcher3.util.ActivityOptionsWrapper; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.OnColorHintListener; import com.android.launcher3.util.RunnableList; import com.android.launcher3.util.Themes; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.util.WallpaperColorHints; import com.android.launcher3.util.WindowBounds; /** Loading @@ -51,7 +49,7 @@ import com.android.launcher3.util.WindowBounds; */ @SuppressWarnings("NewApi") public abstract class BaseDraggingActivity extends BaseActivity implements OnColorsChangedListener, DisplayInfoChangeListener { implements OnColorHintListener, DisplayInfoChangeListener { private static final String TAG = "BaseDraggingActivity"; Loading @@ -63,8 +61,7 @@ public abstract class BaseDraggingActivity extends BaseActivity protected boolean mIsSafeModeEnabled; private Runnable mOnStartCallback; private RunnableList mOnResumeCallbacks = new RunnableList(); private final RunnableList mOnResumeCallbacks = new RunnableList(); private int mThemeRes = R.style.AppTheme; @Override Loading @@ -76,10 +73,7 @@ public abstract class BaseDraggingActivity extends BaseActivity DisplayController.INSTANCE.get(this).addChangeListener(this); // Update theme if (Utilities.ATLEAST_P) { THREAD_POOL_EXECUTOR.execute(() -> getSystemService(WallpaperManager.class) .addOnColorsChangedListener(this, MAIN_EXECUTOR.getHandler())); } WallpaperColorHints.get(this).registerOnColorHintsChangedListener(this); int themeRes = Themes.getActivityThemeRes(this); if (themeRes != mThemeRes) { mThemeRes = themeRes; Loading @@ -97,8 +91,9 @@ public abstract class BaseDraggingActivity extends BaseActivity mOnResumeCallbacks.add(callback); } @MainThread @Override public void onColorsChanged(WallpaperColors wallpaperColors, int which) { public void onColorHintsChanged(int colorHints) { updateTheme(); } Loading Loading @@ -175,10 +170,8 @@ public abstract class BaseDraggingActivity extends BaseActivity @Override protected void onDestroy() { super.onDestroy(); if (Utilities.ATLEAST_P) { getSystemService(WallpaperManager.class).removeOnColorsChangedListener(this); } DisplayController.INSTANCE.get(this).removeChangeListener(this); WallpaperColorHints.get(this).unregisterOnColorsChangedListener(this); } public void runOnceOnStart(Runnable action) { Loading
src/com/android/launcher3/util/Themes.java +2 −11 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ import static android.app.WallpaperColors.HINT_SUPPORTS_DARK_THEME; import static com.android.launcher3.LauncherPrefs.THEMED_ICONS; import android.app.WallpaperColors; import android.app.WallpaperManager; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; Loading @@ -48,16 +46,9 @@ public class Themes { public static final String KEY_THEMED_ICONS = "themed_icons"; /** Gets the WallpaperColorHints and then uses those to get the correct activity theme res. */ public static int getActivityThemeRes(Context context) { final int colorHints; if (Utilities.ATLEAST_P) { WallpaperColors colors = context.getSystemService(WallpaperManager.class) .getWallpaperColors(WallpaperManager.FLAG_SYSTEM); colorHints = colors == null ? 0 : colors.getColorHints(); } else { colorHints = 0; } return getActivityThemeRes(context, colorHints); return getActivityThemeRes(context, WallpaperColorHints.get(context).getHints()); } public static int getActivityThemeRes(Context context, int wallpaperColorHints) { Loading
src/com/android/launcher3/util/WallpaperColorHints.kt 0 → 100644 +95 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.util import android.app.WallpaperColors import android.app.WallpaperManager import android.app.WallpaperManager.FLAG_SYSTEM import android.app.WallpaperManager.OnColorsChangedListener import android.content.Context import androidx.annotation.MainThread import androidx.annotation.VisibleForTesting import com.android.launcher3.Utilities import com.android.launcher3.util.Executors.MAIN_EXECUTOR import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR /** * This class caches the system's wallpaper color hints for use by other classes as a performance * enhancer. It also centralizes all the WallpaperManager color hint code in one location. */ class WallpaperColorHints(private val context: Context) : SafeCloseable { var hints: Int = 0 private set private val wallpaperManager get() = context.getSystemService(WallpaperManager::class.java)!! private val onColorHintsChangedListeners = mutableListOf<OnColorHintListener>() private val onClose: SafeCloseable init { if (Utilities.ATLEAST_S) { hints = wallpaperManager.getWallpaperColors(FLAG_SYSTEM)?.colorHints ?: 0 val onColorsChangedListener = OnColorsChangedListener { colors, which -> onColorsChanged(colors, which) } UI_HELPER_EXECUTOR.execute { wallpaperManager.addOnColorsChangedListener( onColorsChangedListener, MAIN_EXECUTOR.handler ) } onClose = SafeCloseable { UI_HELPER_EXECUTOR.execute { wallpaperManager.removeOnColorsChangedListener(onColorsChangedListener) } } } else { onClose = SafeCloseable {} } } @MainThread private fun onColorsChanged(colors: WallpaperColors?, which: Int) { if ((which and FLAG_SYSTEM) != 0 && Utilities.ATLEAST_S) { val newHints = colors?.colorHints ?: 0 if (newHints != hints) { hints = newHints onColorHintsChangedListeners.forEach { it.onColorHintsChanged(newHints) } } } } override fun close() = onClose.close() fun registerOnColorHintsChangedListener(listener: OnColorHintListener) { onColorHintsChangedListeners.add(listener) } fun unregisterOnColorsChangedListener(listener: OnColorHintListener) { onColorHintsChangedListeners.remove(listener) } companion object { @VisibleForTesting @JvmField val INSTANCE = MainThreadInitializedObject { WallpaperColorHints(it) } @JvmStatic fun get(context: Context): WallpaperColorHints = INSTANCE.get(context) } } interface OnColorHintListener { fun onColorHintsChanged(colorHints: Int) }
tests/src/com/android/launcher3/util/LauncherModelHelper.java +2 −1 Original line number Diff line number Diff line Loading @@ -227,7 +227,8 @@ public class LauncherModelHelper { UserCache.INSTANCE, InstallSessionHelper.INSTANCE, LauncherPrefs.INSTANCE, LauncherAppState.INSTANCE, InvariantDeviceProfile.INSTANCE, DisplayController.INSTANCE, CustomWidgetManager.INSTANCE, SettingsCache.INSTANCE, PluginManagerWrapper.INSTANCE, LockedUserState.INSTANCE, SettingsCache.INSTANCE, PluginManagerWrapper.INSTANCE, LockedUserState.INSTANCE, WallpaperColorHints.INSTANCE, ItemInstallQueue.INSTANCE, WindowManagerProxy.INSTANCE); // System settings cache content provider. Ensure that they are statically initialized Loading