1e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet/*
2e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * Copyright (C) 2011 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.graphics.Canvas;
21e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.util.AttributeSet;
22e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.view.View;
23e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetimport android.view.ViewGroup;
24e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
25e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet/**
26e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * Space is a lightweight View subclass that may be used to create gaps between components
27e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet * in general purpose layouts.
28e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet */
29e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohetpublic final class Space extends View {
30e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
31e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * {@inheritDoc}
32e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
33e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    public Space(Context context, AttributeSet attrs, int defStyle) {
34e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        super(context, attrs, defStyle);
35e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        if (getVisibility() == VISIBLE) {
36e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            setVisibility(INVISIBLE);
37e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        }
38e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
39e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
40e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
41e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * {@inheritDoc}
42e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
43e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    public Space(Context context, AttributeSet attrs) {
44e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        this(context, attrs, 0);
45e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
46e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
47e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
48e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * {@inheritDoc}
49e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
50e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    public Space(Context context) {
51e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        //noinspection NullableProblems
52e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        this(context, null);
53e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
54e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
55e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
56e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * Draw nothing.
57e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     *
58e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * @param canvas an unused parameter.
59e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
60e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    @Override
61e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    public void draw(Canvas canvas) {
62e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
63e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
64e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    /**
65e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * Compare to: {@link View#getDefaultSize(int, int)}
66e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * If mode is AT_MOST, return the child size instead of the parent size
67e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     * (unless it is too big).
68e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet     */
69e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    private static int getDefaultSize2(int size, int measureSpec) {
70e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        int result = size;
71e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        int specMode = MeasureSpec.getMode(measureSpec);
72e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        int specSize = MeasureSpec.getSize(measureSpec);
73e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
74e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        switch (specMode) {
75e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            case MeasureSpec.UNSPECIFIED:
76e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                result = size;
77e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                break;
78e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            case MeasureSpec.AT_MOST:
79e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                result = Math.min(size, specSize);
80e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                break;
81e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet            case MeasureSpec.EXACTLY:
82e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                result = specSize;
83e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                break;
84e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        }
85e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        return result;
86e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
87e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet
88e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    @Override
89e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
90e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet        setMeasuredDimension(
91e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec),
92e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet                getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec));
93e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet    }
94e1feb53bd8abfa46613fdd0abcf7a015c7e706c1Xavier Ducrohet}
95