From b57d29dbe4a9e177581f5bd093a2c78c2a833cf5 Mon Sep 17 00:00:00 2001 From: Patrick Hobusch Date: Fri, 30 Jun 2017 12:42:16 +0200 Subject: [PATCH] [IMP] Use numeric keyboards for OInteger and OFloat types in a OField Recent state: The OInteger and OFloat types in a OField have been mapped to a OEditTextField that always used a normal text keyboard. Thus, it was possible to enter non-numeric characters that cannot be stored in the database, so that is was necessary to do input checks etc. Now, new FieldTypes 'Integer' and 'Float' are introduced. In a OField, the keyboard for a OInteger type is restricted to only digits, and the keyboard for a OFloat type is restricted to digits and a (single) dot for fractional digits. --- .../java/odoo/controls/OEditTextField.java | 13 ++++++ app/src/main/java/odoo/controls/OField.java | 43 ++++++++++++++++--- app/src/main/res/values/attrs.xml | 2 + 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/odoo/controls/OEditTextField.java b/app/src/main/java/odoo/controls/OEditTextField.java index e4d93d063..0bb16fed2 100644 --- a/app/src/main/java/odoo/controls/OEditTextField.java +++ b/app/src/main/java/odoo/controls/OEditTextField.java @@ -26,6 +26,7 @@ import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; +import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; @@ -48,6 +49,7 @@ public class OEditTextField extends LinearLayout implements IOControlData, private float textSize = -1; private int appearance = -1; private int textColor = Color.BLACK; + private int inputtype = -1; @TargetApi(Build.VERSION_CODES.LOLLIPOP) public OEditTextField(Context context, AttributeSet attrs, @@ -102,6 +104,9 @@ public void initControl() { if (appearance > -1) { edtText.setTextAppearance(mContext, appearance); } + if (inputtype > -1) { + edtText.setInputType(inputtype); + } edtText.setTextColor(textColor); addView(edtText); } else { @@ -185,6 +190,14 @@ public Boolean isEditable() { return mEditable; } + public void setInputType(int type) { + inputtype = type; + } + + public int getInputType() { + return inputtype; + } + public void setHint(String hint) { mHint = hint; } diff --git a/app/src/main/java/odoo/controls/OField.java b/app/src/main/java/odoo/controls/OField.java index 7f99b69ed..1448289a5 100644 --- a/app/src/main/java/odoo/controls/OField.java +++ b/app/src/main/java/odoo/controls/OField.java @@ -30,6 +30,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.EditorInfo; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -111,7 +112,7 @@ public static WidgetType getWidgetType(int widget) { } public enum FieldType { - Text, Boolean, ManyToOne, Chips, Selection, Date, Time, DateTime, Blob, RelationType; + Text, Boolean, ManyToOne, Chips, Selection, Date, Time, DateTime, Blob, RelationType, Integer, Float; public static FieldType getTypeValue(int type_val) { switch (type_val) { @@ -133,6 +134,10 @@ public static FieldType getTypeValue(int type_val) { return FieldType.Blob; case 8: return FieldType.Time; + case 9: + return FieldType.Integer; + case 10: + return FieldType.Float; } return FieldType.Text; } @@ -267,6 +272,12 @@ public void initControl() { case Blob: controlView = initBlobControl(); break; + case Integer: + controlView = initIntegerControl(); + break; + case Float: + controlView = initFloatControl(); + break; default: return; } @@ -313,14 +324,21 @@ private FieldType getType(Class type_class) { try { // Varchar if (type_class.isAssignableFrom(OVarchar.class) - || type_class.isAssignableFrom(OInteger.class) - || type_class.isAssignableFrom(OFloat.class)) { + || type_class.isAssignableFrom(OText.class)) { return FieldType.Text; } // boolean if (type_class.isAssignableFrom(OBoolean.class)) { return FieldType.Boolean; } + // Integer + if (type_class.isAssignableFrom(OInteger.class)) { + return FieldType.Integer; + } + // Float + if (type_class.isAssignableFrom(OFloat.class)) { + return FieldType.Float; + } // Blob if (type_class.isAssignableFrom(OBlob.class)) { @@ -335,10 +353,6 @@ private FieldType getType(Class type_class) { if (type_class.isAssignableFrom(ODate.class)) { return FieldType.Date; } - // Text - if (type_class.isAssignableFrom(OText.class)) { - return FieldType.Text; - } // FIXME: WebView type if (type_class.isAssignableFrom(OHtml.class)) { return FieldType.Text; @@ -461,6 +475,21 @@ private View initBlobControl() { return blob; } + // EditText control (TextView, EditText) + private View initIntegerControl() { + OEditTextField edt = (OEditTextField) initTextControl(); + edt.setInputType(EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD + | EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); + return edt; + } + + // EditText control (TextView, EditText) + private View initFloatControl() { + OEditTextField edt = (OEditTextField) initTextControl(); + edt.setInputType(EditorInfo.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_FLAG_DECIMAL); + return edt; + } + private TextView getLabelView() { LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 4a4113dee..9258a7cbb 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -28,6 +28,8 @@ + +