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