diff options
Diffstat (limited to 'srcs/juloo.keyboard2/Autocapitalisation.java')
| -rw-r--r-- | srcs/juloo.keyboard2/Autocapitalisation.java | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/srcs/juloo.keyboard2/Autocapitalisation.java b/srcs/juloo.keyboard2/Autocapitalisation.java new file mode 100644 index 0000000..1affdab --- /dev/null +++ b/srcs/juloo.keyboard2/Autocapitalisation.java @@ -0,0 +1,119 @@ +package juloo.keyboard2; + +import android.text.InputType; +import android.text.TextUtils; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.view.KeyEvent; + +final class Autocapitalisation +{ + private boolean _enabled = false; + private boolean _beginning_of_sentence = false; + + /** Keep track of the cursor to differentiate 'selection_updated' events + corresponding to typing from cursor movement. */ + private int _cursor = 0; + + public boolean should_enable_shift() + { + return _enabled && _beginning_of_sentence; + } + + /** Returns [true] if shift should be on initially. The input connection + isn't stored. */ + public void started(EditorInfo info, InputConnection ic) + { + if ((info.inputType & InputType.TYPE_TEXT_FLAG_CAP_SENTENCES) == 0) + { + _enabled = false; + return; + } + _enabled = true; + _beginning_of_sentence = ((info.initialCapsMode & TextUtils.CAP_MODE_SENTENCES) != 0); + _cursor = 0; // Just a guess + scan_text_before_cursor(10, ic); + } + + public void typed(CharSequence c) + { + for (int i = 0; i < c.length(); i++) + typed(c.charAt(i)); + } + + public void typed(char c) + { + _cursor++; + if (is_beginning_of_sentence(c)) + _beginning_of_sentence = true; + else if (!ignore_at_beginning_of_sentence(c)) + _beginning_of_sentence = false; + } + + public void selection_updated(int old_cursor, int new_cursor, InputConnection ic) + { + if (new_cursor == _cursor) + return; + // Text has been inserted + if (old_cursor == _cursor && new_cursor > old_cursor) + { + scan_text_before_cursor(Math.min(new_cursor - old_cursor, 10), ic); + } + else + { + // Cursor has moved or [_cursor] wasn't uptodate + _beginning_of_sentence = false; + scan_text_before_cursor(10, ic); + } + _cursor = new_cursor; + } + + /** Updates [_cursor]. */ + private void scan_text_before_cursor(int range, InputConnection ic) + { + if (!_enabled) // Don't query characters if disabled + return; + CharSequence text_before = ic.getTextBeforeCursor(range, 0); + if (text_before == null) + { + _beginning_of_sentence = false; + } + else + { + _beginning_of_sentence = true; + typed(text_before); + } + } + + private boolean ignore_at_beginning_of_sentence(char c) + { + switch (c) + { + case ' ': + case '"': + case '\'': + case '(': + case '«': + return true; + default: + return false; + } + } + + private boolean is_beginning_of_sentence(char c) + { + switch (c) + { + case '.': + case ';': + case '\n': + case '!': + case '?': + case '¿': + case '¡': + return true; + default: + return false; + } + } +} |
