diff options
author | mindyp <mindyp@google.com> | 2012-12-14 10:58:44 -0800 |
---|---|---|
committer | mindyp <mindyp@google.com> | 2012-12-14 15:19:43 -0800 |
commit | 70d41146a39058c47eee5c505cae6a6a2c1409f9 (patch) | |
tree | 0762245ed2b47b814e957f389a83fe06341464f5 | |
parent | 0cf347e69473d2259194257d5a4b9aa103c8e448 (diff) | |
download | android_frameworks_ex-70d41146a39058c47eee5c505cae6a6a2c1409f9.tar.gz android_frameworks_ex-70d41146a39058c47eee5c505cae6a6a2c1409f9.tar.bz2 android_frameworks_ex-70d41146a39058c47eee5c505cae6a6a2c1409f9.zip |
Scroll when results appear
Fixes b/7727257 Jank when replying to or forwarding a message in gmail
Change-Id: I6fbb574ac724772d541d063192a5e0e59b776360
-rw-r--r-- | chips/src/com/android/ex/chips/BaseRecipientAdapter.java | 12 | ||||
-rw-r--r-- | chips/src/com/android/ex/chips/RecipientEditTextView.java | 57 |
2 files changed, 64 insertions, 5 deletions
diff --git a/chips/src/com/android/ex/chips/BaseRecipientAdapter.java b/chips/src/com/android/ex/chips/BaseRecipientAdapter.java index 68efa0f..f742cf1 100644 --- a/chips/src/com/android/ex/chips/BaseRecipientAdapter.java +++ b/chips/src/com/android/ex/chips/BaseRecipientAdapter.java @@ -499,6 +499,8 @@ public abstract class BaseRecipientAdapter extends BaseAdapter implements Filter private final DelayedMessageHandler mDelayedMessageHandler = new DelayedMessageHandler(); + private EntriesUpdatedObserver mEntriesUpdatedObserver; + /** * Constructor for email queries. */ @@ -707,9 +709,19 @@ public abstract class BaseRecipientAdapter extends BaseAdapter implements Filter return entries; } + + protected interface EntriesUpdatedObserver { + public void onChanged(List<RecipientEntry> entries); + } + + public void registerUpdateObserver(EntriesUpdatedObserver observer) { + mEntriesUpdatedObserver = observer; + } + /** Resets {@link #mEntries} and notify the event to its parent ListView. */ private void updateEntries(List<RecipientEntry> newEntries) { mEntries = newEntries; + mEntriesUpdatedObserver.onChanged(newEntries); notifyDataSetChanged(); } diff --git a/chips/src/com/android/ex/chips/RecipientEditTextView.java b/chips/src/com/android/ex/chips/RecipientEditTextView.java index c1f21db..434ae1d 100644 --- a/chips/src/com/android/ex/chips/RecipientEditTextView.java +++ b/chips/src/com/android/ex/chips/RecipientEditTextView.java @@ -53,6 +53,7 @@ import android.text.util.Rfc822Token; import android.text.util.Rfc822Tokenizer; import android.util.AttributeSet; import android.util.Log; +import android.util.TypedValue; import android.view.ActionMode; import android.view.ActionMode.Callback; import android.view.DragEvent; @@ -70,6 +71,7 @@ import android.view.inputmethod.InputConnection; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; +import android.widget.Filterable; import android.widget.ListAdapter; import android.widget.ListPopupWindow; import android.widget.ListView; @@ -86,6 +88,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -235,6 +238,10 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements private int mMaxLines; + private static int sExcessTopPadding = -1; + + private int mActionBarHeight = -1; + public RecipientEditTextView(Context context, AttributeSet attrs) { super(context, attrs); setChipDimensions(context, attrs); @@ -667,6 +674,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RecipientEditTextView, 0, 0); Resources r = getContext().getResources(); + mChipBackground = a.getDrawable(R.styleable.RecipientEditTextView_chipBackground); if (mChipBackground == null) { mChipBackground = r.getDrawable(R.drawable.chip_background); @@ -709,6 +717,11 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements } mLineSpacingExtra = r.getDimension(R.dimen.line_spacing_extra); mMaxLines = r.getInteger(R.integer.chips_max_lines); + TypedValue tv = new TypedValue(); + if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { + mActionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources() + .getDisplayMetrics()); + } a.recycle(); } @@ -1298,7 +1311,8 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements */ @Override protected void performFiltering(CharSequence text, int keyCode) { - if (enoughToFilter() && !isCompletedToken(text)) { + boolean isCompletedToken = isCompletedToken(text); + if (enoughToFilter() && !isCompletedToken) { int end = getSelectionEnd(); int start = mTokenizer.findTokenStart(text, end); // If this is a RecipientChip, don't filter @@ -1308,6 +1322,8 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements if (chips != null && chips.length > 0) { return; } + } else if (isCompletedToken) { + return; } super.performFiltering(text, keyCode); } @@ -1388,7 +1404,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements private void scrollLineIntoView(int line) { if (mScrollView != null) { - mScrollView.scrollBy(0, calculateOffsetFromBottom(line)); + mScrollView.smoothScrollBy(0, calculateOffsetFromBottom(line)); } } @@ -2211,7 +2227,6 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements return; } } - scrollBottomIntoView(); } } @@ -2221,10 +2236,41 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements } } + public <T extends ListAdapter & Filterable> void setAdapter(T adapter) { + super.setAdapter(adapter); + ((BaseRecipientAdapter) adapter) + .registerUpdateObserver(new BaseRecipientAdapter.EntriesUpdatedObserver() { + @Override + public void onChanged(List<RecipientEntry> entries) { + if (entries != null && entries.size() > 0) { + scrollBottomIntoView(); + } + } + }); + } + private void scrollBottomIntoView() { - if (mScrollView != null) { - mScrollView.scrollBy(0, (int) (getLineCount() * mChipHeight)); + if (mScrollView != null && mShouldShrink) { + int[] location = new int[2]; + getLocationOnScreen(location); + int height = getHeight(); + int currentPos = location[1] + height; + // Desired position shows at least 1 line of chips below the action + // bar. + // We add excess padding to make sure this is always below other + // content. + int desiredPos = (int) mChipHeight + mActionBarHeight + getExcessTopPadding(); + if (currentPos > desiredPos) { + mScrollView.scrollBy(0, currentPos - desiredPos); + } + } + } + + private int getExcessTopPadding() { + if (sExcessTopPadding == -1) { + sExcessTopPadding = (int) mChipHeight; } + return sExcessTopPadding; } public boolean lastCharacterIsCommitCharacter(CharSequence s) { @@ -2452,6 +2498,7 @@ public class RecipientEditTextView extends MultiAutoCompleteTextView implements oldText.replace(start, end, displayText); replacement.setOriginalText(displayText .toString()); + replacements.set(i, null); } } i++; |