diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index 370fb8ef7c..000d69d400 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -108,6 +108,13 @@ public class DepthController implements StateHandler, } }; + private final Runnable mOpaquenessListener = new Runnable() { + @Override + public void run() { + dispatchTransactionSurface(mDepth); + } + }; + private final Launcher mLauncher; /** * Blur radius when completely zoomed out, in pixels. @@ -150,23 +157,28 @@ public class DepthController implements StateHandler, if (windowToken != null) { mWallpaperManager.setWallpaperZoomOut(windowToken, mDepth); } - CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), - mCrossWindowBlurListener); + onAttached(); } @Override public void onViewDetachedFromWindow(View view) { CrossWindowBlurListeners.getInstance().removeListener(mCrossWindowBlurListener); + mLauncher.getScrimView().removeOpaquenessListener(mOpaquenessListener); } }; mLauncher.getRootView().addOnAttachStateChangeListener(mOnAttachListener); if (mLauncher.getRootView().isAttachedToWindow()) { - CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), - mCrossWindowBlurListener); + onAttached(); } } } + private void onAttached() { + CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(), + mCrossWindowBlurListener); + mLauncher.getScrimView().addOpaquenessListener(mOpaquenessListener); + } + /** * Sets if the underlying activity is started or not */ diff --git a/src/com/android/launcher3/views/ScrimView.java b/src/com/android/launcher3/views/ScrimView.java index 1eb79ad550..4c0bfde682 100644 --- a/src/com/android/launcher3/views/ScrimView.java +++ b/src/com/android/launcher3/views/ScrimView.java @@ -25,23 +25,27 @@ import android.graphics.drawable.ColorDrawable; import android.util.AttributeSet; import android.view.View; +import androidx.annotation.NonNull; import androidx.core.graphics.ColorUtils; import com.android.launcher3.BaseActivity; import com.android.launcher3.Insettable; import com.android.launcher3.util.SystemUiController; +import java.util.ArrayList; + /** * Simple scrim which draws a flat color */ public class ScrimView extends View implements Insettable { private static final float STATUS_BAR_COLOR_FORCE_UPDATE_THRESHOLD = 0.9f; + private final ArrayList mOpaquenessListeners = new ArrayList<>(1); private SystemUiController mSystemUiController; - private ScrimDrawingController mDrawingController; private int mBackgroundColor; private boolean mIsVisible = true; + private boolean mLastDispatchedOpaqueness; public ScrimView(Context context, AttributeSet attrs) { super(context, attrs); @@ -60,6 +64,7 @@ public class ScrimView extends View implements Insettable { @Override protected boolean onSetAlpha(int alpha) { updateSysUiColors(); + dispatchVisibilityListenersIfNeeded(); return super.onSetAlpha(alpha); } @@ -67,6 +72,7 @@ public class ScrimView extends View implements Insettable { public void setBackgroundColor(int color) { mBackgroundColor = color; updateSysUiColors(); + dispatchVisibilityListenersIfNeeded(); super.setBackgroundColor(color); } @@ -74,6 +80,7 @@ public class ScrimView extends View implements Insettable { public void onVisibilityAggregated(boolean isVisible) { super.onVisibilityAggregated(isVisible); mIsVisible = isVisible; + dispatchVisibilityListenersIfNeeded(); } public boolean isFullyOpaque() { @@ -108,6 +115,17 @@ public class ScrimView extends View implements Insettable { } } + private void dispatchVisibilityListenersIfNeeded() { + boolean fullyOpaque = isFullyOpaque(); + if (mLastDispatchedOpaqueness == fullyOpaque) { + return; + } + mLastDispatchedOpaqueness = fullyOpaque; + for (int i = 0; i < mOpaquenessListeners.size(); i++) { + mOpaquenessListeners.get(i).run(); + } + } + private SystemUiController getSystemUiController() { if (mSystemUiController == null) { mSystemUiController = BaseActivity.fromContext(getContext()).getSystemUiController(); @@ -135,6 +153,22 @@ public class ScrimView extends View implements Insettable { } } + /** + * Registers a listener to be notified of whether the scrim is occluding other UI elements. + * @see #isFullyOpaque() + */ + public void addOpaquenessListener(@NonNull Runnable listener) { + mOpaquenessListeners.add(listener); + } + + /** + * Removes previously registered listener. + * @see #addOpaquenessListener(Runnable) + */ + public void removeOpaquenessListener(@NonNull Runnable listener) { + mOpaquenessListeners.remove(listener); + } + /** * A Utility interface allowing for other surfaces to draw on ScrimView */