/* * Copyright (C) 2016 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.support.design.snackbar; import android.support.design.R; import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP; import android.content.Context; import android.content.res.TypedArray; import android.support.annotation.RestrictTo; import android.support.v4.view.ViewCompat; import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; /** @hide */ @RestrictTo(LIBRARY_GROUP) public class SnackbarContentLayout extends LinearLayout implements ContentViewCallback { private TextView messageView; private Button actionView; private int maxWidth; private int maxInlineActionWidth; public SnackbarContentLayout(Context context) { this(context, null); } public SnackbarContentLayout(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SnackbarLayout); maxWidth = a.getDimensionPixelSize(R.styleable.SnackbarLayout_android_maxWidth, -1); maxInlineActionWidth = a.getDimensionPixelSize(R.styleable.SnackbarLayout_maxActionInlineWidth, -1); a.recycle(); } @Override protected void onFinishInflate() { super.onFinishInflate(); messageView = findViewById(R.id.snackbar_text); actionView = findViewById(R.id.snackbar_action); } public TextView getMessageView() { return messageView; } public Button getActionView() { return actionView; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (maxWidth > 0 && getMeasuredWidth() > maxWidth) { widthMeasureSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } final int multiLineVPadding = getResources().getDimensionPixelSize(R.dimen.design_snackbar_padding_vertical_2lines); final int singleLineVPadding = getResources().getDimensionPixelSize(R.dimen.design_snackbar_padding_vertical); final boolean isMultiLine = messageView.getLayout().getLineCount() > 1; boolean remeasure = false; if (isMultiLine && maxInlineActionWidth > 0 && actionView.getMeasuredWidth() > maxInlineActionWidth) { if (updateViewsWithinLayout( VERTICAL, multiLineVPadding, multiLineVPadding - singleLineVPadding)) { remeasure = true; } } else { final int messagePadding = isMultiLine ? multiLineVPadding : singleLineVPadding; if (updateViewsWithinLayout(HORIZONTAL, messagePadding, messagePadding)) { remeasure = true; } } if (remeasure) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } private boolean updateViewsWithinLayout( final int orientation, final int messagePadTop, final int messagePadBottom) { boolean changed = false; if (orientation != getOrientation()) { setOrientation(orientation); changed = true; } if (messageView.getPaddingTop() != messagePadTop || messageView.getPaddingBottom() != messagePadBottom) { updateTopBottomPadding(messageView, messagePadTop, messagePadBottom); changed = true; } return changed; } private static void updateTopBottomPadding(View view, int topPadding, int bottomPadding) { if (ViewCompat.isPaddingRelative(view)) { ViewCompat.setPaddingRelative( view, ViewCompat.getPaddingStart(view), topPadding, ViewCompat.getPaddingEnd(view), bottomPadding); } else { view.setPadding(view.getPaddingLeft(), topPadding, view.getPaddingRight(), bottomPadding); } } @Override public void animateContentIn(int delay, int duration) { messageView.setAlpha(0f); messageView.animate().alpha(1f).setDuration(duration).setStartDelay(delay).start(); if (actionView.getVisibility() == VISIBLE) { actionView.setAlpha(0f); actionView.animate().alpha(1f).setDuration(duration).setStartDelay(delay).start(); } } @Override public void animateContentOut(int delay, int duration) { messageView.setAlpha(1f); messageView.animate().alpha(0f).setDuration(duration).setStartDelay(delay).start(); if (actionView.getVisibility() == VISIBLE) { actionView.setAlpha(1f); actionView.animate().alpha(0f).setDuration(duration).setStartDelay(delay).start(); } } }