1503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato/*
2503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Copyright (C) 2008 The Android Open Source Project
3503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
4503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * you may not use this file except in compliance with the License.
6503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * You may obtain a copy of the License at
7503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
8503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato *
10503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Unless required by applicable law or agreed to in writing, software
11503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * See the License for the specific language governing permissions and
14503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * limitations under the License.
15503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato */
16503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.phone;
18503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
19503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.content.Context;
20503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.util.AttributeSet;
21503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.view.View;
22503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratoimport android.widget.LinearLayout;
23503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
24b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onoratoimport com.android.systemui.R;
25b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato
26503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratopublic class IconMerger extends LinearLayout {
27b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato    private static final String TAG = "IconMerger";
2805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    private static final boolean DEBUG = false;
29b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato
306c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato    private int mIconSize;
3105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    private View mMoreView;
32503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
33503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    public IconMerger(Context context, AttributeSet attrs) {
34503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super(context, attrs);
35503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
366c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato        mIconSize = context.getResources().getDimensionPixelSize(
3705e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler                R.dimen.status_bar_icon_size);
386c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato
3905e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        if (DEBUG) {
4005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler            setBackgroundColor(0x800099FF);
4105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        }
427c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler    }
437c3e39de22c68e69c4924b339132f8e3bf3f96afDaniel Sandler
4405e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    public void setOverflowIndicator(View v) {
4505e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        mMoreView = v;
46b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato    }
47b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato
4805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    @Override
4905e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
5005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
5105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        // we need to constrain this to an integral multiple of our children
5205e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        int width = getMeasuredWidth();
5305e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        setMeasuredDimension(width - (width % mIconSize), getMeasuredHeight());
54b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato    }
55b77f53b21c2185ae3ff7c219c384a6db73f8f4e4Joe Onorato
56503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    @Override
57503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato    protected void onLayout(boolean changed, int l, int t, int r, int b) {
58503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        super.onLayout(changed, l, t, r, b);
5905e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        checkOverflow(r - l);
6005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    }
61503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
6205e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler    private void checkOverflow(int width) {
6305e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        if (mMoreView == null) return;
64503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato
6505e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        final int N = getChildCount();
6605e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        int visibleChildren = 0;
6705e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        for (int i=0; i<N; i++) {
6805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler            if (getChildAt(i).getVisibility() != GONE) visibleChildren++;
69503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        }
7005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        final boolean overflowShown = (mMoreView.getVisibility() == View.VISIBLE);
7105e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        // let's assume we have one more slot if the more icon is already showing
7205e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        if (overflowShown) visibleChildren --;
7305e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        final boolean moreRequired = visibleChildren * mIconSize > width;
7405e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler        if (moreRequired != overflowShown) {
7505e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler            post(new Runnable() {
7605e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler                @Override
7705e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler                public void run() {
7805e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler                    mMoreView.setVisibility(moreRequired ? View.VISIBLE : View.GONE);
79503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato                }
8005e2414ef5a3a8fecbabc1f220c9925539d51f7aDaniel Sandler            });
81503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato        }
826c01a11a20d5fc796360e5e97998401a6cc84f27Joe Onorato    }
83503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato}
84