Release bitmap buffer when KeyboardView is detached from Window

Bug: 5450387
Change-Id: I3e60edd8c0ea70aff9e484f6e00dadcc8f8981f6
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index 6af4123..e69dc58 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -974,5 +974,9 @@
         if (mPreviewPlacer != null) {
             mPreviewPlacer.removeAllViews();
         }
+        if (mBuffer != null) {
+            mBuffer.recycle();
+            mBuffer = null;
+        }
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
index 3452720..c51f184 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboard.java
@@ -59,8 +59,8 @@
     private final int mSpacebarTextColor;
     private final int mSpacebarTextShadowColor;
     private float mSpacebarTextFadeFactor = 0.0f;
-    private final HashMap<Integer, SoftReference<BitmapDrawable>> mSpaceDrawableCache =
-            new HashMap<Integer, SoftReference<BitmapDrawable>>();
+    private final HashMap<Integer, BitmapDrawable> mSpaceDrawableCache =
+            new HashMap<Integer, BitmapDrawable>();
     private final boolean mIsSpacebarTriggeringPopupByLongPress;
 
     /* Shortcut key and its icons if available */
@@ -249,13 +249,13 @@
     private BitmapDrawable getSpaceDrawable(Locale locale, boolean isAutoCorrection) {
         final Integer hashCode = Arrays.hashCode(
                 new Object[] { locale, isAutoCorrection, mSpacebarTextFadeFactor });
-        final SoftReference<BitmapDrawable> ref = mSpaceDrawableCache.get(hashCode);
-        BitmapDrawable drawable = (ref == null) ? null : ref.get();
-        if (drawable == null) {
-            drawable = new BitmapDrawable(mRes, drawSpacebar(
-                    locale, isAutoCorrection, mSpacebarTextFadeFactor));
-            mSpaceDrawableCache.put(hashCode, new SoftReference<BitmapDrawable>(drawable));
+        final BitmapDrawable cached = mSpaceDrawableCache.get(hashCode);
+        if (cached != null) {
+            return cached;
         }
+        final BitmapDrawable drawable = new BitmapDrawable(mRes, drawSpacebar(
+                locale, isAutoCorrection, mSpacebarTextFadeFactor));
+        mSpaceDrawableCache.put(hashCode, drawable);
         return drawable;
     }