Hides text on ButtonDropTargets if any of them are ellipsized.
This can happen on small devices or on devices where Font/Display size
is enlarged and when Developer Options is turned on when all three
options {Uninstall, Delete, App Info} are shown at once.
Bug: 64391860
Change-Id: If355d28087d53148114eb586efb3c26f158b3713
This commit is contained in:
@@ -29,6 +29,7 @@ import android.graphics.ColorMatrix;
|
||||
import android.graphics.ColorMatrixColorFilter;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
@@ -69,6 +70,7 @@ public abstract class ButtonDropTarget extends TextView
|
||||
/** The paint applied to the drag view on hover */
|
||||
protected int mHoverColor = 0;
|
||||
|
||||
protected CharSequence mText;
|
||||
protected ColorStateList mOriginalTextColor;
|
||||
protected Drawable mDrawable;
|
||||
|
||||
@@ -96,6 +98,7 @@ public abstract class ButtonDropTarget extends TextView
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
mText = getText();
|
||||
mOriginalTextColor = getTextColors();
|
||||
}
|
||||
|
||||
@@ -297,4 +300,30 @@ public abstract class ButtonDropTarget extends TextView
|
||||
public int getTextColor() {
|
||||
return getTextColors().getDefaultColor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns True if any update was made.
|
||||
*/
|
||||
public boolean updateText(boolean hide) {
|
||||
if ((hide && getText().toString().isEmpty()) || (!hide && mText.equals(getText()))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
setText(hide ? "" : mText);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isTextTruncated() {
|
||||
int availableWidth = getMeasuredWidth();
|
||||
if (mHideParentOnDisable) {
|
||||
ViewGroup parent = (ViewGroup) getParent();
|
||||
availableWidth = parent.getMeasuredWidth() - parent.getPaddingLeft()
|
||||
- parent.getPaddingRight();
|
||||
}
|
||||
availableWidth -= (getPaddingLeft() + getPaddingRight() + mDrawable.getIntrinsicWidth()
|
||||
+ getCompoundDrawablePadding());
|
||||
CharSequence displayedText = TextUtils.ellipsize(mText, getPaint(), availableWidth,
|
||||
TextUtils.TruncateAt.END);
|
||||
return !mText.equals(displayedText);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,9 +65,11 @@ public class DeleteDropTarget extends ButtonDropTarget {
|
||||
* Set the drop target's text to either "Remove" or "Cancel" depending on the drag source.
|
||||
*/
|
||||
public void setTextBasedOnDragSource(DragSource dragSource) {
|
||||
if (!TextUtils.isEmpty(getText())) {
|
||||
setText(dragSource.supportsDeleteDropTarget() ? R.string.remove_drop_target_label
|
||||
if (!TextUtils.isEmpty(mText)) {
|
||||
mText = getResources().getString(dragSource.supportsDeleteDropTarget()
|
||||
? R.string.remove_drop_target_label
|
||||
: android.R.string.cancel);
|
||||
requestLayout();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,58 @@ public class DropTargetBar extends LinearLayout implements DragController.DragLi
|
||||
setupButtonDropTarget(this, dragController);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
boolean hideText = hideTextHelper(false /* shouldUpdateText */, false /* no-op */);
|
||||
if (hideTextHelper(true /* shouldUpdateText */, hideText)) {
|
||||
// Text has changed, so we need to re-measure.
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method that iterates through the children and returns whether any of the visible
|
||||
* {@link ButtonDropTarget} has truncated text.
|
||||
*
|
||||
* @param shouldUpdateText If True, updates the text of all children.
|
||||
* @param hideText If True and {@param shouldUpdateText} is True, clears the text of all
|
||||
* children; otherwise it sets the original text value.
|
||||
*
|
||||
*
|
||||
* @return If shouldUpdateText is True, returns whether any of the children updated their text.
|
||||
* Else, returns whether any of the children have truncated their text.
|
||||
*/
|
||||
private boolean hideTextHelper(boolean shouldUpdateText, boolean hideText) {
|
||||
boolean result = false;
|
||||
View visibleView;
|
||||
ButtonDropTarget dropTarget;
|
||||
for (int i = getChildCount() - 1; i >= 0; --i) {
|
||||
if (getChildAt(i) instanceof ButtonDropTarget) {
|
||||
visibleView = dropTarget = (ButtonDropTarget) getChildAt(i);
|
||||
} else if (getChildAt(i) instanceof ViewGroup) {
|
||||
// The Drop Target is wrapped in a FrameLayout.
|
||||
visibleView = getChildAt(i);
|
||||
dropTarget = (ButtonDropTarget) ((ViewGroup) visibleView).getChildAt(0);
|
||||
} else {
|
||||
// Ignore other views.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (visibleView.getVisibility() == View.VISIBLE) {
|
||||
if (shouldUpdateText) {
|
||||
result |= dropTarget.updateText(hideText);
|
||||
} else if (dropTarget.isTextTruncated()) {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void setupButtonDropTarget(View view, DragController dragController) {
|
||||
if (view instanceof ButtonDropTarget) {
|
||||
ButtonDropTarget bdt = (ButtonDropTarget) view;
|
||||
|
||||
Reference in New Issue
Block a user