19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19a7287f4d199b5d86e01d1de9d9a9db7e3221b02dAdam Powellimport com.android.internal.R; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viveretteimport android.animation.ValueAnimator; 2275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.content.Context; 23a7287f4d199b5d86e01d1de9d9a9db7e3221b02dAdam Powellimport android.content.res.Resources; 2475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.content.res.TypedArray; 25ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viveretteimport android.graphics.Insets; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.StateListDrawable; 3046e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brownimport android.os.Build; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 33c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.Gravity; 34c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.KeyEvent; 35c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.MotionEvent; 36c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.View; 37a7287f4d199b5d86e01d1de9d9a9db7e3221b02dAdam Powellimport android.view.View.OnTouchListener; 38c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.ViewGroup; 39c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.ViewTreeObserver; 40c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powellimport android.view.ViewTreeObserver.OnScrollChangedListener; 41a7287f4d199b5d86e01d1de9d9a9db7e3221b02dAdam Powellimport android.view.WindowManager; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43a7287f4d199b5d86e01d1de9d9a9db7e3221b02dAdam Powellimport java.lang.ref.WeakReference; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A popup window that can be used to display an arbitrary view. The popup 477ed189e457b16c06b0425bd28aeeb1df5c8ff5b8Scott Kennedy * window is a floating container that appears on top of the current 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * activity.</p> 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.AutoCompleteTextView 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.Spinner 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PopupWindow { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 55e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * Mode for {@link #setInputMethodMode(int)}: the requirements for the 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * input method should be based on the focusability of the popup. That is 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if it is focusable than it needs to work with the input method, else 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it doesn't. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 63e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * Mode for {@link #setInputMethodMode(int)}: this popup always needs to 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * work with an input method, regardless of whether it is focusable. This 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means that it will always be displayed so that the user can also operate 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the input method while it is shown. 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int INPUT_METHOD_NEEDED = 1; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 71e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy * Mode for {@link #setInputMethodMode(int)}: this popup never needs to 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * work with an input method, regardless of whether it is focusable. This 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means that it will always be displayed to use as much space on the 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * screen as needed, regardless of whether this covers the input method. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int INPUT_METHOD_NOT_NEEDED = 2; 7754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell 7854c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell private static final int DEFAULT_ANCHORED_GRAVITY = Gravity.TOP | Gravity.START; 7954c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell 80448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy private Context mContext; 81448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy private WindowManager mWindowManager; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsShowing; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsDropdown; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mContentView; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mPopupView; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mFocusable; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mInputMethodMode = INPUT_METHOD_FROM_FOCUSABLE; 907eab094722af54717859b7dcce3cc050f059e00bDianne Hackborn private int mSoftInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mTouchable = true; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mOutsideTouchable = false; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mClippingEnabled = true; 9446e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown private int mSplitTouchEnabled = -1; 95ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell private boolean mLayoutInScreen; 9656c2d337e02a275397fc9d0460dca90977f199acAdam Powell private boolean mClipToScreen; 97348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell private boolean mAllowScrollingAnchorParent = true; 980bd1d0a15294345bf88b20df28466907f982cec7Adam Powell private boolean mLayoutInsetDecor = false; 99e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell private boolean mNotTouchModal; 100393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale private boolean mAttachedInDecor = true; 101393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale private boolean mAttachedInDecorSet = false; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnTouchListener mTouchInterceptor; 104393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mWidthMode; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mWidth; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastWidth; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mHeightMode; 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mHeight; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mLastHeight; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPopupWidth; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mPopupHeight; 11456c2d337e02a275397fc9d0460dca90977f199acAdam Powell 115ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette private float mElevation; 116ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mDrawingLocation = new int[2]; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mScreenLocation = new int[2]; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Rect mTempRect = new Rect(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mBackground; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mAboveAnchorBackgroundDrawable; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Drawable mBelowAnchorBackgroundDrawable; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 125560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // Temporary animation centers. Should be moved into window params? 126560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette private int mAnchorRelativeX; 127560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette private int mAnchorRelativeY; 128560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mAboveAnchor; 130574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell private int mWindowLayoutType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnDismissListener mOnDismissListener; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIgnoreCheekPress = false; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mAnimationStyle = -1; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] ABOVE_ANCHOR_STATE_SET = new int[] { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.attr.state_above_anchor 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WeakReference<View> mAnchor; 142560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 143560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette private final OnScrollChangedListener mOnScrollChangedListener = 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new OnScrollChangedListener() { 145560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette @Override 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onScrollChanged() { 147560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final View anchor = mAnchor != null ? mAnchor.get() : null; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anchor != null && mPopupView != null) { 149560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final WindowManager.LayoutParams p = (WindowManager.LayoutParams) 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopupView.getLayoutParams(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, 15354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell mAnchoredGravity)); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update(p.x, p.y, -1, -1, true); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 158560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 15954c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell private int mAnchorXoff, mAnchorYoff, mAnchoredGravity; 160560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette private boolean mOverlapAnchor; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 162b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio private boolean mPopupViewInitialLayoutDirectionInherited; 163b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new empty, non focusable popup window of dimension (0,0).</p> 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does provide a background.</p> 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupWindow(Context context) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new empty, non focusable popup window of dimension (0,0).</p> 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does provide a background.</p> 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupWindow(Context context, AttributeSet attrs) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, com.android.internal.R.attr.popupWindowStyle); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new empty, non focusable popup window of dimension (0,0).</p> 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does provide a background.</p> 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 187617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { 188617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette this(context, attrs, defStyleAttr, 0); 189c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell } 190c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell 191c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell /** 192c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell * <p>Create a new, empty, non focusable popup window of dimension (0,0).</p> 193c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell * 194c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell * <p>The popup does not provide a background.</p> 195c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell */ 196c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell public PopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 198448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 200617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette final TypedArray a = context.obtainStyledAttributes( 201ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette attrs, R.styleable.PopupWindow, defStyleAttr, defStyleRes); 202ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette final Drawable bg = a.getDrawable(R.styleable.PopupWindow_popupBackground); 203ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mElevation = a.getDimension(R.styleable.PopupWindow_popupElevation, 0); 204560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette mOverlapAnchor = a.getBoolean(R.styleable.PopupWindow_overlapAnchor, false); 205c3808b5dc7d5873d04e8a0a247b179b2757764baAdam Powell 206c3808b5dc7d5873d04e8a0a247b179b2757764baAdam Powell final int animStyle = a.getResourceId(R.styleable.PopupWindow_popupAnimationStyle, -1); 207ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette mAnimationStyle = animStyle == R.style.Animation_PopupWindow ? -1 : animStyle; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 210ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette 211ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette setBackgroundDrawable(bg); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new empty, non focusable popup window of dimension (0,0).</p> 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does not provide any background. This should be handled 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the content view.</p> 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupWindow() { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(null, 0, 0); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new non focusable popup window which can display the 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tt>contentView</tt>. The dimension of the window are (0,0).</p> 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does not provide any background. This should be handled 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the content view.</p> 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param contentView the popup's content 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupWindow(View contentView) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(contentView, 0, 0); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new empty, non focusable popup window. The dimension of the 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window must be passed to this constructor.</p> 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does not provide any background. This should be handled 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the content view.</p> 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the popup's width 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the popup's height 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupWindow(int width, int height) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(null, width, height); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new non focusable popup window which can display the 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <tt>contentView</tt>. The dimension of the window must be passed to 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this constructor.</p> 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does not provide any background. This should be handled 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the content view.</p> 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param contentView the popup's content 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the popup's width 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the popup's height 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupWindow(View contentView, int width, int height) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(contentView, width, height, false); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Create a new popup window which can display the <tt>contentView</tt>. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The dimension of the window must be passed to this constructor.</p> 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The popup does not provide any background. This should be handled 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by the content view.</p> 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param contentView the popup's content 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the popup's width 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the popup's height 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param focusable true if the popup can be focused, false otherwise 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 279448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy public PopupWindow(View contentView, int width, int height, boolean focusable) { 280448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy if (contentView != null) { 281448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy mContext = contentView.getContext(); 282448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 283448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy } 284393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setContentView(contentView); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWidth(width); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeight(height); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFocusable(focusable); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 292ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * Return the drawable used as the popup window's background. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 294ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @return the background drawable or {@code null} if not set 295ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @see #setBackgroundDrawable(Drawable) 296ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @attr ref android.R.styleable#PopupWindow_popupBackground 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Drawable getBackground() { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBackground; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 303ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * Specifies the background drawable for this popup window. The background 304ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * can be set to {@code null}. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param background the popup's background 307ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @see #getBackground() 308ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @attr ref android.R.styleable#PopupWindow_popupBackground 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBackgroundDrawable(Drawable background) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackground = background; 312ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette 313ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // If this is a StateListDrawable, try to find and store the drawable to be 314ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // used when the drop-down is placed above its anchor view, and the one to be 315ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // used when the drop-down is placed below its anchor view. We extract 316ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // the drawables ourselves to work around a problem with using refreshDrawableState 317ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // that it will take into account the padding of all drawables specified in a 318ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // StateListDrawable, thus adding superfluous padding to drop-down views. 319ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // 320ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // We assume a StateListDrawable will have a drawable for ABOVE_ANCHOR_STATE_SET and 321ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // at least one other drawable, intended for the 'below-anchor state'. 322ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette if (mBackground instanceof StateListDrawable) { 323ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette StateListDrawable stateList = (StateListDrawable) mBackground; 324ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette 325ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // Find the above-anchor view - this one's easy, it should be labeled as such. 326ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette int aboveAnchorStateIndex = stateList.getStateDrawableIndex(ABOVE_ANCHOR_STATE_SET); 327ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette 328ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // Now, for the below-anchor view, look for any other drawable specified in the 329ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // StateListDrawable which is not for the above-anchor state and use that. 330ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette int count = stateList.getStateCount(); 331ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette int belowAnchorStateIndex = -1; 332ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette for (int i = 0; i < count; i++) { 333ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette if (i != aboveAnchorStateIndex) { 334ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette belowAnchorStateIndex = i; 335ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette break; 336ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette } 337ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette } 338ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette 339ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // Store the drawables we found, if we found them. Otherwise, set them both 340ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette // to null so that we'll just use refreshDrawableState. 341ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette if (aboveAnchorStateIndex != -1 && belowAnchorStateIndex != -1) { 342ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette mAboveAnchorBackgroundDrawable = stateList.getStateDrawable(aboveAnchorStateIndex); 343ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette mBelowAnchorBackgroundDrawable = stateList.getStateDrawable(belowAnchorStateIndex); 344ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette } else { 345ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette mBelowAnchorBackgroundDrawable = null; 346ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette mAboveAnchorBackgroundDrawable = null; 347ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette } 348ce8c358712414e4fa98e4504e6a1b8ad36d37c6cAlan Viverette } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 352ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @return the elevation for this popup window in pixels 353ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @see #setElevation(float) 354ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @attr ref android.R.styleable#PopupWindow_popupElevation 355ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette */ 356ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette public float getElevation() { 357ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette return mElevation; 358ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette } 359ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 360ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette /** 361ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * Specifies the elevation for this popup window. 362ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * 363ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @param elevation the popup's elevation in pixels 364ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @see #getElevation() 365ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * @attr ref android.R.styleable#PopupWindow_popupElevation 366ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette */ 367ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette public void setElevation(float elevation) { 368ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mElevation = elevation; 369ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette } 370ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 371ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return the animation style to use the popup appears and disappears</p> 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the animation style to use the popup appears and disappears 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAnimationStyle() { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAnimationStyle; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 379393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 381393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * Set the flag on popup to ignore cheek press event; by default this flag 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is set to false 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which means the pop wont ignore cheek press dispatch events. 384393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 388393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIgnoreCheekPress() { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIgnoreCheekPress = true; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the animation style resource for this popup.</p> 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param animationStyle animation style to use when the popup appears 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and disappears. Set to -1 for the default animation, 0 for no 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation, or a resource identifier for an explicit animation. 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationStyle(int animationStyle) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationStyle = animationStyle; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return the view used as the content of the popup window.</p> 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a {@link android.view.View} representing the popup's content 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setContentView(android.view.View) 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getContentView() { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContentView; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the popup's content. The content is represented by an instance 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of {@link android.view.View}.</p> 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 42881f08086b44a117097960195d2c9072e29644962Gilles Debunne * <p>This method has no effect if called when the popup is showing.</p> 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param contentView the new content for the popup 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getContentView() 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setContentView(View contentView) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isShowing()) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContentView = contentView; 441448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy 4420c0b768e1514280812321854db6dfba723c3d169Romain Guy if (mContext == null && mContentView != null) { 443448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy mContext = mContentView.getContext(); 444448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy } 445448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy 4460c0b768e1514280812321854db6dfba723c3d169Romain Guy if (mWindowManager == null && mContentView != null) { 447448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 448448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy } 449393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 450393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // Setting the default for attachedInDecor based on SDK version here 451393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // instead of in the constructor since we might not have the context 452393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // object in the constructor. We only want to set default here if the 453393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // app hasn't already set the attachedInDecor. 454393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale if (mContext != null && !mAttachedInDecorSet) { 455393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // Attach popup window in decor frame of parent window by default for 456393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // {@link Build.VERSION_CODES.LOLLIPOP_MR1} or greater. Keep current 457393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale // behavior of not attaching to decor frame for older SDKs. 458393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale setAttachedInDecor(mContext.getApplicationInfo().targetSdkVersion 459393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale >= Build.VERSION_CODES.LOLLIPOP_MR1); 460393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale } 461393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set a callback for all touch events being dispatched to the popup 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window. 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTouchInterceptor(OnTouchListener l) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTouchInterceptor = l; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 471393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicate whether the popup window can grab the focus.</p> 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup is focusable, false otherwise 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setFocusable(boolean) 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isFocusable() { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocusable; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the focusability of the popup window. When focusable, the 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window will grab the focus from the current focused widget if the popup 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contains a focusable {@link android.view.View}. By default a popup 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window is not focusable.</p> 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param focusable true if the popup should grab focus, false otherwise. 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isFocusable() 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFocusable(boolean focusable) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocusable = focusable; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the current value in {@link #setInputMethodMode(int)}. 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setInputMethodMode(int) 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getInputMethodMode() { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mInputMethodMode; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Control how the popup operates with an input method: one of 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #INPUT_METHOD_FROM_FOCUSABLE}, {@link #INPUT_METHOD_NEEDED}, 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link #INPUT_METHOD_NOT_NEEDED}. 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getInputMethodMode() 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInputMethodMode(int mode) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputMethodMode = mode; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 528374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy 529374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy /** 530374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * Sets the operating mode for the soft input area. 531374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * 532374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * @param mode The desired mode, see 533374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * {@link android.view.WindowManager.LayoutParams#softInputMode} 534374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * for the full list 535374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * 536374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * @see android.view.WindowManager.LayoutParams#softInputMode 537374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * @see #getSoftInputMode() 538374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy */ 539374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy public void setSoftInputMode(int mode) { 540374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy mSoftInputMode = mode; 541374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy } 542374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy 543374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy /** 544374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * Returns the current value in {@link #setSoftInputMode(int)}. 545374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * 546374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * @see #setSoftInputMode(int) 547374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy * @see android.view.WindowManager.LayoutParams#softInputMode 548374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy */ 549374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy public int getSoftInputMode() { 550374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy return mSoftInputMode; 551374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether the popup window receives touch events.</p> 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup is touchable, false otherwise 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setTouchable(boolean) 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isTouchable() { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTouchable; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Changes the touchability of the popup window. When touchable, the 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window will receive touch events, otherwise touch events will go to the 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window below it. By default the window is touchable.</p> 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param touchable true if the popup should receive touch events, false otherwise 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isTouchable() 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTouchable(boolean touchable) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTouchable = touchable; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether the popup window will be informed of touch events 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * outside of its window.</p> 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup is outside touchable, false otherwise 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setOutsideTouchable(boolean) 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOutsideTouchable() { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOutsideTouchable; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Controls whether the pop-up will be informed of touch events outside 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its window. This only makes sense for pop-ups that are touchable 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but not focusable, which means touches outside of the window will 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be delivered to the window behind. The default is false.</p> 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param touchable true if the popup should receive outside 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * touch events, false otherwise 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isOutsideTouchable() 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOutsideTouchable(boolean touchable) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOutsideTouchable = touchable; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicates whether clipping of the popup window is enabled.</p> 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the clipping is enabled, false otherwise 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setClippingEnabled(boolean) 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isClippingEnabled() { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mClippingEnabled; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Allows the popup window to extend beyond the bounds of the screen. By default the 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window is clipped to the screen boundaries. Setting this to false will allow windows to be 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * accurately positioned.</p> 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown or through a manual call to one of 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #update()} methods.</p> 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled false if the window should be allowed to extend outside of the screen 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isClippingEnabled() 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #update() 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setClippingEnabled(boolean enabled) { 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClippingEnabled = enabled; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 64656c2d337e02a275397fc9d0460dca90977f199acAdam Powell * Clip this popup window to the screen, but not to the containing window. 64756c2d337e02a275397fc9d0460dca90977f199acAdam Powell * 64856c2d337e02a275397fc9d0460dca90977f199acAdam Powell * @param enabled True to clip to the screen. 64956c2d337e02a275397fc9d0460dca90977f199acAdam Powell * @hide 65056c2d337e02a275397fc9d0460dca90977f199acAdam Powell */ 65156c2d337e02a275397fc9d0460dca90977f199acAdam Powell public void setClipToScreenEnabled(boolean enabled) { 65256c2d337e02a275397fc9d0460dca90977f199acAdam Powell mClipToScreen = enabled; 65356c2d337e02a275397fc9d0460dca90977f199acAdam Powell setClippingEnabled(!enabled); 65456c2d337e02a275397fc9d0460dca90977f199acAdam Powell } 655348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell 656348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell /** 657348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell * Allow PopupWindow to scroll the anchor's parent to provide more room 658348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell * for the popup. Enabled by default. 659348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell * 660348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell * @param enabled True to scroll the anchor's parent when more room is desired by the popup. 661348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell */ 662348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell void setAllowScrollingAnchorParent(boolean enabled) { 663348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell mAllowScrollingAnchorParent = enabled; 664348e69cfabec21ccfbe708df06f0a7ea541a3053Adam Powell } 66556c2d337e02a275397fc9d0460dca90977f199acAdam Powell 66656c2d337e02a275397fc9d0460dca90977f199acAdam Powell /** 66701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * <p>Indicates whether the popup window supports splitting touches.</p> 66801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * 66901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * @return true if the touch splitting is enabled, false otherwise 67001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * 67101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * @see #setSplitTouchEnabled(boolean) 67201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown */ 67301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown public boolean isSplitTouchEnabled() { 67446e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown if (mSplitTouchEnabled < 0 && mContext != null) { 67546e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown return mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB; 67646e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown } 67746e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown return mSplitTouchEnabled == 1; 67801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown } 67901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown 68001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown /** 68101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * <p>Allows the popup window to split touches across other windows that also 68246e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown * support split touch. When this flag is false, the first pointer 68301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * that goes down determines the window to which all subsequent touches 68446e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown * go until all pointers go up. When this flag is true, each pointer 68501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * (not necessarily the first) that goes down determines the window 68601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * to which all subsequent touches of that pointer will go until that 68701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * pointer goes up thereby enabling touches with multiple pointers 68801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * to be split across multiple windows.</p> 68901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * 69001ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * @param enabled true if the split touches should be enabled, false otherwise 69101ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown * @see #isSplitTouchEnabled() 69201ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown */ 69301ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown public void setSplitTouchEnabled(boolean enabled) { 69446e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown mSplitTouchEnabled = enabled ? 1 : 0; 69501ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown } 69601ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown 69701ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown /** 698ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * <p>Indicates whether the popup window will be forced into using absolute screen coordinates 699ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * for positioning.</p> 700ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * 701ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * @return true if the window will always be positioned in screen coordinates. 702ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * @hide 703ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell */ 704ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell public boolean isLayoutInScreenEnabled() { 705ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell return mLayoutInScreen; 706ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell } 707ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell 708ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell /** 709ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * <p>Allows the popup window to force the flag 710ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * {@link WindowManager.LayoutParams#FLAG_LAYOUT_IN_SCREEN}, overriding default behavior. 711ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * This will cause the popup to be positioned in absolute screen coordinates.</p> 712ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * 713ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * @param enabled true if the popup should always be positioned in screen coordinates 714ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell * @hide 715ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell */ 716ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell public void setLayoutInScreenEnabled(boolean enabled) { 717ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell mLayoutInScreen = enabled; 718ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell } 719ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell 720ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell /** 721393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * <p>Indicates whether the popup window will be attached in the decor frame of its parent 722393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * window. 723393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 724393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * @return true if the window will be attached to the decor frame of its parent window. 725393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 726393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * @see #setAttachedInDecor(boolean) 727393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * @see WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR 728393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale */ 729393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale public boolean isAttachedInDecor() { 730393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale return mAttachedInDecor; 731393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale } 732393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 733393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale /** 734393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * <p>This will attach the popup window to the decor frame of the parent window to avoid 735393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * overlaping with screen decorations like the navigation bar. Overrides the default behavior of 736393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * the flag {@link WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR}. 737393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 738393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * <p>By default the flag is set on SDK version {@link Build.VERSION_CODES#LOLLIPOP_MR1} or 739393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * greater and cleared on lesser SDK versions. 740393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 741393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * @param enabled true if the popup should be attached to the decor frame of its parent window. 742393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * 743393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * @see WindowManager.LayoutParams#FLAG_LAYOUT_ATTACHED_IN_DECOR 744393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale */ 745393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale public void setAttachedInDecor(boolean enabled) { 746393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale mAttachedInDecor = enabled; 747393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale mAttachedInDecorSet = true; 748393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale } 749393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 750393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale /** 7510bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * Allows the popup window to force the flag 7520bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * {@link WindowManager.LayoutParams#FLAG_LAYOUT_INSET_DECOR}, overriding default behavior. 7530bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * This will cause the popup to inset its content to account for system windows overlaying 7540bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * the screen, such as the status bar. 7550bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * 7560bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * <p>This will often be combined with {@link #setLayoutInScreenEnabled(boolean)}. 7570bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * 7580bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * @param enabled true if the popup's views should inset content to account for system windows, 7590bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * the way that decor views behave for full-screen windows. 7600bd1d0a15294345bf88b20df28466907f982cec7Adam Powell * @hide 7610bd1d0a15294345bf88b20df28466907f982cec7Adam Powell */ 7620bd1d0a15294345bf88b20df28466907f982cec7Adam Powell public void setLayoutInsetDecor(boolean enabled) { 7630bd1d0a15294345bf88b20df28466907f982cec7Adam Powell mLayoutInsetDecor = enabled; 7640bd1d0a15294345bf88b20df28466907f982cec7Adam Powell } 7650bd1d0a15294345bf88b20df28466907f982cec7Adam Powell 7660bd1d0a15294345bf88b20df28466907f982cec7Adam Powell /** 767574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * Set the layout type for this window. Should be one of the TYPE constants defined in 768574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * {@link WindowManager.LayoutParams}. 769574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * 770574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * @param layoutType Layout type for this window. 771574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * @hide 772574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell */ 773574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell public void setWindowLayoutType(int layoutType) { 774574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell mWindowLayoutType = layoutType; 775574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell } 776574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell 777574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell /** 778574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * @return The layout type for this window. 779574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell * @hide 780574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell */ 781574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell public int getWindowLayoutType() { 782574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell return mWindowLayoutType; 783574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell } 784574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell 785574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell /** 786e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell * Set whether this window is touch modal or if outside touches will be sent to 787e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell * other windows behind it. 788e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell * @hide 789e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell */ 790e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell public void setTouchModal(boolean touchModal) { 791e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell mNotTouchModal = !touchModal; 792e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell } 793e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell 794e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell /** 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the width and height measure specs that are given to the 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window manager by the popup. By default these are 0, meaning that 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current width or height is requested as an explicit size from 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the window manager. You can supply 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT} or 800980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link ViewGroup.LayoutParams#MATCH_PARENT} to have that measure 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * spec supplied instead, replacing the absolute width and height that 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been set in the popup.</p> 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown.</p> 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widthSpec an explicit width measure spec mode, either 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT}, 809980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link ViewGroup.LayoutParams#MATCH_PARENT}, or 0 to use the absolute 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * width. 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param heightSpec an explicit height measure spec mode, either 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ViewGroup.LayoutParams#WRAP_CONTENT}, 813980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link ViewGroup.LayoutParams#MATCH_PARENT}, or 0 to use the absolute 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * height. 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWindowLayoutMode(int widthSpec, int heightSpec) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidthMode = widthSpec; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeightMode = heightSpec; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return this popup's height MeasureSpec</p> 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the height MeasureSpec of the popup 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setHeight(int) 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHeight() { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeight; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the popup's height MeasureSpec</p> 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown.</p> 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the height MeasureSpec of the popup 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getHeight() 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setHeight(int height) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = height; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Return this popup's width MeasureSpec</p> 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the width MeasureSpec of the popup 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setWidth(int) 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWidth() { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWidth; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Change the popup's width MeasureSpec</p> 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the popup is showing, calling this method will take effect only 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next time the popup is shown.</p> 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the width MeasureSpec of the popup 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWidth() 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isShowing() 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setWidth(int width) { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = width; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Indicate whether this popup window is showing on screen.</p> 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup is showing, false otherwise 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isShowing() { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsShowing; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Display the content view in a popup window at the specified location. If the popup window 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cannot fit on screen, it will be clipped. See {@link android.view.WindowManager.LayoutParams} 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for more information on how gravity and the x and y parameters are related. Specifying 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a gravity of {@link android.view.Gravity#NO_GRAVITY} is similar to specifying 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>Gravity.LEFT | Gravity.TOP</code>. 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent a parent view to get the {@link android.view.View#getWindowToken()} token from 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param gravity the gravity which controls the placement of the popup window 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x the popup's x location offset 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y the popup's y location offset 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showAtLocation(View parent, int gravity, int x, int y) { 8978ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell showAtLocation(parent.getWindowToken(), gravity, x, y); 8988ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell } 8998ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell 9008ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell /** 9018ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * Display the content view in a popup window at the specified location. 9028ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * 9038ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * @param token Window token to use for creating the new window 9048ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * @param gravity the gravity which controls the placement of the popup window 9058ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * @param x the popup's x location offset 9068ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * @param y the popup's y location offset 9078ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * 9088ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * @hide Internal use only. Applications should use 9098ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell * {@link #showAtLocation(View, int, int, int)} instead. 9108ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell */ 9118ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell public void showAtLocation(IBinder token, int gravity, int x, int y) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isShowing() || mContentView == null) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterForScrollChanged(); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsShowing = true; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDropdown = false; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9218ee6d7c20e7767c2f61f8db9a99d01e0a05f3842Adam Powell WindowManager.LayoutParams p = createPopupLayout(token); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.windowAnimations = computeAnimationResource(); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preparePopup(p); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gravity == Gravity.NO_GRAVITY) { 926aac0d4ed026d1cfbcf3fa81c6e4eb96f4347ca17Fabrice Di Meglio gravity = Gravity.TOP | Gravity.START; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.gravity = gravity; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = x; 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = y; 931ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn if (mHeightMode < 0) p.height = mLastHeight = mHeightMode; 932ab36acb39941ce981dddda9f9cf4d2d23a56fd26Dianne Hackborn if (mWidthMode < 0) p.width = mLastWidth = mWidthMode; 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invokePopup(p); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Display the content view in a popup window anchored to the bottom-left 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corner of the anchor view. If there is not enough room on screen to show 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the popup in its entirety, this method tries to find a parent scroll 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view to scroll. If no parent scroll view can be scrolled, the bottom-left 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corner of the popup is pinned at the top left corner of the anchor view.</p> 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor the view on which to pin the popup window 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #dismiss() 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showAsDropDown(View anchor) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project showAsDropDown(anchor, 0, 0); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Display the content view in a popup window anchored to the bottom-left 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corner of the anchor view offset by the specified x and y coordinates. 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If there is not enough room on screen to show 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the popup in its entirety, this method tries to find a parent scroll 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view to scroll. If no parent scroll view can be scrolled, the bottom-left 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * corner of the popup is pinned at the top left corner of the anchor view.</p> 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the view later scrolls to move <code>anchor</code> to a different 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location, the popup will be moved correspondingly.</p> 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor the view on which to pin the popup window 96254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @param xoff A horizontal offset from the anchor in pixels 96354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @param yoff A vertical offset from the anchor in pixels 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #dismiss() 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void showAsDropDown(View anchor, int xoff, int yoff) { 96854c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY); 96954c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell } 97054c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell 97154c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell /** 97254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * <p>Display the content view in a popup window anchored to the bottom-left 97354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * corner of the anchor view offset by the specified x and y coordinates. 97454c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * If there is not enough room on screen to show 97554c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * the popup in its entirety, this method tries to find a parent scroll 97654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * view to scroll. If no parent scroll view can be scrolled, the bottom-left 97754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * corner of the popup is pinned at the top left corner of the anchor view.</p> 97854c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * <p>If the view later scrolls to move <code>anchor</code> to a different 97954c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * location, the popup will be moved correspondingly.</p> 98054c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * 98154c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @param anchor the view on which to pin the popup window 98254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @param xoff A horizontal offset from the anchor in pixels 98354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @param yoff A vertical offset from the anchor in pixels 98454c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @param gravity Alignment of the popup relative to the anchor 98554c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * 98654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell * @see #dismiss() 98754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell */ 98854c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isShowing() || mContentView == null) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 99354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell registerForScrollChanged(anchor, xoff, yoff, gravity); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsShowing = true; 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsDropdown = true; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams p = createPopupLayout(anchor.getWindowToken()); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project preparePopup(p); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 100154c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff, gravity)); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeightMode < 0) p.height = mLastHeight = mHeightMode; 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mWidthMode < 0) p.width = mLastWidth = mWidthMode; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.windowAnimations = computeAnimationResource(); 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invokePopup(p); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10113e141685003939a9addce21ba2492ea3a8aebee6Romain Guy private void updateAboveAnchor(boolean aboveAnchor) { 10123e141685003939a9addce21ba2492ea3a8aebee6Romain Guy if (aboveAnchor != mAboveAnchor) { 10133e141685003939a9addce21ba2492ea3a8aebee6Romain Guy mAboveAnchor = aboveAnchor; 10143e141685003939a9addce21ba2492ea3a8aebee6Romain Guy 10153e141685003939a9addce21ba2492ea3a8aebee6Romain Guy if (mBackground != null) { 10163e141685003939a9addce21ba2492ea3a8aebee6Romain Guy // If the background drawable provided was a StateListDrawable with above-anchor 10173e141685003939a9addce21ba2492ea3a8aebee6Romain Guy // and below-anchor states, use those. Otherwise rely on refreshDrawableState to 10183e141685003939a9addce21ba2492ea3a8aebee6Romain Guy // do the job. 10193e141685003939a9addce21ba2492ea3a8aebee6Romain Guy if (mAboveAnchorBackgroundDrawable != null) { 10203e141685003939a9addce21ba2492ea3a8aebee6Romain Guy if (mAboveAnchor) { 1021560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette mPopupView.setBackground(mAboveAnchorBackgroundDrawable); 10223e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } else { 1023560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette mPopupView.setBackground(mBelowAnchorBackgroundDrawable); 10243e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } 10253e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } else { 10263e141685003939a9addce21ba2492ea3a8aebee6Romain Guy mPopupView.refreshDrawableState(); 10273e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } 10283e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } 10293e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } 10303e141685003939a9addce21ba2492ea3a8aebee6Romain Guy } 10313e141685003939a9addce21ba2492ea3a8aebee6Romain Guy 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the popup is showing above (the y coordinate of the popup's bottom 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is less than the y coordinate of the anchor) or below the anchor view (the y coordinate 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the popup is greater than y coordinate of the anchor's bottom). 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value returned 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by this method is meaningful only after {@link #showAsDropDown(android.view.View)} 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or {@link #showAsDropDown(android.view.View, int, int)} was invoked. 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if this popup is showing above the anchor view, false otherwise. 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isAboveAnchor() { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAboveAnchor; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Prepare the popup by embedding in into a new ViewGroup if the 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * background drawable is not null. If embedding is required, the layout 1050ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette * parameters' height is modified to take into account the background's 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * padding.</p> 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the layout parameters of the popup's content view 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void preparePopup(WindowManager.LayoutParams p) { 1056448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy if (mContentView == null || mContext == null || mWindowManager == null) { 1057448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy throw new IllegalStateException("You must specify a valid content view by " 1058448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy + "calling setContentView() before attempting to show the popup."); 1059448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy } 1060448ecf5a94bb8778c677f00dedd33b26ea7683e8Romain Guy 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackground != null) { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ViewGroup.LayoutParams layoutParams = mContentView.getLayoutParams(); 1063980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy int height = ViewGroup.LayoutParams.MATCH_PARENT; 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (layoutParams != null && 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT) { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = ViewGroup.LayoutParams.WRAP_CONTENT; 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when a background is available, we embed the content view 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // within another view that owns the background drawable 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PopupViewContainer popupViewContainer = new PopupViewContainer(mContext); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PopupViewContainer.LayoutParams listParams = new PopupViewContainer.LayoutParams( 1073980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy ViewGroup.LayoutParams.MATCH_PARENT, height 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 1075ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette popupViewContainer.setBackground(mBackground); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project popupViewContainer.addView(mContentView, listParams); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopupView = popupViewContainer; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopupView = mContentView; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1082ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette 1083ccb11e183763db5cbaca96abe461adf480ed8e44Alan Viverette mPopupView.setElevation(mElevation); 1084b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio mPopupViewInitialLayoutDirectionInherited = 1085b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio (mPopupView.getRawLayoutDirection() == View.LAYOUT_DIRECTION_INHERIT); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopupWidth = p.width; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopupHeight = p.height; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Invoke the popup window by adding the content view to the window 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * manager.</p> 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The content view must be non-null when this method is invoked.</p> 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the layout parameters of the popup's content view 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void invokePopup(WindowManager.LayoutParams p) { 10990c0b768e1514280812321854db6dfba723c3d169Romain Guy if (mContext != null) { 11000c0b768e1514280812321854db6dfba723c3d169Romain Guy p.packageName = mContext.getPackageName(); 11010c0b768e1514280812321854db6dfba723c3d169Romain Guy } 11020bd1d0a15294345bf88b20df28466907f982cec7Adam Powell mPopupView.setFitsSystemWindows(mLayoutInsetDecor); 1103b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio setLayoutDirectionFromAnchor(); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager.addView(mPopupView, p); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1107b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio private void setLayoutDirectionFromAnchor() { 1108b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio if (mAnchor != null) { 1109b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio View anchor = mAnchor.get(); 1110b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio if (anchor != null && mPopupViewInitialLayoutDirectionInherited) { 1111b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio mPopupView.setLayoutDirection(anchor.getLayoutDirection()); 1112b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio } 1113b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio } 1114b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio } 1115b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Generate the layout parameters for the popup window.</p> 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token the window token used to bind the popup's window 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the layout parameters to pass to the window manager 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowManager.LayoutParams createPopupLayout(IBinder token) { 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // generates the layout parameters for the drop down 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we want a fixed size view located at the bottom left of the anchor 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams p = new WindowManager.LayoutParams(); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // these gravity settings put the view at the top left corner of the 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // screen. The view is then positioned to the appropriate location 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // by setting the x and y offsets to match the anchor's bottom 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // left corner 1131aac0d4ed026d1cfbcf3fa81c6e4eb96f4347ca17Fabrice Di Meglio p.gravity = Gravity.START | Gravity.TOP; 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.width = mLastWidth = mWidth; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.height = mLastHeight = mHeight; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackground != null) { 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.format = mBackground.getOpacity(); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.format = PixelFormat.TRANSLUCENT; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.flags = computeFlags(p.flags); 1140574b37ecc20a5358cb6147dae6d633385467ab55Adam Powell p.type = mWindowLayoutType; 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.token = token; 1142374aaaed32daa8482d98ec16988b2b51547f035dRomain Guy p.softInputMode = mSoftInputMode; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.setTitle("PopupWindow:" + Integer.toHexString(hashCode())); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int computeFlags(int curFlags) { 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags &= ~( 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES | 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 1155ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM | 1156ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell WindowManager.LayoutParams.FLAG_SPLIT_TOUCH); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(mIgnoreCheekPress) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES; 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFocusable) { 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInputMethodMode == INPUT_METHOD_NEEDED) { 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mInputMethodMode == INPUT_METHOD_NOT_NEEDED) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mTouchable) { 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1171c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (mOutsideTouchable) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mClippingEnabled) { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 117746e75294d540fe807d78aec2582ae02cc38c7d42Jeff Brown if (isSplitTouchEnabled()) { 117801ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown curFlags |= WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; 117901ce2e9eee41cc0c24b0d16465710a28ea337d5dJeff Brown } 1180ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell if (mLayoutInScreen) { 1181ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 1182ba0a2c383ffe4be1fe33a5aa57bc3148c4fd0b7cAdam Powell } 11830bd1d0a15294345bf88b20df28466907f982cec7Adam Powell if (mLayoutInsetDecor) { 11840bd1d0a15294345bf88b20df28466907f982cec7Adam Powell curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; 11850bd1d0a15294345bf88b20df28466907f982cec7Adam Powell } 1186e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell if (mNotTouchModal) { 1187e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 1188e0b6cd14ac116006e26dac6898a332fa90f1f49cAdam Powell } 1189393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale if (mAttachedInDecor) { 1190393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR; 1191393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale } 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return curFlags; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1194393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int computeAnimationResource() { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimationStyle == -1) { 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsDropdown) { 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAboveAnchor 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? com.android.internal.R.style.Animation_DropDownUp 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : com.android.internal.R.style.Animation_DropDownDown; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAnimationStyle; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1206560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1208560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * Positions the popup window on screen. When the popup window is too tall 1209560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * to fit under the anchor, a parent scroll view is seeked and scrolled up 1210560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * to reclaim space. If scrolling is not possible or not enough, the popup 1211560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * window gets moved on top of the anchor. 1212560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * <p> 1213560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * The height must have been set on the layout parameters prior to calling 1214560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * this method. 1215560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor the view on which the popup window must be anchored 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the layout parameters used to display the drop down 1218560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * @param xoff horizontal offset used to adjust for background padding 1219560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * @param yoff vertical offset used to adjust for background padding 1220560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette * @param gravity horizontal gravity specifying popup alignment 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the popup is translated upwards to fit on screen 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1223560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette private boolean findDropDownPosition(View anchor, WindowManager.LayoutParams p, int xoff, 1224560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette int yoff, int gravity) { 122562e2bdecc21819a71c04204f20fc051886fdabd6Adam Powell final int anchorHeight = anchor.getHeight(); 1226560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int anchorWidth = anchor.getWidth(); 1227560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette if (mOverlapAnchor) { 1228560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette yoff -= anchorHeight; 1229560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette } 1230560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getLocationInWindow(mDrawingLocation); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = mDrawingLocation[0] + xoff; 123362e2bdecc21819a71c04204f20fc051886fdabd6Adam Powell p.y = mDrawingLocation[1] + anchorHeight + yoff; 123454c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell 1235560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int hgrav = Gravity.getAbsoluteGravity(gravity, anchor.getLayoutDirection()) 1236560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette & Gravity.HORIZONTAL_GRAVITY_MASK; 123754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell if (hgrav == Gravity.RIGHT) { 1238560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // Flip the location to align the right sides of the popup and 1239560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // anchor instead of left. 1240560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette p.x -= mPopupWidth - anchorWidth; 124154c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell } 1242560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean onTop = false; 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 124554c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell p.gravity = Gravity.LEFT | Gravity.TOP; 124654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getLocationOnScreen(mScreenLocation); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect displayFrame = new Rect(); 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getWindowVisibleDisplayFrame(displayFrame); 125062e2bdecc21819a71c04204f20fc051886fdabd6Adam Powell 1251560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int screenY = mScreenLocation[1] + anchorHeight + yoff; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View root = anchor.getRootView(); 1253560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette if (screenY + mPopupHeight > displayFrame.bottom 1254560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette || p.x + mPopupWidth - root.getWidth() > 0) { 1255560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // If the drop down disappears at the bottom of the screen, we try 1256560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // to scroll a parent scrollview or move the drop down back up on 1257560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // top of the edit box. 1258b7c1b20c8a5a4d4378ae91b4a1f12a34100df452Adam Powell if (mAllowScrollingAnchorParent) { 1259560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int scrollX = anchor.getScrollX(); 1260560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int scrollY = anchor.getScrollY(); 1261560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final Rect r = new Rect(scrollX, scrollY, scrollX + mPopupWidth + xoff, 1262560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette scrollY + mPopupHeight + anchorHeight + yoff); 1263b7c1b20c8a5a4d4378ae91b4a1f12a34100df452Adam Powell anchor.requestRectangleOnScreen(r, true); 1264b7c1b20c8a5a4d4378ae91b4a1f12a34100df452Adam Powell } 12653e141685003939a9addce21ba2492ea3a8aebee6Romain Guy 1266560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // Now we re-evaluate the space available, and decide from that 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // whether the pop-up will go above or below the anchor. 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getLocationInWindow(mDrawingLocation); 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = mDrawingLocation[0] + xoff; 1270560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette p.y = mDrawingLocation[1] + anchorHeight + yoff; 127154c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell 1272560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // Preserve the gravity adjustment. 127354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell if (hgrav == Gravity.RIGHT) { 1274560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette p.x -= mPopupWidth - anchorWidth; 127554c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell } 1276560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 1277560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // Determine whether there is more space above or below the anchor. 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getLocationOnScreen(mScreenLocation); 1279560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette onTop = (displayFrame.bottom - mScreenLocation[1] - anchorHeight - yoff) < 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mScreenLocation[1] - yoff - displayFrame.top); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onTop) { 128254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell p.gravity = Gravity.LEFT | Gravity.BOTTOM; 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = root.getHeight() - mDrawingLocation[1] + yoff; 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1285560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette p.y = mDrawingLocation[1] + anchorHeight + yoff; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 128956c2d337e02a275397fc9d0460dca90977f199acAdam Powell if (mClipToScreen) { 129056c2d337e02a275397fc9d0460dca90977f199acAdam Powell final int displayFrameWidth = displayFrame.right - displayFrame.left; 1291560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int right = p.x + p.width; 129256c2d337e02a275397fc9d0460dca90977f199acAdam Powell if (right > displayFrameWidth) { 129356c2d337e02a275397fc9d0460dca90977f199acAdam Powell p.x -= right - displayFrameWidth; 129456c2d337e02a275397fc9d0460dca90977f199acAdam Powell } 1295560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 129656c2d337e02a275397fc9d0460dca90977f199acAdam Powell if (p.x < displayFrame.left) { 129756c2d337e02a275397fc9d0460dca90977f199acAdam Powell p.x = displayFrame.left; 129856c2d337e02a275397fc9d0460dca90977f199acAdam Powell p.width = Math.min(p.width, displayFrameWidth); 129956c2d337e02a275397fc9d0460dca90977f199acAdam Powell } 130056c2d337e02a275397fc9d0460dca90977f199acAdam Powell 13015f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell if (onTop) { 1302560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final int popupTop = mScreenLocation[1] + yoff - mPopupHeight; 13035f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell if (popupTop < 0) { 13045f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell p.y += popupTop; 13055f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell } 13065f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell } else { 13075f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell p.y = Math.max(p.y, displayFrame.top); 13085f83a6017bacb513610df83a36b1f55953e65ad4Adam Powell } 130956c2d337e02a275397fc9d0460dca90977f199acAdam Powell } 131056c2d337e02a275397fc9d0460dca90977f199acAdam Powell 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.gravity |= Gravity.DISPLAY_CLIP_VERTICAL; 1312560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 1313560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette // Compute the position of the anchor relative to the popup. 1314560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette mAnchorRelativeX = mDrawingLocation[0] - p.x + anchorHeight / 2; 1315560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette mAnchorRelativeY = mDrawingLocation[1] - p.y + anchorWidth / 2; 1316560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return onTop; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the maximum height that is available for the popup to be 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * completely shown. It is recommended that this height be the maximum for 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the popup's height, otherwise it is possible that the popup will be 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clipped. 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor The view on which the popup window must be anchored. 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The maximum available height for the popup to be completely 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown. 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMaxAvailableHeight(View anchor) { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getMaxAvailableHeight(anchor, 0); 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the maximum height that is available for the popup to be 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * completely shown. It is recommended that this height be the maximum for 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the popup's height, otherwise it is possible that the popup will be 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clipped. 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor The view on which the popup window must be anchored. 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param yOffset y offset from the view's bottom edge 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The maximum available height for the popup to be completely 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shown. 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMaxAvailableHeight(View anchor, int yOffset) { 134698acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau return getMaxAvailableHeight(anchor, yOffset, false); 134798acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau } 134898acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau 134998acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau /** 135098acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * Returns the maximum height that is available for the popup to be 135198acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * completely shown, optionally ignoring any bottom decorations such as 135298acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * the input method. It is recommended that this height be the maximum for 135398acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * the popup's height, otherwise it is possible that the popup will be 135498acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * clipped. 135598acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * 135698acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * @param anchor The view on which the popup window must be anchored. 135798acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * @param yOffset y offset from the view's bottom edge 135898acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * @param ignoreBottomDecorations if true, the height returned will be 135998acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * all the way to the bottom of the display, ignoring any 136098acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * bottom decorations 136198acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * @return The maximum available height for the popup to be completely 136298acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * shown. 136398acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * 136498acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau * @hide Pending API council approval. 136598acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau */ 136698acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau public int getMaxAvailableHeight(View anchor, int yOffset, boolean ignoreBottomDecorations) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect displayFrame = new Rect(); 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getWindowVisibleDisplayFrame(displayFrame); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] anchorPos = mDrawingLocation; 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor.getLocationOnScreen(anchorPos); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 137398acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau int bottomEdge = displayFrame.bottom; 137498acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau if (ignoreBottomDecorations) { 1375a7287f4d199b5d86e01d1de9d9a9db7e3221b02dAdam Powell Resources res = anchor.getContext().getResources(); 13763f4a764cf400aa209c1f8f76a1c73143eefc4905Adam Powell bottomEdge = res.getDisplayMetrics().heightPixels; 137798acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau } 137898acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int distanceToTop = anchorPos[1] - displayFrame.top + yOffset; 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // anchorPos[1] is distance from anchor to top of screen 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int returnedHeight = Math.max(distanceToBottom, distanceToTop); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackground != null) { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackground.getPadding(mTempRect); 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project returnedHeight -= mTempRect.top + mTempRect.bottom; 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return returnedHeight; 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Dispose of the popup window. This method can be invoked only after 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #showAsDropDown(android.view.View)} has been executed. Failing that, calling 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this method will have no effect.</p> 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #showAsDropDown(android.view.View) 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dismiss() { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isShowing() && mPopupView != null) { 140006f938e8aa56cd89ab0bdb04c8b946392c428dd1Svetoslav Ganov mIsShowing = false; 140106f938e8aa56cd89ab0bdb04c8b946392c428dd1Svetoslav Ganov 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterForScrollChanged(); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 140492be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy try { 1405b82d074038f4c8d86e1bd4f3fa4d3780bd4bcba5Craig Mautner mWindowManager.removeViewImmediate(mPopupView); 140692be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy } finally { 140792be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy if (mPopupView != mContentView && mPopupView instanceof ViewGroup) { 140892be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy ((ViewGroup) mPopupView).removeView(mContentView); 140992be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy } 141092be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy mPopupView = null; 1411b82d074038f4c8d86e1bd4f3fa4d3780bd4bcba5Craig Mautner 141292be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy if (mOnDismissListener != null) { 141392be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy mOnDismissListener.onDismiss(); 141492be82e6a85bfe6f86400eb46d7c5e8ec5787b3cRomain Guy } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the listener to be called when the window is dismissed. 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param onDismissListener The listener. 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnDismissListener(OnDismissListener onDismissListener) { 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnDismissListener = onDismissListener; 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Updates the state of the popup window, if it is currently being displayed, 14303390018c6b45acffa6edf97a4174ca49f1e8c76dJohn Spurlock * from the currently set state. This includes: 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setClippingEnabled(boolean)}, {@link #setFocusable(boolean)}, 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setIgnoreCheekPress()}, {@link #setInputMethodMode(int)}, 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setTouchable(boolean)}, and {@link #setAnimationStyle(int)}. 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update() { 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isShowing() || mContentView == null) { 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams p = (WindowManager.LayoutParams) 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPopupView.getLayoutParams(); 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean update = false; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int newAnim = computeAnimationResource(); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newAnim != p.windowAnimations) { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.windowAnimations = newAnim; 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int newFlags = computeFlags(p.flags); 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFlags != p.flags) { 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.flags = newFlags; 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1456b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (update) { 1458b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio setLayoutDirectionFromAnchor(); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager.updateViewLayout(mPopupView, p); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1462d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy 1463d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy /** 1464d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * <p>Updates the dimension of the popup window. Calling this function 1465d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * also updates the window with the current popup state as described 1466d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * for {@link #update()}.</p> 1467d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * 1468d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @param width the new width 1469d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @param height the new height 1470d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy */ 1471d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy public void update(int width, int height) { 1472d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy WindowManager.LayoutParams p = (WindowManager.LayoutParams) 1473d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy mPopupView.getLayoutParams(); 1474d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy update(p.x, p.y, width, height, false); 1475d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy } 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Updates the position and the dimension of the popup window. Width and 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * height can be set to -1 to update location only. Calling this function 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also updates the window with the current popup state as 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * described for {@link #update()}.</p> 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x the new x location 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y the new y location 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the new width, can be -1 to ignore 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the new height, can be -1 to ignore 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update(int x, int y, int width, int height) { 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update(x, y, width, height, false); 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Updates the position and the dimension of the popup window. Width and 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * height can be set to -1 to update location only. Calling this function 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also updates the window with the current popup state as 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * described for {@link #update()}.</p> 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param x the new x location 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param y the new y location 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the new width, can be -1 to ignore 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the new height, can be -1 to ignore 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param force reposition the window even if the specified position 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * already seems to correspond to the LayoutParams 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update(int x, int y, int width, int height, boolean force) { 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width != -1) { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWidth = width; 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setWidth(width); 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (height != -1) { 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastHeight = height; 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setHeight(height); 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isShowing() || mContentView == null) { 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1520e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams(); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean update = force; 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int finalWidth = mWidthMode < 0 ? mWidthMode : mLastWidth; 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (width != -1 && p.width != finalWidth) { 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.width = mLastWidth = finalWidth; 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int finalHeight = mHeightMode < 0 ? mHeightMode : mLastHeight; 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (height != -1 && p.height != finalHeight) { 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.height = mLastHeight = finalHeight; 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.x != x) { 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = x; 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p.y != y) { 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = y; 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int newAnim = computeAnimationResource(); 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newAnim != p.windowAnimations) { 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.windowAnimations = newAnim; 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int newFlags = computeFlags(p.flags); 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newFlags != p.flags) { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.flags = newFlags; 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project update = true; 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 155798acd54fa6657e8131b3a2a957de7882a2f511abMike LeBeau 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (update) { 1559b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio setLayoutDirectionFromAnchor(); 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager.updateViewLayout(mPopupView, p); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * <p>Updates the position and the dimension of the popup window. Calling this 1566105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * function also updates the window with the current popup state as described 1567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * for {@link #update()}.</p> 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor the popup's anchor view 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the new width, can be -1 to ignore 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the new height, can be -1 to ignore 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update(View anchor, int width, int height) { 157454c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell update(anchor, false, 0, 0, true, width, height, mAnchoredGravity); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Updates the position and the dimension of the popup window. Width and 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * height can be set to -1 to update location only. Calling this function 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * also updates the window with the current popup state as 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * described for {@link #update()}.</p> 158281f08086b44a117097960195d2c9072e29644962Gilles Debunne * 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If the view later scrolls to move <code>anchor</code> to a different 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * location, the popup will be moved correspondingly.</p> 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param anchor the popup's anchor view 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param xoff x offset from the view's left edge 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param yoff y offset from the view's bottom edge 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param width the new width, can be -1 to ignore 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param height the new height, can be -1 to ignore 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void update(View anchor, int xoff, int yoff, int width, int height) { 159354c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell update(anchor, true, xoff, yoff, true, width, height, mAnchoredGravity); 1594105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1595105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1596105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private void update(View anchor, boolean updateLocation, int xoff, int yoff, 159754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell boolean updateDimension, int width, int height, int gravity) { 1598105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isShowing() || mContentView == null) { 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<View> oldAnchor = mAnchor; 1604560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette final boolean needsUpdate = updateLocation 1605560f17098f90b15c8894cce127f2fed85f7aeb6bAlan Viverette && (mAnchorXoff != xoff || mAnchorYoff != yoff); 160681f08086b44a117097960195d2c9072e29644962Gilles Debunne if (oldAnchor == null || oldAnchor.get() != anchor || (needsUpdate && !mIsDropdown)) { 160754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell registerForScrollChanged(anchor, xoff, yoff, gravity); 160881f08086b44a117097960195d2c9072e29644962Gilles Debunne } else if (needsUpdate) { 160981f08086b44a117097960195d2c9072e29644962Gilles Debunne // No need to register again if this is a DropDown, showAsDropDown already did. 161081f08086b44a117097960195d2c9072e29644962Gilles Debunne mAnchorXoff = xoff; 161181f08086b44a117097960195d2c9072e29644962Gilles Debunne mAnchorYoff = yoff; 161254c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell mAnchoredGravity = gravity; 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1615e29f064383cbc745c8605c707000ab4e16ee0aacRomain Guy WindowManager.LayoutParams p = (WindowManager.LayoutParams) mPopupView.getLayoutParams(); 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (updateDimension) { 1618105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (width == -1) { 1619105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project width = mPopupWidth; 1620105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 1621105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mPopupWidth = width; 1622105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (height == -1) { 1624105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project height = mPopupHeight; 1625105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 1626105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mPopupHeight = height; 1627105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 16303e141685003939a9addce21ba2492ea3a8aebee6Romain Guy int x = p.x; 16313e141685003939a9addce21ba2492ea3a8aebee6Romain Guy int y = p.y; 16323e141685003939a9addce21ba2492ea3a8aebee6Romain Guy 1633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (updateLocation) { 163454c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell updateAboveAnchor(findDropDownPosition(anchor, p, xoff, yoff, gravity)); 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 163654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, 163754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell mAnchoredGravity)); 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639b003e28c1d65d06fcb5690ff2955d007d8f7a626Fabrice Di Meglio 16403e141685003939a9addce21ba2492ea3a8aebee6Romain Guy update(p.x, p.y, width, height, x != p.x || y != p.y); 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listener that is called when this popup window is dismissed. 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnDismissListener { 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when this popup window is dismissed. 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDismiss(); 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void unregisterForScrollChanged() { 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<View> anchorRef = mAnchor; 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View anchor = null; 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anchorRef != null) { 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project anchor = anchorRef.get(); 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (anchor != null) { 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewTreeObserver vto = anchor.getViewTreeObserver(); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vto.removeOnScrollChangedListener(mOnScrollChangedListener); 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnchor = null; 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 166654c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell private void registerForScrollChanged(View anchor, int xoff, int yoff, int gravity) { 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unregisterForScrollChanged(); 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnchor = new WeakReference<View>(anchor); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewTreeObserver vto = anchor.getViewTreeObserver(); 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vto != null) { 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vto.addOnScrollChangedListener(mOnScrollChangedListener); 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnchorXoff = xoff; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnchorYoff = yoff; 167754c94dea8a26e66fa59a31fd9170ca221052d3aaAdam Powell mAnchoredGravity = gravity; 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class PopupViewContainer extends FrameLayout { 1681c3fa6304c997ccecf8ed15a4cbb7bd245128f3c3Adam Powell private static final String TAG = "PopupWindow.PopupViewContainer"; 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PopupViewContainer(Context context) { 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAboveAnchor) { 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 1 more needed for the above anchor state 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View.mergeDrawableStates(drawableState, ABOVE_ANCHOR_STATE_SET); 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return drawableState; 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onCreateDrawableState(extraSpace); 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 17024ae02b37bb0ee0a9a626108299b6a2e9ac028ca2Per Andersson if (getKeyDispatcherState() == null) { 17034ae02b37bb0ee0a9a626108299b6a2e9ac028ca2Per Andersson return super.dispatchKeyEvent(event); 17044ae02b37bb0ee0a9a626108299b6a2e9ac028ca2Per Andersson } 17054ae02b37bb0ee0a9a626108299b6a2e9ac028ca2Per Andersson 17068d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn if (event.getAction() == KeyEvent.ACTION_DOWN 17078d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn && event.getRepeatCount() == 0) { 1708b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown KeyEvent.DispatcherState state = getKeyDispatcherState(); 1709b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown if (state != null) { 1710b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown state.startTracking(event, this); 1711b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } 17128d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn return true; 1713b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } else if (event.getAction() == KeyEvent.ACTION_UP) { 1714b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown KeyEvent.DispatcherState state = getKeyDispatcherState(); 1715b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown if (state != null && state.isTracking(event) && !event.isCanceled()) { 1716b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown dismiss(); 1717b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown return true; 1718b3ea92235c9ccc1ff295839a8f324dcd1c83dd6fJeff Brown } 17198d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn } 17208d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn return super.dispatchKeyEvent(event); 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchKeyEvent(event); 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchTouchEvent(MotionEvent ev) { 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTouchInterceptor != null && mTouchInterceptor.onTouch(this, ev)) { 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchTouchEvent(ev); 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouchEvent(MotionEvent event) { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int x = (int) event.getX(); 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int y = (int) event.getY(); 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((event.getAction() == MotionEvent.ACTION_DOWN) 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) { 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismiss(); 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismiss(); 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onTouchEvent(event); 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 175075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 175175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov @Override 175275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public void sendAccessibilityEvent(int eventType) { 175375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov // clinets are interested in the content not the container, make it event source 175475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov if (mContentView != null) { 175575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov mContentView.sendAccessibilityEvent(eventType); 175675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } else { 175775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov super.sendAccessibilityEvent(eventType); 175875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 175975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1763