108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu/* 208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Copyright (C) 2015 The Android Open Source Project 308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * 408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * in compliance with the License. You may obtain a copy of the License at 608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * 708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * 908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License 1008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * or implied. See the License for the specific language governing permissions and limitations under 1208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * the License. 1308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu */ 14ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.leanback.widget; 1508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 16ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.leanback.widget.ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED; 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.recyclerview.widget.RecyclerView.HORIZONTAL; 1808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 1908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guimport android.graphics.Rect; 2008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guimport android.view.View; 2108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guimport android.view.ViewGroup; 2208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 238619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikasimport androidx.leanback.widget.GridLayoutManager.LayoutParams; 248619e0ef7062b6a714f22af993e4b440fae7ef08Aurimas Liutikas 2508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu/** 2608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * Helper class to handle ItemAlignmentFacet in a grid view. 2708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu */ 2808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Guclass ItemAlignmentFacetHelper { 2908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 3008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu private static Rect sRect = new Rect(); 3108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 3208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu /** 3308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu * get alignment position relative to optical left/top of itemView. 3408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu */ 3508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu static int getAlignmentPosition(View itemView, ItemAlignmentFacet.ItemAlignmentDef facet, 3608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int orientation) { 3708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu LayoutParams p = (LayoutParams) itemView.getLayoutParams(); 3808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu View view = itemView; 3908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (facet.mViewId != 0) { 4008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu view = itemView.findViewById(facet.mViewId); 4108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (view == null) { 4208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu view = itemView; 4308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 4408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 4508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu int alignPos = facet.mOffset; 4608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (orientation == HORIZONTAL) { 47bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (itemView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { 48bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos = (view == itemView ? p.getOpticalWidth(view) 49bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu : view.getWidth()) - alignPos; 5008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (facet.mOffsetWithPadding) { 51bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (facet.mOffsetPercent == 0f) { 52bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos -= view.getPaddingRight(); 53bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } else if (facet.mOffsetPercent == 100f) { 54bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos += view.getPaddingLeft(); 55bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } 5608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 57bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) { 58bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos -= (int) (((view == itemView ? p.getOpticalWidth(view) 59bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu : view.getWidth()) * facet.mOffsetPercent) / 100f); 60bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } 61bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (itemView != view) { 62bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu sRect.right = alignPos; 63bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect); 64bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos = sRect.right + p.getOpticalRightInset(); 65bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } 66bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } else { 6708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (facet.mOffsetWithPadding) { 68bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (facet.mOffsetPercent == 0f) { 69bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos += view.getPaddingLeft(); 70bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } else if (facet.mOffsetPercent == 100f) { 71bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos -= view.getPaddingRight(); 72bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } 73bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } 74bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) { 75bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos += (int) (((view == itemView ? p.getOpticalWidth(view) 76bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu : view.getWidth()) * facet.mOffsetPercent) / 100f); 77bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } 78bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (itemView != view) { 79bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu sRect.left = alignPos; 80bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect); 81bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu alignPos = sRect.left - p.getOpticalLeftInset(); 8208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 8308c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 8408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } else { 85bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (facet.mOffsetWithPadding) { 86bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu if (facet.mOffsetPercent == 0f) { 8708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu alignPos += view.getPaddingTop(); 88bc6713f8e2fa9702675dc3827591ed401b539723Dake Gu } else if (facet.mOffsetPercent == 100f) { 8908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu alignPos -= view.getPaddingBottom(); 9008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 9108c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 9208c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (facet.mOffsetPercent != ITEM_ALIGN_OFFSET_PERCENT_DISABLED) { 93985d0981d78f9ea1602e5562fda5f08a2fa8748cDake Gu alignPos += (int) (((view == itemView ? p.getOpticalHeight(view) : view.getHeight()) 94694edde99dc3782374977dab6d9aa34a16c13337Dake Gu * facet.mOffsetPercent) / 100f); 9508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 9608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu if (itemView != view) { 9708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu sRect.top = alignPos; 9808c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu ((ViewGroup) itemView).offsetDescendantRectToMyCoords(view, sRect); 9908c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu alignPos = sRect.top - p.getOpticalTopInset(); 10008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 1013a585b405904d1d8dc9c714ae06da4441a07382dDake Gu if (facet.isAlignedToTextViewBaseLine()) { 1023a585b405904d1d8dc9c714ae06da4441a07382dDake Gu alignPos += view.getBaseline(); 10350c611b216a4b2c8eb2bbd2a2848bb6da34677besusnata } 10408c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 10508c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu return alignPos; 10608c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu } 10708c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu 1080f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton private ItemAlignmentFacetHelper() { 1090f4ca634bbc43ddff900c35f7d2a43b55d8c830dJake Wharton } 11008c56822b71ab0aa0b9bb03e5fd45e28f6e358b8Dake Gu} 111