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

Commit 8e06a630 authored by Gilles Debunne's avatar Gilles Debunne
Browse files

Selection in URL, email, phone, date, numbers selects all

Change-Id: Ide3603404f356564e294b7698b52c2d55e314db9
parent 399ac12c
Loading
Loading
Loading
Loading
+33 −48
Original line number Original line Diff line number Diff line
@@ -7450,6 +7450,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
                hasPrimaryClip());
                hasPrimaryClip());
    }
    }


    private boolean isWordCharacter(int position) {
        final char c = mTransformed.charAt(position);
        final int type = Character.getType(c);
        return (c == '\'' || c == '"' ||
                type == Character.UPPERCASE_LETTER ||
                type == Character.LOWERCASE_LETTER ||
                type == Character.TITLECASE_LETTER ||
                type == Character.MODIFIER_LETTER ||
                type == Character.DECIMAL_DIGIT_NUMBER);
    }

    /**
    /**
     * Returns the offsets delimiting the 'word' located at position offset.
     * Returns the offsets delimiting the 'word' located at position offset.
     *
     *
@@ -7459,77 +7470,51 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
     * Returns a negative value if no valid word was found.
     * Returns a negative value if no valid word was found.
     */
     */
    private long getWordLimitsAt(int offset) {
    private long getWordLimitsAt(int offset) {
        /*
         * Quick return if the input type is one where adding words
         * to the dictionary doesn't make any sense.
         */
        int klass = mInputType & InputType.TYPE_MASK_CLASS;
        int klass = mInputType & InputType.TYPE_MASK_CLASS;
        if (klass == InputType.TYPE_CLASS_NUMBER ||
        int variation = mInputType & InputType.TYPE_MASK_VARIATION;
            klass == InputType.TYPE_CLASS_PHONE ||

            klass == InputType.TYPE_CLASS_DATETIME) {
        // Text selection is not permitted in password fields
        if (variation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
                variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD ||
                variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
            return -1;
            return -1;
        }
        }


        int variation = mInputType & InputType.TYPE_MASK_VARIATION;
        final int len = mText.length();
        if (variation == InputType.TYPE_TEXT_VARIATION_URI ||

            variation == InputType.TYPE_TEXT_VARIATION_PASSWORD ||
        // Specific text fields: always select the entire text
            variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD ||
        if (klass == InputType.TYPE_CLASS_NUMBER ||
            variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ||
                klass == InputType.TYPE_CLASS_PHONE ||
                klass == InputType.TYPE_CLASS_DATETIME ||
                variation == InputType.TYPE_TEXT_VARIATION_URI ||
                variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS ||
                variation == InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS ||
                variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS ||
                variation == InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS ||
                variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
                variation == InputType.TYPE_TEXT_VARIATION_FILTER) {
            return -1;
            return len > 0 ? packRangeInLong(0, len) : -1;
        }
        }


        int len = mText.length();
        int end = Math.min(offset, len);
        int end = Math.min(offset, len);

        if (end < 0) {
        if (end < 0) {
            return -1;
            return -1;
        }
        }


        final int MAX_LENGTH = 48;
        int start = end;
        int start = end;


        for (; start > 0; start--) {
        for (; start > 0; start--) {
            char c = mTransformed.charAt(start - 1);
            if (!isWordCharacter(start - 1)) break;
            int type = Character.getType(c);
            if ((end - start) > MAX_LENGTH) return -1;

            // Cases where the text ends with a '.' and we select from the end of the line (right
            // after the dot), or when we select from the space character in "aaaa, bbbb".
            if (start == end && type == Character.OTHER_PUNCTUATION) continue;

            if (c != '\'' &&
                type != Character.UPPERCASE_LETTER &&
                type != Character.LOWERCASE_LETTER &&
                type != Character.TITLECASE_LETTER &&
                type != Character.MODIFIER_LETTER &&
                type != Character.DECIMAL_DIGIT_NUMBER) {
                break;
            }
        }
        }


        for (; end < len; end++) {
        for (; end < len; end++) {
            char c = mTransformed.charAt(end);
            if (!isWordCharacter(end)) break;
            int type = Character.getType(c);
            if ((end - start) > MAX_LENGTH) return -1;

            if (c != '\'' &&
                type != Character.UPPERCASE_LETTER &&
                type != Character.LOWERCASE_LETTER &&
                type != Character.TITLECASE_LETTER &&
                type != Character.MODIFIER_LETTER &&
                type != Character.DECIMAL_DIGIT_NUMBER) {
                break;
            }
        }
        }


        if (start == end) {
        if (start == end) {
            return -1;
            return -1;
        }
        }


        if (end - start > 48) {
            return -1;
        }

        boolean hasLetter = false;
        boolean hasLetter = false;
        for (int i = start; i < end; i++) {
        for (int i = start; i < end; i++) {
            if (Character.isLetter(mTransformed.charAt(i))) {
            if (Character.isLetter(mTransformed.charAt(i))) {