Deprecate and cleanup usage of KeyEventCompat.

Clean up KeyEventCompat after minSdk 14 bump.

Bug: 32794064
Test: ./gradlew assemble
Change-Id: I2579a79d1feea94b24a6cbf9dd8b2911cefe27a7
diff --git a/api/current.txt b/api/current.txt
index 38b3206..f9cbc2f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -7319,16 +7319,16 @@
     field public static final int SOURCE_UNKNOWN = 0; // 0x0
   }
 
-  public final class KeyEventCompat {
+  public final deprecated class KeyEventCompat {
     method public static deprecated boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
     method public static deprecated java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static deprecated boolean hasModifiers(android.view.KeyEvent, int);
+    method public static deprecated boolean hasNoModifiers(android.view.KeyEvent);
+    method public static deprecated boolean isCtrlPressed(android.view.KeyEvent);
     method public static deprecated boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
+    method public static deprecated boolean metaStateHasModifiers(int, int);
+    method public static deprecated boolean metaStateHasNoModifiers(int);
+    method public static deprecated int normalizeMetaState(int);
     method public static deprecated void startTracking(android.view.KeyEvent);
   }
 
diff --git a/compat/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java b/compat/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java
deleted file mode 100644
index caf0657..0000000
--- a/compat/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.view;
-
-import android.support.annotation.RequiresApi;
-import android.view.KeyEvent;
-
-/**
- * Implementation of key event compatibility that can call Honeycomb APIs.
- */
-
-@RequiresApi(11)
-class KeyEventCompatHoneycomb {
-    public static int normalizeMetaState(int metaState) {
-        return KeyEvent.normalizeMetaState(metaState);
-    }
-    
-    public static boolean metaStateHasModifiers(int metaState, int modifiers) {
-        return KeyEvent.metaStateHasModifiers(metaState, modifiers);
-    }
-
-    public static boolean metaStateHasNoModifiers(int metaState) {
-        return KeyEvent.metaStateHasNoModifiers(metaState);
-    }
-
-    public static boolean isCtrlPressed(KeyEvent event) {
-        return event.isCtrlPressed();
-    }
-}
diff --git a/compat/java/android/support/v4/view/KeyEventCompat.java b/compat/java/android/support/v4/view/KeyEventCompat.java
index 471cbc9..03c668d 100644
--- a/compat/java/android/support/v4/view/KeyEventCompat.java
+++ b/compat/java/android/support/v4/view/KeyEventCompat.java
@@ -22,137 +22,54 @@
 /**
  * Helper for accessing features in {@link KeyEvent} introduced after
  * API level 4 in a backwards compatible fashion.
+ *
+ * @deprecated Use {@link KeyEvent} directly.
  */
+@Deprecated
 public final class KeyEventCompat {
     /**
-     * Interface for the full API.
+     * @deprecated Call {@link KeyEvent#normalizeMetaState(int)} directly. This method will
+     * be removed in a future release.
      */
-    interface KeyEventVersionImpl {
-        int normalizeMetaState(int metaState);
-        boolean metaStateHasModifiers(int metaState, int modifiers);
-        boolean metaStateHasNoModifiers(int metaState);
-        boolean isCtrlPressed(KeyEvent event);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything about v4 APIs.
-     */
-    static class BaseKeyEventVersionImpl implements KeyEventVersionImpl {
-        private static final int META_MODIFIER_MASK =
-                KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_RIGHT_ON
-                | KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON
-                | KeyEvent.META_SYM_ON;
-
-        // Mask of all lock key meta states.
-        private static final int META_ALL_MASK = META_MODIFIER_MASK;
-
-        private static int metaStateFilterDirectionalModifiers(int metaState,
-                int modifiers, int basic, int left, int right) {
-            final boolean wantBasic = (modifiers & basic) != 0;
-            final int directional = left | right;
-            final boolean wantLeftOrRight = (modifiers & directional) != 0;
-
-            if (wantBasic) {
-                if (wantLeftOrRight) {
-                    throw new IllegalArgumentException("bad arguments");
-                }
-                return metaState & ~directional;
-            } else if (wantLeftOrRight) {
-                return metaState & ~basic;
-            } else {
-                return metaState;
-            }
-        }
-
-        @Override
-        public int normalizeMetaState(int metaState) {
-            if ((metaState & (KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_RIGHT_ON)) != 0) {
-                metaState |= KeyEvent.META_SHIFT_ON;
-            }
-            if ((metaState & (KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON)) != 0) {
-                metaState |= KeyEvent.META_ALT_ON;
-            }
-            return metaState & META_ALL_MASK;
-        }
- 
-        @Override
-        public boolean metaStateHasModifiers(int metaState, int modifiers) {
-            metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
-            metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
-                    KeyEvent.META_SHIFT_ON, KeyEvent.META_SHIFT_LEFT_ON, KeyEvent.META_SHIFT_RIGHT_ON);
-            metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
-                    KeyEvent.META_ALT_ON, KeyEvent.META_ALT_LEFT_ON, KeyEvent.META_ALT_RIGHT_ON);
-            return metaState == modifiers;
-        }
-
-        @Override
-        public boolean metaStateHasNoModifiers(int metaState) {
-            return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
-        }
-
-        @Override
-        public boolean isCtrlPressed(KeyEvent event) {
-            return false;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v11 APIs.
-     */
-    static class HoneycombKeyEventVersionImpl extends BaseKeyEventVersionImpl {
-        @Override
-        public int normalizeMetaState(int metaState) {
-            return KeyEventCompatHoneycomb.normalizeMetaState(metaState);
-        }
-        
-        @Override
-        public boolean metaStateHasModifiers(int metaState, int modifiers) {
-            return KeyEventCompatHoneycomb.metaStateHasModifiers(metaState, modifiers);
-        }
-
-        @Override
-        public boolean metaStateHasNoModifiers(int metaState) {
-            return KeyEventCompatHoneycomb.metaStateHasNoModifiers(metaState);
-        }
-
-        @Override
-        public boolean isCtrlPressed(KeyEvent event) {
-            return KeyEventCompatHoneycomb.isCtrlPressed(event);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final KeyEventVersionImpl IMPL;
-    static {
-        if (android.os.Build.VERSION.SDK_INT >= 11) {
-            IMPL = new HoneycombKeyEventVersionImpl();
-        } else {
-            IMPL = new BaseKeyEventVersionImpl();
-        }
-    }
-
-    // -------------------------------------------------------------------
-
+    @Deprecated
     public static int normalizeMetaState(int metaState) {
-        return IMPL.normalizeMetaState(metaState);
+        return KeyEvent.normalizeMetaState(metaState);
     }
 
+    /**
+     * @deprecated Call {@link KeyEvent#metaStateHasModifiers(int, int)} directly. This method will
+     * be removed in a future release.
+     */
+    @Deprecated
     public static boolean metaStateHasModifiers(int metaState, int modifiers) {
-        return IMPL.metaStateHasModifiers(metaState, modifiers);
+        return KeyEvent.metaStateHasModifiers(metaState, modifiers);
     }
 
+    /**
+     * @deprecated Call {@link KeyEvent#metaStateHasNoModifiers(int)} directly. This method will be
+     * removed in a future release.
+     */
+    @Deprecated
     public static boolean metaStateHasNoModifiers(int metaState) {
-        return IMPL.metaStateHasNoModifiers(metaState);
+        return KeyEvent.metaStateHasNoModifiers(metaState);
     }
 
+    /**
+     * @deprecated Call {@link KeyEvent#hasModifiers(int)} directly. This method will be removed in
+     * a future release.
+     */
+    @Deprecated
     public static boolean hasModifiers(KeyEvent event, int modifiers) {
-        return IMPL.metaStateHasModifiers(event.getMetaState(), modifiers);
+        return event.hasModifiers(modifiers);
     }
 
+    /**
+     * @deprecated Call {@link KeyEvent#hasNoModifiers()} directly. This method will be removed in a
+     * future release.
+     */
+    @Deprecated
     public static boolean hasNoModifiers(KeyEvent event) {
-        return IMPL.metaStateHasNoModifiers(event.getMetaState());
+        return event.hasNoModifiers();
     }
 
     /**
@@ -190,11 +107,16 @@
     @Deprecated
     public static boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state,
                 Object target) {
-        return event.dispatch(receiver, (KeyEvent.DispatcherState)state, target);
+        return event.dispatch(receiver, (KeyEvent.DispatcherState) state, target);
     }
 
+    /**
+     * @deprecated Call {@link KeyEvent#isCtrlPressed()} directly. This method will be removed
+     * in a future release.
+     */
+    @Deprecated
     public static boolean isCtrlPressed(KeyEvent event) {
-        return IMPL.isCtrlPressed(event);
+        return event.isCtrlPressed();
     }
 
     private KeyEventCompat() {}
diff --git a/core-ui/java/android/support/v4/view/ViewPager.java b/core-ui/java/android/support/v4/view/ViewPager.java
index f88b53e..b70ef43 100644
--- a/core-ui/java/android/support/v4/view/ViewPager.java
+++ b/core-ui/java/android/support/v4/view/ViewPager.java
@@ -23,7 +23,6 @@
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -2750,14 +2749,10 @@
                     handled = arrowScroll(FOCUS_RIGHT);
                     break;
                 case KeyEvent.KEYCODE_TAB:
-                    if (Build.VERSION.SDK_INT >= 11) {
-                        // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD
-                        // before Android 3.0. Ignore the tab key on those devices.
-                        if (KeyEventCompat.hasNoModifiers(event)) {
-                            handled = arrowScroll(FOCUS_FORWARD);
-                        } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {
-                            handled = arrowScroll(FOCUS_BACKWARD);
-                        }
+                    if (event.hasNoModifiers()) {
+                        handled = arrowScroll(FOCUS_FORWARD);
+                    } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
+                        handled = arrowScroll(FOCUS_BACKWARD);
                     }
                     break;
             }
diff --git a/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java b/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
index a9bc39b..1640100 100644
--- a/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
+++ b/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
@@ -23,7 +23,6 @@
 import android.support.annotation.Nullable;
 import android.support.v4.util.SparseArrayCompat;
 import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.KeyEventCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.ViewCompat.FocusDirection;
 import android.support.v4.view.ViewCompat.FocusRealDirection;
@@ -223,7 +222,7 @@
                 case KeyEvent.KEYCODE_DPAD_UP:
                 case KeyEvent.KEYCODE_DPAD_RIGHT:
                 case KeyEvent.KEYCODE_DPAD_DOWN:
-                    if (KeyEventCompat.hasNoModifiers(event)) {
+                    if (event.hasNoModifiers()) {
                         final int direction = keyToDirection(keyCode);
                         final int count = 1 + event.getRepeatCount();
                         for (int i = 0; i < count; i++) {
@@ -237,7 +236,7 @@
                     break;
                 case KeyEvent.KEYCODE_DPAD_CENTER:
                 case KeyEvent.KEYCODE_ENTER:
-                    if (KeyEventCompat.hasNoModifiers(event)) {
+                    if (event.hasNoModifiers()) {
                         if (event.getRepeatCount() == 0) {
                             clickKeyboardFocusedVirtualView();
                             handled = true;
@@ -245,9 +244,9 @@
                     }
                     break;
                 case KeyEvent.KEYCODE_TAB:
-                    if (KeyEventCompat.hasNoModifiers(event)) {
+                    if (event.hasNoModifiers()) {
                         handled = moveFocus(View.FOCUS_FORWARD, null);
-                    } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {
+                    } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) {
                         handled = moveFocus(View.FOCUS_BACKWARD, null);
                     }
                     break;
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
index 65abe2e..8f15a39 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
@@ -31,7 +31,6 @@
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.NavUtils;
 import android.support.v4.app.TaskStackBuilder;
-import android.support.v4.view.KeyEventCompat;
 import android.support.v7.view.ActionMode;
 import android.support.v7.widget.Toolbar;
 import android.support.v7.widget.VectorEnabledTintResources;
@@ -523,8 +522,8 @@
 
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
-        if (KeyEventCompat.isCtrlPressed(event) &&
-                event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK) == '<') {
+        if (event.isCtrlPressed()
+                && event.getUnicodeChar(event.getMetaState() & ~KeyEvent.META_CTRL_MASK) == '<') {
             // Capture the Control-< and send focus to the ActionBar
             final int action = event.getAction();
             if (action == KeyEvent.ACTION_DOWN) {
diff --git a/v7/appcompat/src/android/support/v7/widget/SearchView.java b/v7/appcompat/src/android/support/v7/widget/SearchView.java
index 755b35e..0fca1f7 100644
--- a/v7/appcompat/src/android/support/v7/widget/SearchView.java
+++ b/v7/appcompat/src/android/support/v7/widget/SearchView.java
@@ -45,7 +45,6 @@
 import android.support.v4.os.ParcelableCompat;
 import android.support.v4.os.ParcelableCompatCreatorCallbacks;
 import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.KeyEventCompat;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.widget.CursorAdapter;
 import android.support.v7.appcompat.R;
@@ -1068,7 +1067,7 @@
 
             // If there is text in the query box, handle enter, and action keys
             // The search key is handled by the dialog's onKeyDown().
-            if (!mSearchSrcTextView.isEmpty() && KeyEventCompat.hasNoModifiers(event)) {
+            if (!mSearchSrcTextView.isEmpty() && event.hasNoModifiers()) {
                 if (event.getAction() == KeyEvent.ACTION_UP) {
                     if (keyCode == KeyEvent.KEYCODE_ENTER) {
                         v.cancelLongPress();
@@ -1097,7 +1096,7 @@
         if (mSuggestionsAdapter == null) {
             return false;
         }
-        if (event.getAction() == KeyEvent.ACTION_DOWN && KeyEventCompat.hasNoModifiers(event)) {
+        if (event.getAction() == KeyEvent.ACTION_DOWN && event.hasNoModifiers()) {
             // First, check for enter or search (both of which we'll treat as a
             // "click")
             if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH