From 07fedbce463d23fcb433c5ea072069dff83a6d16 Mon Sep 17 00:00:00 2001 From: Galia Peycheva Date: Tue, 23 Feb 2021 14:20:02 +0100 Subject: [PATCH] Add WM.setForceCrossWindowBlurDisabled TestApi Bug: 179990440 Test: m && atest BlurTests Change-Id: Ie393e456f2c55dfde945dc53ecdc83bbcfcdb361 --- core/api/test-current.txt | 1 + core/java/android/view/IWindowManager.aidl | 2 ++ core/java/android/view/WindowManager.java | 14 +++++++++ core/java/android/view/WindowManagerImpl.java | 9 ++++++ .../com/android/server/wm/BlurController.java | 30 ++++++++++++------- .../server/wm/WindowManagerService.java | 5 ++++ 6 files changed, 50 insertions(+), 11 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 86949e05ba71e..f5859ace19ddf 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2530,6 +2530,7 @@ package android.view { method public default int getDisplayImePolicy(int); method public default void holdLock(android.os.IBinder, int); method public default void setDisplayImePolicy(int, int); + method public default void setForceCrossWindowBlurDisabled(boolean); method public default void setShouldShowSystemDecors(int, boolean); method public default void setShouldShowWithInsecureKeyguard(int, boolean); method public default boolean shouldShowSystemDecors(int); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 54778007c6ff7..b345b2e582520 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -816,4 +816,6 @@ interface IWindowManager * @param listener the listener to be unregistered */ void unregisterCrossWindowBlurEnabledListener(ICrossWindowBlurEnabledListener listener); + + void setForceCrossWindowBlurDisabled(boolean disable); } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 7338c7d9a5811..818a2b04b5c01 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -873,6 +873,20 @@ public interface WindowManager extends ViewManager { default void removeCrossWindowBlurEnabledListener(@NonNull Consumer listener) { } + /** + * Disables cross-window blurs device-wide. This includes window blur behind + * (see {@link LayoutParams#setBlurBehindRadius}) and window background blur + * (see {@link Window#setBackgroundBlurRadius}). + * + * @param disable specifies whether to disable the blur. Note that calling this + * with 'disable=false' will not enable blurs if there is something + * else disabling blurs. + * @hide + */ + @TestApi + default void setForceCrossWindowBlurDisabled(boolean disable) { + } + public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable { /** * X position for this window. With the default gravity it is ignored. diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index b39870738d68e..e37522bc9986f 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -317,4 +317,13 @@ public final class WindowManagerImpl implements WindowManager { public void removeCrossWindowBlurEnabledListener(@NonNull Consumer listener) { CrossWindowBlurListeners.getInstance().removeListener(listener); } + + @Override + public void setForceCrossWindowBlurDisabled(boolean disable) { + try { + WindowManagerGlobal.getWindowManagerService() + .setForceCrossWindowBlurDisabled(disable); + } catch (RemoteException e) { + } + } } diff --git a/services/core/java/com/android/server/wm/BlurController.java b/services/core/java/com/android/server/wm/BlurController.java index 13295e8aca021..128d452c3018c 100644 --- a/services/core/java/com/android/server/wm/BlurController.java +++ b/services/core/java/com/android/server/wm/BlurController.java @@ -22,12 +22,17 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.view.ICrossWindowBlurEnabledListener; +import com.android.internal.annotations.GuardedBy; + final class BlurController { private final RemoteCallbackList mBlurEnabledListeners = new RemoteCallbackList<>(); private final Object mLock = new Object(); + @GuardedBy("mLock") boolean mBlurEnabled; + @GuardedBy("mLock") + boolean mBlurForceDisabled; BlurController() { mBlurEnabled = CROSS_WINDOW_BLUR_SUPPORTED; @@ -46,19 +51,24 @@ final class BlurController { mBlurEnabledListeners.unregister(listener); } - private void updateBlurEnabled() { - // TODO: add other factors disabling blurs - final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED; + void setForceCrossWindowBlurDisabled(boolean disable) { synchronized (mLock) { - if (mBlurEnabled == newEnabled) { - return; - } - mBlurEnabled = newEnabled; - notifyBlurEnabledChanged(newEnabled); + mBlurForceDisabled = disable; + updateBlurEnabledLocked(); } + } - private void notifyBlurEnabledChanged(boolean enabled) { + private void updateBlurEnabledLocked() { + final boolean newEnabled = CROSS_WINDOW_BLUR_SUPPORTED && !mBlurForceDisabled; + if (mBlurEnabled == newEnabled) { + return; + } + mBlurEnabled = newEnabled; + notifyBlurEnabledChangedLocked(newEnabled); + } + + private void notifyBlurEnabledChangedLocked(boolean enabled) { int i = mBlurEnabledListeners.beginBroadcast(); while (i > 0) { i--; @@ -71,6 +81,4 @@ final class BlurController { } mBlurEnabledListeners.finishBroadcast(); } - - } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 6f853c7955259..c8aaaa52796f5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5702,6 +5702,11 @@ public class WindowManagerService extends IWindowManager.Stub mBlurController.unregisterCrossWindowBlurEnabledListener(listener); } + @Override + public void setForceCrossWindowBlurDisabled(boolean disable) { + mBlurController.setForceCrossWindowBlurDisabled(disable); + } + // ------------------------------------------------------------- // Internals // -------------------------------------------------------------