showDialog should invoke onCreateDialog onPrepareDialog and dialog.show
diff --git a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java
index 57dfe08..df2dd06 100644
--- a/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java
+++ b/src/main/java/com/xtremelabs/robolectric/shadows/ShadowActivity.java
@@ -2,6 +2,7 @@
 
 import android.app.Activity;
 import android.app.Application;
+import android.app.Dialog;
 import android.content.Context;
 import android.content.Intent;
 import android.view.LayoutInflater;
@@ -43,6 +44,19 @@
 
     private Map<Intent, Integer> intentRequestCodeMap = new HashMap<Intent, Integer>();
     private int requestedOrientation = -1;
+    private static Method onCreateDialog;
+    private static Method onPrepareDialog;
+
+    static {
+        try {
+            onCreateDialog = Activity.class.getDeclaredMethod("onCreateDialog", int.class);
+            onCreateDialog.setAccessible(true);
+            onPrepareDialog = Activity.class.getDeclaredMethod("onPrepareDialog", int.class, Dialog.class);
+            onPrepareDialog.setAccessible(true);
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException(e);
+        }
+    }
 
     @Implementation
     public final Application getApplication() {
@@ -252,6 +266,19 @@
         }
     }
 
+    @Implementation
+    public void showDialog(int i) {
+        try {
+            Dialog dialog = (Dialog) onCreateDialog.invoke(realActivity, i);
+            onPrepareDialog.invoke(realActivity, i, dialog);
+            dialog.show();
+        } catch (InvocationTargetException e) {
+            throw new IllegalArgumentException(e);
+        } catch (IllegalAccessException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
     /**
      * Container object to hold an Intent, together with the requestCode used
      * in a call to {@code Activity#startActivityForResult(Intent, int)}
diff --git a/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java b/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java
index 0525863..a2f2054 100644
--- a/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java
+++ b/src/test/java/com/xtremelabs/robolectric/shadows/ActivityTest.java
@@ -1,6 +1,7 @@
 package com.xtremelabs.robolectric.shadows;
 
 import android.app.Activity;
+import android.app.Dialog;
 import android.appwidget.AppWidgetProvider;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -14,6 +15,9 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.lang.ref.Reference;
+import java.util.concurrent.atomic.AtomicBoolean;
+
 import static com.xtremelabs.robolectric.Robolectric.shadowOf;
 import static com.xtremelabs.robolectric.util.TestUtil.newConfig;
 import static org.hamcrest.CoreMatchers.equalTo;
@@ -165,9 +169,46 @@
         assertTrue(runnable.wasRun);
     }
 
+    @Test
+    public void showDialog_shouldCreatePrepareAndShowDialog() {
+        final MyActivity activity = new MyActivity();
+        final AtomicBoolean dialogWasShowed = new AtomicBoolean(false);
+
+        new Dialog(activity) {
+            {  activity.dialog = this; }
+
+            @Override
+            public void show() {
+                dialogWasShowed.set(true);
+            }
+        };
+
+        ShadowActivity shadow = Robolectric.shadowOf(activity);
+        shadow.showDialog(1);
+
+        assertTrue(activity.createdDialog);
+        assertTrue(activity.preparedDialog);
+        assertTrue(dialogWasShowed.get());
+    }
+
     private static class MyActivity extends Activity {
+        public boolean createdDialog = false;
+        public boolean preparedDialog = false;
+        public Dialog dialog = null;
+
         @Override protected void onDestroy() {
             super.onDestroy();
         }
+
+        @Override
+        protected Dialog onCreateDialog(int id) {
+            createdDialog = true;
+            return dialog;
+        }
+
+        @Override
+        protected void onPrepareDialog(int id, Dialog dialog) {
+            preparedDialog = true;
+        }
     }
 }