1/*
2 * Copyright (C) 2011 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.content.Context;
20import android.view.MotionEvent;
21import android.view.View;
22import android.widget.FrameLayout;
23import android.widget.GridLayout;
24
25/**
26 * The grid based layout used strictly for the widget/wallpaper tab of the AppsCustomize pane
27 */
28public class PagedViewGridLayout extends GridLayout implements Page {
29    static final String TAG = "PagedViewGridLayout";
30
31    private int mCellCountX;
32    private int mCellCountY;
33    private Runnable mOnLayoutListener;
34
35    public PagedViewGridLayout(Context context, int cellCountX, int cellCountY) {
36        super(context, null, 0);
37        mCellCountX = cellCountX;
38        mCellCountY = cellCountY;
39    }
40
41    int getCellCountX() {
42        return mCellCountX;
43    }
44
45    int getCellCountY() {
46        return mCellCountY;
47    }
48
49    /**
50     * Clears all the key listeners for the individual widgets.
51     */
52    public void resetChildrenOnKeyListeners() {
53        int childCount = getChildCount();
54        for (int j = 0; j < childCount; ++j) {
55            getChildAt(j).setOnKeyListener(null);
56        }
57    }
58
59    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
60        // PagedView currently has issues with different-sized pages since it calculates the
61        // offset of each page to scroll to before it updates the actual size of each page
62        // (which can change depending on the content if the contents aren't a fixed size).
63        // We work around this by having a minimum size on each widget page).
64        int widthSpecSize = Math.min(getSuggestedMinimumWidth(),
65                MeasureSpec.getSize(widthMeasureSpec));
66        int widthSpecMode = MeasureSpec.EXACTLY;
67        super.onMeasure(MeasureSpec.makeMeasureSpec(widthSpecSize, widthSpecMode),
68                heightMeasureSpec);
69    }
70
71    @Override
72    protected void onDetachedFromWindow() {
73        super.onDetachedFromWindow();
74        mOnLayoutListener = null;
75    }
76
77    public void setOnLayoutListener(Runnable r) {
78        mOnLayoutListener = r;
79    }
80
81    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
82        super.onLayout(changed, left, top, right, bottom);
83        if (mOnLayoutListener != null) {
84            mOnLayoutListener.run();
85        }
86    }
87
88    @Override
89    public boolean onTouchEvent(MotionEvent event) {
90        boolean result = super.onTouchEvent(event);
91        int count = getPageChildCount();
92        if (count > 0) {
93            // We only intercept the touch if we are tapping in empty space after the final row
94            View child = getChildOnPageAt(count - 1);
95            int bottom = child.getBottom();
96            result = result || (event.getY() < bottom);
97        }
98        return result;
99    }
100
101    @Override
102    public void removeAllViewsOnPage() {
103        removeAllViews();
104        mOnLayoutListener = null;
105        setLayerType(LAYER_TYPE_NONE, null);
106    }
107
108    @Override
109    public void removeViewOnPageAt(int index) {
110        removeViewAt(index);
111    }
112
113    @Override
114    public int getPageChildCount() {
115        return getChildCount();
116    }
117
118    @Override
119    public View getChildOnPageAt(int i) {
120        return getChildAt(i);
121    }
122
123    @Override
124    public int indexOfChildOnPage(View v) {
125        return indexOfChild(v);
126    }
127
128    public static class LayoutParams extends FrameLayout.LayoutParams {
129        public LayoutParams(int width, int height) {
130            super(width, height);
131        }
132    }
133}
134