aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2013-07-08 18:46:33 +0900
committerJean Chalard <jchalard@google.com>2013-07-16 14:12:55 +0900
commit6912342a48b9ebf6f4dcd714b697eadac48afbde (patch)
treea56c8276e21f78703ab1fbd3b98adf3f27771133
parentb6f286bfa549ed91c67d591fc1725e35b114742b (diff)
downloadlatinime-6912342a48b9ebf6f4dcd714b697eadac48afbde.tar.gz
latinime-6912342a48b9ebf6f4dcd714b697eadac48afbde.tar.xz
latinime-6912342a48b9ebf6f4dcd714b697eadac48afbde.zip
Fix a bug with bad view reuse.
There are many ways to fix this problem but this is the most direct way. Removing a view from the cache when any animation is started will ensure it won't be used again, and will be garbage collected when it's possible. Since views are created on demand anyway, a new one will just get created when needed, and that's it. Bug: 9400128 Change-Id: I4945d2859d642e79694d51ae90cf4f5bde9a5f1d
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java5
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java4
-rw-r--r--java/src/com/android/inputmethod/dictionarypack/WordListPreference.java2
3 files changed, 9 insertions, 2 deletions
diff --git a/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java b/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java
index c5aca174a..6d6c8f5c6 100644
--- a/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java
+++ b/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java
@@ -47,6 +47,7 @@ public class ButtonSwitcher extends FrameLayout {
private Button mInstallButton;
private Button mCancelButton;
private Button mDeleteButton;
+ private DictionaryListInterfaceState mInterfaceState;
private OnClickListener mOnClickListener;
public ButtonSwitcher(Context context, AttributeSet attrs) {
@@ -57,9 +58,10 @@ public class ButtonSwitcher extends FrameLayout {
super(context, attrs, defStyle);
}
- public void reset() {
+ public void reset(final DictionaryListInterfaceState interfaceState) {
mStatus = NOT_INITIALIZED;
mAnimateToStatus = NOT_INITIALIZED;
+ mInterfaceState = interfaceState;
}
@Override
@@ -153,6 +155,7 @@ public class ButtonSwitcher extends FrameLayout {
private ViewPropertyAnimator animateButton(final View button, final int direction) {
final float outerX = getWidth();
final float innerX = button.getX() - button.getTranslationX();
+ mInterfaceState.removeFromCache((View)getParent());
if (ANIMATION_IN == direction) {
button.setClickable(true);
return button.animate().translationX(0);
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java
index f1a2a8333..13c07de35 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryListInterfaceState.java
@@ -80,4 +80,8 @@ public class DictionaryListInterfaceState {
mViewCache.add(view);
return view;
}
+
+ public void removeFromCache(final View view) {
+ mViewCache.remove(view);
+ }
}
diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
index 7ec7e9c13..ba1fce1a8 100644
--- a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
+++ b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
@@ -224,7 +224,7 @@ public final class WordListPreference extends Preference {
(ButtonSwitcher)view.findViewById(R.id.wordlist_button_switcher);
// We need to clear the state of the button switcher, because we reuse views; if we didn't
// reset it would animate from whatever its old state was.
- buttonSwitcher.reset();
+ buttonSwitcher.reset(mInterfaceState);
if (mInterfaceState.isOpen(mWordlistId)) {
// The button is open.
final int previousStatus = mInterfaceState.getStatus(mWordlistId);