summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dianne Hackborn <hackbod@google.com> 2011-01-25 15:23:13 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2011-01-25 15:23:13 -0800
commitf95bd0feb57f1503be7c08083c0a4d22286256e8 (patch)
tree7523898e898673a3d395a2b4d0dbbbb7ada02906
parent8fca2eccb03b9b8d71ec4a7ec088d617edec4e73 (diff)
parentf812fee071b9992872009b2dcd7969c7ce882a90 (diff)
Merge "Argh forget to include my final part of the change." into honeycomb
-rw-r--r--core/java/android/app/Dialog.java27
-rw-r--r--core/java/android/app/DialogFragment.java12
2 files changed, 37 insertions, 2 deletions
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 7365670a9aaa..f4fa567e28fd 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -85,6 +85,7 @@ public class Dialog implements DialogInterface, Window.Callback,
*/
protected boolean mCancelable = true;
+ private String mCancelAndDismissTaken;
private Message mCancelMessage;
private Message mDismissMessage;
private Message mShowMessage;
@@ -1029,6 +1030,11 @@ public class Dialog implements DialogInterface, Window.Callback,
* @param listener The {@link DialogInterface.OnCancelListener} to use.
*/
public void setOnCancelListener(final OnCancelListener listener) {
+ if (mCancelAndDismissTaken != null) {
+ throw new IllegalStateException(
+ "OnCancelListener is already taken by "
+ + mCancelAndDismissTaken + " and can not be replaced.");
+ }
if (listener != null) {
mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener);
} else {
@@ -1050,6 +1056,11 @@ public class Dialog implements DialogInterface, Window.Callback,
* @param listener The {@link DialogInterface.OnDismissListener} to use.
*/
public void setOnDismissListener(final OnDismissListener listener) {
+ if (mCancelAndDismissTaken != null) {
+ throw new IllegalStateException(
+ "OnDismissListener is already taken by "
+ + mCancelAndDismissTaken + " and can not be replaced.");
+ }
if (listener != null) {
mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener);
} else {
@@ -1077,6 +1088,22 @@ public class Dialog implements DialogInterface, Window.Callback,
mDismissMessage = msg;
}
+ /** @hide */
+ public boolean takeCancelAndDismissListeners(String msg, final OnCancelListener cancel,
+ final OnDismissListener dismiss) {
+ if (mCancelAndDismissTaken != null) {
+ mCancelAndDismissTaken = null;
+ } else if (mCancelMessage != null || mDismissMessage != null) {
+ return false;
+ }
+
+ setOnCancelListener(cancel);
+ setOnDismissListener(dismiss);
+ mCancelAndDismissTaken = msg;
+
+ return true;
+ }
+
/**
* By default, this will use the owner Activity's suggested stream type.
*
diff --git a/core/java/android/app/DialogFragment.java b/core/java/android/app/DialogFragment.java
index 8bdd086eb466..50953d72e24f 100644
--- a/core/java/android/app/DialogFragment.java
+++ b/core/java/android/app/DialogFragment.java
@@ -378,6 +378,12 @@ public class DialogFragment extends Fragment
* default implementation simply instantiates and returns a {@link Dialog}
* class.
*
+ * <p><em>Note: DialogFragment own the {@link Dialog#setOnCancelListener
+ * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener
+ * Dialog.setOnDismissListener} callbacks. You must not set them yourself.</em>
+ * To find out about these events, override {@link #onCancel(DialogInterface)}
+ * and {@link #onDismiss(DialogInterface)}.</p>
+ *
* @param savedInstanceState The last saved instance state of the Fragment,
* or null if this is a freshly created Fragment.
*
@@ -417,8 +423,10 @@ public class DialogFragment extends Fragment
}
mDialog.setOwnerActivity(getActivity());
mDialog.setCancelable(mCancelable);
- mDialog.setOnCancelListener(this);
- mDialog.setOnDismissListener(this);
+ if (!mDialog.takeCancelAndDismissListeners("DialogFragment", this, this)) {
+ throw new IllegalStateException(
+ "You can not set Dialog's OnCancelListener or OnDismissListener");
+ }
if (savedInstanceState != null) {
Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
if (dialogState != null) {