package tk.zielony.carbonsamples.feature.scroll; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.NonNull; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import com.annimon.stream.Stream; import carbon.widget.RelativeLayout; public class DependencyLayout extends RelativeLayout implements GestureDetector.OnGestureListener { GestureDetector detector = new GestureDetector(this); public DependencyLayout(Context context, AttributeSet attrs) { super(context, attrs); } public void updateChildren() { Stream.of(getViews()).forEach(view -> { LayoutParams params = (LayoutParams) view.getLayoutParams(); View dependency = findViewById(params.getDependsOn()); if (view instanceof BehaviorView) ((BehaviorView) view).dependedViewChanged(dependency); }); } @Override public boolean dispatchTouchEvent(@NonNull MotionEvent ev) { if (detector.onTouchEvent(ev)) return true; return super.dispatchTouchEvent(ev); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); updateChildren(); } // ------------------------------- // layout params // ------------------------------- @Override protected LayoutParams generateDefaultLayoutParams() { return new LayoutParams(super.generateDefaultLayoutParams()); } @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } @Override protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { return new LayoutParams(p); } @Override public boolean onDown(MotionEvent e) { return true; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { int dy = (int) distanceY; for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); if (view instanceof ScrollChild) { ScrollChild child = (ScrollChild) view; dy -= child.onNestedScrollByY(dy); } } return true; } @Override public void onLongPress(MotionEvent e) { } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } public static class LayoutParams extends RelativeLayout.LayoutParams { private int dependsOn; public LayoutParams(Context c, AttributeSet attrs) { super(c, attrs); TypedArray a = c.obtainStyledAttributes(attrs, carbon.R.styleable.DependencyLayout_Layout); dependsOn = a.getResourceId(carbon.R.styleable.DependencyLayout_Layout_carbon_dependsOn, -1); a.recycle(); } public LayoutParams(int w, int h) { super(w, h); } /** * {@inheritDoc} */ public LayoutParams(ViewGroup.LayoutParams source) { super(source); } /** * {@inheritDoc} */ public LayoutParams(ViewGroup.MarginLayoutParams source) { super(source); } public LayoutParams(android.widget.RelativeLayout.LayoutParams source) { super((MarginLayoutParams) source); } public LayoutParams(RelativeLayout.LayoutParams source) { super((MarginLayoutParams) source); } public LayoutParams(DependencyLayout.LayoutParams source) { super((MarginLayoutParams) source); } public int getDependsOn() { return dependsOn; } } }