summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chips/res/drawable/chip_background_invalid.xml21
-rw-r--r--chips/src/com/android/ex/chips/RecipientEditTextView.java94
2 files changed, 81 insertions, 34 deletions
diff --git a/chips/res/drawable/chip_background_invalid.xml b/chips/res/drawable/chip_background_invalid.xml
new file mode 100644
index 0000000..39dd246
--- /dev/null
+++ b/chips/res/drawable/chip_background_invalid.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="#ff0000"/>
+ <padding android:left="6dp" android:right="6dp" android:top="2dp"
+ android:bottom="2dp"/>
+</shape>
diff --git a/chips/src/com/android/ex/chips/RecipientEditTextView.java b/chips/src/com/android/ex/chips/RecipientEditTextView.java
index 239883b..fa33fb4 100644
--- a/chips/src/com/android/ex/chips/RecipientEditTextView.java
+++ b/chips/src/com/android/ex/chips/RecipientEditTextView.java
@@ -106,6 +106,8 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
private Validator mValidator;
+ private Drawable mInvalidChipBackground;
+
public RecipientEditTextView(Context context, AttributeSet attrs) {
super(context, attrs);
setSuggestionsEnabled(false);
@@ -210,6 +212,15 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
return tmpBitmap;
}
+
+ /**
+ * Get the background drawable for a RecipientChip.
+ */
+ public Drawable getChipBackground(RecipientEntry contact) {
+ return mValidator != null && mValidator.isValid(contact.getDestination()) ?
+ mChipBackground : mInvalidChipBackground;
+ }
+
private Bitmap createUnselectedChip(RecipientEntry contact, TextPaint paint, Layout layout) {
// Ellipsize the text so that it takes AT MOST the entire width of the
// autocomplete text entry area. Make sure to leave space for padding
@@ -227,9 +238,10 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
// Create the background of the chip.
Bitmap tmpBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(tmpBitmap);
- if (mChipBackground != null) {
- mChipBackground.setBounds(0, 0, width, height);
- mChipBackground.draw(canvas);
+ Drawable background = getChipBackground(contact);
+ if (background != null) {
+ background.setBounds(0, 0, width, height);
+ background.draw(canvas);
// Don't draw photos for recipients that have been typed in.
if (contact.getContactId() != INVALID_CONTACT) {
@@ -279,7 +291,6 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
Layout layout = getLayout();
int line = layout.getLineForOffset(offset);
int lineTop = layout.getLineTop(line);
- boolean isValid = mValidator != null && mValidator.isValid(contact.getDestination());
TextPaint paint = getPaint();
float defaultSize = paint.getTextSize();
@@ -288,11 +299,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
tmpBitmap = createSelectedChip(contact, paint, layout);
} else {
- if (!isValid) {
-
- } else {
- tmpBitmap = createUnselectedChip(contact, paint, layout);
- }
+ tmpBitmap = createUnselectedChip(contact, paint, layout);
}
// Get the location of the widget so we can properly offset
@@ -305,7 +312,8 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
Rect bounds = new Rect(xy[0] + offset, xy[1] + lineTop, xy[0] + tmpBitmap.getWidth(),
calculateLineBottom(xy[1], line, tmpBitmap.getHeight()));
RecipientChip recipientChip = new RecipientChip(result, contact, offset, bounds);
- recipientChip.setIsValid(isValid);
+ recipientChip
+ .setIsValid(mValidator != null && mValidator.isValid(contact.getDestination()));
// Return text to the original size.
paint.setTextSize(defaultSize);
@@ -313,9 +321,8 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * The bottom of the line the chip will be located on is calculated by 4
- * factors:
- * 1) which line the chip appears on
+ * Calculate the bottom of the line the chip will be located on using:
+ * 1) which line the chip appears on
* 2) the height of a line in the autocomplete view vs the heigt of a chip
* 3) padding built into the edit text view will move the bottom position
* 4) the position of the autocomplete view on the screen, taking into account
@@ -349,6 +356,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
* @param alternatesLayout
* @param alternatesSelectedLayout
* @param padding Padding around the text in a chip
+ * @deprecated
*/
public void setChipDimensions(Drawable chipBackground, Drawable chipBackgroundPressed,
Drawable chipDelete, Bitmap defaultContact, int moreResource, int alternatesLayout,
@@ -365,6 +373,23 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
mChipFontSize = chipFontSize;
}
+ public void setChipDimensions(Drawable chipBackground, Drawable chipBackgroundPressed,
+ Drawable invalidChip, Drawable chipDelete, Bitmap defaultContact, int moreResource,
+ int alternatesLayout, int alternatesSelectedLayout, float chipHeight, float padding,
+ float chipFontSize) {
+ mChipBackground = chipBackground;
+ mChipBackgroundPressed = chipBackgroundPressed;
+ mChipDelete = chipDelete;
+ mChipPadding = (int) padding;
+ mAlternatesLayout = alternatesLayout;
+ mAlternatesSelectedLayout = alternatesSelectedLayout;
+ mDefaultContactPhoto = defaultContact;
+ mMoreString = moreResource;
+ mChipHeight = chipHeight;
+ mChipFontSize = chipFontSize;
+ mInvalidChipBackground = invalidChip;
+ }
+
@Override
public void setTokenizer(Tokenizer tokenizer) {
mTokenizer = tokenizer;
@@ -422,19 +447,18 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
return super.onKeyUp(keyCode, event);
}
+ /**
+ * Create a chip from the default selection. If the popup is showing, the
+ * default is the first item in the popup suggestions list. Otherwise, it is
+ * whatever the user had typed in. End represents where the the tokenizer
+ * should search for a token to turn into a chip.
+ * @return If a chip was created from a real contact.
+ */
private boolean commitDefault() {
- return commitDefault(getSelectionEnd());
- }
-
- // If the popup is showing, the default is the first item in the popup
- // suggestions list. Otherwise, it is whatever the user had typed in.
- // End represents where the the tokenizer should search for a token
- // to turn into a chip.
- private boolean commitDefault(int end) {
Editable editable = getText();
boolean enough = enoughToFilter();
boolean shouldSubmitAtPosition = false;
-
+ int end = getSelectionEnd();
int start = mTokenizer.findTokenStart(editable, end);
if (enough) {
RecipientChip[] chips = getSpannable().getSpans(start, end, RecipientChip.class);
@@ -712,8 +736,9 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * The more chip is text that replaces any chips that do not fit in the pre-defined
- * available space when the RecipientEditTextView loses focus.
+ * Create the more chip. The more chip is text that replaces any chips that
+ * do not fit in the pre-defined available space when the
+ * RecipientEditTextView loses focus.
*/
private ImageSpan createMoreChip() {
RecipientChip[] recipients = getRecipients();
@@ -743,7 +768,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
"We have recipients. Tt should not be possible to have zero RecipientChips.");
return null;
}
- mRemovedSpans = new ArrayList<RecipientChip>();
+ mRemovedSpans = new ArrayList<RecipientChip>(chips.length);
int totalReplaceStart = 0;
int totalReplaceEnd = 0;
for (int i = numRecipients - overage; i < chips.length; i++) {
@@ -883,9 +908,9 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * Unselecting a RecipientChip will render the chip without a delete icon
- * and with an unfocused background. This is called when the RecipientChip
- * not longer has focus.
+ * Remove selection from this chip. Unselecting a RecipientChip will render
+ * the chip without a delete icon and with an unfocused background. This
+ * is called when the RecipientChip not longer has focus.
*/
public void unselectChip() {
int start = getChipStart();
@@ -905,7 +930,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * If the RecipientChip is just an email address,
+ * Show this chip as selected. If the RecipientChip is just an email address,
* selecting the chip will take the contents of the chip and place it at
* the end of the RecipientEditTextView for inline editing. If the
* RecipientChip is a complete contact, then selecting the chip
@@ -957,8 +982,8 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * If keyCode equals KeyEvent.KEYCODE_DEL, this deletes the currently
- * selected chip.
+ * Handle key events for a chip. When the keyCode equals
+ * KeyEvent.KEYCODE_DEL, this deletes the currently selected chip.
*/
public void onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL) {
@@ -1099,8 +1124,9 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * When a selected chip receives a click event, see if that event was in
- * the delete icon. If so, delete it. Otherwise, unselect the chip.
+ * Handle click events for a chip. When a selected chip receives a click
+ * event, see if that event was in the delete icon. If so, delete it.
+ * Otherwise, unselect the chip.
*/
public void onClick(View widget, int offset, float x, float y) {
if (mSelected) {
@@ -1121,7 +1147,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView
}
/**
- * Handles clicks to alternate addresses for a selected chip. If the user
+ * Handle clicks to alternate addresses for a selected chip. If the user
* selects an alternate, the chip is replaced with a new contact with the
* new contact address information.
*/