From c1e07681f0b0970e90c8ba7144e4beaa87441477 Mon Sep 17 00:00:00 2001 From: Preyea Regmi Date: Wed, 24 Jul 2019 15:32:46 +0900 Subject: [PATCH] Successfully Intercepted global touch listener in splash --- .../splash_screen/view/SplashScreen.java | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java b/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java index 5584af05..00712d6b 100644 --- a/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java +++ b/app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.graphics.Paint; +import android.graphics.Rect; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -14,12 +15,15 @@ import android.support.transition.ChangeBounds; import android.support.transition.Transition; import android.support.transition.TransitionListenerAdapter; import android.support.transition.TransitionManager; +import android.support.v4.view.GestureDetectorCompat; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.text.Editable; +import android.view.GestureDetector; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AnticipateOvershootInterpolator; @@ -113,6 +117,12 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, @BindView(R.id.countrySelectionSpinner) View countrySelectionSpinner; + @BindView(R.id.receiveMoneyViewContainer) + View receiveMoneyViewContainer; + + @BindView(R.id.sendMoneyViewContainer) + View sendMoneyViewContainer; + LanguageViewTransitionManager languageViewTransitionManager; @@ -131,6 +141,8 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, private SendAmountTextWatcher sendMoneyTextWatcher; private ReceiveAmountTextWatcher receiveMoneyTextWatcher; + private GestureDetectorCompat gestureDetector; + private AmountChangeAndFocusOutDetector myViewGestureDetector; @Override @@ -161,6 +173,9 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, initPayoutModeRV(); sendMoneyTextWatcher = new SendAmountTextWatcher(sendAmountEdTxt); receiveMoneyTextWatcher = new ReceiveAmountTextWatcher(receiveAmountEdTxt); + myViewGestureDetector = new AmountChangeAndFocusOutDetector(); + gestureDetector = new GestureDetectorCompat(this, myViewGestureDetector); + } @@ -230,6 +245,12 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, } + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + gestureDetector.onTouchEvent(ev); + return super.dispatchTouchEvent(ev); + } + @Override public void onBackPressed() { if (languageViewTransitionManager.isAnimationRunning()) @@ -431,6 +452,8 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, private ConstraintSet mainViewConstraintSet; private ConstraintSet preLoadingConstraintSet; + private boolean isExrateViewVisible; + LanguageViewTransitionManager(Context context) { isAnimationOnProgress = false; this.context = context; @@ -449,11 +472,14 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, accelerateDecelerateInterpolator = new AccelerateDecelerateInterpolator(); textViewPaintFlags = selectedLanguageText.getPaintFlags(); + isExrateViewVisible = false; + } void showLanguageView(Runnable onAnimationCompleteCallback) { hideKeyBoard(); + isExrateViewVisible = false; ChangeBounds transition = new ChangeBounds(); transition.setPathMotion(new ArcMotion()); transition.setInterpolator(anticipateOvershootInterpolator); @@ -537,6 +563,7 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, public void onTransitionEnd(@NonNull Transition transition) { super.onTransitionEnd(transition); isAnimationOnProgress = false; + isExrateViewVisible = true; userNavigatedToLanguageView = false; if (onAnimationCompleteCallback != null) onAnimationCompleteCallback.run(); @@ -557,6 +584,7 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, @Override public void onTransitionEnd(@NonNull Transition transition) { super.onTransitionEnd(transition); + isExrateViewVisible = true; isAnimationOnProgress = false; userNavigatedToLanguageView = false; if (onAnimationCompleteCallback != null) @@ -577,7 +605,9 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, return this.userNavigatedToLanguageView; } - + public boolean isExrateViewVisible() { + return isExrateViewVisible; + } } @@ -600,6 +630,7 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, @Override public void afterTextChanged(Editable s) { super.afterTextChanged(s); + presenter.setCalcByPayoutAmount(false); presenter.setCAmount(s.toString()); } } @@ -623,10 +654,64 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener, @Override public void afterTextChanged(Editable s) { super.afterTextChanged(s); + presenter.setCalcByPayoutAmount(true); presenter.setPAmount(s.toString()); } } + private class AmountChangeAndFocusOutDetector extends GestureDetector.SimpleOnGestureListener { + + @Override + public boolean onSingleTapUp(MotionEvent e) { + if (!languageViewTransitionManager.isExrateViewVisible()) + return super.onSingleTapUp(e); + if (e.getAction() == MotionEvent.ACTION_UP) { + if (hasValidOutsideAmountWidgetTouch(e.getX(), e.getY())) { + presenter.calcExrate(); + return true; + + } + } + return super.onSingleTapUp(e); + } + + private boolean hasValidOutsideAmountWidgetTouch(float x, float y) { + + int posX = (int) x; + int posY = (int) y; + int[] sendMoneyLeftAndTopCoordinates = new int[2]; + + int[] receiveMoneyLeftAndTopCoordinates = new int[2]; + + int[] backButtonLeftAndTopCoordinates = new int[2]; + + sendMoneyViewContainer.getLocationOnScreen(sendMoneyLeftAndTopCoordinates); + receiveMoneyViewContainer.getLocationOnScreen(receiveMoneyLeftAndTopCoordinates); + iv_back.getLocationOnScreen(backButtonLeftAndTopCoordinates); + + Rect sendMoneyBoundRect = new Rect(sendMoneyLeftAndTopCoordinates[0], sendMoneyLeftAndTopCoordinates[1], + sendMoneyLeftAndTopCoordinates[0] + sendMoneyViewContainer.getMeasuredWidth(), + sendMoneyLeftAndTopCoordinates[1] + sendMoneyViewContainer.getMeasuredHeight()); + + Rect receiveMoneyBoundRect = new Rect(receiveMoneyLeftAndTopCoordinates[0], receiveMoneyLeftAndTopCoordinates[1], + receiveMoneyLeftAndTopCoordinates[0] + receiveMoneyViewContainer.getMeasuredWidth(), + receiveMoneyLeftAndTopCoordinates[1] + receiveMoneyViewContainer.getMeasuredHeight()); + + Rect backButtonBoundRect = new Rect(backButtonLeftAndTopCoordinates[0], backButtonLeftAndTopCoordinates[1], + backButtonLeftAndTopCoordinates[0] + iv_back.getMeasuredWidth(), + backButtonLeftAndTopCoordinates[1] + iv_back.getMeasuredHeight()); + + + return (receiveAmountEdTxt.hasFocus() || sendAmountEdTxt.hasFocus()) + && !sendMoneyBoundRect.contains(posX, posY) + && !receiveMoneyBoundRect.contains(posX, posY) + && !backButtonBoundRect.contains(posX, posY); + } + + + } + + static { System.loadLibrary("antidebugger"); }