_keyUp(event) {
    if (this._needsKeyUpTextDidChangeTrigger) {
      this._textDidChange();
      this._needsKeyUpTextDidChangeTrigger = false;
    }
    const keyCode = event.keyCode;
    // NOTE: Certain Androids on Chrome always return 229
    // https://code.google.com/p/chromium/issues/detail?id=118639
    if (keyCode === 229) {
      // Text has already been changed at this point, so we check the previous text
      // to determine whether we need to undo the change.
      const previousText = this._currentValue || '';
      this._processChange({
        currentText: previousText,
        proposedText: this.text(),
        onSuccess: (change, changeTriggeredFormatting) => {
          if (changeTriggeredFormatting) {
            const newText = change.proposed.text;
            this.setSelectedRange(change.proposed.selectedRange);
            this.setText(newText);
          }
          if (!this._isDirty) {
            this._valueOnFocus = change.current.text || '';
            this._isDirty = true;
          }
          this.undoManager().proxyFor(this)._applyChangeFromUndoManager(change);
          this._textDidChange();
          this._currentValue = change.proposed.text;
        },
        onFail: () => {
          // Need to rollback the letter input in the Keyup event because it is not valid,
          // so we set text to the previous state (as collected from the UndoManager).
          this.setText(previousText);
        }
      });
    } else {
      this.rollbackInvalidChanges(() => {
        if (event.keyCode === KEYS.TAB) {
          this.selectAll(event);
        }
      });
    }
  }
Handles keyup events. On Some Android we need to do all input processing
here because no other information comes in.

@param {Event} event
@private