Fixes lock on Home. Adds a new API on Dialog to get a callback when the dialog
shows.
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 2b165fc..1330912 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -86,6 +86,7 @@
private Message mCancelMessage;
private Message mDismissMessage;
+ private Message mShowMessage;
/**
* Whether to cancel the dialog when a touch is received outside of the
@@ -140,7 +141,7 @@
w.setWindowManager(mWindowManager, null, null);
w.setGravity(Gravity.CENTER);
mUiThread = Thread.currentThread();
- mDismissCancelHandler = new DismissCancelHandler(this);
+ mListenersHandler = new ListenersHandler(this);
}
/**
@@ -235,6 +236,8 @@
}
mWindowManager.addView(mDecor, l);
mShowing = true;
+
+ sendShowMessage();
}
/**
@@ -289,6 +292,13 @@
}
}
+ private void sendShowMessage() {
+ if (mShowMessage != null) {
+ // Obtain a new message so this dialog can be re-used
+ Message.obtain(mShowMessage).sendToTarget();
+ }
+ }
+
// internal method to make sure mcreated is set properly without requiring
// users to call through to super in onCreate
void dispatchOnCreate(Bundle savedInstanceState) {
@@ -890,7 +900,7 @@
*/
public void setOnCancelListener(final OnCancelListener listener) {
if (listener != null) {
- mCancelMessage = mDismissCancelHandler.obtainMessage(CANCEL, listener);
+ mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener);
} else {
mCancelMessage = null;
}
@@ -911,13 +921,26 @@
*/
public void setOnDismissListener(final OnDismissListener listener) {
if (listener != null) {
- mDismissMessage = mDismissCancelHandler.obtainMessage(DISMISS, listener);
+ mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener);
} else {
mDismissMessage = null;
}
}
/**
+ * Sets a listener to be invoked when the dialog is shown.
+ *
+ * @hide Pending API council approval
+ */
+ public void setOnShowListener(OnShowListener listener) {
+ if (listener != null) {
+ mShowMessage = mListenersHandler.obtainMessage(SHOW, listener);
+ } else {
+ mShowMessage = null;
+ }
+ }
+
+ /**
* Set a message to be sent when the dialog is dismissed.
* @param msg The msg to send when the dialog is dismissed.
*/
@@ -951,13 +974,14 @@
private static final int DISMISS = 0x43;
private static final int CANCEL = 0x44;
+ private static final int SHOW = 0x45;
- private Handler mDismissCancelHandler;
+ private Handler mListenersHandler;
- private static final class DismissCancelHandler extends Handler {
+ private static final class ListenersHandler extends Handler {
private WeakReference<DialogInterface> mDialog;
- public DismissCancelHandler(Dialog dialog) {
+ public ListenersHandler(Dialog dialog) {
mDialog = new WeakReference<DialogInterface>(dialog);
}
@@ -970,6 +994,9 @@
case CANCEL:
((OnCancelListener) msg.obj).onCancel(mDialog.get());
break;
+ case SHOW:
+ ((OnShowListener) msg.obj).onShow(mDialog.get());
+ break;
}
}
}
diff --git a/core/java/android/content/DialogInterface.java b/core/java/android/content/DialogInterface.java
index 4afa294..9f1036e 100644
--- a/core/java/android/content/DialogInterface.java
+++ b/core/java/android/content/DialogInterface.java
@@ -92,6 +92,21 @@
}
/**
+ * Interface used to allow the creator of a dialog to run some code when the
+ * dialog is shown.
+ * @hide Pending API council approval
+ */
+ interface OnShowListener {
+ /**
+ * This method will be invoked when the dialog is shown.
+ *
+ * @param dialog The dialog that was shown will be passed into the
+ * method.
+ */
+ public void onShow(DialogInterface dialog);
+ }
+
+ /**
* Interface used to allow the creator of a dialog to run some code when an
* item on the dialog is clicked..
*/