1e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet/*
2e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * Copyright (C) 2012 The Android Open Source Project
3e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet *
4e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
5e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * you may not use this file except in compliance with the License.
6e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * You may obtain a copy of the License at
7e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet *
8e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
9e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet *
10e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
11e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
12e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * See the License for the specific language governing permissions and
14e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * limitations under the License.
15e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet */
16e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
17e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetpackage android.support.v7.widget;
18e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
19e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.content.Context;
20e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.os.Build;
21e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.util.AttributeSet;
22e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.view.View;
23e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
24e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet/**
25e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * Custom ViewGroup providing some services to the support implementation of GridLayout.
26e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet *
27e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet */
28e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetabstract class ViewGroup extends android.view.ViewGroup {
29e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
30e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    public ViewGroup(Context context, AttributeSet attrs, int defStyle) {
31e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        super(context, attrs, defStyle);
32e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
33e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
34e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    protected static final int MEASURED_STATE_TOO_SMALL = 0x01000000;
35e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
36e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
37e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * Bits of {@link #getMeasuredWidthAndState()} and
38e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * {@link #getMeasuredWidthAndState()} that provide the additional state bits.
39e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
40e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    protected static final int MEASURED_STATE_MASK = 0xff000000;
41e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
42e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
43e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * Utility to reconcile a desired size and state, with constraints imposed
44e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * by a MeasureSpec.  Will take the desired size, unless a different size
45e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * is imposed by the constraints.  The returned value is a compound integer,
46e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * with the resolved size in the {@link #MEASURED_SIZE_MASK} bits and
47e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * optionally the bit {@link #MEASURED_STATE_TOO_SMALL} set if the resulting
48e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * size is smaller than the size the view wants to be.
49e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     *
50e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * @param size How big the view wants to be
51e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * @param measureSpec Constraints imposed by the parent
52e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * @return Size information bit mask as defined by
53e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * {@link #MEASURED_SIZE_MASK} and {@link #MEASURED_STATE_TOO_SMALL}.
54e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
55e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
56e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        if (Build.VERSION.SDK_INT >= 11) {
57e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            return View.resolveSizeAndState(size, measureSpec, childMeasuredState);
58e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        }
59e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        int result = size;
60e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        int specMode = MeasureSpec.getMode(measureSpec);
61e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        int specSize =  MeasureSpec.getSize(measureSpec);
62e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        switch (specMode) {
63e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        case MeasureSpec.UNSPECIFIED:
64e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            result = size;
65e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            break;
66e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        case MeasureSpec.AT_MOST:
67e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            if (specSize < size) {
68e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                result = specSize | MEASURED_STATE_TOO_SMALL;
69e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            } else {
70e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                result = size;
71e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            }
72e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            break;
73e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        case MeasureSpec.EXACTLY:
74e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            result = specSize;
75e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            break;
76e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        }
77e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        return result | (childMeasuredState&MEASURED_STATE_MASK);
78e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
79e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
80e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    protected static boolean isLayoutRtl(View view) {
81e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        return false;
82e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
83e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet}
84