Simplify insets calculation

InputMethodService.Insets.touchableRegion has been available since API Level 11.  We can safely access that method without the risk of runtime exceptions.  No behavior change is intended in the supported platforms.

BUG=none
TEST=compile

git-svn-id: https://mozc.googlecode.com/svn/trunk@405 a6090854-d499-a067-5803-1114d4e51264
diff --git a/src/android/src/com/google/android/inputmethod/japanese/MozcView.java b/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
index 8de9847..5bce6c6 100644
--- a/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
+++ b/src/android/src/com/google/android/inputmethod/japanese/MozcView.java
@@ -48,13 +48,11 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.inputmethodservice.InputMethodService.Insets;
-import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
 import android.util.AttributeSet;
@@ -85,76 +83,6 @@
  */
 public class MozcView extends LinearLayout implements MemoryManageable {
 
-  /**
-   * Decides insets.
-   * Insets.touchableRegion needs API Level 11. So we split it to RegionInsetsCalculator
-   * which is used under reflection.
-   */
-  static interface InsetsCalculator {
-    boolean isFloatingMode(MozcView mozcView);
-    void setInsets(MozcView mozcView, int contentViewWidth, int contentViewHeight,
-                   Insets outInsets);
-  }
-
-  static class DefaultInsetsCalculator implements InsetsCalculator {
-    static void setInsetsDefault(MozcView mozcView, int contentViewHeight,
-                                 Insets outInsets) {
-      outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_CONTENT;
-      outInsets.contentTopInsets = contentViewHeight - mozcView.getVisibleViewHeight();
-      outInsets.visibleTopInsets = outInsets.contentTopInsets;
-    }
-
-    @Override
-    public boolean isFloatingMode(MozcView mozcView) {
-      return false;
-    }
-
-    @Override
-    public void setInsets(MozcView mozcView, int contentViewWidth, int contentViewHeight,
-                          Insets outInsets) {
-      setInsetsDefault(mozcView, contentViewHeight, outInsets);
-    }
-  }
-
-  /**
-   * Sets regional Inset to transparent background.
-   *
-   * public accessibility for easier invocation via reflection.
-   */
-  @TargetApi(11)
-  public static class RegionInsetsCalculator implements InsetsCalculator {
-    @Override
-    public boolean isFloatingMode(MozcView mozcView) {
-      Resources resources = mozcView.getResources();
-      return mozcView.layoutAdjustment != LayoutAdjustment.FILL
-          && !mozcView.narrowMode
-          && resources.getDisplayMetrics().widthPixels
-              >= mozcView.dimensionPixelSize.imeWindowRegionInsetThreshold;
-    }
-
-    @Override
-    public void setInsets(MozcView mozcView, int contentViewWidth, int contentViewHeight,
-                          Insets outInsets) {
-      if (!isFloatingMode(mozcView)) {
-        DefaultInsetsCalculator.setInsetsDefault(mozcView, contentViewHeight,
-                                                 outInsets);
-        return;
-      }
-      mozcView.getResources();
-      int height = mozcView.getVisibleViewHeight();
-      int width = mozcView.getSideAdjustedWidth();
-      int left =
-          mozcView.layoutAdjustment == LayoutAdjustment.RIGHT ? (contentViewWidth - width) : 0;
-
-      outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_REGION;
-      outInsets.touchableRegion.set(
-          left, contentViewHeight - height, left + width, contentViewHeight);
-      outInsets.contentTopInsets = contentViewHeight;
-      outInsets.visibleTopInsets = contentViewHeight;
-      return;
-    }
-  }
-
   static class DimensionPixelSize {
     final int imeWindowPartialWidth;
     final int imeWindowRegionInsetThreshold;
@@ -240,7 +168,6 @@
   private static final float NARROW_MODE_BUTTON_TOP_OFFSET = 1.0f;
   private static final float NARROW_MODE_BUTTON_RIGHT_OFFSET = 2.0f;
   private static final float NARROW_MODE_BUTTON_BOTTOM_OFFSET = 3.0f;
-  private static final InsetsCalculator insetsCalculator;
 
   @VisibleForTesting
   final InOutAnimatedFrameLayout.VisibilityChangeListener onVisibilityChangeListener =
@@ -272,36 +199,6 @@
   @VisibleForTesting Animation dropShadowSymbolInputViewOutAnimation;
   @VisibleForTesting boolean isDropShadowExpanded = false;
 
-  static {
-    // API Level 11 is Build.VERSION_CODES.HONEYCOMB.
-    // When right/left adjustment mode, outInsets uses touchableRegion to cut out IME rectangle.
-    // Because only after API.11(HONEYCOMB) supports touchableRegion, filter it.
-    InsetsCalculator tmpCalculator = null;
-    if (Build.VERSION.SDK_INT >= 11) {
-      // Try to create RegsionInsetsCalculator if the API level is high enough.
-      try {
-        Class<?> clazz = Class.forName(new StringBuilder(MozcView.class.getCanonicalName())
-            .append('$')
-            .append("RegionInsetsCalculator")
-            .toString());
-        tmpCalculator = InsetsCalculator.class.cast(clazz.newInstance());
-      } catch (ClassNotFoundException e) {
-        MozcLog.e(e.getMessage(), e);
-      } catch (IllegalArgumentException e) {
-        MozcLog.e(e.getMessage(), e);
-      } catch (IllegalAccessException e) {
-        MozcLog.e(e.getMessage(), e);
-      } catch (InstantiationException e) {
-        MozcLog.e(e.getMessage(), e);
-      }
-    }
-
-    if (tmpCalculator == null) {
-      tmpCalculator = new DefaultInsetsCalculator();
-    }
-    insetsCalculator = tmpCalculator;
-  }
-
   public MozcView(Context context) {
     super(context);
   }
@@ -816,18 +713,40 @@
     // If fullscreenMode, background should not show original window.
     // If narrowMode, it is always full-width.
     // If isFloatingMode, background should be transparent.
-    int resourceId = (fullscreenMode || (!narrowMode && !insetsCalculator.isFloatingMode(this))) ?
+    int resourceId = (fullscreenMode || (!narrowMode && !isFloatingMode())) ?
         R.color.input_frame_background : 0;
     getBottomBackground().setBackgroundResource(resourceId);
   }
 
+  @VisibleForTesting
+  boolean isFloatingMode() {
+    return layoutAdjustment != LayoutAdjustment.FILL
+        && !narrowMode
+        && getResources().getDisplayMetrics().widthPixels
+            >= dimensionPixelSize.imeWindowRegionInsetThreshold;
+  }
+
   /**
    * This function is called to compute insets.
    */
   public void setInsets(int contentViewWidth, int contentViewHeight, Insets outInsets) {
-    insetsCalculator.setInsets(this, contentViewWidth, contentViewHeight, outInsets);
-  }
+    if (!isFloatingMode()) {
+      outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_CONTENT;
+      outInsets.contentTopInsets = contentViewHeight - getVisibleViewHeight();
+      outInsets.visibleTopInsets = outInsets.contentTopInsets;
+      return;
+    }
+    int height = getVisibleViewHeight();
+    int width = getSideAdjustedWidth();
+    int left = layoutAdjustment == LayoutAdjustment.RIGHT ? (contentViewWidth - width) : 0;
 
+    outInsets.touchableInsets = Insets.TOUCHABLE_INSETS_REGION;
+    outInsets.touchableRegion.set(
+        left, contentViewHeight - height, left + width, contentViewHeight);
+    outInsets.contentTopInsets = contentViewHeight;
+    outInsets.visibleTopInsets = contentViewHeight;
+    return;
+  }
 
   void expandDropShadowAndBackground() {
     leftFrameStubProxy.flipDropShadowVisibility(INVISIBLE);
diff --git a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
index 9113e21..3ca845a 100644
--- a/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
+++ b/src/android/tests/src/com/google/android/inputmethod/japanese/MozcViewTest.java
@@ -44,7 +44,6 @@
 import org.mozc.android.inputmethod.japanese.LayoutParamsAnimator.InterpolationListener;
 import org.mozc.android.inputmethod.japanese.MozcView.DimensionPixelSize;
 import org.mozc.android.inputmethod.japanese.MozcView.HeightLinearInterpolationListener;
-import org.mozc.android.inputmethod.japanese.MozcView.InsetsCalculator;
 import org.mozc.android.inputmethod.japanese.ViewManagerInterface.LayoutAdjustment;
 import org.mozc.android.inputmethod.japanese.emoji.EmojiProviderType;
 import org.mozc.android.inputmethod.japanese.hardwarekeyboard.HardwareKeyboard.CompositionSwitchMode;
@@ -59,7 +58,6 @@
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Command;
 import org.mozc.android.inputmethod.japanese.protobuf.ProtoCommands.Output;
 import org.mozc.android.inputmethod.japanese.resources.R;
-import org.mozc.android.inputmethod.japanese.testing.ApiLevel;
 import org.mozc.android.inputmethod.japanese.testing.InstrumentationTestCaseWithMock;
 import org.mozc.android.inputmethod.japanese.testing.Parameter;
 import org.mozc.android.inputmethod.japanese.testing.VisibilityProxy;
@@ -67,7 +65,6 @@
 import org.mozc.android.inputmethod.japanese.view.SkinType;
 import com.google.common.base.Optional;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Rect;
@@ -755,7 +752,7 @@
     class TestData extends Parameter {
       final boolean fullscreenMode;
       final boolean narrowMode;
-      final InsetsCalculator insetsCalculator;
+      final boolean isFloatable;
 
       final int expectResourceId;
 
@@ -763,17 +760,7 @@
                int expectedResourceId) {
         this.fullscreenMode = fullscreenMode;
         this.narrowMode = narrowMode;
-        this.insetsCalculator = new InsetsCalculator() {
-          @Override
-          public void setInsets(
-              MozcView mozcView, int contentViewWidth, int contentViewHeight, Insets outInsets) {
-          }
-
-          @Override
-          public boolean isFloatingMode(MozcView mozcView) {
-            return isFloatable;
-          }
-        };
+        this.isFloatable = isFloatable;
         this.expectResourceId = expectedResourceId;
       }
     }
@@ -791,7 +778,7 @@
 
       resetAll();
       expect(mozcView.getBottomBackground()).andStubReturn(bottomBackground);
-      VisibilityProxy.setField(mozcView, "insetsCalculator", testData.insetsCalculator);
+      expect(mozcView.isFloatingMode()).andStubReturn(testData.isFloatable);
       bottomBackground.setBackgroundResource(testData.expectResourceId);
 
       replayAll();
@@ -802,37 +789,34 @@
   }
 
   @SmallTest
-  public void testDefaultInsetsCalculator() {
+  public void testInsetsCalculator_static() {
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethod("getVisibleViewHeight")
+        .addMockedMethods("getVisibleViewHeight", "isFloatingMode")
         .createMock();
-    InsetsCalculator insetsCalculator = new MozcView.DefaultInsetsCalculator();
     int visibleViewHeight = 240;
     int contentViewWidth = 800;
     int contentViewHeight = 400;
     expect(mozcView.getVisibleViewHeight()).andStubReturn(visibleViewHeight);
+    expect(mozcView.isFloatingMode()).andStubReturn(false);
     replayAll();
 
-    assertFalse(insetsCalculator.isFloatingMode(mozcView));
     Insets outInsets = new Insets();
-    insetsCalculator.setInsets(mozcView, contentViewWidth, contentViewHeight, outInsets);
+    mozcView.setInsets(contentViewWidth, contentViewHeight, outInsets);
     assertEquals(Insets.TOUCHABLE_INSETS_CONTENT, outInsets.touchableInsets);
     assertEquals(contentViewHeight - visibleViewHeight, outInsets.contentTopInsets);
     assertEquals(contentViewHeight - visibleViewHeight, outInsets.visibleTopInsets);
   }
 
   @SmallTest
-  @ApiLevel(11)
-  @TargetApi(11)
-  public void testRegionInsetsCalculator() {
+  public void testInsetsCalculator_floating() {
     MozcView mozcView = createViewMockBuilder(MozcView.class)
-        .addMockedMethods("getVisibleViewHeight", "getResources", "getSideAdjustedWidth")
+        .addMockedMethods("getVisibleViewHeight", "getResources", "getSideAdjustedWidth",
+                          "isFloatingMode")
         .createMock();
     Resources resources = createMockBuilder(MockResources.class)
         .addMockedMethods("getDisplayMetrics", "getDimensionPixelSize")
         .createMock();
 
-    InsetsCalculator insetsCalculator = new MozcView.RegionInsetsCalculator();
     int visibleViewHeight = 240;
     int contentViewWidth = 800;
     int contentViewHeight = 400;
@@ -847,6 +831,7 @@
     expect(resources.getDimensionPixelSize(anyInt())).andStubReturn(0);
     expect(mozcView.getVisibleViewHeight()).andStubReturn(visibleViewHeight);
     expect(mozcView.getSideAdjustedWidth()).andStubReturn(width);
+    expect(mozcView.isFloatingMode()).andStubReturn(true);
 
     replayAll();
 
@@ -854,23 +839,11 @@
     VisibilityProxy.setField(mozcView, "dimensionPixelSize", dimensionPixelSize);
 
     {
-      mozcView.layoutAdjustment = LayoutAdjustment.FILL;
-      assertFalse(insetsCalculator.isFloatingMode(mozcView));
-
-      Insets outInsets = new Insets();
-      insetsCalculator.setInsets(mozcView, contentViewWidth, contentViewHeight, outInsets);
-      assertEquals(Insets.TOUCHABLE_INSETS_CONTENT, outInsets.touchableInsets);
-      assertEquals(contentViewHeight - visibleViewHeight, outInsets.contentTopInsets);
-      assertEquals(contentViewHeight - visibleViewHeight, outInsets.visibleTopInsets);
-    }
-
-    {
       mozcView.layoutAdjustment = LayoutAdjustment.LEFT;
       mozcView.narrowMode = false;
-      assertTrue(insetsCalculator.isFloatingMode(mozcView));
 
       Insets outInsets = new Insets();
-      insetsCalculator.setInsets(mozcView, contentViewWidth, contentViewHeight, outInsets);
+      mozcView.setInsets(contentViewWidth, contentViewHeight, outInsets);
       assertEquals(Insets.TOUCHABLE_INSETS_REGION, outInsets.touchableInsets);
       Rect bounds = outInsets.touchableRegion.getBounds();
       assertEquals(0, bounds.left);
@@ -884,10 +857,9 @@
     {
       mozcView.layoutAdjustment = LayoutAdjustment.RIGHT;
       mozcView.narrowMode = false;
-      assertTrue(insetsCalculator.isFloatingMode(mozcView));
 
       Insets outInsets = new Insets();
-      insetsCalculator.setInsets(mozcView, contentViewWidth, contentViewHeight, outInsets);
+      mozcView.setInsets(contentViewWidth, contentViewHeight, outInsets);
       assertEquals(Insets.TOUCHABLE_INSETS_REGION, outInsets.touchableInsets);
       Rect bounds = outInsets.touchableRegion.getBounds();
       assertEquals(contentViewWidth - width, bounds.left);
diff --git a/src/mozc_version_template.txt b/src/mozc_version_template.txt
index 0151b35..a0ae0b3 100644
--- a/src/mozc_version_template.txt
+++ b/src/mozc_version_template.txt
@@ -1,6 +1,6 @@
 MAJOR=2
 MINOR=16
-BUILD=1945
+BUILD=1946
 REVISION=102
 # NACL_DICTIONARY_VERSION is the target version of the system dictionary to be
 # downloaded by NaCl Mozc.