1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.messaging.ui;
17 
18 import android.content.Context;
19 import android.content.res.TypedArray;
20 import android.util.AttributeSet;
21 import android.widget.ScrollView;
22 
23 import com.android.messaging.R;
24 
25 /**
26  * A ScrollView that limits the maximum height that it can take. This is to work around android
27  * layout's limitation of not having android:maxHeight.
28  */
29 public class MaxHeightScrollView extends ScrollView {
30     private static final int NO_MAX_HEIGHT = -1;
31 
32     private final int mMaxHeight;
33 
MaxHeightScrollView(final Context context, final AttributeSet attrs)34     public MaxHeightScrollView(final Context context, final AttributeSet attrs) {
35         super(context, attrs);
36         final TypedArray attr = context.obtainStyledAttributes(attrs,
37                 R.styleable.MaxHeightScrollView, 0, 0);
38         mMaxHeight = attr.getDimensionPixelSize(R.styleable.MaxHeightScrollView_android_maxHeight,
39                 NO_MAX_HEIGHT);
40         attr.recycle();
41     }
42 
43     @Override
onMeasure(final int widthMeasureSpec, final int heightMeasureSpec)44     protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
45         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
46         if (mMaxHeight != NO_MAX_HEIGHT) {
47             setMeasuredDimension(getMeasuredWidth(), Math.min(getMeasuredHeight(), mMaxHeight));
48         }
49     }
50 }