blob: ff186c18a90b8c9813009a397584355408ff97de [file] [log] [blame]
/*
* 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);
}
}