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 
17 package com.android.launcher2;
18 
19 import android.content.Context;
20 import android.view.MotionEvent;
21 import android.view.View;
22 import android.widget.FrameLayout;
23 import android.widget.GridLayout;
24 
25 /**
26  * The grid based layout used strictly for the widget/wallpaper tab of the AppsCustomize pane
27  */
28 public 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 
PagedViewGridLayout(Context context, int cellCountX, int cellCountY)35     public PagedViewGridLayout(Context context, int cellCountX, int cellCountY) {
36         super(context, null, 0);
37         mCellCountX = cellCountX;
38         mCellCountY = cellCountY;
39     }
40 
getCellCountX()41     int getCellCountX() {
42         return mCellCountX;
43     }
44 
getCellCountY()45     int getCellCountY() {
46         return mCellCountY;
47     }
48 
49     /**
50      * Clears all the key listeners for the individual widgets.
51      */
resetChildrenOnKeyListeners()52     public void resetChildrenOnKeyListeners() {
53         int childCount = getChildCount();
54         for (int j = 0; j < childCount; ++j) {
55             getChildAt(j).setOnKeyListener(null);
56         }
57     }
58 
onMeasure(int widthMeasureSpec, int heightMeasureSpec)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
onDetachedFromWindow()72     protected void onDetachedFromWindow() {
73         super.onDetachedFromWindow();
74         mOnLayoutListener = null;
75     }
76 
setOnLayoutListener(Runnable r)77     public void setOnLayoutListener(Runnable r) {
78         mOnLayoutListener = r;
79     }
80 
onLayout(boolean changed, int left, int top, int right, int bottom)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
onTouchEvent(MotionEvent event)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
removeAllViewsOnPage()102     public void removeAllViewsOnPage() {
103         removeAllViews();
104         mOnLayoutListener = null;
105         setLayerType(LAYER_TYPE_NONE, null);
106     }
107 
108     @Override
removeViewOnPageAt(int index)109     public void removeViewOnPageAt(int index) {
110         removeViewAt(index);
111     }
112 
113     @Override
getPageChildCount()114     public int getPageChildCount() {
115         return getChildCount();
116     }
117 
118     @Override
getChildOnPageAt(int i)119     public View getChildOnPageAt(int i) {
120         return getChildAt(i);
121     }
122 
123     @Override
indexOfChildOnPage(View v)124     public int indexOfChildOnPage(View v) {
125         return indexOfChild(v);
126     }
127 
128     public static class LayoutParams extends FrameLayout.LayoutParams {
LayoutParams(int width, int height)129         public LayoutParams(int width, int height) {
130             super(width, height);
131         }
132     }
133 }
134