Merge "Add some interfaces"
diff --git a/api/current.txt b/api/current.txt
index cc2ae0c..079763f 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6611,18 +6611,21 @@
   }
 
   public final class AccessibilityManagerCompat {
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
+    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
     method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
     method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
     method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
+    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener);
   }
 
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  public static abstract interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
     method public abstract void onAccessibilityStateChanged(boolean);
   }
 
+  public static abstract deprecated class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+  }
+
   public class AccessibilityNodeInfoCompat {
     ctor public AccessibilityNodeInfoCompat(java.lang.Object);
     method public void addAction(int);
@@ -7248,8 +7251,8 @@
     method public static void setImeOptions(android.view.View, int);
     method public static void setInputType(android.view.View, int);
     method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
+    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListener);
+    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListener);
     method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
     method public static void setQueryHint(android.view.View, java.lang.CharSequence);
     method public static void setQueryRefinementEnabled(android.view.View, boolean);
@@ -7257,12 +7260,21 @@
     method public static void setSubmitButtonEnabled(android.view.View, boolean);
   }
 
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
+  public static abstract interface SearchViewCompat.OnCloseListener {
+    method public abstract boolean onClose();
+  }
+
+  public static abstract deprecated class SearchViewCompat.OnCloseListenerCompat implements android.support.v4.widget.SearchViewCompat.OnCloseListener {
     ctor public SearchViewCompat.OnCloseListenerCompat();
     method public boolean onClose();
   }
 
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
+  public static abstract interface SearchViewCompat.OnQueryTextListener {
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public static abstract deprecated class SearchViewCompat.OnQueryTextListenerCompat implements android.support.v4.widget.SearchViewCompat.OnQueryTextListener {
     ctor public SearchViewCompat.OnQueryTextListenerCompat();
     method public boolean onQueryTextChange(java.lang.String);
     method public boolean onQueryTextSubmit(java.lang.String);
diff --git a/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java b/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
index 4d4e024..3b5be26 100644
--- a/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
+++ b/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
@@ -27,30 +27,53 @@
  */
 class AccessibilityManagerCompatIcs {
 
-    interface AccessibilityStateChangeListenerBridge {
-        public void onAccessibilityStateChanged(boolean enabled);
+    public static class AccessibilityStateChangeListenerWrapper
+            implements AccessibilityStateChangeListener {
+        Object mListener;
+        AccessibilityStateChangeListenerBridge mListenerBridge;
+
+        public AccessibilityStateChangeListenerWrapper(Object listener,
+                AccessibilityStateChangeListenerBridge listenerBridge) {
+            mListener = listener;
+            mListenerBridge = listenerBridge;
+        }
+
+        @Override
+        public int hashCode() {
+            return mListener == null ? 0 : mListener.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) {
+                return true;
+            }
+            if (o == null || getClass() != o.getClass()) {
+                return false;
+            }
+            AccessibilityStateChangeListenerWrapper other =
+                    (AccessibilityStateChangeListenerWrapper) o;
+            return mListener == null ? other.mListener == null : mListener.equals(other.mListener);
+        }
+
+        @Override
+        public void onAccessibilityStateChanged(boolean enabled) {
+            mListenerBridge.onAccessibilityStateChanged(enabled);
+        }
     }
 
-    public static Object newAccessibilityStateChangeListener(
-            final AccessibilityStateChangeListenerBridge bridge) {
-        return new AccessibilityStateChangeListener() {
-            @Override
-            public void onAccessibilityStateChanged(boolean enabled) {
-                bridge.onAccessibilityStateChanged(enabled);
-            }
-        };
+    interface AccessibilityStateChangeListenerBridge {
+        void onAccessibilityStateChanged(boolean enabled);
     }
 
     public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-            Object listener) {
-        return manager.addAccessibilityStateChangeListener(
-                (AccessibilityStateChangeListener)listener);
+            AccessibilityStateChangeListenerWrapper listener) {
+        return manager.addAccessibilityStateChangeListener(listener);
     }
 
     public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-            Object listener) {
-        return manager.removeAccessibilityStateChangeListener(
-                (AccessibilityStateChangeListener)listener);
+            AccessibilityStateChangeListenerWrapper listener) {
+        return manager.removeAccessibilityStateChangeListener(listener);
     }
 
     public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
index 734c246c..3ced556 100644
--- a/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
@@ -19,6 +19,7 @@
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.os.Build;
 import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
+import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerWrapper;
 import android.view.accessibility.AccessibilityManager;
 
 import java.util.Collections;
@@ -31,35 +32,35 @@
 public final class AccessibilityManagerCompat {
 
     interface AccessibilityManagerVersionImpl {
-        public Object newAccessiblityStateChangeListener(
-                AccessibilityStateChangeListenerCompat listener);
-        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener);
-        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener);
-        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
+        AccessibilityStateChangeListenerWrapper newAccessiblityStateChangeListener(
+                AccessibilityStateChangeListener listener);
+        boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListener listener);
+        boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListener listener);
+        List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
                 AccessibilityManager manager,int feedbackTypeFlags);
-        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
+        List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
                 AccessibilityManager manager);
-        public boolean isTouchExplorationEnabled(AccessibilityManager manager);
+        boolean isTouchExplorationEnabled(AccessibilityManager manager);
     }
 
     static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
         @Override
-        public Object newAccessiblityStateChangeListener(
-                AccessibilityStateChangeListenerCompat listener) {
+        public AccessibilityStateChangeListenerWrapper newAccessiblityStateChangeListener(
+                AccessibilityStateChangeListener listener) {
             return null;
         }
 
         @Override
         public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener) {
+                AccessibilityStateChangeListener listener) {
             return false;
         }
 
         @Override
         public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener) {
+                AccessibilityStateChangeListener listener) {
             return false;
         }
 
@@ -82,31 +83,30 @@
     }
 
     static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
-        
         @Override
-        public Object newAccessiblityStateChangeListener(
-                final AccessibilityStateChangeListenerCompat listener) {
-            return AccessibilityManagerCompatIcs.newAccessibilityStateChangeListener(
-                new AccessibilityStateChangeListenerBridge() {
-                    @Override
-                    public void onAccessibilityStateChanged(boolean enabled) {
-                        listener.onAccessibilityStateChanged(enabled);
-                    }
-                });
+        public AccessibilityStateChangeListenerWrapper newAccessiblityStateChangeListener(
+                final AccessibilityStateChangeListener listener) {
+            return new AccessibilityStateChangeListenerWrapper(listener,
+                    new AccessibilityStateChangeListenerBridge() {
+                        @Override
+                        public void onAccessibilityStateChanged(boolean enabled) {
+                            listener.onAccessibilityStateChanged(enabled);
+                        }
+                    });
         }
 
         @Override
         public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener) {
+                AccessibilityStateChangeListener listener) {
             return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
-                    listener.mListener);
+                    newAccessiblityStateChangeListener(listener));
         }
 
         @Override
         public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                final AccessibilityStateChangeListenerCompat listener) {
+                AccessibilityStateChangeListener listener) {
             return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
-                    listener.mListener);
+                    newAccessiblityStateChangeListener(listener));
         }
 
         @Override
@@ -147,7 +147,7 @@
      * @return True if successfully registered.
      */
     public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-            AccessibilityStateChangeListenerCompat listener) {
+            AccessibilityStateChangeListener listener) {
         return IMPL.addAccessibilityStateChangeListener(manager, listener);
     }
 
@@ -159,7 +159,7 @@
      * @return True if successfully unregistered.
      */
     public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-            AccessibilityStateChangeListenerCompat listener) {
+            AccessibilityStateChangeListener listener) {
         return IMPL.removeAccessibilityStateChangeListener(manager, listener);
     }
 
@@ -204,21 +204,23 @@
     }
 
     /**
+     * @deprecated Use {@link AccessibilityStateChangeListener} instead.
+     */
+    @Deprecated
+    public static abstract class AccessibilityStateChangeListenerCompat
+            implements AccessibilityStateChangeListener {
+    }
+
+    /**
      * Listener for the accessibility state.
      */
-    public static abstract class AccessibilityStateChangeListenerCompat {
-        final Object mListener;
-
-        public AccessibilityStateChangeListenerCompat() {
-            mListener = IMPL.newAccessiblityStateChangeListener(this);
-        }
-
+    public interface AccessibilityStateChangeListener {
         /**
          * Called back on change in the accessibility state.
          *
          * @param enabled Whether accessibility is enabled.
          */
-        public abstract void onAccessibilityStateChanged(boolean enabled);
+        void onAccessibilityStateChanged(boolean enabled);
     }
 
     private AccessibilityManagerCompat() {}
diff --git a/compat/java/android/support/v4/widget/SearchViewCompat.java b/compat/java/android/support/v4/widget/SearchViewCompat.java
index 48fbc5b..2b69f55 100644
--- a/compat/java/android/support/v4/widget/SearchViewCompat.java
+++ b/compat/java/android/support/v4/widget/SearchViewCompat.java
@@ -34,10 +34,10 @@
         void setSearchableInfo(View searchView, ComponentName searchableComponent);
         void setImeOptions(View searchView, int imeOptions);
         void setInputType(View searchView, int inputType);
-        Object newOnQueryTextListener(OnQueryTextListenerCompat listener);
-        void setOnQueryTextListener(View searchView, Object listener);
-        Object newOnCloseListener(OnCloseListenerCompat listener);
-        void setOnCloseListener(View searchView, Object listener);
+        Object newOnQueryTextListener(OnQueryTextListener listener);
+        void setOnQueryTextListener(View searchView, OnQueryTextListener listener);
+        Object newOnCloseListener(OnCloseListener listener);
+        void setOnCloseListener(View searchView, OnCloseListener listener);
         CharSequence getQuery(View searchView);
         void setQuery(View searchView, CharSequence query, boolean submit);
         void setQueryHint(View searchView, CharSequence hint);
@@ -70,21 +70,21 @@
         }
 
         @Override
-        public Object newOnQueryTextListener(OnQueryTextListenerCompat listener) {
+        public Object newOnQueryTextListener(OnQueryTextListener listener) {
             return null;
         }
 
         @Override
-        public void setOnQueryTextListener(View searchView, Object listener) {
+        public void setOnQueryTextListener(View searchView, OnQueryTextListener listener) {
         }
 
         @Override
-        public Object newOnCloseListener(OnCloseListenerCompat listener) {
+        public Object newOnCloseListener(OnCloseListener listener) {
             return null;
         }
 
         @Override
-        public void setOnCloseListener(View searchView, Object listener) {
+        public void setOnCloseListener(View searchView, OnCloseListener listener) {
         }
 
         @Override
@@ -146,7 +146,7 @@
         }
 
         @Override
-        public Object newOnQueryTextListener(final OnQueryTextListenerCompat listener) {
+        public Object newOnQueryTextListener(final OnQueryTextListener listener) {
             return SearchViewCompatHoneycomb.newOnQueryTextListener(
                     new SearchViewCompatHoneycomb.OnQueryTextListenerCompatBridge() {
                         @Override
@@ -161,13 +161,14 @@
         }
 
         @Override
-        public void setOnQueryTextListener(View searchView, Object listener) {
+        public void setOnQueryTextListener(View searchView, OnQueryTextListener listener) {
             checkIfLegalArg(searchView);
-            SearchViewCompatHoneycomb.setOnQueryTextListener(searchView, listener);
+            SearchViewCompatHoneycomb.setOnQueryTextListener(searchView,
+                    newOnQueryTextListener(listener));
         }
 
         @Override
-        public Object newOnCloseListener(final OnCloseListenerCompat listener) {
+        public Object newOnCloseListener(final OnCloseListener listener) {
             return SearchViewCompatHoneycomb.newOnCloseListener(
                     new SearchViewCompatHoneycomb.OnCloseListenerCompatBridge() {
                         @Override
@@ -178,9 +179,9 @@
         }
 
         @Override
-        public void setOnCloseListener(View searchView, Object listener) {
+        public void setOnCloseListener(View searchView, OnCloseListener listener) {
             checkIfLegalArg(searchView);
-            SearchViewCompatHoneycomb.setOnCloseListener(searchView, listener);
+            SearchViewCompatHoneycomb.setOnCloseListener(searchView, newOnCloseListener(listener));
         }
 
         @Override
@@ -342,20 +343,30 @@
      * @param listener the listener object that receives callbacks when the user performs
      *     actions in the SearchView such as clicking on buttons or typing a query.
      */
-    public static void setOnQueryTextListener(View searchView, OnQueryTextListenerCompat listener) {
-        IMPL.setOnQueryTextListener(searchView, listener.mListener);
+    public static void setOnQueryTextListener(View searchView, OnQueryTextListener listener) {
+        IMPL.setOnQueryTextListener(searchView, listener);
+    }
+
+    /**
+     * @deprecated Use {@link OnQueryTextListener} instead.
+     */
+    @Deprecated
+    public static abstract class OnQueryTextListenerCompat implements OnQueryTextListener {
+        @Override
+        public boolean onQueryTextSubmit(String query) {
+            return false;
+        }
+
+        @Override
+        public boolean onQueryTextChange(String newText) {
+            return false;
+        }
     }
 
     /**
      * Callbacks for changes to the query text.
      */
-    public static abstract class OnQueryTextListenerCompat {
-        final Object mListener;
-
-        public OnQueryTextListenerCompat() {
-            mListener = IMPL.newOnQueryTextListener(this);
-        }
-
+    public interface OnQueryTextListener {
         /**
          * Called when the user submits the query. This could be due to a key press on the
          * keyboard or due to pressing a submit button.
@@ -368,9 +379,7 @@
          * @return true if the query has been handled by the listener, false to let the
          * SearchView perform the default action.
          */
-        public boolean onQueryTextSubmit(String query) {
-            return false;
-        }
+        boolean onQueryTextSubmit(String query);
 
         /**
          * Called when the query text is changed by the user.
@@ -380,9 +389,7 @@
          * @return false if the SearchView should perform the default action of showing any
          * suggestions if available, true if the action was handled by the listener.
          */
-        public boolean onQueryTextChange(String newText) {
-            return false;
-        }
+        boolean onQueryTextChange(String newText);
     }
 
     /**
@@ -391,29 +398,32 @@
      * @param searchView The SearchView in which to register the listener.
      * @param listener the listener to call when the user closes the SearchView.
      */
-    public static void setOnCloseListener(View searchView, OnCloseListenerCompat listener) {
-        IMPL.setOnCloseListener(searchView, listener.mListener);
+    public static void setOnCloseListener(View searchView, OnCloseListener listener) {
+        IMPL.setOnCloseListener(searchView, listener);
+    }
+
+    /**
+     * @deprecated Use {@link OnCloseListener} instead.
+     */
+    @Deprecated
+    public static abstract class OnCloseListenerCompat implements OnCloseListener {
+        @Override
+        public boolean onClose() {
+            return false;
+        }
     }
 
     /**
      * Callback for closing the query UI.
      */
-    public static abstract class OnCloseListenerCompat {
-        final Object mListener;
-
-        public OnCloseListenerCompat() {
-            mListener = IMPL.newOnCloseListener(this);
-        }
-
+    public interface OnCloseListener {
         /**
          * The user is attempting to close the SearchView.
          *
          * @return true if the listener wants to override the default behavior of clearing the
          * text field and dismissing it, false otherwise.
          */
-        public boolean onClose() {
-            return false;
-        }
+        boolean onClose();
     }
 
     /**