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/**
2447520b68e50572a9775a662410c5aff8300c8784Craig Stout * Helper class that stay bellow a HorizontalGridView and shows a hover card and align
2547520b68e50572a9775a662410c5aff8300c8784Craig Stout * the hover card left to left of selected child view.  If there is no space when scroll
2647520b68e50572a9775a662410c5aff8300c8784Craig Stout * to the end, right edge hover card will be aligned to right of parent view excluding
2747520b68e50572a9775a662410c5aff8300c8784Craig Stout * right 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