1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 *      http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui;
16
17import android.content.Context;
18import android.content.res.Configuration;
19import android.content.res.TypedArray;
20import android.graphics.Canvas;
21import android.util.AttributeSet;
22import android.view.View;
23import android.view.ViewGroup.LayoutParams;
24
25public class ResizingSpace extends View {
26
27    private final int mWidth;
28    private final int mHeight;
29
30    public ResizingSpace(Context context, AttributeSet attrs) {
31        super(context, attrs);
32        if (getVisibility() == VISIBLE) {
33            setVisibility(INVISIBLE);
34        }
35        TypedArray a = context.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
36        mWidth = a.getResourceId(android.R.styleable.ViewGroup_Layout_layout_width, 0);
37        mHeight = a.getResourceId(android.R.styleable.ViewGroup_Layout_layout_height, 0);
38    }
39
40    @Override
41    protected void onConfigurationChanged(Configuration newConfig) {
42        super.onConfigurationChanged(newConfig);
43        LayoutParams params = getLayoutParams();
44        boolean changed = false;
45        if (mWidth > 0) {
46            int width = getContext().getResources().getDimensionPixelOffset(mWidth);
47            if (width != params.width) {
48                params.width = width;
49                changed = true;
50            }
51        }
52        if (mHeight > 0) {
53            int height = getContext().getResources().getDimensionPixelOffset(mHeight);
54            if (height != params.height) {
55                params.height = height;
56                changed = true;
57            }
58        }
59        if (changed) {
60            setLayoutParams(params);
61        }
62    }
63
64    /**
65     * Draw nothing.
66     *
67     * @param canvas an unused parameter.
68     */
69    @Override
70    public void draw(Canvas canvas) {
71    }
72
73    /**
74     * Compare to: {@link View#getDefaultSize(int, int)}
75     * If mode is AT_MOST, return the child size instead of the parent size
76     * (unless it is too big).
77     */
78    private static int getDefaultSize2(int size, int measureSpec) {
79        int result = size;
80        int specMode = MeasureSpec.getMode(measureSpec);
81        int specSize = MeasureSpec.getSize(measureSpec);
82
83        switch (specMode) {
84            case MeasureSpec.UNSPECIFIED:
85                result = size;
86                break;
87            case MeasureSpec.AT_MOST:
88                result = Math.min(size, specSize);
89                break;
90            case MeasureSpec.EXACTLY:
91                result = specSize;
92                break;
93        }
94        return result;
95    }
96
97    @Override
98    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
99        setMeasuredDimension(
100                getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec),
101                getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec));
102    }
103
104}
105