Enable manual pass and keep screen on for presence tests

Bug: 301483254
Change-Id: I97fb0648da261ef4b6918aa287d0f70a0f7b6bac
(cherry picked from commit d8c7429d1ca47aee4e62116950ffa9a44dfa16e5)
Merged-In: I97fb0648da261ef4b6918aa287d0f70a0f7b6bac
diff --git a/apps/CtsVerifier/res/layout/ble_rssi_precision.xml b/apps/CtsVerifier/res/layout/ble_rssi_precision.xml
index e33c94d..288e8f2 100644
--- a/apps/CtsVerifier/res/layout/ble_rssi_precision.xml
+++ b/apps/CtsVerifier/res/layout/ble_rssi_precision.xml
@@ -18,6 +18,7 @@
                 xmlns:tools="http://schemas.android.com/tools"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
+                android:keepScreenOn="true"
                 android:orientation="vertical"
                 style="@style/RootLayoutPadding"
                 tools:ignore="Autofill">
@@ -49,6 +50,12 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
 
+            <CheckBox
+                android:id="@+id/is_manual_pass"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/is_manual_pass_text"/>
+
             <Button
                 android:id="@+id/start_test"
                 android:layout_width="wrap_content"
diff --git a/apps/CtsVerifier/res/layout/ble_rx_tx_offset_precision.xml b/apps/CtsVerifier/res/layout/ble_rx_tx_offset_precision.xml
index a60b0a7..3abe695 100644
--- a/apps/CtsVerifier/res/layout/ble_rx_tx_offset_precision.xml
+++ b/apps/CtsVerifier/res/layout/ble_rx_tx_offset_precision.xml
@@ -19,6 +19,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:orientation="vertical"
+                android:keepScreenOn="true"
                 style="@style/RootLayoutPadding"
                 tools:ignore="Autofill">
 
@@ -49,6 +50,12 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content">
 
+                <CheckBox
+                    android:id="@+id/is_manual_pass"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/is_manual_pass_text"/>
+
                 <Button
                     android:id="@+id/start_test"
                     android:layout_width="wrap_content"
diff --git a/apps/CtsVerifier/res/layout/nan_accuracy.xml b/apps/CtsVerifier/res/layout/nan_accuracy.xml
index 1aa565a..e89ad0e 100644
--- a/apps/CtsVerifier/res/layout/nan_accuracy.xml
+++ b/apps/CtsVerifier/res/layout/nan_accuracy.xml
@@ -18,6 +18,7 @@
                 xmlns:tools="http://schemas.android.com/tools"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
+                android:keepScreenOn="true"
                 android:orientation="vertical"
                 style="@style/RootLayoutPadding"
                 tools:ignore="Autofill">
@@ -49,6 +50,12 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content">
 
+                <CheckBox
+                    android:id="@+id/is_manual_pass"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/is_manual_pass_text"/>
+
                 <TextView
                     android:id="@+id/test_distance_radio_group_description"
                     android:layout_height="wrap_content"
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index f809e11..5937523 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -6896,6 +6896,7 @@
         \nIf the TV device is launched on older Android letters, all tests will be disabled. Press Pass to pass this case.
     </string>
     <string name="is_reference_device_checkbox_text">Is Reference Device</string>
+    <string name="is_manual_pass_text">Pass test manually after test completion</string>
     <string name="uwb_precision">Uwb Precision Test</string>
     <string name="uwb_short_range">Uwb Short Range Test</string>
     <string name="uwb_precision_instruction">
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRssiPrecisionActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRssiPrecisionActivity.java
index b2591ec..1a3352d 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRssiPrecisionActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRssiPrecisionActivity.java
@@ -49,6 +49,7 @@
 
     // Report log schema
     private static final String KEY_REFERENCE_DEVICE = "reference_device";
+    private static final String KEY_RSSI_RANGE_95_PERCENTILE = "rssi_range_95_percentile";
 
     // Thresholds
     private static final int MAX_RSSI_RANGE_DBM = 18;
@@ -69,7 +70,10 @@
     private EditText mReferenceDeviceIdInput;
     private String mReferenceDeviceName;
     private CheckBox mIsReferenceDeviceCheckbox;
-    private boolean mTestPassed;
+    private CheckBox mIsManualPassCheckbox;
+    private boolean mIsManualPass;
+    private boolean mTestCompleted;
+    private int mRssiRange;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -85,6 +89,7 @@
         mDeviceFoundTextView = findViewById(R.id.device_found_info);
         mReferenceDeviceIdInput = findViewById(R.id.ref_device_id_input);
         mIsReferenceDeviceCheckbox = findViewById(R.id.is_reference_device);
+        mIsManualPassCheckbox = findViewById(R.id.is_manual_pass);
         mDutModeLayout = findViewById(R.id.dut_mode_layout);
         mRefModeLayout = findViewById(R.id.ref_mode_layout);
         DeviceFeatureChecker.checkFeatureSupported(this, getPassButton(),
@@ -99,11 +104,15 @@
         mDeviceIdInfoTextView.setVisibility(View.GONE);
         mDeviceFoundTextView.setVisibility(View.GONE);
         isReferenceDevice = mIsReferenceDeviceCheckbox.isChecked();
+        mIsManualPass = mIsManualPassCheckbox.isChecked();
         checkUiMode();
         mIsReferenceDeviceCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
             isReferenceDevice = isChecked;
             checkUiMode();
         });
+        mIsManualPassCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            mIsManualPass = isChecked;
+        });
         mStartTestButton.setOnClickListener(v -> startTest());
         mStopTestButton.setOnClickListener(v -> stopTest());
         mStartAdvertisingButton.setOnClickListener(v -> startAdvertising());
@@ -116,6 +125,7 @@
     }
 
     private void startTest() {
+        mTestCompleted = false;
         if (!checkBluetoothEnabled()) {
             return;
         }
@@ -162,10 +172,15 @@
         Collections.sort(data);
         // Calculate range at 95th percentile
         int rssiRange = data.get(975) - data.get(25);
+        mRssiRange = rssiRange;
+        mTestCompleted = true;
         if (rssiRange <= MAX_RSSI_RANGE_DBM) {
             makeToast("Test passed! Rssi range is: " + rssiRange);
-            getPassButton().performClick();
-            mTestPassed = true;
+            if (mIsManualPass) {
+                getPassButton().setEnabled(true);
+            } else {
+                getPassButton().performClick();
+            }
         } else {
             makeToast("Test failed! Rssi range is: " + rssiRange);
         }
@@ -244,9 +259,11 @@
 
     @Override
     public void recordTestResults() {
-        if (mTestPassed) {
+        if (mTestCompleted) {
             getReportLog().addValue(KEY_REFERENCE_DEVICE, mReferenceDeviceName,
                     ResultType.NEUTRAL, ResultUnit.NONE);
+            getReportLog().addValue(KEY_RSSI_RANGE_95_PERCENTILE, mRssiRange, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
             getReportLog().submit();
         }
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRxTxOffsetPrecisionActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRxTxOffsetPrecisionActivity.java
index dd663bc..f18f84f 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRxTxOffsetPrecisionActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/presence/BleRxTxOffsetPrecisionActivity.java
@@ -49,6 +49,8 @@
 
     // Report log schema
     private static final String KEY_REFERENCE_DEVICE = "reference_device";
+    private static final String KEY_RSSI_MEDIAN_DUT = "rssi_median_dut";
+    private static final String KEY_RSSI_MEDIAN_REFERENCE = "rssi_median_ref";
 
     // Thresholds
     private static final int MIN_RSSI_MEDIAN_DBM = -65;
@@ -72,9 +74,12 @@
     private EditText mReferenceDeviceIdInput;
     private String mReferenceDeviceName;
     private CheckBox mIsReferenceDeviceCheckbox;
-    private boolean mTestPassed;
+    private CheckBox mIsManualPassCheckbox;
+    private boolean mIsManualPass;
     private byte mCurrentReferenceDeviceId = 0;
     private byte mRssiMedianFromReferenceDevice = 0;
+    private int mRssiMedianOnDut = 0;
+    private boolean mTestCompleted;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -90,6 +95,7 @@
         mDeviceFoundTextView = findViewById(R.id.device_found_info);
         mReferenceDeviceIdInput = findViewById(R.id.ref_device_id_input);
         mIsReferenceDeviceCheckbox = findViewById(R.id.is_reference_device);
+        mIsManualPassCheckbox = findViewById(R.id.is_manual_pass);
         mDutModeLayout = findViewById(R.id.dut_mode_layout);
         mRefModeLayout = findViewById(R.id.ref_mode_layout);
         mDutTestInfoTextView = findViewById(R.id.dut_test_result_info);
@@ -108,11 +114,15 @@
         mRefTestInfoTextView.setVisibility(View.GONE);
         mDutTestInfoTextView.setVisibility(View.GONE);
         isReferenceDevice = mIsReferenceDeviceCheckbox.isChecked();
+        mIsManualPass = mIsManualPassCheckbox.isChecked();
         checkUiMode();
         mIsReferenceDeviceCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
             isReferenceDevice = isChecked;
             checkUiMode();
         });
+        mIsManualPassCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            mIsManualPass = isChecked;
+        });
         mStartTestButton.setOnClickListener(v -> startTestAsDut());
         mStopTestButton.setOnClickListener(v -> stopTest());
         mStartAdvertisingButton.setOnClickListener(v -> startTestAsReferenceDevice());
@@ -125,6 +135,9 @@
     }
 
     private void startTestAsDut() {
+        mTestCompleted = false;
+        mRssiMedianFromReferenceDevice = 0;
+        mRssiMedianOnDut = 0;
         if (!checkBluetoothEnabled()) {
             return;
         }
@@ -134,6 +147,7 @@
         }
         mStartTestButton.setEnabled(false);
         mStopTestButton.setEnabled(true);
+        mDutTestInfoTextView.setVisibility(View.GONE);
         mCurrentReferenceDeviceId = Byte.parseByte(mReferenceDeviceIdInput.getText().toString());
         mIsReferenceDeviceCheckbox.setEnabled(false);
         startAdvertising();
@@ -176,6 +190,7 @@
         if (!checkBluetoothEnabled()) {
             return;
         }
+        mRefTestInfoTextView.setVisibility(View.GONE);
         startAdvertising();
         mBleScanner.startScanning((uuids,
                 macAddress,
@@ -217,6 +232,8 @@
             startAdvertising();
             return;
         }
+        mRssiMedianOnDut = rssiMedian;
+        mTestCompleted = true;
         String dutDeviceTestInfo = getString(R.string.dut_test_result_info_presence,
                 rssiMedian, mRssiMedianFromReferenceDevice);
         mDutTestInfoTextView.setVisibility(View.VISIBLE);
@@ -226,8 +243,11 @@
                 && mRssiMedianFromReferenceDevice <= MAX_RSSI_MEDIAN_DBM) {
             makeToast("Test passed! TX Rssi median is: " + rssiMedian + ". Rx Rssi median is: "
                     + mRssiMedianFromReferenceDevice);
-            mTestPassed = true;
-            getPassButton().performClick();
+            if (mIsManualPass) {
+                getPassButton().setEnabled(true);
+            } else {
+                getPassButton().performClick();
+            }
         } else {
             makeToast("Test failed! TX Rssi median is: " + rssiMedian + ". Rx Rssi median is: "
                     + mRssiMedianFromReferenceDevice);
@@ -244,11 +264,8 @@
         mStopTestButton.setEnabled(false);
         mStartTestButton.setEnabled(true);
         mIsReferenceDeviceCheckbox.setEnabled(true);
-        mRssiMedianFromReferenceDevice = 0;
         mCurrentReferenceDeviceId = 0;
-        mRefTestInfoTextView.setVisibility(View.GONE);
         mDeviceFoundTextView.setVisibility(View.GONE);
-        mDutTestInfoTextView.setVisibility(View.GONE);
     }
 
     private void startAdvertising() {
@@ -319,9 +336,13 @@
 
     @Override
     public void recordTestResults() {
-        if (mTestPassed) {
+        if (mTestCompleted) {
             getReportLog().addValue(KEY_REFERENCE_DEVICE, mReferenceDeviceName,
                     ResultType.NEUTRAL, ResultUnit.NONE);
+            getReportLog().addValue(KEY_RSSI_MEDIAN_DUT, mRssiMedianOnDut, ResultType.NEUTRAL,
+                    ResultUnit.NONE);
+            getReportLog().addValue(KEY_RSSI_MEDIAN_REFERENCE, mRssiMedianFromReferenceDevice,
+                    ResultType.NEUTRAL, ResultUnit.NONE);
             getReportLog().submit();
         }
     }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/presence/NanAccuracyActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/presence/NanAccuracyActivity.java
index 4b8fbbf..dd39e36 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/presence/NanAccuracyActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/presence/NanAccuracyActivity.java
@@ -62,6 +62,7 @@
     private Button mStartTestButton;
     private Button mStartPublishingButton;
     private CheckBox mReferenceDeviceCheckbox;
+    private CheckBox mIsManualPassCheckbox;
     private LinearLayout mDutModeLayout;
     private LinearLayout mRefModeLayout;
     private TextView mDeviceFoundTextView;
@@ -70,6 +71,7 @@
     private EditText mServiceIdInputEditText;
     private RadioGroup mTestDistanceRadioGroup;
     private String mReferenceDeviceName = "";
+    private boolean mIsManualPass;
     private final WifiAwarePeerListener mWifiAwarePeerListener = new WifiAwarePeerListener() {
         @Override
         public void onDeviceFound(PeerHandle peerHandle) {
@@ -96,6 +98,7 @@
         setPassFailButtonClickListeners();
         getPassButton().setEnabled(false);
         mReferenceDeviceCheckbox = findViewById(R.id.is_reference_device);
+        mIsManualPassCheckbox = findViewById(R.id.is_manual_pass);
         mStartTestButton = findViewById(R.id.start_test);
         Button stopTestButton = findViewById(R.id.stop_test);
         mStartPublishingButton = findViewById(R.id.start_publishing);
@@ -118,8 +121,12 @@
         mWifiAwarePeer = new WifiAwarePeer(this, handler);
         mReceivedSamples = new HashMap<>();
         setUpActivity();
+        mIsManualPass = mIsManualPassCheckbox.isChecked();
         mReferenceDeviceCheckbox.setOnCheckedChangeListener(
                 (buttonView, isChecked) -> setUpActivity());
+        mIsManualPassCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            mIsManualPass = isChecked;
+        });
         mStartTestButton.setOnClickListener((view) -> startTest());
         stopTestButton.setOnClickListener((view) -> stopTest());
         mDeviceFoundTextView.setVisibility(View.GONE);
@@ -231,7 +238,11 @@
                     + new DecimalFormat("#.##").format((data.size() / (double) 100) * 100) + "%");
         }
         if (mTestResult.isAllPassed()) {
-            getPassButton().performClick();
+            if (mIsManualPass) {
+                getPassButton().setEnabled(true);
+            } else {
+                getPassButton().performClick();
+            }
         }
         mReceivedSamples.clear();
     }