/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.systemui.qs; import android.content.Context; import android.graphics.Point; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import com.android.systemui.R; import com.android.systemui.qs.customize.QSCustomizer; /** * Wrapper view with background which contains {@link QSPanel} and {@link BaseStatusBarHeader} */ public class QSContainerImpl extends FrameLayout { private final Point mSizePoint = new Point(); private int mHeightOverride = -1; protected View mQSPanel; private View mQSDetail; protected View mHeader; protected float mQsExpansion; private QSCustomizer mQSCustomizer; private QSFooter mQSFooter; private int mGutterHeight; private View mBackground; private float mFullElevation; public QSContainerImpl(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); mQSPanel = findViewById(R.id.quick_settings_panel); mQSDetail = findViewById(R.id.qs_detail); mHeader = findViewById(R.id.header); mQSCustomizer = findViewById(R.id.qs_customize); mQSFooter = findViewById(R.id.qs_footer); mBackground = findViewById(R.id.qs_background); mGutterHeight = getContext().getResources().getDimensionPixelSize(R.dimen.qs_gutter_height); mFullElevation = mQSPanel.getElevation(); setClickable(true); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); } @Override public boolean performClick() { // Want to receive clicks so missing QQS tiles doesn't cause collapse, but // don't want to do anything with them. return true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Since we control our own bottom, be whatever size we want. // Otherwise the QSPanel ends up with 0 height when the window is only the // size of the status bar. mQSPanel.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec( MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED)); int width = mQSPanel.getMeasuredWidth(); LayoutParams layoutParams = (LayoutParams) mQSPanel.getLayoutParams(); int height = layoutParams.topMargin + layoutParams.bottomMargin + mQSPanel.getMeasuredHeight(); super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); // QSCustomizer will always be the height of the screen, but do this after // other measuring to avoid changing the height of the QS. getDisplay().getRealSize(mSizePoint); mQSCustomizer.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(mSizePoint.y, MeasureSpec.EXACTLY)); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); updateExpansion(); } /** * Overrides the height of this view (post-layout), so that the content is clipped to that * height and the background is set to that height. * * @param heightOverride the overridden height */ public void setHeightOverride(int heightOverride) { mHeightOverride = heightOverride; updateExpansion(); } public void updateExpansion() { int height = calculateContainerHeight(); int gutterHeight = Math.round(mQsExpansion * mGutterHeight); setBottom(getTop() + height + gutterHeight); mQSDetail.setBottom(getTop() + height); mBackground.setBottom(getTop() + height); // Pin QS Footer to the bottom of the panel. mQSFooter.setTranslationY(height - mQSFooter.getHeight()); float elevation = mQsExpansion * mFullElevation; mQSDetail.setElevation(elevation); mBackground.setElevation(elevation); mQSFooter.setElevation(elevation); mQSPanel.setElevation(elevation); } protected int calculateContainerHeight() { int heightOverride = mHeightOverride != -1 ? mHeightOverride : getMeasuredHeight(); return mQSCustomizer.isCustomizing() ? mQSCustomizer.getHeight() : Math.round(mQsExpansion * (heightOverride - mHeader.getHeight())) + mHeader.getHeight(); } public void setExpansion(float expansion) { mQsExpansion = expansion; updateExpansion(); } public void setGutterEnabled(boolean gutterEnabled) { if (gutterEnabled == (mGutterHeight != 0)) { return; } if (gutterEnabled) { mGutterHeight = getContext().getResources().getDimensionPixelSize( R.dimen.qs_gutter_height); } else { mGutterHeight = 0; } updateExpansion(); } }