18245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka/*
28245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * Copyright (C) 2010 The Android Open Source Project
38245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka *
48245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * Licensed under the Apache License, Version 2.0 (the "License");
58245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * you may not use this file except in compliance with the License.
68245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * You may obtain a copy of the License at
78245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka *
88245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka *      http://www.apache.org/licenses/LICENSE-2.0
98245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka *
108245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * Unless required by applicable law or agreed to in writing, software
118245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * distributed under the License is distributed on an "AS IS" BASIS,
128245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * See the License for the specific language governing permissions and
148245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * limitations under the License.
158245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka */
168245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
178245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkapackage com.android.launcher2;
188245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
198245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.content.Context;
208245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.graphics.Rect;
218245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.view.View;
228245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkaimport android.view.ViewGroup;
238245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
248245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka/**
258245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * An abstraction of the original CellLayout which supports laying out items
268245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * which span multiple cells into a grid-like layout.  Also supports dimming
278245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka * to give a preview of its contents.
288245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka */
298245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkapublic class PagedViewCellLayoutChildren extends ViewGroup {
308245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    static final String TAG = "PagedViewCellLayout";
318245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
328245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    private boolean mCenterContent;
338245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
348245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    private int mCellWidth;
358245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    private int mCellHeight;
368245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    private int mWidthGap;
378245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    private int mHeightGap;
388245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
398245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    public PagedViewCellLayoutChildren(Context context) {
408245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        super(context);
418245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
428245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
438245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    @Override
448245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    public void cancelLongPress() {
458245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        super.cancelLongPress();
468245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
478245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        // Cancel long press for all children
488245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        final int count = getChildCount();
498245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        for (int i = 0; i < count; i++) {
508245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            final View child = getChildAt(i);
518245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            child.cancelLongPress();
528245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
538245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
548245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
558245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    public void setGap(int widthGap, int heightGap) {
568245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        mWidthGap = widthGap;
578245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        mHeightGap = heightGap;
588245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        requestLayout();
598245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
608245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
618245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    public void setCellDimensions(int width, int height) {
628245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        mCellWidth = width;
638245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        mCellHeight = height;
648245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        requestLayout();
658245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
668245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
678245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    @Override
688245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    public void requestChildFocus(View child, View focused) {
698245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        super.requestChildFocus(child, focused);
708245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        if (child != null) {
718245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            Rect r = new Rect();
728245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            child.getDrawingRect(r);
738245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            requestRectangleOnScreen(r);
748245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
758245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
768245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
778245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    @Override
788245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
798245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
808245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
818245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
828245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
838245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);
848245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
858245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) {
868245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions");
878245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
888245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
898245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        final int count = getChildCount();
908245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        for (int i = 0; i < count; i++) {
918245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            View child = getChildAt(i);
928245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            PagedViewCellLayout.LayoutParams lp =
938245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                (PagedViewCellLayout.LayoutParams) child.getLayoutParams();
948245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap,
959bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka                    getPaddingLeft(),
969bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka                    getPaddingTop());
978245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
988245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width,
998245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                    MeasureSpec.EXACTLY);
1008245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
1018245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                    MeasureSpec.EXACTLY);
1028245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1038245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            child.measure(childWidthMeasureSpec, childheightMeasureSpec);
1048245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
1058245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1068245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        setMeasuredDimension(widthSpecSize, heightSpecSize);
1078245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
1088245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1098245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    @Override
1108245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    protected void onLayout(boolean changed, int l, int t, int r, int b) {
1118245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        int count = getChildCount();
1128245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1138245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        int offsetX = 0;
1149bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka        if (mCenterContent && count > 0) {
1158245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            // determine the max width of all the rows and center accordingly
1169bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka            int maxRowX = 0;
1179bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka            int minRowX = Integer.MAX_VALUE;
1188245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            for (int i = 0; i < count; i++) {
1198245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                View child = getChildAt(i);
1208245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                if (child.getVisibility() != GONE) {
1218245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                    PagedViewCellLayout.LayoutParams lp =
1228245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                        (PagedViewCellLayout.LayoutParams) child.getLayoutParams();
1239bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka                    minRowX = Math.min(minRowX, lp.x);
1249bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka                    maxRowX = Math.max(maxRowX, lp.x + lp.width);
1258245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                }
1268245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            }
1279bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka            int maxRowWidth = maxRowX - minRowX;
1289bfe2b2646f3849f5463c63876c184e820a7f03bMichael Jurka            offsetX = (getMeasuredWidth() - maxRowWidth) / 2;
1298245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
1308245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1318245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        for (int i = 0; i < count; i++) {
1328245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            View child = getChildAt(i);
1338245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            if (child.getVisibility() != GONE) {
1348245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                PagedViewCellLayout.LayoutParams lp =
1358245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                    (PagedViewCellLayout.LayoutParams) child.getLayoutParams();
1368245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1378245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                int childLeft = offsetX + lp.x;
1388245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                int childTop = lp.y;
1398245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);
1408245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            }
1418245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
1428245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
1438245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1448245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    public void enableCenteredContent(boolean enabled) {
1458245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        mCenterContent = enabled;
1468245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
1478245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka
1488245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    @Override
1498245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    protected void setChildrenDrawingCacheEnabled(boolean enabled) {
1508245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        final int count = getChildCount();
1518245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        for (int i = 0; i < count; i++) {
1528245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            final View view = getChildAt(i);
1538245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            view.setDrawingCacheEnabled(enabled);
1548245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            // Update the drawing caches
1558245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            if (!view.isHardwareAccelerated()) {
1568245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka                view.buildDrawingCache(true);
1578245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka            }
1588245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka        }
1598245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka    }
1608245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka}
161