Loading core/java/android/widget/Editor.java +1 −13 Original line number Diff line number Diff line Loading @@ -244,15 +244,6 @@ public class Editor { final CursorAnchorInfoNotifier mCursorAnchorInfoNotifier = new CursorAnchorInfoNotifier(); private final Runnable mHideFloatingToolbar = new Runnable() { @Override public void run() { if (mTextActionMode != null) { mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); } } }; private final Runnable mShowFloatingToolbar = new Runnable() { @Override public void run() { Loading Loading @@ -389,7 +380,6 @@ public class Editor { mTextView.removeCallbacks(mInsertionActionModeRunnable); } mTextView.removeCallbacks(mHideFloatingToolbar); mTextView.removeCallbacks(mShowFloatingToolbar); destroyDisplayListsData(); Loading Loading @@ -1248,14 +1238,12 @@ public class Editor { private void hideFloatingToolbar() { if (mTextActionMode != null) { mTextView.removeCallbacks(mShowFloatingToolbar); // Delay the "hide" a little bit just in case a "show" will happen almost immediately. mTextView.postDelayed(mHideFloatingToolbar, 100); mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); } } private void showFloatingToolbar() { if (mTextActionMode != null) { mTextView.removeCallbacks(mHideFloatingToolbar); // Delay "show" so it doesn't interfere with click confirmations // or double-clicks that could "dismiss" the floating toolbar. int delay = ViewConfiguration.getDoubleTapTimeout(); Loading core/java/com/android/internal/view/FloatingActionMode.java +57 −38 Original line number Diff line number Diff line Loading @@ -48,12 +48,14 @@ public class FloatingActionMode extends ActionMode { private final Runnable mMovingOff = new Runnable() { public void run() { mFloatingToolbarVisibilityHelper.setMoving(false); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } }; private final Runnable mHideOff = new Runnable() { public void run() { mFloatingToolbarVisibilityHelper.setHideRequested(false); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } }; Loading Loading @@ -87,6 +89,7 @@ public class FloatingActionMode extends ActionMode { } }); mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar); mFloatingToolbarVisibilityHelper.activate(); } @Override Loading @@ -108,8 +111,7 @@ public class FloatingActionMode extends ActionMode { public void invalidate() { checkToolbarInitialized(); mCallback.onPrepareActionMode(this, mMenu); mFloatingToolbar.updateLayout(); invalidateContentRect(); invalidateContentRect(); // Will re-layout and show the toolbar if necessary. } @Override Loading @@ -131,6 +133,9 @@ public class FloatingActionMode extends ActionMode { mContentRectOnWindow.set(mContentRect); mContentRectOnWindow.offset(mViewPosition[0], mViewPosition[1]); if (isContentRectWithinBounds()) { mFloatingToolbarVisibilityHelper.setOutOfBounds(false); // Make sure that content rect is not out of the view's visible bounds. mContentRectOnWindow.set( Math.max(mContentRectOnWindow.left, mViewRect.left), Loading @@ -139,19 +144,21 @@ public class FloatingActionMode extends ActionMode { Math.min(mContentRectOnWindow.bottom, mViewRect.bottom)); if (!mContentRectOnWindow.equals(mPreviousContentRectOnWindow)) { if (!mPreviousContentRectOnWindow.isEmpty()) { notifyContentRectMoving(); } // Content rect is moving. mOriginatingView.removeCallbacks(mMovingOff); mFloatingToolbarVisibilityHelper.setMoving(true); mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY); mFloatingToolbar.setContentRect(mContentRectOnWindow); mFloatingToolbar.updateLayout(); } mPreviousContentRectOnWindow.set(mContentRectOnWindow); if (isContentRectWithinBounds()) { mFloatingToolbarVisibilityHelper.setOutOfBounds(false); } else { mFloatingToolbarVisibilityHelper.setOutOfBounds(true); mContentRectOnWindow.setEmpty(); } mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); mPreviousContentRectOnWindow.set(mContentRectOnWindow); } private boolean isContentRectWithinBounds() { Loading @@ -165,12 +172,6 @@ public class FloatingActionMode extends ActionMode { && Rect.intersects(mContentRectOnWindow, mViewRect); } private void notifyContentRectMoving() { mOriginatingView.removeCallbacks(mMovingOff); mFloatingToolbarVisibilityHelper.setMoving(true); mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY); } @Override public void hide(long duration) { checkToolbarInitialized(); Loading @@ -184,6 +185,7 @@ public class FloatingActionMode extends ActionMode { mHideOff.run(); } else { mFloatingToolbarVisibilityHelper.setHideRequested(true); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); mOriginatingView.postDelayed(mHideOff, duration); } } Loading Loading @@ -221,7 +223,7 @@ public class FloatingActionMode extends ActionMode { } /** * @throws IlllegalStateException * @throws IllegalStateException */ private void checkToolbarInitialized() { Preconditions.checkState(mFloatingToolbar != null); Loading @@ -229,13 +231,14 @@ public class FloatingActionMode extends ActionMode { } private void reset() { mFloatingToolbarVisibilityHelper.deactivate(); mOriginatingView.removeCallbacks(mMovingOff); mOriginatingView.removeCallbacks(mHideOff); } /** * A helper that shows/hides the floating toolbar depending on certain states. * A helper for showing/hiding the floating toolbar depending on certain states. */ private static final class FloatingToolbarVisibilityHelper { Loading @@ -245,29 +248,45 @@ public class FloatingActionMode extends ActionMode { private boolean mMoving; private boolean mOutOfBounds; private boolean mActive; public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) { mToolbar = Preconditions.checkNotNull(toolbar); } public void activate() { mHideRequested = false; mMoving = false; mOutOfBounds = false; mActive = true; } public void deactivate() { mActive = false; mToolbar.dismiss(); } public void setHideRequested(boolean hide) { mHideRequested = hide; updateToolbarVisibility(); } public void setMoving(boolean moving) { mMoving = moving; updateToolbarVisibility(); } public void setOutOfBounds(boolean outOfBounds) { mOutOfBounds = outOfBounds; updateToolbarVisibility(); } private void updateToolbarVisibility() { public void updateToolbarVisibility() { if (!mActive) { return; } if (mHideRequested || mMoving || mOutOfBounds) { mToolbar.hide(); } else if (mToolbar.isHidden()) { } else { mToolbar.show(); } } Loading Loading
core/java/android/widget/Editor.java +1 −13 Original line number Diff line number Diff line Loading @@ -244,15 +244,6 @@ public class Editor { final CursorAnchorInfoNotifier mCursorAnchorInfoNotifier = new CursorAnchorInfoNotifier(); private final Runnable mHideFloatingToolbar = new Runnable() { @Override public void run() { if (mTextActionMode != null) { mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); } } }; private final Runnable mShowFloatingToolbar = new Runnable() { @Override public void run() { Loading Loading @@ -389,7 +380,6 @@ public class Editor { mTextView.removeCallbacks(mInsertionActionModeRunnable); } mTextView.removeCallbacks(mHideFloatingToolbar); mTextView.removeCallbacks(mShowFloatingToolbar); destroyDisplayListsData(); Loading Loading @@ -1248,14 +1238,12 @@ public class Editor { private void hideFloatingToolbar() { if (mTextActionMode != null) { mTextView.removeCallbacks(mShowFloatingToolbar); // Delay the "hide" a little bit just in case a "show" will happen almost immediately. mTextView.postDelayed(mHideFloatingToolbar, 100); mTextActionMode.hide(ActionMode.DEFAULT_HIDE_DURATION); } } private void showFloatingToolbar() { if (mTextActionMode != null) { mTextView.removeCallbacks(mHideFloatingToolbar); // Delay "show" so it doesn't interfere with click confirmations // or double-clicks that could "dismiss" the floating toolbar. int delay = ViewConfiguration.getDoubleTapTimeout(); Loading
core/java/com/android/internal/view/FloatingActionMode.java +57 −38 Original line number Diff line number Diff line Loading @@ -48,12 +48,14 @@ public class FloatingActionMode extends ActionMode { private final Runnable mMovingOff = new Runnable() { public void run() { mFloatingToolbarVisibilityHelper.setMoving(false); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } }; private final Runnable mHideOff = new Runnable() { public void run() { mFloatingToolbarVisibilityHelper.setHideRequested(false); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } }; Loading Loading @@ -87,6 +89,7 @@ public class FloatingActionMode extends ActionMode { } }); mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar); mFloatingToolbarVisibilityHelper.activate(); } @Override Loading @@ -108,8 +111,7 @@ public class FloatingActionMode extends ActionMode { public void invalidate() { checkToolbarInitialized(); mCallback.onPrepareActionMode(this, mMenu); mFloatingToolbar.updateLayout(); invalidateContentRect(); invalidateContentRect(); // Will re-layout and show the toolbar if necessary. } @Override Loading @@ -131,6 +133,9 @@ public class FloatingActionMode extends ActionMode { mContentRectOnWindow.set(mContentRect); mContentRectOnWindow.offset(mViewPosition[0], mViewPosition[1]); if (isContentRectWithinBounds()) { mFloatingToolbarVisibilityHelper.setOutOfBounds(false); // Make sure that content rect is not out of the view's visible bounds. mContentRectOnWindow.set( Math.max(mContentRectOnWindow.left, mViewRect.left), Loading @@ -139,19 +144,21 @@ public class FloatingActionMode extends ActionMode { Math.min(mContentRectOnWindow.bottom, mViewRect.bottom)); if (!mContentRectOnWindow.equals(mPreviousContentRectOnWindow)) { if (!mPreviousContentRectOnWindow.isEmpty()) { notifyContentRectMoving(); } // Content rect is moving. mOriginatingView.removeCallbacks(mMovingOff); mFloatingToolbarVisibilityHelper.setMoving(true); mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY); mFloatingToolbar.setContentRect(mContentRectOnWindow); mFloatingToolbar.updateLayout(); } mPreviousContentRectOnWindow.set(mContentRectOnWindow); if (isContentRectWithinBounds()) { mFloatingToolbarVisibilityHelper.setOutOfBounds(false); } else { mFloatingToolbarVisibilityHelper.setOutOfBounds(true); mContentRectOnWindow.setEmpty(); } mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); mPreviousContentRectOnWindow.set(mContentRectOnWindow); } private boolean isContentRectWithinBounds() { Loading @@ -165,12 +172,6 @@ public class FloatingActionMode extends ActionMode { && Rect.intersects(mContentRectOnWindow, mViewRect); } private void notifyContentRectMoving() { mOriginatingView.removeCallbacks(mMovingOff); mFloatingToolbarVisibilityHelper.setMoving(true); mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY); } @Override public void hide(long duration) { checkToolbarInitialized(); Loading @@ -184,6 +185,7 @@ public class FloatingActionMode extends ActionMode { mHideOff.run(); } else { mFloatingToolbarVisibilityHelper.setHideRequested(true); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); mOriginatingView.postDelayed(mHideOff, duration); } } Loading Loading @@ -221,7 +223,7 @@ public class FloatingActionMode extends ActionMode { } /** * @throws IlllegalStateException * @throws IllegalStateException */ private void checkToolbarInitialized() { Preconditions.checkState(mFloatingToolbar != null); Loading @@ -229,13 +231,14 @@ public class FloatingActionMode extends ActionMode { } private void reset() { mFloatingToolbarVisibilityHelper.deactivate(); mOriginatingView.removeCallbacks(mMovingOff); mOriginatingView.removeCallbacks(mHideOff); } /** * A helper that shows/hides the floating toolbar depending on certain states. * A helper for showing/hiding the floating toolbar depending on certain states. */ private static final class FloatingToolbarVisibilityHelper { Loading @@ -245,29 +248,45 @@ public class FloatingActionMode extends ActionMode { private boolean mMoving; private boolean mOutOfBounds; private boolean mActive; public FloatingToolbarVisibilityHelper(FloatingToolbar toolbar) { mToolbar = Preconditions.checkNotNull(toolbar); } public void activate() { mHideRequested = false; mMoving = false; mOutOfBounds = false; mActive = true; } public void deactivate() { mActive = false; mToolbar.dismiss(); } public void setHideRequested(boolean hide) { mHideRequested = hide; updateToolbarVisibility(); } public void setMoving(boolean moving) { mMoving = moving; updateToolbarVisibility(); } public void setOutOfBounds(boolean outOfBounds) { mOutOfBounds = outOfBounds; updateToolbarVisibility(); } private void updateToolbarVisibility() { public void updateToolbarVisibility() { if (!mActive) { return; } if (mHideRequested || mMoving || mOutOfBounds) { mToolbar.hide(); } else if (mToolbar.isHidden()) { } else { mToolbar.show(); } } Loading