1cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao/*
2cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * Copyright (C) 2014 Google Inc.
3cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * Licensed to The Android Open Source Project.
4cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao *
5cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * Licensed under the Apache License, Version 2.0 (the "License");
6cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * you may not use this file except in compliance with the License.
7cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * You may obtain a copy of the License at
8cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao *
9cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao *      http://www.apache.org/licenses/LICENSE-2.0
10cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao *
11cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * Unless required by applicable law or agreed to in writing, software
12cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * distributed under the License is distributed on an "AS IS" BASIS,
13cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * See the License for the specific language governing permissions and
15cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * limitations under the License.
16cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao */
17cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
18cfba4bb705440723bbc14a8371b75dcb82f79067Jin Caopackage com.android.mail.ui;
19cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
20cfba4bb705440723bbc14a8371b75dcb82f79067Jin Caoimport android.content.Context;
21cfba4bb705440723bbc14a8371b75dcb82f79067Jin Caoimport android.graphics.Rect;
22cfba4bb705440723bbc14a8371b75dcb82f79067Jin Caoimport android.util.AttributeSet;
23cfba4bb705440723bbc14a8371b75dcb82f79067Jin Caoimport android.widget.ListView;
24cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
25cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao/**
26cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * A list view that auto resizes depending on the height of the viewing frame. This means this
27cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao * list view will auto resize whenever the soft keyboard appears/disappears.
28cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao */
29cfba4bb705440723bbc14a8371b75dcb82f79067Jin Caopublic class AutoResizeListView extends ListView {
30cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    private final Rect mRect = new Rect();
31cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    private final int[] mCoords = new int[2];
32cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
33cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    public AutoResizeListView(Context context) {
34cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        this(context, null);
35cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    }
36cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
37cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    public AutoResizeListView(Context context, AttributeSet attrs) {
38cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        super(context, attrs);
39cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    }
40cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
41cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    @Override
42cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
43cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        getWindowVisibleDisplayFrame(mRect);
44cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        getLocationInWindow(mCoords);
45cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
46cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        // The desired height is the available height we have for VIEWING.
47cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        final int desiredHeight = mRect.bottom - mCoords[1];
48cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
49cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
50cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
51cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        // Measure height and obey the measure mode.
52cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        final int height;
53cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        if (heightMode == MeasureSpec.EXACTLY) {
54cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao            height = heightSize;
55cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        } else {
56cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao            // For AT_MOST and UNSPECIFIED we always want to get the minimum.
57cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao            height = Math.min(desiredHeight, heightSize);
58cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        }
59cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
60cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        // Compile back to measure spec and pass it along
61cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, heightMode);
62cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao
63cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
64cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao    }
65cfba4bb705440723bbc14a8371b75dcb82f79067Jin Cao}
66