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;
+ }
}
}