18245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka/* 28245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * Copyright (C) 2010 The Android Open Source Project 38245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * 48245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * Licensed under the Apache License, Version 2.0 (the "License"); 58245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * you may not use this file except in compliance with the License. 68245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * You may obtain a copy of the License at 78245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * 88245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * http://www.apache.org/licenses/LICENSE-2.0 98245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * 108245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * Unless required by applicable law or agreed to in writing, software 118245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * distributed under the License is distributed on an "AS IS" BASIS, 128245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * See the License for the specific language governing permissions and 148245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * limitations under the License. 158245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka */ 168245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3; 188245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 198245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.content.Context; 208245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.graphics.Rect; 218245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.view.View; 228245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.view.ViewGroup; 238245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 248245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka/** 258245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * An abstraction of the original CellLayout which supports laying out items 268245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * which span multiple cells into a grid-like layout. Also supports dimming 278245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * to give a preview of its contents. 288245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka */ 298245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkapublic class PagedViewCellLayoutChildren extends ViewGroup { 308245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka static final String TAG = "PagedViewCellLayout"; 318245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 328245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka private boolean mCenterContent; 338245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 348245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka private int mCellWidth; 358245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka private int mCellHeight; 368245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka private int mWidthGap; 378245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka private int mHeightGap; 388245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 398245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public PagedViewCellLayoutChildren(Context context) { 408245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka super(context); 418245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 428245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 438245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 448245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void cancelLongPress() { 458245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka super.cancelLongPress(); 468245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 478245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka // Cancel long press for all children 488245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka final int count = getChildCount(); 498245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka for (int i = 0; i < count; i++) { 508245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka final View child = getChildAt(i); 518245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka child.cancelLongPress(); 528245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 538245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 548245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 558245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void setGap(int widthGap, int heightGap) { 568245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mWidthGap = widthGap; 578245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHeightGap = heightGap; 588245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka requestLayout(); 598245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 608245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 618245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void setCellDimensions(int width, int height) { 628245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mCellWidth = width; 638245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mCellHeight = height; 648245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka requestLayout(); 658245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 668245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 678245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 688245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void requestChildFocus(View child, View focused) { 698245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka super.requestChildFocus(child, focused); 708245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka if (child != null) { 718245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka Rect r = new Rect(); 728245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka child.getDrawingRect(r); 738245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka requestRectangleOnScreen(r); 748245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 758245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 768245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 778245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 788245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 798245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); 808245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 818245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 828245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); 838245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 848245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 858245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { 868245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions"); 878245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 888245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 898245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka final int count = getChildCount(); 908245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka for (int i = 0; i < count; i++) { 918245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka View child = getChildAt(i); 928245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka PagedViewCellLayout.LayoutParams lp = 938245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka (PagedViewCellLayout.LayoutParams) child.getLayoutParams(); 94e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler lp.setup(getContext(), 95e4f9891f01bdc10d8f96e4e2429e2f4d0558238bDaniel Sandler mCellWidth, mCellHeight, mWidthGap, mHeightGap, 969bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka getPaddingLeft(), 979bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka getPaddingTop()); 988245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 998245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, 1008245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka MeasureSpec.EXACTLY); 1018245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height, 1028245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka MeasureSpec.EXACTLY); 1038245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1048245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka child.measure(childWidthMeasureSpec, childheightMeasureSpec); 1058245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1068245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1078245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka setMeasuredDimension(widthSpecSize, heightSpecSize); 1088245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1098245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1108245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 1118245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka protected void onLayout(boolean changed, int l, int t, int r, int b) { 1128245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int count = getChildCount(); 1138245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1148245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int offsetX = 0; 1159bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka if (mCenterContent && count > 0) { 1168245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka // determine the max width of all the rows and center accordingly 1179bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka int maxRowX = 0; 1189bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka int minRowX = Integer.MAX_VALUE; 1198245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka for (int i = 0; i < count; i++) { 1208245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka View child = getChildAt(i); 1218245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka if (child.getVisibility() != GONE) { 1228245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka PagedViewCellLayout.LayoutParams lp = 1238245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka (PagedViewCellLayout.LayoutParams) child.getLayoutParams(); 1249bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka minRowX = Math.min(minRowX, lp.x); 1259bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka maxRowX = Math.max(maxRowX, lp.x + lp.width); 1268245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1278245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1289bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka int maxRowWidth = maxRowX - minRowX; 1299bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka offsetX = (getMeasuredWidth() - maxRowWidth) / 2; 1308245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1318245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1328245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka for (int i = 0; i < count; i++) { 1338245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka View child = getChildAt(i); 1348245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka if (child.getVisibility() != GONE) { 1358245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka PagedViewCellLayout.LayoutParams lp = 1368245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka (PagedViewCellLayout.LayoutParams) child.getLayoutParams(); 1378245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1388245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int childLeft = offsetX + lp.x; 1398245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int childTop = lp.y; 1408245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height); 1418245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1428245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1438245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1448245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1458245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void enableCenteredContent(boolean enabled) { 1468245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mCenterContent = enabled; 1478245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1488245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1498245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 1508245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka protected void setChildrenDrawingCacheEnabled(boolean enabled) { 1518245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka final int count = getChildCount(); 1528245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka for (int i = 0; i < count; i++) { 1538245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka final View view = getChildAt(i); 1548245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka view.setDrawingCacheEnabled(enabled); 1558245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka // Update the drawing caches 1568245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka if (!view.isHardwareAccelerated()) { 1578245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka view.buildDrawingCache(true); 1588245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1598245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1608245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1618245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka} 162