10e9492360e123589ac8c54e0668901d567f788a6Craig Stout/*
20e9492360e123589ac8c54e0668901d567f788a6Craig Stout * Copyright (C) 2014 The Android Open Source Project
30e9492360e123589ac8c54e0668901d567f788a6Craig Stout *
40e9492360e123589ac8c54e0668901d567f788a6Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
50e9492360e123589ac8c54e0668901d567f788a6Craig Stout * in compliance with the License. You may obtain a copy of the License at
60e9492360e123589ac8c54e0668901d567f788a6Craig Stout *
70e9492360e123589ac8c54e0668901d567f788a6Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
80e9492360e123589ac8c54e0668901d567f788a6Craig Stout *
90e9492360e123589ac8c54e0668901d567f788a6Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
100e9492360e123589ac8c54e0668901d567f788a6Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
110e9492360e123589ac8c54e0668901d567f788a6Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
120e9492360e123589ac8c54e0668901d567f788a6Craig Stout * the License.
130e9492360e123589ac8c54e0668901d567f788a6Craig Stout */
140e9492360e123589ac8c54e0668901d567f788a6Craig Stoutpackage android.support.v17.leanback.widget;
150e9492360e123589ac8c54e0668901d567f788a6Craig Stout
160e9492360e123589ac8c54e0668901d567f788a6Craig Stoutimport android.content.Context;
170e9492360e123589ac8c54e0668901d567f788a6Craig Stoutimport android.graphics.Rect;
180e9492360e123589ac8c54e0668901d567f788a6Craig Stoutimport android.util.AttributeSet;
19aa93f6777233b789feb14d95d900b158d0ac4841Craig Stoutimport android.view.View;
200e9492360e123589ac8c54e0668901d567f788a6Craig Stoutimport android.widget.LinearLayout;
210e9492360e123589ac8c54e0668901d567f788a6Craig Stout
220e9492360e123589ac8c54e0668901d567f788a6Craig Stoutclass ControlBar extends LinearLayout {
230e9492360e123589ac8c54e0668901d567f788a6Craig Stout
244cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    public interface OnChildFocusedListener {
254cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout        public void onChildFocusedListener(View child, View focused);
264cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    }
274cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout
28aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout    private int mChildMarginFromCenter;
294cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    private OnChildFocusedListener mOnChildFocusedListener;
30aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout
310e9492360e123589ac8c54e0668901d567f788a6Craig Stout    public ControlBar(Context context, AttributeSet attrs) {
320e9492360e123589ac8c54e0668901d567f788a6Craig Stout        super(context, attrs);
330e9492360e123589ac8c54e0668901d567f788a6Craig Stout    }
340e9492360e123589ac8c54e0668901d567f788a6Craig Stout
350e9492360e123589ac8c54e0668901d567f788a6Craig Stout    public ControlBar(Context context, AttributeSet attrs, int defStyle) {
360e9492360e123589ac8c54e0668901d567f788a6Craig Stout        super(context, attrs, defStyle);
370e9492360e123589ac8c54e0668901d567f788a6Craig Stout    }
380e9492360e123589ac8c54e0668901d567f788a6Craig Stout
390e9492360e123589ac8c54e0668901d567f788a6Craig Stout    @Override
400e9492360e123589ac8c54e0668901d567f788a6Craig Stout    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
410e9492360e123589ac8c54e0668901d567f788a6Craig Stout        if (getChildCount() > 0) {
420e9492360e123589ac8c54e0668901d567f788a6Craig Stout            if (getChildAt(getChildCount() / 2).requestFocus(direction, previouslyFocusedRect)) {
430e9492360e123589ac8c54e0668901d567f788a6Craig Stout                return true;
440e9492360e123589ac8c54e0668901d567f788a6Craig Stout            }
450e9492360e123589ac8c54e0668901d567f788a6Craig Stout        }
460e9492360e123589ac8c54e0668901d567f788a6Craig Stout        return super.requestFocus(direction, previouslyFocusedRect);
470e9492360e123589ac8c54e0668901d567f788a6Craig Stout    }
480e9492360e123589ac8c54e0668901d567f788a6Craig Stout
494cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    public void setOnChildFocusedListener(OnChildFocusedListener listener) {
504cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout        mOnChildFocusedListener = listener;
514cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    }
524cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout
53aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout    public void setChildMarginFromCenter(int marginFromCenter) {
54aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        mChildMarginFromCenter = marginFromCenter;
55aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout    }
56aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout
57aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout    @Override
584cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    public void requestChildFocus (View child, View focused) {
594cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout        super.requestChildFocus(child, focused);
604cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout        if (mOnChildFocusedListener != null) {
614cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout            mOnChildFocusedListener.onChildFocusedListener(child, focused);
624cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout        }
634cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    }
644cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout
654cc255c1c9ce5f3a718970b6e0be2c3ae6abf9edCraig Stout    @Override
66aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
67aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
68aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        if (mChildMarginFromCenter <= 0) {
69aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            return;
70aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        }
71aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout
72aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        int totalExtraMargin = 0;
73aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        for (int i = 0; i < getChildCount() - 1; i++) {
74aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            View first = getChildAt(i);
75aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            View second = getChildAt(i+1);
76aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            int measuredWidth = first.getMeasuredWidth() + second.getMeasuredWidth();
77aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            int marginStart = mChildMarginFromCenter - measuredWidth / 2;
78aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            LayoutParams lp = (LayoutParams) second.getLayoutParams();
79aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            int extraMargin = marginStart - lp.getMarginStart();
80aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            lp.setMarginStart(marginStart);
81aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            second.setLayoutParams(lp);
82aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout            totalExtraMargin += extraMargin;
83aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        }
84aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout        setMeasuredDimension(getMeasuredWidth() + totalExtraMargin, getMeasuredHeight());
85aa93f6777233b789feb14d95d900b158d0ac4841Craig Stout    }
860e9492360e123589ac8c54e0668901d567f788a6Craig Stout}
87