Add depth animation when multiwindow mode changes.
This is a workaround until we can support app transitions when starting
an activity in mw mode.
Bug: 158613217
Change-Id: I843d6669722c543728ab532e1c4fbd4643f6f135
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index d2e0339..47ce320 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -83,6 +83,7 @@
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 2b08dcd..fe8f0c6 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.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 @@
/**
* Controls blur and wallpaper zoom, for the Launcher surface only.
*/
-public class DepthController implements StateHandler<LauncherState> {
+public class DepthController implements StateHandler<LauncherState>,
+ BaseActivity.MultiWindowModeChangedListener {
public static final FloatProperty<DepthController> DEPTH =
new FloatProperty<DepthController>("depth") {
@@ -104,6 +109,9 @@
*/
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 @@
@Override
public void setState(LauncherState toState) {
- if (mSurface == null) {
+ if (mSurface == null || mIgnoreStateChangesDuringMultiWindowAnimation) {
return;
}
@@ -186,7 +194,8 @@
PendingAnimation animation) {
if (mSurface == null
|| config.onlyPlayAtomicComponent()
- || config.hasAnimationFlag(SKIP_DEPTH_CONTROLLER)) {
+ || config.hasAnimationFlag(SKIP_DEPTH_CONTROLLER)
+ || mIgnoreStateChangesDuringMultiWindowAnimation) {
return;
}
@@ -231,4 +240,21 @@
.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 31bfc09..c78df62 100644
--- a/src/com/android/launcher3/LauncherState.java
+++ b/src/com/android/launcher3/LauncherState.java
@@ -226,7 +226,16 @@
* 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);