147520b68e50572a9775a662410c5aff8300c8784Craig Stout/* 247520b68e50572a9775a662410c5aff8300c8784Craig Stout * Copyright (C) 2014 The Android Open Source Project 347520b68e50572a9775a662410c5aff8300c8784Craig Stout * 447520b68e50572a9775a662410c5aff8300c8784Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 547520b68e50572a9775a662410c5aff8300c8784Craig Stout * in compliance with the License. You may obtain a copy of the License at 647520b68e50572a9775a662410c5aff8300c8784Craig Stout * 747520b68e50572a9775a662410c5aff8300c8784Craig Stout * http://www.apache.org/licenses/LICENSE-2.0 847520b68e50572a9775a662410c5aff8300c8784Craig Stout * 947520b68e50572a9775a662410c5aff8300c8784Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License 1047520b68e50572a9775a662410c5aff8300c8784Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1147520b68e50572a9775a662410c5aff8300c8784Craig Stout * or implied. See the License for the specific language governing permissions and limitations under 1247520b68e50572a9775a662410c5aff8300c8784Craig Stout * the License. 1347520b68e50572a9775a662410c5aff8300c8784Craig Stout */ 1447520b68e50572a9775a662410c5aff8300c8784Craig Stoutpackage android.support.v17.leanback.widget; 1547520b68e50572a9775a662410c5aff8300c8784Craig Stout 1647520b68e50572a9775a662410c5aff8300c8784Craig Stoutimport android.graphics.Rect; 178e3566285de4ac771d6188f62fe947e23d371a3dKris Giesingimport android.support.v4.view.ViewCompat; 1847520b68e50572a9775a662410c5aff8300c8784Craig Stoutimport android.view.View; 1947520b68e50572a9775a662410c5aff8300c8784Craig Stoutimport android.view.ViewGroup; 2047520b68e50572a9775a662410c5aff8300c8784Craig Stoutimport android.view.View.MeasureSpec; 2147520b68e50572a9775a662410c5aff8300c8784Craig Stoutimport android.view.ViewGroup.MarginLayoutParams; 2247520b68e50572a9775a662410c5aff8300c8784Craig Stout 2347520b68e50572a9775a662410c5aff8300c8784Craig Stout/** 24a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * A helper class for showing a hover card view below a {@link HorizontalGridView}. The hover card 25a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * is aligned to the starting edge of the selected child view. If there is no space when scrolling 26a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * to the end, the ending edge of the hover card will be aligned to the ending edge of the parent 27a00bada00bff4a58436a39472ab14ccb7a8f619dCraig Stout * view, excluding padding. 2847520b68e50572a9775a662410c5aff8300c8784Craig Stout */ 2947520b68e50572a9775a662410c5aff8300c8784Craig Stoutpublic final class HorizontalHoverCardSwitcher extends PresenterSwitcher { 3047520b68e50572a9775a662410c5aff8300c8784Craig Stout // left and right of selected card view 3147520b68e50572a9775a662410c5aff8300c8784Craig Stout int mCardLeft, mCardRight; 3247520b68e50572a9775a662410c5aff8300c8784Craig Stout 3347520b68e50572a9775a662410c5aff8300c8784Craig Stout private int[] mTmpOffsets = new int[2]; 3447520b68e50572a9775a662410c5aff8300c8784Craig Stout private Rect mTmpRect = new Rect(); 3547520b68e50572a9775a662410c5aff8300c8784Craig Stout 3647520b68e50572a9775a662410c5aff8300c8784Craig Stout @Override 3747520b68e50572a9775a662410c5aff8300c8784Craig Stout protected void insertView(View view) { 3847520b68e50572a9775a662410c5aff8300c8784Craig Stout // append hovercard to the end of container 3947520b68e50572a9775a662410c5aff8300c8784Craig Stout getParentViewGroup().addView(view); 4047520b68e50572a9775a662410c5aff8300c8784Craig Stout } 4147520b68e50572a9775a662410c5aff8300c8784Craig Stout 4247520b68e50572a9775a662410c5aff8300c8784Craig Stout @Override 4347520b68e50572a9775a662410c5aff8300c8784Craig Stout protected void onViewSelected(View view) { 4447520b68e50572a9775a662410c5aff8300c8784Craig Stout int rightLimit = getParentViewGroup().getWidth() - 4547520b68e50572a9775a662410c5aff8300c8784Craig Stout getParentViewGroup().getPaddingRight(); 468e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing int leftLimit = getParentViewGroup().getPaddingLeft(); 478e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing // measure the hover card width; if it's too large, align hover card 488e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing // end edge with row view's end edge, otherwise align start edges. 4947520b68e50572a9775a662410c5aff8300c8784Craig Stout view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); 5047520b68e50572a9775a662410c5aff8300c8784Craig Stout MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams(); 518e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing boolean isRtl = ViewCompat.getLayoutDirection(view) == View.LAYOUT_DIRECTION_RTL; 528e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing if (!isRtl && mCardLeft + view.getMeasuredWidth() > rightLimit) { 5347520b68e50572a9775a662410c5aff8300c8784Craig Stout params.leftMargin = rightLimit - view.getMeasuredWidth(); 548e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing } else if (isRtl && mCardLeft < leftLimit) { 558e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing params.leftMargin = leftLimit; 568e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing } else if (isRtl) { 578e3566285de4ac771d6188f62fe947e23d371a3dKris Giesing params.leftMargin = mCardRight - view.getMeasuredWidth(); 5847520b68e50572a9775a662410c5aff8300c8784Craig Stout } else { 5947520b68e50572a9775a662410c5aff8300c8784Craig Stout params.leftMargin = mCardLeft; 6047520b68e50572a9775a662410c5aff8300c8784Craig Stout } 6147520b68e50572a9775a662410c5aff8300c8784Craig Stout view.requestLayout(); 6247520b68e50572a9775a662410c5aff8300c8784Craig Stout } 6347520b68e50572a9775a662410c5aff8300c8784Craig Stout 6447520b68e50572a9775a662410c5aff8300c8784Craig Stout /** 6547520b68e50572a9775a662410c5aff8300c8784Craig Stout * Select a childView inside a grid view and create/bind a corresponding hover card view 6647520b68e50572a9775a662410c5aff8300c8784Craig Stout * for the object. 6747520b68e50572a9775a662410c5aff8300c8784Craig Stout */ 6801b7f19dfa3b2ec113f20defacf32d0a548f5bebTim Kilbourn public void select(HorizontalGridView gridView, View childView, Object object) { 6947520b68e50572a9775a662410c5aff8300c8784Craig Stout ViewGroup parent = getParentViewGroup(); 7047520b68e50572a9775a662410c5aff8300c8784Craig Stout gridView.getViewSelectedOffsets(childView, mTmpOffsets); 7147520b68e50572a9775a662410c5aff8300c8784Craig Stout mTmpRect.set(0, 0, childView.getWidth(), childView.getHeight()); 7247520b68e50572a9775a662410c5aff8300c8784Craig Stout parent.offsetDescendantRectToMyCoords(childView, mTmpRect); 7347520b68e50572a9775a662410c5aff8300c8784Craig Stout mCardLeft = mTmpRect.left - mTmpOffsets[0]; 7447520b68e50572a9775a662410c5aff8300c8784Craig Stout mCardRight = mTmpRect.right - mTmpOffsets[0]; 7547520b68e50572a9775a662410c5aff8300c8784Craig Stout select(object); 7647520b68e50572a9775a662410c5aff8300c8784Craig Stout } 7747520b68e50572a9775a662410c5aff8300c8784Craig Stout 7801b7f19dfa3b2ec113f20defacf32d0a548f5bebTim Kilbourn} 79