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