new: swap button moves dialog to bottom of screen Bug: 285450365

Change-Id: I795e773f33cde68723c7519a9d9d5d7ab36d34c4
diff --git a/common/device-side/interactive/src/main/java/com/android/interactive/Step.java b/common/device-side/interactive/src/main/java/com/android/interactive/Step.java
index 07d0f03..abe25f1 100644
--- a/common/device-side/interactive/src/main/java/com/android/interactive/Step.java
+++ b/common/device-side/interactive/src/main/java/com/android/interactive/Step.java
@@ -256,6 +256,21 @@
     }
 
     /**
+     * Adds small button with a single up/down arrow, used for moving the text box to the
+     * bottom of the screen in case it covers some critical area of the app
+     */
+
+    protected void addSwapButton() {
+        Button btn = new Button(TestApis.context().instrumentedContext());
+        // up/down arrow
+        btn.setText("\u21F5");
+        btn.setOnClickListener(v -> swap());
+
+        GridLayout layout = mInstructionView.findViewById(R.id.buttons);
+        layout.addView(btn);
+    }
+
+    /**
      * Adds a button to immediately mark the test as failed and request the tester to provide the
      * reason for failure.
      */
@@ -296,6 +311,19 @@
         });
     }
 
+    /**
+     * Swaps the prompt from the top to the bottom of the user screen
+     */
+    protected void swap() {
+        WindowManager.LayoutParams params = (WindowManager.LayoutParams) mInstructionView.getLayoutParams();
+        if (params.gravity == Gravity.TOP) {
+            params.gravity = Gravity.BOTTOM;
+        } else {
+            params.gravity = Gravity.TOP;
+        }
+        sWindowManager.updateViewLayout(mInstructionView, params);
+    }
+
     protected void close() {
         if (mInstructionView != null) {
             TestApis.context().instrumentationContext().getMainExecutor().execute(() -> {
diff --git a/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndConfirmStep.java b/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndConfirmStep.java
index 1333a6e..9ce5549 100644
--- a/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndConfirmStep.java
+++ b/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndConfirmStep.java
@@ -36,5 +36,6 @@
         addButton("Done", this::pass);
 
         addFailButton();
+        addSwapButton();
     }
 }
diff --git a/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndWaitStep.java b/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndWaitStep.java
index 22873cd..944ec8c 100644
--- a/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndWaitStep.java
+++ b/common/device-side/interactive/src/main/java/com/android/interactive/steps/ActAndWaitStep.java
@@ -45,6 +45,7 @@
     public void interact() {
         show(mInstruction);
         addFailButton();
+        addSwapButton();
     }
 
     @Override
diff --git a/common/device-side/interactive/src/main/java/com/android/interactive/steps/MultipleChoiceStep.java b/common/device-side/interactive/src/main/java/com/android/interactive/steps/MultipleChoiceStep.java
index 0f94ecf..5625781 100644
--- a/common/device-side/interactive/src/main/java/com/android/interactive/steps/MultipleChoiceStep.java
+++ b/common/device-side/interactive/src/main/java/com/android/interactive/steps/MultipleChoiceStep.java
@@ -46,5 +46,6 @@
             });
         }
         addFailButton();
+        addSwapButton();
     }
 }
diff --git a/common/device-side/interactive/src/main/java/com/android/interactive/steps/YesNoStep.java b/common/device-side/interactive/src/main/java/com/android/interactive/steps/YesNoStep.java
index 6f78875..bd5cd72 100644
--- a/common/device-side/interactive/src/main/java/com/android/interactive/steps/YesNoStep.java
+++ b/common/device-side/interactive/src/main/java/com/android/interactive/steps/YesNoStep.java
@@ -43,5 +43,6 @@
             close();
         });
         addFailButton();
+        addSwapButton();
     }
 }