diff options
Diffstat (limited to 'core/java/android/view/NotificationHeaderView.java')
| -rw-r--r-- | core/java/android/view/NotificationHeaderView.java | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java new file mode 100644 index 000000000000..659820fba33c --- /dev/null +++ b/core/java/android/view/NotificationHeaderView.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2015 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 android.view; + +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.LinearLayout; +import android.widget.RemoteViews; + +import com.android.internal.R; + +/** + * A header of a notification view + * + * @hide + */ +@RemoteViews.RemoteView +public class NotificationHeaderView extends LinearLayout { + private final int mHeaderMinWidth; + private View mAppName; + private View mSubTextView; + + public NotificationHeaderView(Context context) { + this(context, null); + } + + public NotificationHeaderView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public NotificationHeaderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public NotificationHeaderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + mHeaderMinWidth = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_header_shrink_min_width); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mAppName = findViewById(com.android.internal.R.id.app_name_text); + mSubTextView = findViewById(com.android.internal.R.id.header_sub_text); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int givenWidth = MeasureSpec.getSize(widthMeasureSpec); + final int givenHeight = MeasureSpec.getSize(heightMeasureSpec); + int wrapContentWidthSpec = MeasureSpec.makeMeasureSpec(givenWidth, + MeasureSpec.AT_MOST); + int wrapContentHeightSpec = MeasureSpec.makeMeasureSpec(givenHeight, + MeasureSpec.AT_MOST); + int totalWidth = getPaddingStart() + getPaddingEnd(); + for (int i = 0; i < getChildCount(); i++) { + final View child = getChildAt(i); + if (child.getVisibility() == GONE) { + // We'll give it the rest of the space in the end + continue; + } + final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); + int childWidthSpec = getChildMeasureSpec(wrapContentWidthSpec, + lp.leftMargin + lp.rightMargin, lp.width); + int childHeightSpec = getChildMeasureSpec(wrapContentHeightSpec, + lp.topMargin + lp.bottomMargin, lp.height); + child.measure(childWidthSpec, childHeightSpec); + totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth(); + } + if (totalWidth > givenWidth) { + int overFlow = totalWidth - givenWidth; + // We are overflowing, lets shrink + final int appWidth = mAppName.getMeasuredWidth(); + if (appWidth > mHeaderMinWidth) { + int newSize = appWidth - Math.min(appWidth - mHeaderMinWidth, overFlow); + int childWidthSpec = MeasureSpec.makeMeasureSpec(newSize, MeasureSpec.AT_MOST); + mAppName.measure(childWidthSpec, wrapContentHeightSpec); + overFlow -= appWidth - newSize; + } + if (overFlow > 0 && mSubTextView.getVisibility() != GONE) { + // we're still too big + final int subTextWidth = mSubTextView.getMeasuredWidth(); + int newSize = Math.max(0, subTextWidth - overFlow); + int childWidthSpec = MeasureSpec.makeMeasureSpec(newSize, MeasureSpec.AT_MOST); + mSubTextView.measure(childWidthSpec, wrapContentHeightSpec); + } + totalWidth = givenWidth; + } + setMeasuredDimension(totalWidth, givenHeight); + } +} |
