1/* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.launcher2; 18 19import android.app.WallpaperManager; 20import android.content.Context; 21import android.graphics.Rect; 22import android.view.View; 23import android.view.ViewGroup; 24 25public class CellLayoutChildren extends ViewGroup { 26 static final String TAG = "CellLayoutChildren"; 27 28 // These are temporary variables to prevent having to allocate a new object just to 29 // return an (x, y) value from helper functions. Do NOT use them to maintain other state. 30 private final int[] mTmpCellXY = new int[2]; 31 32 private final WallpaperManager mWallpaperManager; 33 34 private int mCellWidth; 35 private int mCellHeight; 36 37 private int mWidthGap; 38 private int mHeightGap; 39 40 public CellLayoutChildren(Context context) { 41 super(context); 42 mWallpaperManager = WallpaperManager.getInstance(context); 43 } 44 45 public void enableHardwareLayers() { 46 setLayerType(LAYER_TYPE_HARDWARE, null); 47 } 48 49 public void setCellDimensions(int cellWidth, int cellHeight, int widthGap, int heightGap ) { 50 mCellWidth = cellWidth; 51 mCellHeight = cellHeight; 52 mWidthGap = widthGap; 53 mHeightGap = heightGap; 54 } 55 56 public View getChildAt(int x, int y) { 57 final int count = getChildCount(); 58 for (int i = 0; i < count; i++) { 59 View child = getChildAt(i); 60 CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 61 62 if ((lp.cellX <= x) && (x < lp.cellX + lp.cellHSpan) && 63 (lp.cellY <= y) && (y < lp.cellY + lp.cellVSpan)) { 64 return child; 65 } 66 } 67 return null; 68 } 69 70 @Override 71 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 72 int count = getChildCount(); 73 for (int i = 0; i < count; i++) { 74 View child = getChildAt(i); 75 measureChild(child); 76 } 77 int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 78 int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 79 setMeasuredDimension(widthSpecSize, heightSpecSize); 80 } 81 82 public void setupLp(CellLayout.LayoutParams lp) { 83 lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap); 84 } 85 86 public void measureChild(View child) { 87 final int cellWidth = mCellWidth; 88 final int cellHeight = mCellHeight; 89 CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 90 91 lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap); 92 int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); 93 int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height, 94 MeasureSpec.EXACTLY); 95 child.measure(childWidthMeasureSpec, childheightMeasureSpec); 96 } 97 98 @Override 99 protected void onLayout(boolean changed, int l, int t, int r, int b) { 100 int count = getChildCount(); 101 for (int i = 0; i < count; i++) { 102 final View child = getChildAt(i); 103 if (child.getVisibility() != GONE) { 104 CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams(); 105 106 int childLeft = lp.x; 107 int childTop = lp.y; 108 child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height); 109 110 if (lp.dropped) { 111 lp.dropped = false; 112 113 final int[] cellXY = mTmpCellXY; 114 getLocationOnScreen(cellXY); 115 mWallpaperManager.sendWallpaperCommand(getWindowToken(), 116 WallpaperManager.COMMAND_DROP, 117 cellXY[0] + childLeft + lp.width / 2, 118 cellXY[1] + childTop + lp.height / 2, 0, null); 119 } 120 } 121 } 122 } 123 124 @Override 125 public boolean shouldDelayChildPressedState() { 126 return false; 127 } 128 129 @Override 130 public void requestChildFocus(View child, View focused) { 131 super.requestChildFocus(child, focused); 132 if (child != null) { 133 Rect r = new Rect(); 134 child.getDrawingRect(r); 135 requestRectangleOnScreen(r); 136 } 137 } 138 139 @Override 140 public void cancelLongPress() { 141 super.cancelLongPress(); 142 143 // Cancel long press for all children 144 final int count = getChildCount(); 145 for (int i = 0; i < count; i++) { 146 final View child = getChildAt(i); 147 child.cancelLongPress(); 148 } 149 } 150 151 @Override 152 protected void setChildrenDrawingCacheEnabled(boolean enabled) { 153 final int count = getChildCount(); 154 for (int i = 0; i < count; i++) { 155 final View view = getChildAt(i); 156 view.setDrawingCacheEnabled(enabled); 157 // Update the drawing caches 158 if (!view.isHardwareAccelerated() && enabled) { 159 view.buildDrawingCache(true); 160 } 161 } 162 } 163 164 @Override 165 protected void setChildrenDrawnWithCacheEnabled(boolean enabled) { 166 super.setChildrenDrawnWithCacheEnabled(enabled); 167 } 168} 169