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