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..
      */