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