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) {