ShortcutAndWidgetContainer.java revision d4844c3e731b00547a31f23a00f8bd4a271e2b62
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 19d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohenimport java.util.ArrayList; 20d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.app.WallpaperManager; 228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.content.Context; 238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.graphics.Rect; 24d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohenimport android.view.MotionEvent; 258c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.view.View; 26cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkaimport android.view.ViewGroup; 278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 28cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkapublic class CellLayoutChildren extends ViewGroup { 298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka static final String TAG = "CellLayoutChildren"; 308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // These are temporary variables to prevent having to allocate a new object just to 328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // return an (x, y) value from helper functions. Do NOT use them to maintain other state. 338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private final int[] mTmpCellXY = new int[2]; 348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private final WallpaperManager mWallpaperManager; 368c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private int mLeftPadding; 388c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private int mTopPadding; 398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 40d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private int mCellWidth; 41d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private int mCellHeight; 42d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private int mWidthGap; 448c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka private int mHeightGap; 458c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 468c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public CellLayoutChildren(Context context) { 478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super(context); 488c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mWallpaperManager = WallpaperManager.getInstance(context); 49bdb5c5342adc550559fd723af461e53248f2fba8Michael Jurka setLayerType(LAYER_TYPE_HARDWARE, null); 50be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung 51be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung // Disable multitouch for the workspace 52be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung setMotionEventSplittingEnabled(false); 538c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 548c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 558c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public void setCellDimensions(int cellWidth, int cellHeight, 568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int leftPadding, int topPadding, int widthGap, int heightGap ) { 578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mCellWidth = cellWidth; 588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mCellHeight = cellHeight; 598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mLeftPadding = leftPadding; 608c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mTopPadding = topPadding; 618c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mWidthGap = widthGap; 628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mHeightGap = heightGap; 638c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public View getChildAt(int x, int y) { 668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int count = getChildCount(); 678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka View child = getChildAt(i); 698c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 708c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 718c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if ((lp.cellX <= x) && (x < lp.cellX + lp.cellHSpan) && 728c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka (lp.cellY <= y) && (y < lp.cellY + lp.cellHSpan)) { 738c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka return child; 748c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 758c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 768c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka return null; 778c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 788c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 798c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 808c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 818c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int cellWidth = mCellWidth; 828c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int cellHeight = mCellHeight; 838c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int count = getChildCount(); 848c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 858c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka View child = getChildAt(i); 868c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 878c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 888c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap, 898c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mLeftPadding, mTopPadding); 908c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 918c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); 928c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height, 938c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka MeasureSpec.EXACTLY); 948c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 958c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.measure(childWidthMeasureSpec, childheightMeasureSpec); 968c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 978c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 988c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 998c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka setMeasuredDimension(widthSpecSize, heightSpecSize); 1008c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1018c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1028c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1038c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void onLayout(boolean changed, int l, int t, int r, int b) { 1048c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int count = getChildCount(); 1058c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 1068c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final View child = getChildAt(i); 1078c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (child.getVisibility() != GONE) { 1088c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 1098c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int childLeft = lp.x; 1118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka int childTop = lp.y; 1128c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height); 1138c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1148c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (lp.dropped) { 1158c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka lp.dropped = false; 1168c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1178c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int[] cellXY = mTmpCellXY; 1188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka getLocationOnScreen(cellXY); 1198c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka mWallpaperManager.sendWallpaperCommand(getWindowToken(), 1208c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka WallpaperManager.COMMAND_DROP, 1218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka cellXY[0] + childLeft + lp.width / 2, 1228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka cellXY[1] + childTop + lp.height / 2, 0, null); 1238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1248c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (lp.animateDrop) { 1258c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka lp.animateDrop = false; 1268c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // This call does not result in a requestLayout(), but at one point did. 1288c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // We need to be cautious about any method calls within the layout pass 1298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // to insure we don't leave the view tree in a bad state. 1308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka ((Workspace) mParent.getParent()).animateViewIntoPosition(child); 1318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1368c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1388c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public void requestChildFocus(View child, View focused) { 1398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super.requestChildFocus(child, focused); 1408c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (child != null) { 1418c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka Rect r = new Rect(); 1428c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.getDrawingRect(r); 1438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka requestRectangleOnScreen(r); 1448c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1458c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1468c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1488c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka public void cancelLongPress() { 1498c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super.cancelLongPress(); 1508c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1518c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // Cancel long press for all children 1528c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int count = getChildCount(); 1538c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 1548c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final View child = getChildAt(i); 1558c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka child.cancelLongPress(); 1568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1608c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void setChildrenDrawingCacheEnabled(boolean enabled) { 1618c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final int count = getChildCount(); 1628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka for (int i = 0; i < count; i++) { 1638c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka final View view = getChildAt(i); 1648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka view.setDrawingCacheEnabled(enabled); 1658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka // Update the drawing caches 1668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka if (!view.isHardwareAccelerated()) { 1678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka view.buildDrawingCache(true); 1688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1698c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1708c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 1718c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka 1728c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka @Override 1738c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka protected void setChildrenDrawnWithCacheEnabled(boolean enabled) { 1748c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka super.setChildrenDrawnWithCacheEnabled(enabled); 1758c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } 176d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 177d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private final ArrayList<AppWidgetResizeFrame> mResizeFrames = new ArrayList<AppWidgetResizeFrame>(); 178d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private AppWidgetResizeFrame mCurrentResizeFrame; 179d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private int mXDown, mYDown; 180d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen private boolean mIsWidgetBeingResized; 181d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 182d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen public void clearAllResizeFrames() { 183d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen for (AppWidgetResizeFrame frame: mResizeFrames) { 184d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen removeView(frame); 185d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 186d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mResizeFrames.clear(); 187d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 188d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 189d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen public boolean isWidgetBeingResized() { 190d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen return mIsWidgetBeingResized; 191d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 192d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 193d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen @Override 194d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen public boolean onInterceptTouchEvent(MotionEvent ev) { 195d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen Rect hitRect = new Rect(); 196d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 197d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen int x = (int) ev.getX(); 198d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen int y = (int) ev.getY(); 199d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 200d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (ev.getAction() == MotionEvent.ACTION_DOWN) { 201d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen for (AppWidgetResizeFrame child: mResizeFrames) { 202d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen child.getHitRect(hitRect); 203d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (hitRect.contains(x, y)) { 204d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) { 205d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mCurrentResizeFrame = child; 206d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mIsWidgetBeingResized = true; 207d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mXDown = x; 208d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mYDown = y; 209d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen requestDisallowInterceptTouchEvent(true); 210d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen return true; 211d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 212d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 213d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 214d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mCurrentResizeFrame = null; 215d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 216d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen return false; 217d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 218d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 219d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen @Override 220d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen public boolean onTouchEvent(MotionEvent ev) { 221d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen boolean handled = false; 222d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen Rect hitRect = new Rect(); 223d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen int action = ev.getAction(); 224d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 225d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen int x = (int) ev.getX(); 226d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen int y = (int) ev.getY(); 227d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 228d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (ev.getAction() == MotionEvent.ACTION_DOWN) { 229d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen for (AppWidgetResizeFrame child: mResizeFrames) { 230d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen child.getHitRect(hitRect); 231d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (hitRect.contains(x, y)) { 232d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) { 233d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mCurrentResizeFrame = child; 234d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mIsWidgetBeingResized = true; 235d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mXDown = x; 236d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mYDown = y; 237d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen requestDisallowInterceptTouchEvent(true); 238d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen return true; 239d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 240d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 241d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 242d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mCurrentResizeFrame = null; 243d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 244d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 245d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen // TODO: Need to handle ACTION_POINTER_UP / multi-touch 246d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen if (mCurrentResizeFrame != null) { 247d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen switch (action) { 248d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen case MotionEvent.ACTION_MOVE: 249d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mCurrentResizeFrame.visualizeResizeForDelta(x - mXDown, y - mYDown); 250d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen break; 251d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen case MotionEvent.ACTION_CANCEL: 252d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen case MotionEvent.ACTION_UP: { 253d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mCurrentResizeFrame.commitResizeForDelta(x - mXDown, y - mYDown); 254d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mIsWidgetBeingResized = false; 255d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen handled = true; 256d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 257d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 258d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 259d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen return handled; 260d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 261d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 262d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen public void addResizeFrame(ItemInfo itemInfo, LauncherAppWidgetHostView widget, CellLayout cellLayout) { 263d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen AppWidgetResizeFrame resizeFrame = new AppWidgetResizeFrame(getContext(), 264d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen itemInfo, widget, cellLayout); 265d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 266d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen CellLayout.LayoutParams lp = new CellLayout.LayoutParams(-1, -1, -1, -1); 267d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen lp.isLockedToGrid = false; 268d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 269d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen addView(resizeFrame, lp); 270d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen mResizeFrames.add(resizeFrame); 271d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 272d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen resizeFrame.snapToWidget(false); 273d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 274d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen} 275