1package android.support.v17.leanback.widget; 2 3import android.content.Context; 4import android.content.res.TypedArray; 5import android.support.v17.leanback.R; 6import android.util.AttributeSet; 7import android.view.KeyEvent; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.RelativeLayout; 11 12/** 13 * Relative layout implementation that assign subactions list topMargin based on a percentage 14 * given by "guidedStepKeyline" theme attribute when the topMargin is set to a negative value. 15 */ 16class GuidedActionsRelativeLayout extends RelativeLayout { 17 18 interface InterceptKeyEventListener { 19 public boolean onInterceptKeyEvent(KeyEvent event); 20 } 21 22 private float mKeyLinePercent; 23 private boolean mInOverride = false; 24 private InterceptKeyEventListener mInterceptKeyEventListener; 25 26 public GuidedActionsRelativeLayout(Context context) { 27 this(context, null); 28 } 29 30 public GuidedActionsRelativeLayout(Context context, AttributeSet attrs) { 31 this(context, attrs, 0); 32 } 33 34 public GuidedActionsRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 35 super(context, attrs, defStyle); 36 mKeyLinePercent = GuidanceStylingRelativeLayout.getKeyLinePercent(context); 37 } 38 39 private void init() { 40 TypedArray ta = getContext().getTheme().obtainStyledAttributes( 41 R.styleable.LeanbackGuidedStepTheme); 42 mKeyLinePercent = ta.getFloat(R.styleable.LeanbackGuidedStepTheme_guidedStepKeyline, 43 40); 44 ta.recycle(); 45 } 46 47 @Override 48 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 49 final int heightSize = MeasureSpec.getSize(heightMeasureSpec); 50 if (heightSize > 0) { 51 View view = findViewById(R.id.guidedactions_sub_list); 52 if (view != null) { 53 ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) 54 view.getLayoutParams(); 55 if (lp.topMargin < 0 && !mInOverride) { 56 mInOverride = true; 57 } 58 if (mInOverride) { 59 lp.topMargin = (int) (mKeyLinePercent * heightSize / 100); 60 } 61 } 62 } 63 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 64 } 65 66 @Override 67 protected void onLayout(boolean changed, int l, int t, int r, int b) { 68 super.onLayout(changed, l, t, r, b); 69 mInOverride = false; 70 } 71 72 public void setInterceptKeyEventListener(InterceptKeyEventListener l) { 73 mInterceptKeyEventListener = l; 74 } 75 76 @Override 77 public boolean dispatchKeyEvent(KeyEvent event) { 78 if (mInterceptKeyEventListener != null) { 79 if (mInterceptKeyEventListener.onInterceptKeyEvent(event)) { 80 return true; 81 } 82 } 83 return super.dispatchKeyEvent(event); 84 } 85} 86