Merge "Remove workaround code of placing DrawingPreviewPlacerView"
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 0f9c39a..d8dd93a 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -30,7 +30,6 @@
 import android.graphics.drawable.Drawable;
 import android.preference.PreferenceManager;
 import android.util.AttributeSet;
-import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -428,21 +427,11 @@
     }
 
     private void locatePreviewPlacerView() {
-        if (mDrawingPreviewPlacerView.getParent() != null) {
-            return;
-        }
-        final int width = getWidth();
-        final int height = getHeight();
-        if (width == 0 || height == 0) {
-            // In transient state.
-            return;
-        }
         getLocationInWindow(mOriginCoords);
-        final DisplayMetrics dm = getResources().getDisplayMetrics();
-        if (CoordinateUtils.y(mOriginCoords) < dm.heightPixels / 4) {
-            // In transient state.
-            return;
-        }
+        mDrawingPreviewPlacerView.setKeyboardViewGeometry(mOriginCoords, getWidth(), getHeight());
+    }
+
+    private void installPreviewPlacerView() {
         final View rootView = getRootView();
         if (rootView == null) {
             Log.w(TAG, "Cannot find root view");
@@ -452,10 +441,9 @@
         // Note: It'd be very weird if we get null by android.R.id.content.
         if (windowContentView == null) {
             Log.w(TAG, "Cannot find android.R.id.content view to add DrawingPreviewPlacerView");
-        } else {
-            windowContentView.addView(mDrawingPreviewPlacerView);
-            mDrawingPreviewPlacerView.setKeyboardViewGeometry(mOriginCoords, width, height);
+            return;
         }
+        windowContentView.addView(mDrawingPreviewPlacerView);
     }
 
     /**
@@ -576,6 +564,7 @@
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
+        installPreviewPlacerView();
         // Notify the ResearchLogger (development only diagnostics) that the keyboard view has
         // been attached.  This is needed to properly show the splash screen, which requires that
         // the window token of the KeyboardView be non-null.
diff --git a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java
index cd7dd6f..3a72aed 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java
@@ -29,25 +29,37 @@
 public abstract class AbstractDrawingPreview {
     private final View mDrawingView;
     private boolean mPreviewEnabled;
+    private boolean mHasValidGeometry;
 
     protected AbstractDrawingPreview(final View drawingView) {
         mDrawingView = drawingView;
     }
 
-    public final View getDrawingView() {
+    protected final View getDrawingView() {
         return mDrawingView;
     }
 
+    protected final boolean isPreviewEnabled() {
+        return mPreviewEnabled && mHasValidGeometry;
+    }
+
     public final void setPreviewEnabled(final boolean enabled) {
         mPreviewEnabled = enabled;
     }
 
-    public boolean isPreviewEnabled() {
-        return mPreviewEnabled;
-    }
-
-    public void setKeyboardGeometry(final int[] originCoords, final int width, final int height) {
-        // Default implementation is empty.
+    /**
+     * Set {@link MainKeyboardView} geometry and position in the {@link SoftInputWindow}.
+     * The class that is overriding this method must call this super implementation.
+     *
+     * @param originCoords the top-left coordinates of the {@link MainKeyboardView} in
+     *        {@link SoftInputWindow} coordinate-system. This is unused but has a point in an
+     *        extended class, such as {@link GestureTrailsDrawingPreview}.
+     * @param width the width of {@link MainKeyboardView}.
+     * @param height the height of {@link MainKeyboardView}.
+     */
+    public void setKeyboardViewGeometry(final int[] originCoords, final int width,
+            final int height) {
+        mHasValidGeometry = (width > 0 && height > 0);
     }
 
     public abstract void onDeallocateMemory();
diff --git a/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java
index 606addc..fdc2458 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/DrawingPreviewPlacerView.java
@@ -55,7 +55,7 @@
         CoordinateUtils.copy(mKeyboardViewOrigin, originCoords);
         final int count = mPreviews.size();
         for (int i = 0; i < count; i++) {
-            mPreviews.get(i).setKeyboardGeometry(originCoords, width, height);
+            mPreviews.get(i).setKeyboardViewGeometry(originCoords, width, height);
         }
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java
index eef4b36..d8b00c7 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureTrailsDrawingPreview.java
@@ -95,7 +95,9 @@
     }
 
     @Override
-    public void setKeyboardGeometry(final int[] originCoords, final int width, final int height) {
+    public void setKeyboardViewGeometry(final int[] originCoords, final int width,
+            final int height) {
+        super.setKeyboardViewGeometry(originCoords, width, height);
         mOffscreenOffsetY = (int)(height
                 * GestureStrokeRecognitionPoints.EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO);
         mOffscreenWidth = width;