Fix bug where icon remains invisible after returning home.
- The bug is caused by cancelling of the RectFSpringAnim before the StaggeredWorkspaceAnim has started. - Instead of having logic in StaggeredWorkspaceAnim control the visibility of the icon, we instead maintain all the visibility within the FloatingIconView class itself. Bug: 142120338 Change-Id: I94f3a066d395f9c3b97dc6ee9fc836e9401650a5 Merged-In: I082291ca9b288f57701cc00d61a9b3a84da8b084
This commit is contained in:
committed by
Jonathan Miranda
parent
f3761296a1
commit
a3ea27de39
+2
-2
@@ -398,8 +398,8 @@ public class NoButtonQuickSwitchTouchController implements TouchController,
|
||||
updateNonOverviewAnim(targetState, new AnimatorSetBuilder(), 0 /* animComponents */);
|
||||
nonOverviewAnim = mNonOverviewAnim.getAnimationPlayer();
|
||||
|
||||
new StaggeredWorkspaceAnim(mLauncher, null, velocity.y,
|
||||
false /* animateOverviewScrim */).start();
|
||||
new StaggeredWorkspaceAnim(mLauncher, velocity.y, false /* animateOverviewScrim */)
|
||||
.start();
|
||||
} else {
|
||||
boolean canceled = targetState == NORMAL;
|
||||
if (canceled) {
|
||||
|
||||
+2
-2
@@ -166,8 +166,8 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe
|
||||
|
||||
@Override
|
||||
public void playAtomicAnimation(float velocity) {
|
||||
new StaggeredWorkspaceAnim(activity, workspaceView, velocity,
|
||||
true /* animateOverviewScrim */).start();
|
||||
new StaggeredWorkspaceAnim(activity, velocity, true /* animateOverviewScrim */)
|
||||
.start();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
+2
-36
@@ -28,8 +28,6 @@ import android.animation.ObjectAnimator;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.CellLayout;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Launcher;
|
||||
@@ -43,7 +41,6 @@ import com.android.launcher3.anim.AnimatorSetBuilder;
|
||||
import com.android.launcher3.anim.PropertySetter;
|
||||
import com.android.launcher3.anim.SpringObjectAnimator;
|
||||
import com.android.launcher3.graphics.OverviewScrim;
|
||||
import com.android.launcher3.views.IconLabelDotView;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -67,20 +64,12 @@ public class StaggeredWorkspaceAnim {
|
||||
private final float mVelocity;
|
||||
private final float mSpringTransY;
|
||||
|
||||
// The original view of the {@link FloatingIconView}.
|
||||
private final View mOriginalView;
|
||||
|
||||
private final List<Animator> mAnimators = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* @param floatingViewOriginalView The FloatingIconView's original view.
|
||||
*/
|
||||
public StaggeredWorkspaceAnim(Launcher launcher, @Nullable View floatingViewOriginalView,
|
||||
float velocity, boolean animateOverviewScrim) {
|
||||
public StaggeredWorkspaceAnim(Launcher launcher, float velocity, boolean animateOverviewScrim) {
|
||||
prepareToAnimate(launcher);
|
||||
|
||||
mVelocity = velocity;
|
||||
mOriginalView = floatingViewOriginalView;
|
||||
|
||||
// Scale the translationY based on the initial velocity to better sync the workspace items
|
||||
// with the floating view.
|
||||
@@ -212,35 +201,12 @@ public class StaggeredWorkspaceAnim {
|
||||
springTransY.setStartDelay(startDelay);
|
||||
mAnimators.add(springTransY);
|
||||
|
||||
ObjectAnimator alpha = getAlphaAnimator(v, startDelay);
|
||||
if (v == mOriginalView) {
|
||||
// For IconLabelDotViews, we just want the label to fade in.
|
||||
// Icon, badge, and dots will animate in separately (controlled via FloatingIconView)
|
||||
if (v instanceof IconLabelDotView) {
|
||||
alpha.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
IconLabelDotView view = (IconLabelDotView) v;
|
||||
view.setIconVisible(false);
|
||||
view.setForceHideDot(true);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
v.setAlpha(0);
|
||||
mAnimators.add(alpha);
|
||||
}
|
||||
|
||||
private ObjectAnimator getAlphaAnimator(View v, long startDelay) {
|
||||
ObjectAnimator alpha = ObjectAnimator.ofFloat(v, View.ALPHA, 0f, 1f);
|
||||
alpha.setInterpolator(LINEAR);
|
||||
alpha.setDuration(ALPHA_DURATION_MS);
|
||||
alpha.setStartDelay(startDelay);
|
||||
return alpha;
|
||||
|
||||
mAnimators.add(alpha);
|
||||
}
|
||||
|
||||
private void addScrimAnimationForState(Launcher launcher, LauncherState state, long duration) {
|
||||
|
||||
@@ -560,7 +560,7 @@ public class FloatingIconView extends View implements
|
||||
* Checks if the icon result is loaded. If true, we set the icon immediately. Else, we add a
|
||||
* callback to set the icon once the icon result is loaded.
|
||||
*/
|
||||
private void checkIconResult(View originalView, boolean isOpening) {
|
||||
private void checkIconResult(View originalView) {
|
||||
CancellationSignal cancellationSignal = new CancellationSignal();
|
||||
|
||||
if (mIconLoadResult == null) {
|
||||
@@ -572,9 +572,7 @@ public class FloatingIconView extends View implements
|
||||
if (mIconLoadResult.isIconLoaded) {
|
||||
setIcon(originalView, mIconLoadResult.drawable, mIconLoadResult.badge,
|
||||
mIconLoadResult.iconOffset);
|
||||
if (isOpening) {
|
||||
hideOriginalView(originalView);
|
||||
}
|
||||
hideOriginalView(originalView);
|
||||
} else {
|
||||
mIconLoadResult.onIconLoaded = () -> {
|
||||
if (cancellationSignal.isCanceled()) {
|
||||
@@ -583,12 +581,8 @@ public class FloatingIconView extends View implements
|
||||
|
||||
setIcon(originalView, mIconLoadResult.drawable, mIconLoadResult.badge,
|
||||
mIconLoadResult.iconOffset);
|
||||
|
||||
setVisibility(VISIBLE);
|
||||
if (isOpening) {
|
||||
// Delay swapping views until the icon is loaded to prevent a flash.
|
||||
hideOriginalView(originalView);
|
||||
}
|
||||
hideOriginalView(originalView);
|
||||
};
|
||||
mLoadIconSignal = cancellationSignal;
|
||||
}
|
||||
@@ -596,9 +590,9 @@ public class FloatingIconView extends View implements
|
||||
}
|
||||
|
||||
private void hideOriginalView(View originalView) {
|
||||
if (originalView instanceof BubbleTextView) {
|
||||
((BubbleTextView) originalView).setIconVisible(false);
|
||||
((BubbleTextView) originalView).setForceHideDot(true);
|
||||
if (originalView instanceof IconLabelDotView) {
|
||||
((IconLabelDotView) originalView).setIconVisible(false);
|
||||
((IconLabelDotView) originalView).setForceHideDot(true);
|
||||
} else {
|
||||
originalView.setVisibility(INVISIBLE);
|
||||
}
|
||||
@@ -674,6 +668,9 @@ public class FloatingIconView extends View implements
|
||||
}
|
||||
|
||||
public void fastFinish() {
|
||||
if (mLoadIconSignal != null) {
|
||||
mLoadIconSignal.cancel();
|
||||
}
|
||||
if (mEndRunnable != null) {
|
||||
mEndRunnable.run();
|
||||
mEndRunnable = null;
|
||||
@@ -689,6 +686,10 @@ public class FloatingIconView extends View implements
|
||||
if (mIconLoadResult != null && mIconLoadResult.isIconLoaded) {
|
||||
setVisibility(View.VISIBLE);
|
||||
}
|
||||
if (!mIsOpening) {
|
||||
// When closing an app, we want the item on the workspace to be invisible immediately
|
||||
hideOriginalView(mOriginalIcon);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -798,7 +799,7 @@ public class FloatingIconView extends View implements
|
||||
// Must be called after the fastFinish listener and end runnable is created so that
|
||||
// the icon is not left in a hidden state.
|
||||
if (shouldLoadIcon) {
|
||||
view.checkIconResult(originalView, isOpening);
|
||||
view.checkIconResult(originalView);
|
||||
}
|
||||
|
||||
return view;
|
||||
@@ -842,6 +843,7 @@ public class FloatingIconView extends View implements
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
btv.setIconVisible(true);
|
||||
btv.setForceHideDot(true);
|
||||
}
|
||||
});
|
||||
fade.play(ObjectAnimator.ofInt(btv.getIcon(), DRAWABLE_ALPHA, 0, 255));
|
||||
|
||||
Reference in New Issue
Block a user