ShortcutAndWidgetContainer.java revision 2801cafe62653131fdc9da402e5c44e5ffd0bf47
18c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka/* 28c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * Copyright (C) 2008 The Android Open Source Project 38c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * 48c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * Licensed under the Apache License, Version 2.0 (the "License"); 58c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * you may not use this file except in compliance with the License. 68c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * You may obtain a copy of the License at 78c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * 88c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * http://www.apache.org/licenses/LICENSE-2.0 98c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * 108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * Unless required by applicable law or agreed to in writing, software 118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * distributed under the License is distributed on an "AS IS" BASIS, 128c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * See the License for the specific language governing permissions and 148c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * limitations under the License. 158c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka */ 168c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 178c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkapackage com.android.launcher2; 188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 198c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.app.WallpaperManager; 208c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.content.Context; 218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.graphics.Rect; 228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.view.View; 23cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkaimport android.view.ViewGroup; 248c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 25cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkapublic class CellLayoutChildren extends ViewGroup { 268c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka static final String TAG = "CellLayoutChildren"; 278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 288c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // These are temporary variables to prevent having to allocate a new object just to 298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // return an (x, y) value from helper functions. Do NOT use them to maintain other state. 308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private final int[] mTmpCellXY = new int[2]; 318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private final WallpaperManager mWallpaperManager; 338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 34d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private int mCellWidth; 35d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private int mCellHeight; 36d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private int mWidthGap; 388c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private int mHeightGap; 398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 408c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public CellLayoutChildren(Context context) { 418c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super(context); 428c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mWallpaperManager = WallpaperManager.getInstance(context); 432801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 442801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen 452801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen public void enableHardwareLayers() { 46bdb5c5342adc550559fd723af461e53248f2fba8Michael Jurka setLayerType(LAYER_TYPE_HARDWARE, null); 478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 488c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 497f4eabe3709a72b416569136e4a095431c493c8bAdam Cohen public void setCellDimensions(int cellWidth, int cellHeight, int widthGap, int heightGap ) { 508c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mCellWidth = cellWidth; 518c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mCellHeight = cellHeight; 528c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mWidthGap = widthGap; 538c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mHeightGap = heightGap; 548c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 558c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public View getChildAt(int x, int y) { 578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int count = getChildCount(); 588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka View child = getChildAt(i); 608c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 618c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if ((lp.cellX <= x) && (x < lp.cellX + lp.cellHSpan) && 63f579b5041afe8272c79f9f13001120d37eeeee7bAdam Cohen (lp.cellY <= y) && (y < lp.cellY + lp.cellVSpan)) { 648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka return child; 658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka return null; 688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 698c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 708c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 718c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 728c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int count = getChildCount(); 738c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 748c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka View child = getChildAt(i); 75d5e42733799817d11d739b0a882da8dda721126dAdam Cohen measureChild(child); 768c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 778c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 788c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 798c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka setMeasuredDimension(widthSpecSize, heightSpecSize); 808c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 818c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 82d5e42733799817d11d739b0a882da8dda721126dAdam Cohen public void measureChild(View child) { 83d5e42733799817d11d739b0a882da8dda721126dAdam Cohen final int cellWidth = mCellWidth; 84d5e42733799817d11d739b0a882da8dda721126dAdam Cohen final int cellHeight = mCellHeight; 85d5e42733799817d11d739b0a882da8dda721126dAdam Cohen CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 86d5e42733799817d11d739b0a882da8dda721126dAdam Cohen 877f4eabe3709a72b416569136e4a095431c493c8bAdam Cohen lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap); 88d5e42733799817d11d739b0a882da8dda721126dAdam Cohen int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); 89d5e42733799817d11d739b0a882da8dda721126dAdam Cohen int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height, 90d5e42733799817d11d739b0a882da8dda721126dAdam Cohen MeasureSpec.EXACTLY); 91d5e42733799817d11d739b0a882da8dda721126dAdam Cohen 92d5e42733799817d11d739b0a882da8dda721126dAdam Cohen child.measure(childWidthMeasureSpec, childheightMeasureSpec); 93d5e42733799817d11d739b0a882da8dda721126dAdam Cohen } 94d5e42733799817d11d739b0a882da8dda721126dAdam Cohen 958c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 968c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void onLayout(boolean changed, int l, int t, int r, int b) { 978c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int count = getChildCount(); 988c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 998c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final View child = getChildAt(i); 1008c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (child.getVisibility() != GONE) { 1018c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 1028c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1038c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int childLeft = lp.x; 1048c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int childTop = lp.y; 1058c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height); 1068c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1078c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (lp.dropped) { 1088c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka lp.dropped = false; 1098c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int[] cellXY = mTmpCellXY; 1118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka getLocationOnScreen(cellXY); 1128c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mWallpaperManager.sendWallpaperCommand(getWindowToken(), 1138c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka WallpaperManager.COMMAND_DROP, 1148c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka cellXY[0] + childLeft + lp.width / 2, 1158c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka cellXY[1] + childTop + lp.height / 2, 0, null); 1168c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1178c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (lp.animateDrop) { 1188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka lp.animateDrop = false; 1198c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1208c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // This call does not result in a requestLayout(), but at one point did. 1218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // We need to be cautious about any method calls within the layout pass 1228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // to insure we don't leave the view tree in a bad state. 1238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka ((Workspace) mParent.getParent()).animateViewIntoPosition(child); 1248c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1258c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1268c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1288c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public void requestChildFocus(View child, View focused) { 1328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super.requestChildFocus(child, focused); 1338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (child != null) { 1348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka Rect r = new Rect(); 1358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.getDrawingRect(r); 1368c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka requestRectangleOnScreen(r); 1378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1388c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1408c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1418c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public void cancelLongPress() { 1428c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super.cancelLongPress(); 1438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1448c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // Cancel long press for all children 1458c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int count = getChildCount(); 1468c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 1478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final View child = getChildAt(i); 1488c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.cancelLongPress(); 1498c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1508c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1518c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1528c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1538c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void setChildrenDrawingCacheEnabled(boolean enabled) { 1548c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int count = getChildCount(); 1558c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 1568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final View view = getChildAt(i); 1578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka view.setDrawingCacheEnabled(enabled); 1588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // Update the drawing caches 1598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (!view.isHardwareAccelerated()) { 1608c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka view.buildDrawingCache(true); 1618c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1638c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void setChildrenDrawnWithCacheEnabled(boolean enabled) { 1678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super.setChildrenDrawnWithCacheEnabled(enabled); 1688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 169d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen} 170