/* * Copyright (C) 2013 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.widget; import android.view.View; import android.view.View.OnTouchListener; import android.widget.PopupWindow; /** * Helper for accessing features in PopupWindow introduced after API level 4 * in a backwards compatible fashion. */ public class PopupWindowCompat { /** * Interface for the full API. */ interface PopupWindowImpl { public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff, int gravity); } /** * Interface implementation that doesn't use anything above v4 APIs. */ static class BasePopupWindowImpl implements PopupWindowImpl { @Override public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff, int gravity) { popup.showAsDropDown(anchor, xoff, yoff); } } /** * Interface implementation for devices with at least KitKat APIs. */ static class KitKatPopupWindowImpl extends BasePopupWindowImpl { @Override public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff, int gravity) { PopupWindowCompatKitKat.showAsDropDown(popup, anchor, xoff, yoff, gravity); } } /** * Select the correct implementation to use for the current platform. */ static final PopupWindowImpl IMPL; static { final int version = android.os.Build.VERSION.SDK_INT; if (version >= 19) { IMPL = new KitKatPopupWindowImpl(); } else { IMPL = new BasePopupWindowImpl(); } } private PopupWindowCompat() { // This class is not publicly instantiable. } /** * <p>Display the content view in a popup window anchored to the bottom-left * corner of the anchor view offset by the specified x and y coordinates. * If there is not enough room on screen to show * the popup in its entirety, this method tries to find a parent scroll * view to scroll. If no parent scroll view can be scrolled, the bottom-left * corner of the popup is pinned at the top left corner of the anchor view.</p> * <p>If the view later scrolls to move <code>anchor</code> to a different * location, the popup will be moved correspondingly.</p> * * @param popup the PopupWindow to show * @param anchor the view on which to pin the popup window * @param xoff A horizontal offset from the anchor in pixels * @param yoff A vertical offset from the anchor in pixels * @param gravity Alignment of the popup relative to the anchor */ public static void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff, int gravity) { IMPL.showAsDropDown(popup, anchor, xoff, yoff, gravity); } }