diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
index 8e4e63c..4a8004a 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java
@@ -59,7 +59,7 @@
     private static final String INFO_DIALOG_MESSAGE_ID = "infoDialogMessageId";
 
     // Interface mostly for making documentation and refactoring easier...
-    private interface PassFailActivity {
+    public interface PassFailActivity {
 
         /**
          * Hooks up the pass and fail buttons to click listeners that will record the test results.
@@ -268,7 +268,7 @@
         }
     }
 
-    private static <T extends android.app.Activity & PassFailActivity>
+    protected static <T extends android.app.Activity & PassFailActivity>
             void setPassFailClickListeners(final T activity) {
         View.OnClickListener clickListener = new View.OnClickListener() {
             @Override
@@ -299,7 +299,7 @@
         });
     }
 
-    private static void setInfo(final android.app.Activity activity, final int titleId,
+    protected static void setInfo(final android.app.Activity activity, final int titleId,
             final int messageId, final int viewId) {
         // Show the middle "info" button and make it show the info dialog when clicked.
         View infoButton = activity.findViewById(R.id.info_button);
@@ -324,7 +324,7 @@
         }
     }
 
-    private static boolean hasSeenInfoDialog(android.app.Activity activity) {
+    protected static boolean hasSeenInfoDialog(android.app.Activity activity) {
         ContentResolver resolver = activity.getContentResolver();
         Cursor cursor = null;
         try {
@@ -338,7 +338,7 @@
         }
     }
 
-    private static void showInfoDialog(final android.app.Activity activity, int titleId,
+    protected 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);
@@ -347,7 +347,7 @@
         activity.showDialog(INFO_DIALOG_ID, args);
     }
 
-    private static Dialog createDialog(final android.app.Activity activity, int id, Bundle args) {
+    protected static Dialog createDialog(final android.app.Activity activity, int id, Bundle args) {
         switch (id) {
             case INFO_DIALOG_ID:
                 return createInfoDialog(activity, id, args);
@@ -356,7 +356,7 @@
         }
     }
 
-    private static Dialog createInfoDialog(final android.app.Activity activity, int id,
+    protected 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);
@@ -385,7 +385,7 @@
         return builder.create();
     }
 
-    private static void markSeenInfoDialog(android.app.Activity activity) {
+    protected static void markSeenInfoDialog(android.app.Activity activity) {
         ContentResolver resolver = activity.getContentResolver();
         ContentValues values = new ContentValues(2);
         values.put(TestResultsProvider.COLUMN_TEST_NAME, activity.getClass().getName());
@@ -398,7 +398,7 @@
     }
 
     /** Set the test result corresponding to the button clicked and finish the activity. */
-    private static void setTestResultAndFinish(android.app.Activity activity, String testId,
+    protected static void setTestResultAndFinish(android.app.Activity activity, String testId,
             String testDetails, ReportLog reportLog, View target) {
         boolean passed;
         if (target.getId() == R.id.pass_button) {
@@ -413,7 +413,7 @@
     }
 
     /** Set the test result and finish the activity. */
-    private static void setTestResultAndFinishHelper(android.app.Activity activity, String testId,
+    protected static void setTestResultAndFinishHelper(android.app.Activity activity, String testId,
             String testDetails, boolean passed, ReportLog reportLog) {
         if (passed) {
             TestResult.setPassedResult(activity, testId, testDetails, reportLog);
@@ -424,7 +424,7 @@
         activity.finish();
     }
 
-    private static ImageButton getPassButtonView(android.app.Activity activity) {
+    protected static ImageButton getPassButtonView(android.app.Activity activity) {
         return (ImageButton) activity.findViewById(R.id.pass_button);
     }
 
