From 4ff82024af2504a0e08750df47e05a28a0d9a135 Mon Sep 17 00:00:00 2001 From: preyearegmi Date: Tue, 29 Jan 2019 10:42:35 +0900 Subject: [PATCH] Security keyboard visiblity control success --- .../base/BaseActivity.java | 1 + .../SecurityKeyboardManager.java | 8 +- .../securitykeypad/SecurityKeyboardView.java | 113 +++++++++++++++++- .../loginV2/view/LoginV2Activity.java | 103 +++++++++------- 4 files changed, 170 insertions(+), 55 deletions(-) diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/base/BaseActivity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/base/BaseActivity.java index 3237fac6..52bc5658 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/base/BaseActivity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/base/BaseActivity.java @@ -101,6 +101,7 @@ public class BaseActivity extends AppCompatActivity implements BaseContractInter } if (imm != null) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + view.clearFocus(); } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardManager.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardManager.java index 5d37cbe0..3e224fe8 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardManager.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardManager.java @@ -2,6 +2,7 @@ package com.gmeremit.online.gmeremittance_native.customwidgets.securitykeypad; import android.content.Context; import android.content.Intent; +import android.view.MotionEvent; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.HorizontalScrollView; @@ -120,13 +121,14 @@ public class SecurityKeyboardManager { return editTextView; } - public void showKeyboard () throws IllegalAccessException { + public void showKeyboard () { if(controller!=null) this.controller.showKeypad(requestParams.getDefaultKeyboardType()); - else - throw new IllegalAccessException("Keyboard not initialized properly. Did you forgot to invoke build() method?"); + } + + /** * Aggregation of all the listener that the virtual keypad accepts. */ diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardView.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardView.java index 37740192..071777af 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardView.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/customwidgets/securitykeypad/SecurityKeyboardView.java @@ -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 { + +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) - { - View v= View.inflate(context, R.layout.security_keyboard_view, this); + 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); + 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); + } + + + } } diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java index 1707d6e9..f53e55f3 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java @@ -5,11 +5,10 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.drawable.GradientDrawable; import android.os.Bundle; -import android.os.Handler; -import android.support.design.widget.TextInputLayout; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewCompat; import android.util.Log; @@ -40,12 +39,12 @@ import com.gmeremit.online.gmeremittance_native.resetpassV2.view.ResetPassV2Acti import butterknife.BindView; import butterknife.ButterKnife; -public class LoginV2Activity extends BaseActivity implements View.OnClickListener, LoginV2PresenterInterface.LoginV2ContractInterface { +public class LoginV2Activity extends BaseActivity implements View.OnClickListener, LoginV2PresenterInterface.LoginV2ContractInterface, SecurityKeyboardView.SecurityKeyboardFocusStateListener { @BindView(R.id.usernameId) EditText usernameId; -// @BindView(R.id.passwordId) + // @BindView(R.id.passwordId) EditText passwordId; @BindView(R.id.btn_submit) @@ -88,12 +87,12 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene private LoginV2Presenter presenter; - private AnimatorSet mMorphingAnimatorSet=null; - private boolean mIsMorphingInProgress=false; + private AnimatorSet mMorphingAnimatorSet = null; + private boolean mIsMorphingInProgress = false; private static float DEFAULT_CORNER_RADIUS; -private Interpolator interpolator=new AccelerateDecelerateInterpolator(); + private Interpolator interpolator = new AccelerateDecelerateInterpolator(); private int originalButtonWidth; - private boolean isLoadingInProgress=false; + private boolean isLoadingInProgress = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -105,18 +104,19 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); } - private void initialize() { - this.presenter=new LoginV2Presenter(this); - DEFAULT_CORNER_RADIUS=35*getResources().getDisplayMetrics().density; - loginButtonText=loginBtn.getText().toString(); - progressbar_login.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(this,android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY); - ViewCompat.setTranslationZ(progressbar_login, 100); - progressbar_login.setVisibility(View.GONE); + this.presenter = new LoginV2Presenter(this); + DEFAULT_CORNER_RADIUS = 35 * getResources().getDisplayMetrics().density; + loginButtonText = loginBtn.getText().toString(); + progressbar_login.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(this, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY); + ViewCompat.setTranslationZ(progressbar_login, 100); + progressbar_login.setVisibility(View.GONE); + securityKeyboardView.setKeyboardContainerView(keypadContainer); + securityKeyboardView.setKeyboardBallonView(ballonView); try { - securityKeyboardManager=new SecurityKeyboardManager(this); - SecurityKeypadRequestParamBuilder request =new SecurityKeypadRequestParamBuilder(this); + securityKeyboardManager = new SecurityKeyboardManager(this); + SecurityKeypadRequestParamBuilder request = new SecurityKeypadRequestParamBuilder(this); request.setHintString("Password"); securityKeyboardManager.bindWithSecurityWidgetView(securityKeyboardView) @@ -153,29 +153,17 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); } catch (Exception e) { e.printStackTrace(); - Log.d("GMESecurityKeyboard",e.getMessage()); + Log.d("GMESecurityKeyboard", e.getMessage()); } - passwordId=securityKeyboardManager.getEditTextView(); - } private void performDefaultAction(Bundle savedInstanceState) { - new Handler().postDelayed((new Runnable() { - @Override - public void run() { - - try { - securityKeyboardManager.showKeyboard(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - }),200); } + @SuppressLint("ClickableViewAccessibility") @Override protected void onStart() { super.onStart(); @@ -183,9 +171,12 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); registerTxt.setOnClickListener(this); loginBtn.setOnClickListener(this); // iv_back.setOnClickListener(this); + securityKeyboardView.setSecurityKeyboardFocusStateListener(this); } + + @SuppressLint("ClickableViewAccessibility") @Override protected void onStop() { super.onStop(); @@ -193,6 +184,9 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); registerTxt.setOnClickListener(null); loginBtn.setOnClickListener(null); // iv_back.setOnClickListener(null); + securityKeyboardView.setSecurityKeyboardFocusStateListener(null); + + } @Override @@ -204,7 +198,7 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); break; case R.id.btn_submit: - if(presenter.validateAll(usernameId.getText().toString(),passwordId.getText().toString())) { + if (presenter.validateAll(usernameId.getText().toString(), passwordId.getText().toString())) { hideKeyBoard(); rootView.clearFocus(); morphButtonIntoProgressBar(); @@ -216,30 +210,33 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); startActivity(forgetPassIntent); break; - case R.id.iv_back: + case R.id.iv_back: onBackPressed(); break; + } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { - return isLoadingInProgress || super.dispatchTouchEvent(ev); + return (isLoadingInProgress||securityKeyboardView.checkIfTouchIntersectKeypadLayout(ev)||super.dispatchTouchEvent(ev)); + + } @Override public void onBackPressed() { if (!isLoadingInProgress) { - if(securityKeyboardManager.isKeyboardVisible()) - securityKeyboardManager.hideKeyboard(); - else - super.onBackPressed(); + if (securityKeyboardManager.isKeyboardVisible()) + securityKeyboardManager.hideKeyboard(); + else + super.onBackPressed(); } } - private void morphButtonIntoProgressBar() - { + + private void morphButtonIntoProgressBar() { GradientDrawable mGradientDrawable = (GradientDrawable) loginBtn.getBackground(); @@ -249,7 +246,7 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); DEFAULT_CORNER_RADIUS, loginBtn.getHeight()); - originalButtonWidth=loginBtn.getWidth(); + originalButtonWidth = loginBtn.getWidth(); ValueAnimator widthAnimation = ValueAnimator.ofInt(loginBtn.getWidth(), loginBtn.getHeight()); widthAnimation.addUpdateListener(valueAnimator -> { int val = (Integer) valueAnimator.getAnimatedValue(); @@ -268,7 +265,7 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); mIsMorphingInProgress = true; - isLoadingInProgress=true; + isLoadingInProgress = true; loginBtn.setText(""); } @@ -285,8 +282,7 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); @Override - public void morphProgressBarIntoButton(Runnable callback) - { + public void morphProgressBarIntoButton(Runnable callback) { GradientDrawable mGradientDrawable = (GradientDrawable) loginBtn.getBackground(); @@ -323,8 +319,8 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); public void onAnimationEnd(Animator animation) { mIsMorphingInProgress = false; loginBtn.setText(loginButtonText); - isLoadingInProgress=false; - if(callback!=null) + isLoadingInProgress = false; + if (callback != null) callback.run(); @@ -352,4 +348,19 @@ private Interpolator interpolator=new AccelerateDecelerateInterpolator(); startActivity(intent); finish(); } + + + @Override + public void onSecurityViewRecievedFocus() { + if(securityKeyboardManager!=null&&!securityKeyboardManager.isKeyboardVisible()) { + hideKeyBoard(); + securityKeyboardManager.showKeyboard(); + } + } + + @Override + public void onSecurityViewLostFocus() { + if(securityKeyboardManager!=null&&securityKeyboardManager.isKeyboardVisible()) + securityKeyboardManager.hideKeyboard(); + } }