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