From a938be3c4f3737a36bf52e640a6db49b18b4bae0 Mon Sep 17 00:00:00 2001 From: Luong Vo Date: Tue, 21 Apr 2020 12:11:27 +0700 Subject: [PATCH 1/2] Add support to get max length integer value via integer id --- .../alimuzaffar/lib/pin/PinEntryEditText.java | 53 +++++++++++-------- .../main/res/layout/activity_edit_text.xml | 4 +- sample-app/src/main/res/values/integers.xml | 4 ++ 3 files changed, 38 insertions(+), 23 deletions(-) create mode 100644 sample-app/src/main/res/values/integers.xml diff --git a/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java b/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java index 09e4952..4ab71e4 100755 --- a/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java +++ b/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java @@ -15,28 +15,17 @@ */ package com.alimuzaffar.lib.pin; -import android.animation.Animator; -import android.animation.AnimatorSet; -import android.animation.ValueAnimator; +import android.animation.*; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.RectF; -import android.graphics.Typeface; +import android.graphics.*; import android.graphics.drawable.Drawable; -import android.text.InputFilter; -import android.text.InputType; -import android.text.TextUtils; +import android.os.Build; +import android.text.*; import android.util.AttributeSet; import android.util.TypedValue; -import android.view.ActionMode; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; +import android.view.*; import android.view.animation.OvershootInterpolator; import android.view.inputmethod.InputMethodManager; @@ -45,9 +34,11 @@ import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; +import java.lang.reflect.Field; + public class PinEntryEditText extends AppCompatEditText { - private static final String XML_NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android"; + private static final int DEFAULT_MAX_LENGTH = 4; public static final String DEFAULT_MASK = "\u25CF"; protected String mMask = null; @@ -56,9 +47,9 @@ public class PinEntryEditText extends AppCompatEditText { protected int mAnimatedType = 0; protected float mSpace = 24; //24 dp by default, space between the lines protected float mCharSize; - protected float mNumChars = 4; + protected float mNumChars = DEFAULT_MAX_LENGTH; protected float mTextBottomPadding = 8; //8dp by default, height of the text from our lines - protected int mMaxLength = 4; + protected int mMaxLength = DEFAULT_MAX_LENGTH; protected RectF[] mLineCoords; protected float[] mCharBottom; protected Paint mCharPaint; @@ -176,7 +167,7 @@ private void init(Context context, AttributeSet attrs) { setBackgroundResource(0); - mMaxLength = attrs.getAttributeIntValue(XML_NAMESPACE_ANDROID, "maxLength", 4); + mMaxLength = getMaxLength(); mNumChars = mMaxLength; //Disable copy paste @@ -232,6 +223,26 @@ public boolean onLongClick(View v) { mAnimate = mAnimatedType > -1; } + private int getMaxLength() { + for (InputFilter filter : getFilters()) { + if (filter instanceof InputFilter.LengthFilter) { + InputFilter.LengthFilter lengthFilter = ((InputFilter.LengthFilter) filter); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + return lengthFilter.getMax(); + } else { + try { + Field max = InputFilter.LengthFilter.class.getDeclaredField("mMax"); + max.setAccessible(true); + return (int) max.get(lengthFilter); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + return DEFAULT_MAX_LENGTH; + } + @Override public void setInputType(int type) { super.setInputType(type); @@ -626,4 +637,4 @@ public void setOnPinEnteredListener(OnPinEnteredListener l) { public interface OnPinEnteredListener { void onPinEntered(CharSequence str); } -} \ No newline at end of file +} diff --git a/sample-app/src/main/res/layout/activity_edit_text.xml b/sample-app/src/main/res/layout/activity_edit_text.xml index b725766..4e77eee 100755 --- a/sample-app/src/main/res/layout/activity_edit_text.xml +++ b/sample-app/src/main/res/layout/activity_edit_text.xml @@ -44,7 +44,7 @@ android:cursorVisible="false" android:digits="1234567890" android:inputType="number" - android:maxLength="6" + android:maxLength="@integer/pin_length" android:textIsSelectable="false" android:textSize="24dp" app:pinAnimationType="fromBottom" @@ -98,4 +98,4 @@ app:pinLineColors="@color/pin_line_colors" app:pinRepeatedHint="#" /> - \ No newline at end of file + diff --git a/sample-app/src/main/res/values/integers.xml b/sample-app/src/main/res/values/integers.xml new file mode 100644 index 0000000..c5eb328 --- /dev/null +++ b/sample-app/src/main/res/values/integers.xml @@ -0,0 +1,4 @@ + + + 6 + From fb9fe95a845a667af08bd553c91b9b61f0672b5c Mon Sep 17 00:00:00 2001 From: Luong Vo Date: Tue, 21 Apr 2020 14:22:45 +0700 Subject: [PATCH 2/2] Switch to get integer id value from resource api instead of reflection --- .../alimuzaffar/lib/pin/PinEntryEditText.java | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java b/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java index 4ab71e4..df205b2 100755 --- a/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java +++ b/pinentryedittext/src/main/java/com/alimuzaffar/lib/pin/PinEntryEditText.java @@ -21,7 +21,6 @@ import android.content.res.TypedArray; import android.graphics.*; import android.graphics.drawable.Drawable; -import android.os.Build; import android.text.*; import android.util.AttributeSet; import android.util.TypedValue; @@ -34,10 +33,9 @@ import androidx.core.content.ContextCompat; import androidx.core.view.ViewCompat; -import java.lang.reflect.Field; - public class PinEntryEditText extends AppCompatEditText { + private static final String XML_NAMESPACE_ANDROID = "http://schemas.android.com/apk/res/android"; private static final int DEFAULT_MAX_LENGTH = 4; public static final String DEFAULT_MASK = "\u25CF"; @@ -167,7 +165,7 @@ private void init(Context context, AttributeSet attrs) { setBackgroundResource(0); - mMaxLength = getMaxLength(); + mMaxLength = getAndroidAttributeIntValue(attrs, "maxLength", DEFAULT_MAX_LENGTH); mNumChars = mMaxLength; //Disable copy paste @@ -223,24 +221,13 @@ public boolean onLongClick(View v) { mAnimate = mAnimatedType > -1; } - private int getMaxLength() { - for (InputFilter filter : getFilters()) { - if (filter instanceof InputFilter.LengthFilter) { - InputFilter.LengthFilter lengthFilter = ((InputFilter.LengthFilter) filter); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - return lengthFilter.getMax(); - } else { - try { - Field max = InputFilter.LengthFilter.class.getDeclaredField("mMax"); - max.setAccessible(true); - return (int) max.get(lengthFilter); - } catch (Exception e) { - e.printStackTrace(); - } - } - } + private int getAndroidAttributeIntValue(AttributeSet attrs, String attributeName, int defaultValue) { + int resId = attrs.getAttributeResourceValue(XML_NAMESPACE_ANDROID, attributeName, -1); + if (resId > 0) { + return getResources().getInteger(resId); + } else { + return attrs.getAttributeIntValue(XML_NAMESPACE_ANDROID, attributeName, defaultValue); } - return DEFAULT_MAX_LENGTH; } @Override