16573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk/*
26573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * Copyright (C) 2016 The Android Open Source Project
36573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk *
46573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
56573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * except in compliance with the License. You may obtain a copy of the License at
66573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk *
76573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk *      http://www.apache.org/licenses/LICENSE-2.0
86573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk *
96573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * Unless required by applicable law or agreed to in writing, software distributed under the
106573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
116573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * KIND, either express or implied. See the License for the specific language governing
126573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk * permissions and limitations under the License.
136573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk */
146573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
156573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkpackage com.android.systemui;
166573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
176573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.content.Context;
186573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.content.res.Configuration;
196573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.content.res.TypedArray;
206573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.graphics.Canvas;
216573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.util.AttributeSet;
226573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.view.View;
236573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkimport android.view.ViewGroup.LayoutParams;
246573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
256573ef20790b0438cfd60c6306e58db0ef85c31bJason Monkpublic class ResizingSpace extends View {
266573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
276573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    private final int mWidth;
286573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    private final int mHeight;
296573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
306573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    public ResizingSpace(Context context, AttributeSet attrs) {
316573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        super(context, attrs);
326573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        if (getVisibility() == VISIBLE) {
336573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            setVisibility(INVISIBLE);
346573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        }
356573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        TypedArray a = context.obtainStyledAttributes(attrs, android.R.styleable.ViewGroup_Layout);
366573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        mWidth = a.getResourceId(android.R.styleable.ViewGroup_Layout_layout_width, 0);
376573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        mHeight = a.getResourceId(android.R.styleable.ViewGroup_Layout_layout_height, 0);
386573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    }
396573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
406573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    @Override
416573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    protected void onConfigurationChanged(Configuration newConfig) {
426573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        super.onConfigurationChanged(newConfig);
436573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        LayoutParams params = getLayoutParams();
446573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        boolean changed = false;
456573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        if (mWidth > 0) {
466573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            int width = getContext().getResources().getDimensionPixelOffset(mWidth);
476573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            if (width != params.width) {
486573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                params.width = width;
496573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                changed = true;
506573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            }
516573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        }
526573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        if (mHeight > 0) {
536573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            int height = getContext().getResources().getDimensionPixelOffset(mHeight);
546573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            if (height != params.height) {
556573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                params.height = height;
566573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                changed = true;
576573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            }
586573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        }
596573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        if (changed) {
606573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            setLayoutParams(params);
616573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        }
626573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    }
636573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
646573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    /**
656573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     * Draw nothing.
666573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     *
676573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     * @param canvas an unused parameter.
686573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     */
696573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    @Override
706573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    public void draw(Canvas canvas) {
716573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    }
726573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
736573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    /**
746573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     * Compare to: {@link View#getDefaultSize(int, int)}
756573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     * If mode is AT_MOST, return the child size instead of the parent size
766573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     * (unless it is too big).
776573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk     */
786573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    private static int getDefaultSize2(int size, int measureSpec) {
796573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        int result = size;
806573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        int specMode = MeasureSpec.getMode(measureSpec);
816573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        int specSize = MeasureSpec.getSize(measureSpec);
826573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
836573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        switch (specMode) {
846573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            case MeasureSpec.UNSPECIFIED:
856573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                result = size;
866573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                break;
876573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            case MeasureSpec.AT_MOST:
886573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                result = Math.min(size, specSize);
896573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                break;
906573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk            case MeasureSpec.EXACTLY:
916573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                result = specSize;
926573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                break;
936573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        }
946573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        return result;
956573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    }
966573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
976573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    @Override
986573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
996573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk        setMeasuredDimension(
1006573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                getDefaultSize2(getSuggestedMinimumWidth(), widthMeasureSpec),
1016573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk                getDefaultSize2(getSuggestedMinimumHeight(), heightMeasureSpec));
1026573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk    }
1036573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk
1046573ef20790b0438cfd60c6306e58db0ef85c31bJason Monk}
105