diff options
| author | 2011-01-19 17:08:42 -0800 | |
|---|---|---|
| committer | 2011-01-19 17:09:29 -0800 | |
| commit | d2766aec6a72eb73264281472a5164a75c6df799 (patch) | |
| tree | dba6b26bad5d38a52e8393039b3b8446b1beffd6 | |
| parent | 7457b36b92490daa6cd7e346919fad74a4b92eb9 (diff) | |
Fix bug 3112733 - Missing TLS encryption option in manual email account setup
Make spinner popups observe global events that should change the
position of the popup.
Change-Id: Ia65204f594a6972b96d4db08c205770e340fcaf9
| -rw-r--r-- | core/java/android/widget/Spinner.java | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java index 0baddcb97501..e38a69fde005 100644 --- a/core/java/android/widget/Spinner.java +++ b/core/java/android/widget/Spinner.java @@ -23,13 +23,14 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.res.TypedArray; import android.database.DataSetObserver; -import android.graphics.drawable.Drawable; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; /** @@ -69,6 +70,8 @@ public class Spinner extends AbsSpinner implements OnClickListener { private int mGravity; + private LayoutObserver mLayoutObserver; + /** * Construct a new spinner with the given context's theme. * @@ -169,6 +172,7 @@ public class Spinner extends AbsSpinner implements OnClickListener { com.android.internal.R.styleable.Spinner_dropDownHorizontalOffset, 0)); mPopup = popup; + mLayoutObserver = new LayoutObserver(); break; } } @@ -421,6 +425,11 @@ public class Spinner extends AbsSpinner implements OnClickListener { handled = true; if (!mPopup.isShowing()) { + if (mLayoutObserver != null) { + final ViewTreeObserver vto = getViewTreeObserver(); + vto.addOnGlobalLayoutListener(mLayoutObserver); + vto.addOnScrollChangedListener(mLayoutObserver); + } mPopup.show(); } } @@ -668,6 +677,7 @@ public class Spinner extends AbsSpinner implements OnClickListener { super.show(); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); setSelection(Spinner.this.getSelectedItemPosition()); + setOnDismissListener(mLayoutObserver); } @Override @@ -718,4 +728,28 @@ public class Spinner extends AbsSpinner implements OnClickListener { ViewGroup.LayoutParams.WRAP_CONTENT); } } + + private class LayoutObserver implements ViewTreeObserver.OnGlobalLayoutListener, + ViewTreeObserver.OnScrollChangedListener, PopupWindow.OnDismissListener { + @Override + public void onScrollChanged() { + if (mPopup != null && mPopup.isShowing()) { + mPopup.show(); + } + } + + @Override + public void onGlobalLayout() { + if (mPopup != null && mPopup.isShowing()) { + mPopup.show(); + } + } + + @Override + public void onDismiss() { + ViewTreeObserver vto = getViewTreeObserver(); + vto.removeGlobalOnLayoutListener(mLayoutObserver); + vto.removeOnScrollChangedListener(mLayoutObserver); + } + } } |