summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormindyp <mindyp@google.com>2012-12-14 10:58:44 -0800
committermindyp <mindyp@google.com>2012-12-14 15:19:43 -0800
commit70d41146a39058c47eee5c505cae6a6a2c1409f9 (patch)
tree0762245ed2b47b814e957f389a83fe06341464f5
parent0cf347e69473d2259194257d5a4b9aa103c8e448 (diff)
downloadandroid_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.java12
-rw-r--r--chips/src/com/android/ex/chips/RecipientEditTextView.java57
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++;