|
|
@ -1,10 +1,14 @@ |
|
|
|
package com.gmeremit.online.gmeremittance_native.customwidgets.securitykeypad; |
|
|
|
|
|
|
|
import android.content.Context; |
|
|
|
import android.support.annotation.LayoutRes; |
|
|
|
import android.graphics.Rect; |
|
|
|
import android.support.v4.view.GestureDetectorCompat; |
|
|
|
import android.util.AttributeSet; |
|
|
|
import android.view.GestureDetector; |
|
|
|
import android.view.MotionEvent; |
|
|
|
import android.view.View; |
|
|
|
import android.widget.EditText; |
|
|
|
import android.widget.FrameLayout; |
|
|
|
import android.widget.HorizontalScrollView; |
|
|
|
import android.widget.ImageButton; |
|
|
|
import android.widget.LinearLayout; |
|
|
@ -12,12 +16,26 @@ import android.widget.RelativeLayout; |
|
|
|
|
|
|
|
import com.gmeremit.online.gmeremittance_native.R; |
|
|
|
|
|
|
|
|
|
|
|
public class SecurityKeyboardView extends RelativeLayout implements SecurityKeyboardManager.SecurityKeyboardWidgetBinder { |
|
|
|
|
|
|
|
private SecurityKeyboardFocusStateListener focusListener; |
|
|
|
private FrameLayout keyboardContainerView; |
|
|
|
private RelativeLayout keyboardBallonView; |
|
|
|
|
|
|
|
public interface SecurityKeyboardFocusStateListener { |
|
|
|
void onSecurityViewRecievedFocus(); |
|
|
|
|
|
|
|
void onSecurityViewLostFocus(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
EditText securityKeyboard; |
|
|
|
HorizontalScrollView horizontalScrollView; |
|
|
|
LinearLayout keyLayout; |
|
|
|
ImageButton clearImageButton; |
|
|
|
private GestureDetectorCompat gestureDetector; |
|
|
|
private SecurityKeyboardManagerGestureDetector myViewGestureDetector; |
|
|
|
|
|
|
|
public SecurityKeyboardView(Context context) { |
|
|
|
super(context); |
|
|
@ -36,13 +54,22 @@ public class SecurityKeyboardView extends RelativeLayout implements SecurityKey |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private void init(Context context) |
|
|
|
{ |
|
|
|
public void setKeyboardContainerView(FrameLayout keyboardContainerView) { |
|
|
|
this.keyboardContainerView = keyboardContainerView; |
|
|
|
} |
|
|
|
|
|
|
|
public void setKeyboardBallonView(RelativeLayout keyboardBallonView) { |
|
|
|
this.keyboardBallonView = keyboardBallonView; |
|
|
|
} |
|
|
|
|
|
|
|
private void init(Context context) { |
|
|
|
View v = View.inflate(context, R.layout.security_keyboard_view, this); |
|
|
|
securityKeyboard = (EditText) v.findViewById(R.id.securityKeyboardEditText); |
|
|
|
horizontalScrollView = (HorizontalScrollView) v.findViewById(R.id.securityKeyboardScrollView); |
|
|
|
keyLayout = (LinearLayout) v.findViewById(R.id.keyLayout); |
|
|
|
clearImageButton = (ImageButton) v.findViewById(R.id.securityKeyboardClearAllImageView); |
|
|
|
myViewGestureDetector = new SecurityKeyboardManagerGestureDetector(); |
|
|
|
gestureDetector = new GestureDetectorCompat(context, myViewGestureDetector); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
@ -66,5 +93,79 @@ public class SecurityKeyboardView extends RelativeLayout implements SecurityKey |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setSecurityKeyboardFocusStateListener(SecurityKeyboardFocusStateListener listener) { |
|
|
|
this.focusListener = listener; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public boolean checkIfTouchIntersectKeypadLayout(MotionEvent ev) { |
|
|
|
return gestureDetector.onTouchEvent(ev); |
|
|
|
} |
|
|
|
|
|
|
|
public void onDestory() { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private boolean checkIfIntersectsBounds(float x, float y) { |
|
|
|
int posX = (int) x; |
|
|
|
int posY = (int) y; |
|
|
|
|
|
|
|
int[] securityKeypadInputFieldLeftAndTopCoordinates = new int[2]; |
|
|
|
|
|
|
|
|
|
|
|
getLocationOnScreen(securityKeypadInputFieldLeftAndTopCoordinates); |
|
|
|
|
|
|
|
Rect securityKeypadBoundRect = new Rect(securityKeypadInputFieldLeftAndTopCoordinates[0], securityKeypadInputFieldLeftAndTopCoordinates[1], |
|
|
|
securityKeypadInputFieldLeftAndTopCoordinates[0] + getMeasuredWidth(), |
|
|
|
securityKeypadInputFieldLeftAndTopCoordinates[1] + getMeasuredHeight()); |
|
|
|
|
|
|
|
return securityKeypadBoundRect.contains(posX, posY); |
|
|
|
} |
|
|
|
|
|
|
|
private boolean checkIfUserIsTyping(float x, float y) { |
|
|
|
|
|
|
|
int posX = (int) x; |
|
|
|
int posY = (int) y; |
|
|
|
|
|
|
|
int[] keypadContainerLeftAndTopCoordinates = new int[2]; |
|
|
|
|
|
|
|
if (keyboardContainerView == null) |
|
|
|
throw new IllegalArgumentException("Its seems you forgot to set keyboard container view"); |
|
|
|
|
|
|
|
if (keyboardContainerView.getChildAt(0) != null) { |
|
|
|
keyboardContainerView.getChildAt(0).getLocationOnScreen(keypadContainerLeftAndTopCoordinates); |
|
|
|
|
|
|
|
Rect securityKeypadContainerBoundRect = new Rect(keypadContainerLeftAndTopCoordinates[0], keypadContainerLeftAndTopCoordinates[1], |
|
|
|
keypadContainerLeftAndTopCoordinates[0] + keyboardContainerView.getChildAt(0).getMeasuredWidth(), |
|
|
|
keypadContainerLeftAndTopCoordinates[1] + keyboardContainerView.getChildAt(0).getMeasuredHeight()); |
|
|
|
|
|
|
|
|
|
|
|
return securityKeypadContainerBoundRect.contains(posX, posY); |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
class SecurityKeyboardManagerGestureDetector extends GestureDetector.SimpleOnGestureListener { |
|
|
|
@Override |
|
|
|
public boolean onSingleTapUp(MotionEvent e) { |
|
|
|
if (e.getAction() == MotionEvent.ACTION_UP) { |
|
|
|
boolean hasIntersected = checkIfIntersectsBounds(e.getX(), e.getY()); |
|
|
|
if (focusListener != null) { |
|
|
|
if (hasIntersected) |
|
|
|
focusListener.onSecurityViewRecievedFocus(); |
|
|
|
else { |
|
|
|
boolean isUserTypingonKeypad = checkIfUserIsTyping(e.getX(), e.getY()); |
|
|
|
if (!isUserTypingonKeypad) |
|
|
|
focusListener.onSecurityViewLostFocus(); |
|
|
|
} |
|
|
|
} |
|
|
|
return hasIntersected; |
|
|
|
} |
|
|
|
return super.onSingleTapUp(e); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |