Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit baaace59 authored by Gilles Debunne's avatar Gilles Debunne
Browse files

Bug fixes in Text selection.

"Select word" is displayed only when the text field is not empty.

Paste is always displayed in first menu.
Bug #3001438

Cut/copy works
Bug #3052005 fixed in 3047653

Change-Id: I573f04818683f9b1c78ecb4613570b738d30ba09
parent d8f1a540
Loading
Loading
Loading
Loading
+11 −26
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@ import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.DateKeyListener;
import android.text.method.DateTimeKeyListener;
import android.text.method.DialerKeyListener;
@@ -92,7 +91,6 @@ import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewDebug;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewRoot;
@@ -1155,7 +1153,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener

        fixFocusableAndClickableSettings();

        // SelectionModifierCursorController depends on canSelectText, which depends on mMovement
        // SelectionModifierCursorController depends on textCanBeSelected, which depends on mMovement
        prepareCursorControllers();
    }

@@ -2725,7 +2723,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            sendAfterTextChanged((Editable) text);
        }

        // SelectionModifierCursorController depends on canSelectText, which depends on text
        // SelectionModifierCursorController depends on textCanBeSelected, which depends on text
        prepareCursorControllers();
    }

@@ -6604,6 +6602,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            } else {
                terminateTextSelectionMode();
            }

            mLastTouchOffset = -1;
        }

        startStopMarquee(focused);
@@ -6836,7 +6836,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            mInsertionPointCursorController = null;
        }

        if (canSelectText() && mLayout != null) {
        if (textCanBeSelected() && mLayout != null) {
            if (mSelectionModifierCursorController == null) {
                mSelectionModifierCursorController = new SelectionModifierCursorController();
            }
@@ -7054,7 +7054,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_A:
            if (canSelectAll()) {
            if (canSelectText()) {
                return onTextContextMenuItem(ID_SELECT_ALL);
            }

@@ -7085,11 +7085,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        return super.onKeyShortcut(keyCode, event);
    }

    private boolean canSelectAll() {
        return canSelectText() && mText.length() != 0;
    private boolean canSelectText() {
        return textCanBeSelected() && mText.length() != 0;
    }

    private boolean canSelectText() {
    private boolean textCanBeSelected() {
        // prepareCursorController() relies on this method.
        // If you change this condition, make sure prepareCursorController is called anywhere
        // the value of this condition might be changed.
@@ -7398,10 +7398,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
            if (canSelectText()) {
                menu.add(0, ID_START_SELECTING_TEXT, 0, com.android.internal.R.string.selectText).
                     setOnMenuItemClickListener(handler);
                added = true;
            }
            
            if (canSelectAll()) {
                menu.add(0, ID_SELECT_ALL, 0, com.android.internal.R.string.selectAll).
                     setOnMenuItemClickListener(handler).
                     setAlphabeticShortcut('a');
@@ -7424,8 +7420,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                }
            }
            
            // Paste location is too imprecise. Only allow on empty text fields.
            if (canPaste() && textIsOnlySpaces()) {
            if (canPaste()) {
                menu.add(0, ID_PASTE, 0, com.android.internal.R.string.paste).
                     setOnMenuItemClickListener(handler).
                     setAlphabeticShortcut('v');
@@ -7453,16 +7448,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
        }
    }

    private boolean textIsOnlySpaces() {
        final int length = mTransformed.length();
        for (int i = 0; i < length; i++) {
            if (!Character.isSpaceChar(mTransformed.charAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Returns whether this text view is a current input method target.  The
     * default implementation just checks with {@link InputMethodManager}.