1f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang/** 2f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * Copyright (C) 2014 Google Inc. 3f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * Licensed to The Android Open Source Project. 4f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * 5f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * Licensed under the Apache License, Version 2.0 (the "License"); 6f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * you may not use this file except in compliance with the License. 7f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * You may obtain a copy of the License at 8f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * 9f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * http://www.apache.org/licenses/LICENSE-2.0 10f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * 11f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * Unless required by applicable law or agreed to in writing, software 12f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * distributed under the License is distributed on an "AS IS" BASIS, 13f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * See the License for the specific language governing permissions and 15f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * limitations under the License. 16f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang */ 17f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangpackage com.android.mail.ui; 18f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 19f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport android.content.Context; 20db1564cc9699331c972d2bfe86881e07345ea84dTony Mantlerimport android.database.DataSetObserver; 21e4c6a13112d6e06a61f7db07a3344e72f7db8dbaJin Caoimport android.graphics.Rect; 22f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport android.util.AttributeSet; 23f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport android.view.LayoutInflater; 24f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport android.view.View; 25f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport android.widget.ImageView; 26f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport android.widget.LinearLayout; 27db1564cc9699331c972d2bfe86881e07345ea84dTony Mantlerimport android.widget.ListAdapter; 28f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 29f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport com.android.mail.R; 30f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport com.android.mail.content.ObjectCursor; 31f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangimport com.android.mail.providers.Folder; 3275f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantlerimport com.android.mail.utils.LogUtils; 33f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 34db1564cc9699331c972d2bfe86881e07345ea84dTony Mantlerimport java.util.ArrayDeque; 35db1564cc9699331c972d2bfe86881e07345ea84dTony Mantlerimport java.util.Queue; 36db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler 37f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang/** 38f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang * A smaller version of the account- and folder-switching drawer view for tablet UIs. 39f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang */ 40f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huangpublic class MiniDrawerView extends LinearLayout { 41f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 42f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang private FolderListFragment mController; 43f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 44f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang private View mSpacer; 45f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 46f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang private final LayoutInflater mInflater; 47f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 48f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang private static final int NUM_RECENT_ACCOUNTS = 2; 49f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 50f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public MiniDrawerView(Context context) { 51f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang this(context, null); 52f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 53f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 54f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public MiniDrawerView(Context context, AttributeSet attrs) { 55f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang super(context, attrs); 56f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 57f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang mInflater = LayoutInflater.from(context); 58f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 59f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 60f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang @Override 61f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang protected void onFinishInflate() { 62f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang super.onFinishInflate(); 63f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 64f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang mSpacer = findViewById(R.id.spacer); 65f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 66f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 673f784c879e564cb144d542b29c4e68e980d2c298Andy Huang @Override 683f784c879e564cb144d542b29c4e68e980d2c298Andy Huang public boolean requestFocus(int direction, Rect previouslyFocusedRect) { 693f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // This ViewGroup is focusable purely so it can act as a stable target for other views to 703f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // designate as their left/right focus ID. When focus comes to this view, the XML 713f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // declaration of descendantFocusability=FOCUS_AFTER_DESCENDANTS means it will always try 723f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // to focus one of its children before resorting to this (great! we basically never want 733f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // this container to gain focus). 743f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // 753f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // But the usual focus search towards the LEFT (in LTR) actually starts at the bottom, 763f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // which is weird. So override all focus requests that land on this parent to use the 773f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // FORWARD direction so the top-most item gets first focus. This will not affect focus 783f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // traversal within this ViewGroup as the descendantFocusability prevents the parent from 793f784c879e564cb144d542b29c4e68e980d2c298Andy Huang // gaining focus. 803f784c879e564cb144d542b29c4e68e980d2c298Andy Huang return super.requestFocus(FOCUS_DOWN, previouslyFocusedRect); 813f784c879e564cb144d542b29c4e68e980d2c298Andy Huang } 823f784c879e564cb144d542b29c4e68e980d2c298Andy Huang 83f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public void setController(FolderListFragment flf) { 84f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang mController = flf; 85db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final ListAdapter adapter = mController.getMiniDrawerAccountsAdapter(); 86db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler adapter.registerDataSetObserver(new Observer()); 87db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler } 88f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 89db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler private class Observer extends DataSetObserver { 90f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 91db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler @Override 92db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler public void onChanged() { 93db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler refresh(); 94db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler } 95f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 96f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 97f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public void refresh() { 98110522872a851fdaf165ef0cfb9d98a002f8f6d8Tony Mantler if (mController == null || !mController.isAdded()) { 99f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang return; 100f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 101f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 102db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final ListAdapter adapter = 103db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler mController.getMiniDrawerAccountsAdapter(); 104f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 105db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler if (adapter.getCount() > 0) { 106db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final View oldCurrentAccountView = getChildAt(0); 107db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler if (oldCurrentAccountView != null) { 108db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler removeView(oldCurrentAccountView); 109db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler } 110db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final View newCurrentAccountView = adapter.getView(0, oldCurrentAccountView, this); 1113f784c879e564cb144d542b29c4e68e980d2c298Andy Huang newCurrentAccountView.setClickable(false); 1123f784c879e564cb144d542b29c4e68e980d2c298Andy Huang newCurrentAccountView.setFocusable(false); 113db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler addView(newCurrentAccountView, 0); 114db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler } 115f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 116f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang final int removePos = indexOfChild(mSpacer) + 1; 117db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final int recycleCount = getChildCount() - removePos; 118db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final Queue<View> recycleViews = new ArrayDeque<>(recycleCount); 119db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler for (int recycleIndex = 0; recycleIndex < recycleCount; recycleIndex++) { 120db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final View recycleView = getChildAt(removePos); 121db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler recycleViews.add(recycleView); 122db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler removeView(recycleView); 123f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 124db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler 125db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final int adapterCount = Math.min(adapter.getCount(), NUM_RECENT_ACCOUNTS + 1); 126db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler for (int accountIndex = 1; accountIndex < adapterCount; accountIndex++) { 127db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final View recycleView = recycleViews.poll(); 128db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler final View accountView = adapter.getView(accountIndex, recycleView, this); 129db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler addView(accountView); 130f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 131f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 132db1564cc9699331c972d2bfe86881e07345ea84dTony Mantler View child; 133f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang // reset the inbox views for this account 1345c9ada75dc50b904a90df8320e4562a4a56f146bAndrew Sapperstein while ((child=getChildAt(1)) != mSpacer) { 135f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang removeView(child); 136f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 1375c9ada75dc50b904a90df8320e4562a4a56f146bAndrew Sapperstein 138f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang final ObjectCursor<Folder> folderCursor = mController.getFoldersCursor(); 139f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang if (folderCursor != null && !folderCursor.isClosed()) { 140f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang int pos = -1; 141f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang int numInboxes = 0; 142f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang while (folderCursor.moveToPosition(++pos)) { 143f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang final Folder f = folderCursor.getModel(); 144f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang if (f.isInbox()) { 145e5f28abed41c8d32fc4b42adcb2ff6620fdda652Tony Mantler final View view = mInflater.inflate( 146f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang R.layout.mini_drawer_folder_item, this, false /* attachToRoot */); 147e5f28abed41c8d32fc4b42adcb2ff6620fdda652Tony Mantler final ImageView iv = (ImageView) view.findViewById(R.id.image_view); 148f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang iv.setTag(new FolderItem(f, iv)); 149cdfc653dc200693ae4d88b42b3ac18be2f75469aTony Mantler iv.setContentDescription(f.name); 150e5f28abed41c8d32fc4b42adcb2ff6620fdda652Tony Mantler view.setActivated(mController.isSelectedFolder(f)); 151e5f28abed41c8d32fc4b42adcb2ff6620fdda652Tony Mantler addView(view, 1 + numInboxes); 152f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang numInboxes++; 153f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 154f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 155f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 156f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 157f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 158f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang private class FolderItem implements View.OnClickListener { 159f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public final Folder folder; 160f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public final ImageView view; 161f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 162f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public FolderItem(Folder f, ImageView iv) { 163f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang folder = f; 164f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang view = iv; 165f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang Folder.setIcon(folder, view); 166f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang view.setOnClickListener(this); 167f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 168f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 169f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang @Override 170f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang public void onClick(View v) { 171f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang mController.onFolderSelected(folder, "mini-drawer"); 172f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 173f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang } 174f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 17575f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler @Override 17652016fc65758f48e3684112e36cbf37f4459b406Tony Mantler protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 17752016fc65758f48e3684112e36cbf37f4459b406Tony Mantler // We want to make sure that all children get measured. These will be re-hidden in onLayout 17852016fc65758f48e3684112e36cbf37f4459b406Tony Mantler // according to space constraints. 17952016fc65758f48e3684112e36cbf37f4459b406Tony Mantler // This means we can't set views to Gone elsewhere, which is kind of unfortunate. 18052016fc65758f48e3684112e36cbf37f4459b406Tony Mantler final int childCount = getChildCount(); 18152016fc65758f48e3684112e36cbf37f4459b406Tony Mantler for (int i = 0; i < childCount; i++) { 18252016fc65758f48e3684112e36cbf37f4459b406Tony Mantler final View child = getChildAt(i); 18352016fc65758f48e3684112e36cbf37f4459b406Tony Mantler child.setVisibility(View.VISIBLE); 18452016fc65758f48e3684112e36cbf37f4459b406Tony Mantler } 18552016fc65758f48e3684112e36cbf37f4459b406Tony Mantler super.onMeasure(widthMeasureSpec, heightMeasureSpec); 18652016fc65758f48e3684112e36cbf37f4459b406Tony Mantler } 18752016fc65758f48e3684112e36cbf37f4459b406Tony Mantler 18852016fc65758f48e3684112e36cbf37f4459b406Tony Mantler @Override 18975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler protected void onLayout(boolean changed, int l, int t, int r, int b) { 19075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler if (getChildCount() == 0) { 19175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler return; 19275f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 19375f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final int availableHeight = getMeasuredHeight() - getPaddingBottom() - getPaddingTop(); 19475f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 19575f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler int childHeight = 0; 19675f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final int childCount = getChildCount(); 19775f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler for (int i = 0; i < childCount; i++) { 19875f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final View child = getChildAt(i); 19975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler if (child.equals(mSpacer) || child.getVisibility() == View.GONE) { 20075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler continue; 20175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 20275f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final LayoutParams params = (LayoutParams) child.getLayoutParams(); 20375f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler childHeight += params.topMargin + params.bottomMargin + child.getMeasuredHeight(); 20475f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 205f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang 20675f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler if (childHeight <= availableHeight) { 20775f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler // Nothing to do here 20875f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler super.onLayout(changed, l, t, r, b); 20975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler return; 21075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 21175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 21275f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler // Check again 21375f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler if (childHeight <= availableHeight) { 21475f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler // Fit the spacer to the remaining height 21575f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler measureSpacer(availableHeight - childHeight); 21675f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler super.onLayout(changed, l, t, r, b); 21775f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler return; 21875f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 21975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 22075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler // Sanity check 22175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler if (getChildAt(getChildCount() - 1).equals(mSpacer)) { 22252016fc65758f48e3684112e36cbf37f4459b406Tony Mantler LogUtils.v(LogUtils.TAG, "The ellipsis was the last item in the minidrawer and " + 22375f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler "hiding it didn't help fit all the views"); 22452016fc65758f48e3684112e36cbf37f4459b406Tony Mantler return; 22575f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 22675f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 22775f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final View childToHide = getChildAt(indexOfChild(mSpacer) + 1); 22875f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler childToHide.setVisibility(View.GONE); 22975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 23075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final LayoutParams childToHideParams = (LayoutParams) childToHide.getLayoutParams(); 23175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler childHeight -= childToHideParams.topMargin + childToHideParams.bottomMargin + 23275f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler childToHide.getMeasuredHeight(); 23375f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 23475f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler // Check again 23575f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler if (childHeight <= availableHeight) { 23675f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler // Fit the spacer to the remaining height 23775f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler measureSpacer(availableHeight - childHeight); 23875f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler super.onLayout(changed, l, t, r, b); 23975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler return; 24075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 24175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 24252016fc65758f48e3684112e36cbf37f4459b406Tony Mantler LogUtils.v(LogUtils.TAG, "Hid two children in the minidrawer and still couldn't fit " + 24352016fc65758f48e3684112e36cbf37f4459b406Tony Mantler "all the views"); 24475f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 24575f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 24675f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler private void measureSpacer(int height) { 24775f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final LayoutParams spacerParams = (LayoutParams) mSpacer.getLayoutParams(); 24875f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final int spacerHeight = height - 24975f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler spacerParams.bottomMargin - spacerParams.topMargin; 25075f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler final int spacerWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); 25175f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler mSpacer.measure(MeasureSpec.makeMeasureSpec(spacerWidth, MeasureSpec.AT_MOST), 25275f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler MeasureSpec.makeMeasureSpec(spacerHeight, MeasureSpec.EXACTLY)); 25375f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler 25475f0ca60077f0b41d1f02915a97b8017c97b1651Tony Mantler } 255f58e4c3c942033fce12b5f75f9e4d9e708c9ea6aAndy Huang} 256