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