Refactor text input keyboards

Reviewed By: foghina

Differential Revision: D2807491

fb-gh-sync-id: e7e5fb8c235f3637f619b2f44053749c51f379f0
This commit is contained in:
Andrei Coman 2016-01-07 13:39:27 -08:00 committed by facebook-github-bot-7
parent fe77ce1c62
commit cc449b394e
3 changed files with 43 additions and 39 deletions

View File

@ -489,11 +489,12 @@ var TextInput = React.createClass({
};
}
var autoCapitalize = UIManager.UIText.AutocapitalizationType[this.props.autoCapitalize];
var textAlign =
UIManager.AndroidTextInput.Constants.TextAlign[this.props.textAlign];
var autoCapitalize =
UIManager.AndroidTextInput.Constants.AutoCapitalizationType[this.props.autoCapitalize];
var textAlign = UIManager.AndroidTextInput.Constants.TextAlign[this.props.textAlign];
var textAlignVertical =
UIManager.AndroidTextInput.Constants.TextAlignVertical[this.props.textAlignVertical];
var children = this.props.children;
var childCount = 0;
ReactChildren.forEach(children, () => ++childCount);

View File

@ -92,20 +92,6 @@ import com.facebook.react.uimanager.events.TouchEventType;
"ScaleAspectFill",
ImageView.ScaleType.CENTER_CROP.ordinal())));
constants.put(
"UIText",
MapBuilder.of(
"AutocapitalizationType",
MapBuilder.of(
"none",
InputType.TYPE_CLASS_TEXT,
"characters",
InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS,
"words",
InputType.TYPE_TEXT_FLAG_CAP_WORDS,
"sentences",
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)));
constants.put(
"Dimensions",
MapBuilder.of(

View File

@ -16,6 +16,7 @@ import java.util.Map;
import android.graphics.PorterDuff;
import android.os.SystemClock;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.Spannable;
import android.text.TextWatcher;
@ -25,10 +26,8 @@ import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.text.InputFilter;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.JSApplicationCausedNativeException;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
@ -55,6 +54,10 @@ public class ReactTextInputManager extends
private static final int FOCUS_TEXT_INPUT = 1;
private static final int BLUR_TEXT_INPUT = 2;
private static final int INPUT_TYPE_KEYBOARD_NUMBERED =
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL |
InputType.TYPE_NUMBER_FLAG_SIGNED;
private static final String KEYBOARD_TYPE_EMAIL_ADDRESS = "email-address";
private static final String KEYBOARD_TYPE_NUMERIC = "numeric";
private static final InputFilter[] EMPTY_FILTERS = new InputFilter[0];
@ -253,43 +256,35 @@ public class ReactTextInputManager extends
public void setPassword(ReactEditText view, boolean password) {
updateStagedInputTypeFlag(
view,
password ? 0 : InputType.TYPE_TEXT_VARIATION_PASSWORD,
password ? 0 :
InputType.TYPE_NUMBER_VARIATION_PASSWORD | InputType.TYPE_TEXT_VARIATION_PASSWORD,
password ? InputType.TYPE_TEXT_VARIATION_PASSWORD : 0);
checkPasswordType(view);
}
@ReactProp(name = "autoCapitalize", defaultInt = InputType.TYPE_CLASS_TEXT)
@ReactProp(name = "autoCapitalize")
public void setAutoCapitalize(ReactEditText view, int autoCapitalize) {
int flagsToSet = 0;
switch (autoCapitalize) {
case InputType.TYPE_TEXT_FLAG_CAP_SENTENCES:
case InputType.TYPE_TEXT_FLAG_CAP_WORDS:
case InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS:
case InputType.TYPE_CLASS_TEXT:
flagsToSet = autoCapitalize;
break;
default:
throw new
JSApplicationCausedNativeException("Invalid autoCapitalize value: " + autoCapitalize);
}
updateStagedInputTypeFlag(
view,
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES | InputType.TYPE_TEXT_FLAG_CAP_WORDS |
InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS,
flagsToSet);
autoCapitalize);
}
@ReactProp(name = "keyboardType")
public void setKeyboardType(ReactEditText view, @Nullable String keyboardType) {
int flagsToSet = 0;
int flagsToSet = InputType.TYPE_CLASS_TEXT;
if (KEYBOARD_TYPE_NUMERIC.equalsIgnoreCase(keyboardType)) {
flagsToSet = InputType.TYPE_CLASS_NUMBER;
flagsToSet = INPUT_TYPE_KEYBOARD_NUMBERED;
} else if (KEYBOARD_TYPE_EMAIL_ADDRESS.equalsIgnoreCase(keyboardType)) {
flagsToSet = InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
flagsToSet = InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS | InputType.TYPE_CLASS_TEXT;
}
updateStagedInputTypeFlag(
view,
InputType.TYPE_CLASS_NUMBER | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS,
INPUT_TYPE_KEYBOARD_NUMBERED | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS |
InputType.TYPE_CLASS_TEXT,
flagsToSet);
checkPasswordType(view);
}
@Override
@ -298,6 +293,18 @@ public class ReactTextInputManager extends
view.commitStagedInputType();
}
// Sets the correct password type, since numeric and text passwords have different types
private static void checkPasswordType(ReactEditText view) {
if ((view.getStagedInputType() & INPUT_TYPE_KEYBOARD_NUMBERED) != 0 &&
(view.getStagedInputType() & InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0) {
// Text input type is numbered password, remove text password variation, add numeric one
updateStagedInputTypeFlag(
view,
InputType.TYPE_TEXT_VARIATION_PASSWORD,
InputType.TYPE_NUMBER_VARIATION_PASSWORD);
}
}
private static void updateStagedInputTypeFlag(
ReactEditText view,
int flagsToUnset,
@ -473,6 +480,16 @@ public class ReactTextInputManager extends
MapBuilder.of(
"top", Gravity.TOP,
"center", Gravity.CENTER_VERTICAL,
"bottom", Gravity.BOTTOM));
"bottom", Gravity.BOTTOM),
"AutoCapitalizationType",
MapBuilder.of(
"none",
0,
"characters",
InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS,
"words",
InputType.TYPE_TEXT_FLAG_CAP_WORDS,
"sentences",
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
}
}