/* * This is the source code of Telegram for Android v. 1.4.x. * It is licensed under GNU GPL v. 2 or later. * You should have received a copy of the license in this archive (see LICENSE). * * Copyright Nikolai Kudashov, 2013-2014. */ //Thanks to https://github.com/JakeWharton/ActionBarSherlock/ package org.telegram.ui.Views.ActionBar; import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.PopupWindow; import java.lang.reflect.Field; public class ActionBarPopupWindow extends PopupWindow { private static final Field superListenerField; static { Field f = null; try { f = PopupWindow.class.getDeclaredField("mOnScrollChangedListener"); f.setAccessible(true); } catch (NoSuchFieldException e) { /* ignored */ } superListenerField = f; } private static final ViewTreeObserver.OnScrollChangedListener NOP = new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { /* do nothing */ } }; private ViewTreeObserver.OnScrollChangedListener mSuperScrollListener; private ViewTreeObserver mViewTreeObserver; public static interface OnDispatchKeyEventListener { public void onDispatchKeyEvent(KeyEvent keyEvent); } public static class ActionBarPopupWindowLayout extends LinearLayout { private OnDispatchKeyEventListener mOnDispatchKeyEventListener; public ActionBarPopupWindowLayout(Context context) { super(context); } public ActionBarPopupWindowLayout(Context context, AttributeSet attrs) { super(context, attrs); } public ActionBarPopupWindowLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setDispatchKeyEventListener(OnDispatchKeyEventListener listener) { mOnDispatchKeyEventListener = listener; } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (mOnDispatchKeyEventListener != null) { mOnDispatchKeyEventListener.onDispatchKeyEvent(event); } return super.dispatchKeyEvent(event); } } public ActionBarPopupWindow() { super(); init(); } public ActionBarPopupWindow(Context context) { super(context); init(); } public ActionBarPopupWindow(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ActionBarPopupWindow(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public ActionBarPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } public ActionBarPopupWindow(int width, int height) { super(width, height); init(); } public ActionBarPopupWindow(View contentView) { super(contentView); init(); } public ActionBarPopupWindow(View contentView, int width, int height, boolean focusable) { super(contentView, width, height, focusable); init(); } public ActionBarPopupWindow(View contentView, int width, int height) { super(contentView, width, height); init(); } private void init() { if (superListenerField != null) { try { mSuperScrollListener = (ViewTreeObserver.OnScrollChangedListener) superListenerField.get(this); superListenerField.set(this, NOP); } catch (Exception e) { mSuperScrollListener = null; } } } private void unregisterListener() { if (mSuperScrollListener != null && mViewTreeObserver != null) { if (mViewTreeObserver.isAlive()) { mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener); } mViewTreeObserver = null; } } private void registerListener(View anchor) { if (mSuperScrollListener != null) { ViewTreeObserver vto = (anchor.getWindowToken() != null) ? anchor.getViewTreeObserver() : null; if (vto != mViewTreeObserver) { if (mViewTreeObserver != null && mViewTreeObserver.isAlive()) { mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener); } if ((mViewTreeObserver = vto) != null) { vto.addOnScrollChangedListener(mSuperScrollListener); } } } } @Override public void showAsDropDown(View anchor, int xoff, int yoff) { super.showAsDropDown(anchor, xoff, yoff); registerListener(anchor); } @Override public void update(View anchor, int xoff, int yoff, int width, int height) { super.update(anchor, xoff, yoff, width, height); registerListener(anchor); } @Override public void update(View anchor, int width, int height) { super.update(anchor, width, height); registerListener(anchor); } @Override public void showAtLocation(View parent, int gravity, int x, int y) { super.showAtLocation(parent, gravity, x, y); unregisterListener(); } @Override public void dismiss() { setFocusable(false); super.dismiss(); unregisterListener(); } }