diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java index d2e0339325..47ce320331 100644 --- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java @@ -83,6 +83,7 @@ public abstract class BaseQuickstepLauncher extends Launcher super.onCreate(savedInstanceState); SysUINavigationMode.INSTANCE.get(this).addModeChangeListener(this); + addMultiWindowModeChangedListener(mDepthController); } @Override diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java index 2b08dcd6ed..fe8f0c653d 100644 --- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java +++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java @@ -20,11 +20,15 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.states.StateAnimationConfig.ANIM_DEPTH; import static com.android.launcher3.states.StateAnimationConfig.SKIP_DEPTH_CONTROLLER; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; import android.os.IBinder; import android.util.FloatProperty; import android.view.View; import android.view.ViewTreeObserver; +import com.android.launcher3.BaseActivity; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.R; @@ -41,7 +45,8 @@ import com.android.systemui.shared.system.WallpaperManagerCompat; /** * Controls blur and wallpaper zoom, for the Launcher surface only. */ -public class DepthController implements StateHandler { +public class DepthController implements StateHandler, + BaseActivity.MultiWindowModeChangedListener { public static final FloatProperty DEPTH = new FloatProperty("depth") { @@ -104,6 +109,9 @@ public class DepthController implements StateHandler { */ private float mDepth; + // Workaround for animating the depth when multiwindow mode changes. + private boolean mIgnoreStateChangesDuringMultiWindowAnimation = false; + private View.OnAttachStateChangeListener mOnAttachListener; public DepthController(Launcher l) { @@ -171,7 +179,7 @@ public class DepthController implements StateHandler { @Override public void setState(LauncherState toState) { - if (mSurface == null) { + if (mSurface == null || mIgnoreStateChangesDuringMultiWindowAnimation) { return; } @@ -186,7 +194,8 @@ public class DepthController implements StateHandler { PendingAnimation animation) { if (mSurface == null || config.onlyPlayAtomicComponent() - || config.hasAnimationFlag(SKIP_DEPTH_CONTROLLER)) { + || config.hasAnimationFlag(SKIP_DEPTH_CONTROLLER) + || mIgnoreStateChangesDuringMultiWindowAnimation) { return; } @@ -231,4 +240,21 @@ public class DepthController implements StateHandler { .apply(); } } + + @Override + public void onMultiWindowModeChanged(boolean isInMultiWindowMode) { + mIgnoreStateChangesDuringMultiWindowAnimation = true; + + ObjectAnimator mwAnimation = ObjectAnimator.ofFloat(this, DEPTH, + mLauncher.getStateManager().getState().getDepth(mLauncher, isInMultiWindowMode)) + .setDuration(300); + mwAnimation.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mIgnoreStateChangesDuringMultiWindowAnimation = false; + } + }); + mwAnimation.setAutoCancel(true); + mwAnimation.start(); + } } diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index 31bfc09da7..c78df62991 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -226,7 +226,16 @@ public abstract class LauncherState implements BaseState { * 0 means completely zoomed in, without blurs. 1 is zoomed out, with blurs. */ public final float getDepth(Context context) { - if (BaseDraggingActivity.fromContext(context).getDeviceProfile().isMultiWindowMode) { + return getDepth(context, + BaseDraggingActivity.fromContext(context).getDeviceProfile().isMultiWindowMode); + } + + /** + * Returns the amount of blur and wallpaper zoom for this state with {@param isMultiWindowMode}. + * @see #getDepth(Context). + */ + public final float getDepth(Context context, boolean isMultiWindowMode) { + if (isMultiWindowMode) { return 0; } return getDepthUnchecked(context);