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