| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.phone; |
| |
| import android.content.Context; |
| import android.content.res.TypedArray; |
| import android.graphics.drawable.Drawable; |
| import android.text.TextUtils.TruncateAt; |
| import android.util.Log; |
| import android.view.Gravity; |
| import android.widget.TextView; |
| |
| |
| /** |
| * The View for each item in the {@link InCallMenuView}. |
| * |
| * Each in-call menu item has a text label, an optional "green LED" on/off |
| * indicator below the text, and an optional icon above the text. |
| * (It's really just a TextView, using "compound drawables" for |
| * the indicator and icon.) |
| * |
| * Originally modeled after android/widget/IconMenuItemView.java. |
| */ |
| class InCallMenuItemView extends TextView { |
| private static final String LOG_TAG = "PHONE/InCallMenuItemView"; |
| private static final boolean DBG = false; |
| |
| private boolean mIndicatorVisible; |
| private boolean mIndicatorState; |
| private Drawable mIndicatorDrawable; |
| private Drawable mIcon; |
| |
| public InCallMenuItemView(Context context) { |
| super(context); |
| if (DBG) log("InCallMenuView constructor..."); |
| |
| setGravity(Gravity.CENTER); |
| |
| TypedArray a = |
| context.obtainStyledAttributes( |
| com.android.internal.R.styleable.MenuView); |
| int textAppearance = a.getResourceId(com.android.internal.R.styleable. |
| MenuView_itemTextAppearance, -1); |
| // TODO: any other styleable attrs we need from the standard menu item style? |
| a.recycle(); |
| |
| setClickable(true); |
| setFocusable(true); |
| setTextAppearance(context, textAppearance); |
| |
| // Set the padding like the regular menu items do |
| setPadding(3, getPaddingTop(), 3, getPaddingBottom()); |
| } |
| |
| // |
| // Visibility: we only ever use the VISIBLE and GONE states. |
| // |
| |
| public void setVisible(boolean isVisible) { |
| setVisibility(isVisible ? VISIBLE : GONE); |
| } |
| |
| public boolean isVisible() { |
| return (getVisibility() == VISIBLE); |
| } |
| |
| /** |
| * Sets whether or not this item's "green LED" state indicator |
| * should be visible. |
| */ |
| public void setIndicatorVisible(boolean isVisible) { |
| if (DBG) log("setIndicatorVisible(" + isVisible + ")..."); |
| mIndicatorVisible = isVisible; |
| updateIndicator(); |
| updateCompoundDrawables(); |
| } |
| |
| /** |
| * Turns this item's "green LED" state indicator on or off. |
| */ |
| public void setIndicatorState(boolean onoff) { |
| if (DBG) log("setIndicatorState(" + onoff + ")..."); |
| mIndicatorState = onoff; |
| updateIndicator(); |
| updateCompoundDrawables(); |
| } |
| |
| /** |
| * Sets this item's icon, to be drawn above the text label. |
| */ |
| public void setIcon(Drawable icon) { |
| if (DBG) log("setIcon(" + icon + ")..."); |
| mIcon = icon; |
| updateCompoundDrawables(); |
| |
| // If there's an icon, we'll only have enough room for one line of text. |
| if (icon != null) setSingleLineMarquee(); |
| } |
| |
| /** |
| * Sets this item's icon, to be drawn above the text label. |
| */ |
| public void setIconResource(int resId) { |
| if (DBG) log("setIconResource(" + resId + ")..."); |
| Drawable iconDrawable = getResources().getDrawable(resId); |
| setIcon(iconDrawable); |
| } |
| |
| /** |
| * Updates mIndicatorDrawable based on mIndicatorVisible and mIndicatorState. |
| */ |
| private void updateIndicator() { |
| if (mIndicatorVisible) { |
| int resId = mIndicatorState ? android.R.drawable.button_onoff_indicator_on |
| : android.R.drawable.button_onoff_indicator_off; |
| mIndicatorDrawable = getResources().getDrawable(resId); |
| } else { |
| mIndicatorDrawable = null; |
| } |
| } |
| |
| /** |
| * Installs mIcon and mIndicatorDrawable as our TextView "compound drawables", |
| * and does any necessary layout tweaking depending on the presence or |
| * absence of the icon or indicator. |
| */ |
| private void updateCompoundDrawables() { |
| // TODO: There are several hand-tweaked layout constants hardcoded here. |
| // If we ever move this widget into the framework (and make it |
| // usable from XML), be sure to move these constants to XML too. |
| |
| // If the icon is visible, add a bit of negative padding to scoot |
| // it down closer to the text. |
| if (mIcon != null) { |
| setCompoundDrawablePadding(-10); |
| } |
| |
| // Add some top/bottom padding when the indicator and/or icon are |
| // visible (to add a little vertical space between the indicator |
| // and the bottom of the item, or the icon and the top of the |
| // item.) |
| int topPadding = (mIcon != null) ? 5 : 0; |
| int bottomPadding = (mIndicatorDrawable != null) ? 5 : 0; |
| setPadding(0, topPadding, 0, bottomPadding); |
| |
| // TODO: topPadding seems to have no effect here. |
| // Regardless of the value I use, the icon image |
| // ends up right up against the top edge of the button... |
| // (Maybe we're just out of room?) |
| // if (DBG) log("updateCompoundDrawables: padding: top " + topPadding |
| // + ", bottom " + bottomPadding); |
| |
| setCompoundDrawablesWithIntrinsicBounds(null, mIcon, null, mIndicatorDrawable); |
| } |
| |
| /** |
| * Forces this menu item into "single line" mode, with marqueeing enabled. |
| * This is only necessary when an icon is present, since otherwise |
| * there's enough room for long labels to wrap onto two lines. |
| */ |
| private void setSingleLineMarquee() { |
| setEllipsize(TruncateAt.MARQUEE); |
| setHorizontalFadingEdgeEnabled(true); |
| setSingleLine(true); |
| } |
| |
| @Override |
| public String toString() { |
| return "'" + getText() + "' (" + super.toString() + ")"; |
| } |
| |
| private void log(String msg) { |
| Log.d(LOG_TAG, msg); |
| } |
| } |