Fix Info Dialog Leak

Properly use showDialog/onCreateDialog for creating the info dialog
shown for each test activity, so that it does not leak when
changing screen orientation in some tests.

Change-Id: I18f0e75be79f7d7786c42126d0a0dfb71ffbc983
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
index b629fc5..2b4661e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
@@ -17,12 +17,14 @@
 package com.android.cts.verifier;
 
 import android.app.AlertDialog;
+import android.app.Dialog;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnCancelListener;
 import android.database.Cursor;
+import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -44,6 +46,12 @@
  */
 public class PassFailButtons {
 
+    private static final int INFO_DIALOG_ID = 1337;
+
+    private static final String INFO_DIALOG_VIEW_ID = "infoDialogViewId";
+    private static final String INFO_DIALOG_TITLE_ID = "infoDialogTitleId";
+    private static final String INFO_DIALOG_MESSAGE_ID = "infoDialogMessageId";
+
     // Interface mostly for making documentation and refactoring easier...
     private interface PassFailActivity {
 
@@ -67,36 +75,55 @@
         void setInfoResources(int titleId, int messageId, int viewId);
 
         Button getPassButton();
+
+        /* Added to the interface just to make sure it isn't forgotten in the implementations. */
+        Dialog onCreateDialog(int id, Bundle args);
     }
 
     public static class Activity extends android.app.Activity implements PassFailActivity {
 
+        @Override
         public void setPassFailButtonClickListeners() {
             setPassFailClickListeners(this);
         }
 
+        @Override
         public void setInfoResources(int titleId, int messageId, int viewId) {
             setInfo(this, titleId, messageId, viewId);
         }
 
+        @Override
         public Button getPassButton() {
             return getPassButtonView(this);
         }
+
+        @Override
+        public Dialog onCreateDialog(int id, Bundle args) {
+            return createDialog(this, id, args);
+        }
     }
 
     public static class ListActivity extends android.app.ListActivity implements PassFailActivity {
 
+        @Override
         public void setPassFailButtonClickListeners() {
             setPassFailClickListeners(this);
         }
 
+        @Override
         public void setInfoResources(int titleId, int messageId, int viewId) {
             setInfo(this, titleId, messageId, viewId);
         }
 
+        @Override
         public Button getPassButton() {
             return getPassButtonView(this);
         }
+
+        @Override
+        public Dialog onCreateDialog(int id, Bundle args) {
+            return createDialog(this, id, args);
+        }
     }
 
     private static void setPassFailClickListeners(final android.app.Activity activity) {
@@ -117,6 +144,7 @@
         View infoButton = activity.findViewById(R.id.info_button);
         infoButton.setVisibility(View.VISIBLE);
         infoButton.setOnClickListener(new OnClickListener() {
+            @Override
             public void onClick(View view) {
                 showInfoDialog(activity, titleId, messageId, viewId);
             }
@@ -145,6 +173,28 @@
 
     private static void showInfoDialog(final android.app.Activity activity, int titleId,
             int messageId, int viewId) {
+        Bundle args = new Bundle();
+        args.putInt(INFO_DIALOG_TITLE_ID, titleId);
+        args.putInt(INFO_DIALOG_MESSAGE_ID, messageId);
+        args.putInt(INFO_DIALOG_VIEW_ID, viewId);
+        activity.showDialog(INFO_DIALOG_ID, args);
+    }
+
+    private static Dialog createDialog(final android.app.Activity activity, int id, Bundle args) {
+        switch (id) {
+            case INFO_DIALOG_ID:
+                return createInfoDialog(activity, id, args);
+            default:
+                throw new IllegalArgumentException("Bad dialog id: " + id);
+        }
+    }
+
+    private static Dialog createInfoDialog(final android.app.Activity activity, int id,
+            Bundle args) {
+        int viewId = args.getInt(INFO_DIALOG_VIEW_ID);
+        int titleId = args.getInt(INFO_DIALOG_TITLE_ID);
+        int messageId = args.getInt(INFO_DIALOG_MESSAGE_ID);
+
         AlertDialog.Builder builder = new AlertDialog.Builder(activity).setIcon(
                 android.R.drawable.ic_dialog_info).setTitle(titleId);
         if (viewId > 0) {
@@ -155,15 +205,17 @@
             builder.setMessage(messageId);
         }
         builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+            @Override
             public void onClick(DialogInterface dialog, int which) {
                 markSeenInfoDialog(activity);
             }
         }).setOnCancelListener(new OnCancelListener() {
+            @Override
             public void onCancel(DialogInterface dialog) {
                 markSeenInfoDialog(activity);
             }
-        })
-    	.show();
+        });
+        return builder.create();
     }
 
     private static void markSeenInfoDialog(android.app.Activity activity) {