ActionMenuItemView.java revision 20ac724a3a836bfd362c911f7dc55a61c02b4d44
1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2010 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 17bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpackage android.support.appcompat.view.menu; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 20bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.Resources; 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray; 22bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.Rect; 23bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.graphics.drawable.Drawable; 24bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.support.appcompat.R; 25bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.text.TextUtils; 26bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.util.AttributeSet; 27bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.Gravity; 28bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.view.View; 29bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.TextView; 30bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.widget.Toast; 31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 32bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell// TODO(trevorjohns): Lots of things here have been commented out. This needs to be addressed. 33bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 34bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/** 35bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * @hide 36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 37bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionMenuItemView extends TextView 3820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns implements MenuView.ItemView, View.OnClickListener, View.OnLongClickListener, 3920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns ActionMenuView.ActionMenuChildView { 4020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 41ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private static final String TAG = "ActionMenuItemView"; 42ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 43ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private MenuItemImpl mItemData; 44ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private CharSequence mTitle; 45ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private Drawable mIcon; 46ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private MenuBuilder.ItemInvoker mItemInvoker; 47ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 48ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private boolean mAllowTextWithIcon; 49ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private boolean mExpandedFormat; 50ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private int mMinWidth; 51ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private int mSavedPaddingLeft; 52ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 53ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public ActionMenuItemView(Context context) { 54ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani this(context, null); 55ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 56ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 57ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public ActionMenuItemView(Context context, AttributeSet attrs) { 58ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani this(context, attrs, 0); 59ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 60ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 61ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) { 62ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super(context, attrs, defStyle); 63ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final Resources res = context.getResources(); 64ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mAllowTextWithIcon = res.getBoolean( 6520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns android.support.appcompat.R.bool.config_allowActionMenuItemTextWithIcon); 66ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani TypedArray a = context.obtainStyledAttributes(attrs, 6720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns android.support.appcompat.R.styleable.ActionMenuItemView, 0, 0); 68ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mMinWidth = a.getDimensionPixelSize( 6920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns R.styleable.ActionMenuItemView_android_minWidth, 0); 70ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani a.recycle(); 71ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 72ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setOnClickListener(this); 73ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setOnLongClickListener(this); 74ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 75ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mSavedPaddingLeft = -1; 76ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 77ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 78ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 79ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setPadding(int l, int t, int r, int b) { 80ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mSavedPaddingLeft = l; 81ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.setPadding(l, t, r, b); 82ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 83ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 84ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public MenuItemImpl getItemData() { 85ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return mItemData; 86ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 87ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 88ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void initialize(MenuItemImpl itemData, int menuType) { 89ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mItemData = itemData; 90ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 91ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setIcon(itemData.getIcon()); 92ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setTitle(itemData.getTitleForItemView(this)); // Title only takes effect if there is no icon 93ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setId(itemData.getItemId()); 94ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 95ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); 96ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setEnabled(itemData.isEnabled()); 97ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 98ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 99ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void onClick(View v) { 100ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mItemInvoker != null) { 101ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mItemInvoker.invokeItem(mItemData); 102ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 103ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 104ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 105ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setItemInvoker(MenuBuilder.ItemInvoker invoker) { 10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mItemInvoker = invoker; 107ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 108ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 109ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean prefersCondensedTitle() { 110ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 111ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 112ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 113ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setCheckable(boolean checkable) { 114ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // TODO Support checkable action items 115ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 116ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 117ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setChecked(boolean checked) { 118ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // TODO Support checkable action items 119ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 120ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 121ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setExpandedFormat(boolean expandedFormat) { 122ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mExpandedFormat != expandedFormat) { 123ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mExpandedFormat = expandedFormat; 124ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (mItemData != null) { 125ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mItemData.actionFormatChanged(); 126ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 127ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 128ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 129ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 130ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani private void updateTextButtonVisibility() { 131ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani boolean visible = !TextUtils.isEmpty(mTitle); 132ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani visible &= mIcon == null || 13320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns (mItemData.showsTextAsAction() && (mAllowTextWithIcon || mExpandedFormat)); 134ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 135ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setText(visible ? mTitle : null); 136ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 137ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 138ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setIcon(Drawable icon) { 139ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mIcon = icon; 140ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null); 141ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 142ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani updateTextButtonVisibility(); 143ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 144ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 145ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean hasText() { 146ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return !TextUtils.isEmpty(getText()); 147ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 148ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 149ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setShortcut(boolean showShortcut, char shortcutKey) { 150ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Action buttons don't show text for shortcut keys. 151ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 152ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 153ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public void setTitle(CharSequence title) { 154ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani mTitle = title; 155ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 156ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani setContentDescription(mTitle); 157ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani updateTextButtonVisibility(); 158ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 159ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 160ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean showsIcon() { 161ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 162ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 163ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 164ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean needsDividerBefore() { 165ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return hasText() && mItemData.getIcon() == null; 166ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 167ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 168ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean needsDividerAfter() { 169ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return hasText(); 170ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 171ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 172ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 173ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani public boolean onLongClick(View v) { 174ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (hasText()) { 175ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Don't show the cheat sheet for items that already show text. 176ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return false; 177ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 178ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 179ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int[] screenPos = new int[2]; 180ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final Rect displayFrame = new Rect(); 181ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani getLocationOnScreen(screenPos); 182ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani getWindowVisibleDisplayFrame(displayFrame); 183ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 184ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final Context context = getContext(); 185ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int width = getWidth(); 186ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int height = getHeight(); 187ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int midy = screenPos[1] + height / 2; 188ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; 189ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 190ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT); 191ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (midy < displayFrame.height()) { 192ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Show along the top; follow action buttons 193ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT, 19420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns screenWidth - screenPos[0] - width / 2, height); 195ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } else { 196ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Show along the bottom center 197ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); 198ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 199ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani cheatSheet.show(); 200ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani return true; 201ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 202ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 203ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani @Override 204ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 205ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final boolean textVisible = hasText(); 206ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (textVisible && mSavedPaddingLeft >= 0) { 207ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.setPadding(mSavedPaddingLeft, getPaddingTop(), 20820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns getPaddingRight(), getPaddingBottom()); 209ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 210ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 211ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.onMeasure(widthMeasureSpec, heightMeasureSpec); 212ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 213ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int widthMode = MeasureSpec.getMode(widthMeasureSpec); 214ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int widthSize = MeasureSpec.getSize(widthMeasureSpec); 215ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int oldMeasuredWidth = getMeasuredWidth(); 216ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(widthSize, mMinWidth) 21720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns : mMinWidth; 218ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 219ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (widthMode != MeasureSpec.EXACTLY && mMinWidth > 0 && oldMeasuredWidth < targetWidth) { 220ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // Remeasure at exactly the minimum width. 221ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), 22220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns heightMeasureSpec); 223ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 224ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani 225ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani if (!textVisible && mIcon != null) { 226ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // TextView won't center compound drawables in both dimensions without 227ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani // a little coercion. Pad in to center the icon after we've measured. 228ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int w = getMeasuredWidth(); 229ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani final int dw = mIcon.getIntrinsicWidth(); 230ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani super.setPadding((w - dw) / 2, getPaddingTop(), getPaddingRight(), getPaddingBottom()); 231ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 232ced50ab7536cd3d3573f03310fc899f10c414d37Anirudh Dewani } 233bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 234