summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Powell <adamp@google.com> 2011-01-19 17:08:42 -0800
committer Adam Powell <adamp@google.com> 2011-01-19 17:09:29 -0800
commitd2766aec6a72eb73264281472a5164a75c6df799 (patch)
treedba6b26bad5d38a52e8393039b3b8446b1beffd6
parent7457b36b92490daa6cd7e346919fad74a4b92eb9 (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.java36
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);
+ }
+ }
}