-Search solution for the viewpager crashes actions when try to define a pattern horisontally

-In the ChildViewPager of security settings disable swipe horisontally and navigation now it is by tabs
-In the ChildViewPager modify the class so it can control when the swipe touch event is bloqued or not correctly
This commit is contained in:
dtvv 2018-10-24 03:56:21 -05:00
parent b3a267fb47
commit 4ba6299822
3 changed files with 47 additions and 18 deletions

View file

@ -28,6 +28,7 @@ import butterknife.OnTextChanged;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.application.CrystalSecurityMonitor;
import cy.agorise.crystalwallet.models.GeneralSetting;
import cy.agorise.crystalwallet.util.ChildViewPager;
import cy.agorise.crystalwallet.util.PasswordManager;
import cy.agorise.crystalwallet.viewmodels.GeneralSettingListViewModel;
import cy.agorise.crystalwallet.viewmodels.validators.PinSecurityValidator;
@ -45,9 +46,17 @@ public class PatternSecurityFragment extends Fragment {
@BindView(R.id.tvPatternText)
TextView tvPatternText;
/*
* Contains the ChildViewPager to block the viewpager when the user is using the pattern control
* */
private ChildViewPager childViewPager;
private PatternLockViewListener actualPatternListener;
private String patternEntered;
public PatternSecurityFragment() {
// Required empty public constructor
}
@ -80,6 +89,11 @@ public class PatternSecurityFragment extends Fragment {
return patternString;
}
public void setChildViewPager(ChildViewPager childViewPager) {
this.childViewPager = childViewPager;
}
public void removePatternListener(){
if (actualPatternListener != null){
patternLockView.removePatternLockListener(actualPatternListener);
@ -96,7 +110,6 @@ public class PatternSecurityFragment extends Fragment {
actualPatternListener = new PatternLockViewListener() {
@Override
public void onStarted() {
}
@Override

View file

@ -96,7 +96,6 @@ public class SecuritySettingsFragment extends Fragment {
default:
mPager.setCurrentItem(0);
}
mPager.setSwipeLocked(true);
TabLayout tabLayout = v.findViewById(R.id.tabs);
@ -134,7 +133,9 @@ public class SecuritySettingsFragment extends Fragment {
case 1:
return new PinSecurityFragment();
case 2:
return new PatternSecurityFragment();
final PatternSecurityFragment patternSecurityFragment = new PatternSecurityFragment();
patternSecurityFragment.setChildViewPager(mPager);
return patternSecurityFragment;
}
return null; //new OnConstructionFragment();

View file

@ -4,6 +4,10 @@ import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import java.lang.reflect.Field;
/**
* Created by xd on 1/18/18.
@ -14,36 +18,47 @@ import android.view.MotionEvent;
public class ChildViewPager extends ViewPager {
private boolean swipeLocked;
public ChildViewPager(Context context) {
super(context);
setMyScroller();
}
public ChildViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public boolean getSwipeLocked() {
return swipeLocked;
}
public void setSwipeLocked(boolean swipeLocked) {
this.swipeLocked = swipeLocked;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return !swipeLocked && super.onTouchEvent(event);
// stop swipe
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return !swipeLocked && super.onInterceptTouchEvent(event);
// stop switching pages
return false;
}
@Override
public boolean canScrollHorizontally(int direction) {
return !swipeLocked && super.canScrollHorizontally(direction);
private void setMyScroller() {
try {
Class<?> viewpager = ViewPager.class;
Field scroller = viewpager.getDeclaredField("mScroller");
scroller.setAccessible(true);
scroller.set(this, new MyScroller(getContext()));
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyScroller extends Scroller {
public MyScroller(Context context) {
super(context, new DecelerateInterpolator());
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, 350 /*1 secs*/);
}
}
}