diff --git a/hover/src/main/java/io/mattcarroll/hover/FloatingTab.java b/hover/src/main/java/io/mattcarroll/hover/FloatingTab.java index 7785207..9c08e08 100644 --- a/hover/src/main/java/io/mattcarroll/hover/FloatingTab.java +++ b/hover/src/main/java/io/mattcarroll/hover/FloatingTab.java @@ -52,6 +52,8 @@ class FloatingTab extends HoverFrameLayout { private int mTabSize; private View mTabView; private Dock mDock; + private AnimatorSet mAnimatorSetDisappear; + private AnimatorSet mAnimatorSetAppear; public FloatingTab(@NonNull Context context, @NonNull String tabId) { super(context); @@ -100,15 +102,16 @@ public void enableDebugMode(boolean debugMode) { } public void appear(@Nullable final Runnable onAppeared) { - AnimatorSet animatorSet = new AnimatorSet(); + cancelAnimatorSetAppearIfNeeded(); + mAnimatorSetAppear = new AnimatorSet(); ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 0.0f, 1.0f); ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 0.0f, 1.0f); - animatorSet.setDuration(APPEARING_ANIMATION_DURATION); - animatorSet.setInterpolator(new OvershootInterpolator()); - animatorSet.playTogether(scaleX, scaleY); - animatorSet.start(); + mAnimatorSetAppear.setDuration(APPEARING_ANIMATION_DURATION); + mAnimatorSetAppear.setInterpolator(new OvershootInterpolator()); + mAnimatorSetAppear.playTogether(scaleX, scaleY); + mAnimatorSetAppear.start(); - animatorSet.addListener(new Animator.AnimatorListener() { + mAnimatorSetAppear.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @@ -133,18 +136,22 @@ public void onAnimationRepeat(Animator animation) { } public void appearImmediate() { + cancelAnimatorSetDisappearIfNeeded(); setVisibility(VISIBLE); + setScaleX(1.0f); + setScaleY(1.0f); } public void disappear(@Nullable final Runnable onDisappeared) { - AnimatorSet animatorSet = new AnimatorSet(); + cancelAnimatorSetDisappearIfNeeded(); + mAnimatorSetDisappear = new AnimatorSet(); ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 0.0f); ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 0.0f); - animatorSet.setDuration(APPEARING_ANIMATION_DURATION); - animatorSet.playTogether(scaleX, scaleY); - animatorSet.start(); + mAnimatorSetDisappear.setDuration(APPEARING_ANIMATION_DURATION); + mAnimatorSetDisappear.playTogether(scaleX, scaleY); + mAnimatorSetDisappear.start(); - animatorSet.addListener(new Animator.AnimatorListener() { + mAnimatorSetDisappear.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @@ -169,9 +176,24 @@ public void onAnimationRepeat(Animator animation) { } public void disappearImmediate() { + cancelAnimatorSetAppearIfNeeded(); setVisibility(GONE); } + private void cancelAnimatorSetAppearIfNeeded() { + if (mAnimatorSetAppear != null && mAnimatorSetAppear.isRunning()) { + mAnimatorSetAppear.cancel(); + mAnimatorSetAppear = null; + } + } + + private void cancelAnimatorSetDisappearIfNeeded() { + if (mAnimatorSetDisappear != null && mAnimatorSetDisappear.isRunning()) { + mAnimatorSetDisappear.cancel(); + mAnimatorSetDisappear = null; + } + } + public void shrink() { mTabSize = getResources().getDimensionPixelSize(R.dimen.hover_tab_size_shrunk); updateSize(); diff --git a/hover/src/main/java/io/mattcarroll/hover/HoverViewStateCollapsed.java b/hover/src/main/java/io/mattcarroll/hover/HoverViewStateCollapsed.java index 0b0ad56..6c02f35 100644 --- a/hover/src/main/java/io/mattcarroll/hover/HoverViewStateCollapsed.java +++ b/hover/src/main/java/io/mattcarroll/hover/HoverViewStateCollapsed.java @@ -91,6 +91,7 @@ public void run() { return; } if (wasFloatingTabVisible) { + mFloatingTab.appearImmediate(); sendToDock(); } else { moveToDock(); @@ -375,9 +376,11 @@ void moveFloatingTabTo(View floatingTab, @NonNull Point position) { } protected void activateDragger() { - ArrayList> list = new ArrayList<>(); - list.add(new Pair<>(mFloatingTab, mFloatingTabDragListener)); - mHoverView.mDragger.activate(list); + if (mHoverView != null && mHoverView.mDragger != null) { + ArrayList> list = new ArrayList<>(); + list.add(new Pair<>(mFloatingTab, mFloatingTabDragListener)); + mHoverView.mDragger.activate(list); + } } protected void deactivateDragger() { diff --git a/hover/src/main/java/io/mattcarroll/hover/HoverViewStatePreviewed.java b/hover/src/main/java/io/mattcarroll/hover/HoverViewStatePreviewed.java index f032375..faedaa1 100644 --- a/hover/src/main/java/io/mattcarroll/hover/HoverViewStatePreviewed.java +++ b/hover/src/main/java/io/mattcarroll/hover/HoverViewStatePreviewed.java @@ -78,10 +78,12 @@ protected void onClose(final boolean userDropped) { @Override protected void activateDragger() { - ArrayList> list = new ArrayList<>(); - list.add(new Pair<>(mFloatingTab, mFloatingTabDragListener)); - list.add(new Pair<>(mMessageView, mDefaultMessageViewDragListener)); - mHoverView.mDragger.activate(list); + if (mHoverView != null && mHoverView.mDragger != null) { + ArrayList> list = new ArrayList<>(); + list.add(new Pair<>(mFloatingTab, mFloatingTabDragListener)); + list.add(new Pair<>(mMessageView, mDefaultMessageViewDragListener)); + mHoverView.mDragger.activate(list); + } } @Override