summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorGilles Debunne <debunne@google.com>2011-06-09 16:56:31 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-09 16:56:31 -0700
commitaab49b40e8dd78aca67db160f5d0c787379c8f7f (patch)
tree5b11fb0ded38ad33960e51db6ab470c0db6f3e03 /core/java
parent680e0a4782a2b8012343794a36e8e7debcb2305c (diff)
parented6741817a6c075a306b5e9c63e6c08abc5b8dc6 (diff)
downloadframeworks_base-aab49b40e8dd78aca67db160f5d0c787379c8f7f.zip
frameworks_base-aab49b40e8dd78aca67db160f5d0c787379c8f7f.tar.gz
frameworks_base-aab49b40e8dd78aca67db160f5d0c787379c8f7f.tar.bz2
Merge "Text selection on phone"
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/widget/TextView.java32
1 files changed, 24 insertions, 8 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index eba9d37..9a5977a 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8738,10 +8738,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return false;
}
- boolean currentWordSelected = selectCurrentWord();
- if (!currentWordSelected) {
- // No word found under cursor or text selection not permitted.
- return false;
+ if (!hasSelection()) {
+ // There may already be a selection on device rotation
+ boolean currentWordSelected = selectCurrentWord();
+ if (!currentWordSelected) {
+ // No word found under cursor or text selection not permitted.
+ return false;
+ }
}
ActionMode.Callback actionModeCallback = new SelectionActionModeCallback();
@@ -9057,6 +9060,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
private int mContainerPositionX, mContainerPositionY;
// Visible or not (scrolled off screen), whether or not this handle should be visible
private boolean mIsActive = false;
+ // Used to detect that setFrame was called
+ private boolean mNeedsUpdate = true;
public HandleView() {
super(TextView.this.mContext);
@@ -9074,6 +9079,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mIdealVerticalOffset = 0.7f * handleHeight;
}
+ @Override
+ protected boolean setFrame(int left, int top, int right, int bottom) {
+ boolean changed = super.setFrame(left, top, right, bottom);
+ // onPreDraw is called for PhoneWindow before the layout of this view is
+ // performed. Make sure to update position, even if container didn't move.
+ if (changed) mNeedsUpdate = true;
+ return changed;
+ }
+
protected abstract void initDrawable();
// Touch-up filter: number of previous positions remembered
@@ -9222,7 +9236,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mPositionY += viewportToContentVerticalOffset();
}
- protected boolean updateContainerPosition() {
+ private void checkForContainerPositionChange() {
positionAtCursorOffset(getCurrentCursorOffset());
final int previousContainerPositionX = mContainerPositionX;
@@ -9232,12 +9246,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
mContainerPositionX = mTempCoords[0] + mPositionX;
mContainerPositionY = mTempCoords[1] + mPositionY;
- return (previousContainerPositionX != mContainerPositionX ||
- previousContainerPositionY != mContainerPositionY);
+ mNeedsUpdate |= previousContainerPositionX != mContainerPositionX;
+ mNeedsUpdate |= previousContainerPositionY != mContainerPositionY;
}
public boolean onPreDraw() {
- if (updateContainerPosition()) {
+ checkForContainerPositionChange();
+ if (mNeedsUpdate) {
if (mIsDragging) {
if (mTempCoords[0] != mLastParentX || mTempCoords[1] != mLastParentY) {
mTouchToWindowOffsetX += mTempCoords[0] - mLastParentX;
@@ -9261,6 +9276,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
dismiss();
}
}
+ mNeedsUpdate = false;
}
return true;
}