1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.adservices.ui.util; 18 19 import static com.android.adservices.service.DebugFlagsConstants.KEY_CONSENT_NOTIFICATION_DEBUG_MODE; 20 import static com.android.adservices.service.FlagsConstants.KEY_IS_EEA_DEVICE; 21 import static com.android.adservices.service.FlagsConstants.KEY_IS_EEA_DEVICE_FEATURE_ENABLED; 22 import static com.android.adservices.service.FlagsConstants.KEY_PAS_UX_ENABLED; 23 import static com.android.adservices.service.FlagsConstants.KEY_UI_DIALOGS_FEATURE_ENABLED; 24 import static com.android.adservices.service.FlagsConstants.KEY_UI_TOGGLE_SPEED_BUMP_ENABLED; 25 import static com.android.adservices.ui.util.AdServicesUiTestCase.LAUNCH_TIMEOUT_MS; 26 import static com.android.adservices.ui.util.ApkTestUtil.assertNotNull; 27 import static com.android.adservices.ui.util.ApkTestUtil.getConsentSwitch; 28 29 import static com.google.common.truth.Truth.assertWithMessage; 30 31 import android.content.Intent; 32 import android.os.Build; 33 import android.os.RemoteException; 34 import android.util.Log; 35 36 import androidx.test.uiautomator.UiDevice; 37 import androidx.test.uiautomator.UiObject2; 38 import androidx.test.uiautomator.Until; 39 40 import com.android.adservices.api.R; 41 import com.android.adservices.common.AdServicesFlagsSetterRule; 42 43 import java.util.concurrent.TimeUnit; 44 45 /** Util class for Settings tests. */ 46 public final class SettingsTestUtil { 47 48 private static final String TAG = SettingsTestUtil.class.getSimpleName(); 49 private static final int WINDOW_LAUNCH_TIMEOUT_MS = 2_000; 50 private static final int PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS = 2_000; 51 private static final String PRIVACY_SANDBOX_UI = "android.adservices.ui.SETTINGS"; 52 settingsRemoveMainToggleAndMeasurementEntryTestUtil(UiDevice device)53 public static void settingsRemoveMainToggleAndMeasurementEntryTestUtil(UiDevice device) { 54 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 55 56 // make sure we are on the main settings page 57 UiObject2 appButton = ApkTestUtil.scrollTo(device, R.string.settingsUI_apps_ga_title); 58 assertNotNull(appButton, R.string.settingsUI_apps_ga_title); 59 60 UiObject2 topicsButton = ApkTestUtil.scrollTo(device, R.string.settingsUI_topics_ga_title); 61 assertNotNull(topicsButton, R.string.settingsUI_topics_ga_title); 62 63 // click measurement page 64 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_title); 65 66 // verify have entered to measurement page 67 UiObject2 measurementSwitch = 68 ApkTestUtil.getElement(device, R.string.settingsUI_measurement_switch_title); 69 assertNotNull(measurementSwitch, R.string.settingsUI_measurement_switch_title); 70 71 pressBack(device); 72 // verify back to the main page 73 assertNotNull(appButton, R.string.settingsUI_apps_ga_title); 74 } 75 measurementDialogTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)76 public static void measurementDialogTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) 77 throws RemoteException { 78 flags.setFlag(KEY_UI_DIALOGS_FEATURE_ENABLED, true); 79 device.setOrientationNatural(); 80 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 81 // open measurement view 82 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_title); 83 84 // click reset 85 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_reset_title); 86 UiObject2 resetButton = 87 ApkTestUtil.getElement(device, R.string.settingsUI_measurement_view_reset_title); 88 assertNotNull(resetButton, R.string.settingsUI_measurement_view_reset_title); 89 90 // click reset again 91 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_reset_title); 92 resetButton = 93 ApkTestUtil.getElement(device, R.string.settingsUI_measurement_view_reset_title); 94 assertNotNull(resetButton, R.string.settingsUI_measurement_view_reset_title); 95 } 96 topicsToggleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)97 public static void topicsToggleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) 98 throws RemoteException { 99 flags.setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false); 100 101 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 102 // 1) disable Topics API is enabled 103 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_topics_ga_title); 104 105 UiObject2 topicsToggle = getConsentSwitch(device); 106 if (topicsToggle.isChecked()) { 107 topicsToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 108 } 109 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ false); 110 pressBack(device); 111 112 // 2) enable Topics API 113 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_topics_ga_title); 114 115 topicsToggle = getConsentSwitch(device); 116 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ false); 117 topicsToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 118 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ true); 119 pressBack(device); 120 121 // 3) check if Topics API is enabled 122 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_topics_ga_title); 123 // rotate device to test rotating as well 124 device.setOrientationLeft(); 125 device.setOrientationNatural(); 126 topicsToggle = getConsentSwitch(device); 127 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ true); 128 pressBack(device); 129 } 130 fledgeToggleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)131 public static void fledgeToggleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) 132 throws RemoteException { 133 flags.setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false); 134 135 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 136 // 1) disable Fledge API is enabled 137 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 138 139 UiObject2 fledgeToggle = getConsentSwitch(device); 140 if (fledgeToggle.isChecked()) { 141 fledgeToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 142 } 143 ApkTestUtil.assertToggleState(fledgeToggle, /* checked= */ false); 144 pressBack(device); 145 146 // 2) enable Fledge API 147 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 148 149 fledgeToggle = getConsentSwitch(device); 150 ApkTestUtil.assertToggleState(fledgeToggle, /* checked= */ false); 151 fledgeToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 152 ApkTestUtil.assertToggleState(fledgeToggle, /* checked= */ true); 153 pressBack(device); 154 155 // 3) check if Fledge API is enabled 156 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 157 // rotate device to test rotating as well 158 device.setOrientationLeft(); 159 device.setOrientationNatural(); 160 fledgeToggle = getConsentSwitch(device); 161 ApkTestUtil.assertToggleState(fledgeToggle, /* checked= */ true); 162 pressBack(device); 163 } 164 measurementToggleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)165 public static void measurementToggleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) 166 throws RemoteException { 167 flags.setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false); 168 169 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 170 // 1) disable Measurement API is enabled 171 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_title); 172 173 UiObject2 measurementToggle = getConsentSwitch(device); 174 if (measurementToggle.isChecked()) { 175 measurementToggle.clickAndWait( 176 Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 177 } 178 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ false); 179 pressBack(device); 180 181 // 2) enable Measurement API 182 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_title); 183 184 measurementToggle = getConsentSwitch(device); 185 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ false); 186 measurementToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 187 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ true); 188 pressBack(device); 189 190 // 3) check if Measurement API is enabled 191 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_view_title); 192 // rotate device to test rotating as well 193 device.setOrientationLeft(); 194 device.setOrientationNatural(); 195 measurementToggle = getConsentSwitch(device); 196 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ true); 197 pressBack(device); 198 } 199 topicsSubtitleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)200 public static void topicsSubtitleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) { 201 flags.setFlag(KEY_UI_DIALOGS_FEATURE_ENABLED, false) 202 .setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false); 203 204 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 205 SettingsTestUtil.checkSubtitleMatchesToggle( 206 device, 207 ".*:id/topics_preference_subtitle", 208 R.string.settingsUI_topics_ga_title); 209 } 210 appsSubtitleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)211 public static void appsSubtitleTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) { 212 flags.setFlag(KEY_UI_DIALOGS_FEATURE_ENABLED, false) 213 .setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false); 214 215 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 216 SettingsTestUtil.checkSubtitleMatchesToggle( 217 device, 218 ".*:id/apps_preference_subtitle", 219 R.string.settingsUI_apps_ga_title); 220 } 221 measurementSubtitleTestUtil( UiDevice device, AdServicesFlagsSetterRule flags)222 public static void measurementSubtitleTestUtil( 223 UiDevice device, AdServicesFlagsSetterRule flags) { 224 flags.setFlag(KEY_UI_DIALOGS_FEATURE_ENABLED, false) 225 .setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false); 226 227 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 228 SettingsTestUtil.checkSubtitleMatchesToggle( 229 device, 230 ".*:id/measurement_preference_subtitle", 231 R.string.settingsUI_measurement_view_title); 232 } 233 topicsToggleDialogTestUtil( UiDevice device, AdServicesFlagsSetterRule flags)234 public static void topicsToggleDialogTestUtil( 235 UiDevice device, AdServicesFlagsSetterRule flags) { 236 flags.setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, true); 237 238 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 239 240 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_topics_ga_title); 241 242 UiObject2 topicsToggle = getConsentSwitch(device); 243 if (topicsToggle.isChecked()) { 244 // turn it off 245 topicsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 246 UiObject2 dialogOptOutTitle = 247 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_topics_opt_out_title); 248 UiObject2 positiveButton = 249 ApkTestUtil.getElement( 250 device, R.string.settingsUI_dialog_opt_out_positive_text); 251 assertNotNull(dialogOptOutTitle, R.string.settingsUI_dialog_topics_opt_out_title); 252 positiveButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 253 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 254 topicsToggle = getConsentSwitch(device); 255 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ false); 256 // then turn it on again 257 topicsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 258 UiObject2 dialogOptInTitle = 259 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_topics_opt_in_title); 260 UiObject2 okButton = 261 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_acknowledge); 262 assertNotNull(dialogOptInTitle, R.string.settingsUI_dialog_topics_opt_in_title); 263 okButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 264 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 265 topicsToggle = getConsentSwitch(device); 266 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ true); 267 } else { 268 // turn it on 269 topicsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 270 UiObject2 dialogOptInTitle = 271 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_topics_opt_in_title); 272 UiObject2 okButton = 273 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_acknowledge); 274 assertNotNull(dialogOptInTitle, R.string.settingsUI_dialog_topics_opt_in_title); 275 okButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 276 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 277 topicsToggle = getConsentSwitch(device); 278 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ true); 279 // then turn it off 280 topicsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 281 UiObject2 dialogOptOutTitle = 282 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_topics_opt_out_title); 283 UiObject2 positiveButton = 284 ApkTestUtil.getElement( 285 device, R.string.settingsUI_dialog_opt_out_positive_text); 286 assertNotNull(dialogOptOutTitle, R.string.settingsUI_dialog_topics_opt_out_title); 287 positiveButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 288 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 289 topicsToggle = getConsentSwitch(device); 290 ApkTestUtil.assertToggleState(topicsToggle, /* checked= */ false); 291 } 292 } 293 appsToggleDialogTestUtil(UiDevice device, AdServicesFlagsSetterRule flags)294 public static void appsToggleDialogTestUtil(UiDevice device, AdServicesFlagsSetterRule flags) { 295 flags.setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, true); 296 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 297 298 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 299 300 UiObject2 appsToggle = getConsentSwitch(device); 301 if (appsToggle.isChecked()) { 302 // turn it off 303 appsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 304 UiObject2 dialogOptOutTitle = 305 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_apps_opt_out_title); 306 UiObject2 positiveButton = 307 ApkTestUtil.getElement( 308 device, R.string.settingsUI_dialog_opt_out_positive_text); 309 assertNotNull(dialogOptOutTitle, R.string.settingsUI_dialog_apps_opt_out_title); 310 positiveButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 311 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 312 appsToggle = getConsentSwitch(device); 313 ApkTestUtil.assertToggleState(appsToggle, /* checked= */ false); 314 // then turn it on again 315 appsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 316 UiObject2 dialogOptInTitle = 317 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_apps_opt_in_title); 318 UiObject2 okButton = 319 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_acknowledge); 320 assertNotNull(dialogOptInTitle, R.string.settingsUI_dialog_apps_opt_in_title); 321 okButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 322 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 323 appsToggle = getConsentSwitch(device); 324 ApkTestUtil.assertToggleState(appsToggle, /* checked= */ true); 325 } else { 326 // turn it on 327 appsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 328 UiObject2 dialogOptInTitle = 329 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_apps_opt_in_title); 330 UiObject2 okButton = 331 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_acknowledge); 332 assertNotNull(dialogOptInTitle, R.string.settingsUI_dialog_apps_opt_in_title); 333 okButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 334 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 335 appsToggle = getConsentSwitch(device); 336 ApkTestUtil.assertToggleState(appsToggle, /* checked= */ true); 337 // then turn it off 338 appsToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 339 UiObject2 dialogOptOutTitle = 340 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_apps_opt_out_title); 341 UiObject2 positiveButton = 342 ApkTestUtil.getElement( 343 device, R.string.settingsUI_dialog_opt_out_positive_text); 344 assertNotNull(dialogOptOutTitle, R.string.settingsUI_dialog_apps_opt_out_title); 345 positiveButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 346 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 347 appsToggle = getConsentSwitch(device); 348 ApkTestUtil.assertToggleState(appsToggle, /* checked= */ false); 349 } 350 } 351 measurementToggleDialogTestUtil( UiDevice device, AdServicesFlagsSetterRule flags)352 public static void measurementToggleDialogTestUtil( 353 UiDevice device, AdServicesFlagsSetterRule flags) { 354 flags.setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, true); 355 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 356 357 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_measurement_ga_title); 358 359 UiObject2 measurementToggle = getConsentSwitch(device); 360 361 if (measurementToggle.isChecked()) { 362 // turn it off 363 measurementToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 364 UiObject2 dialogOptOutTitle = 365 ApkTestUtil.getElement( 366 device, R.string.settingsUI_dialog_measurement_opt_out_title); 367 UiObject2 positiveButton = 368 ApkTestUtil.getElement( 369 device, R.string.settingsUI_dialog_opt_out_positive_text); 370 assertNotNull(dialogOptOutTitle, R.string.settingsUI_dialog_measurement_opt_out_title); 371 positiveButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 372 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 373 measurementToggle = getConsentSwitch(device); 374 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ false); 375 // then turn it on again 376 measurementToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 377 UiObject2 dialogOptInTitle = 378 ApkTestUtil.getElement( 379 device, R.string.settingsUI_dialog_measurement_opt_in_title); 380 UiObject2 okButton = 381 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_acknowledge); 382 assertNotNull(dialogOptInTitle, R.string.settingsUI_dialog_measurement_opt_in_title); 383 okButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 384 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 385 measurementToggle = getConsentSwitch(device); 386 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ true); 387 } else { 388 // turn it on 389 measurementToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 390 UiObject2 dialogOptInTitle = 391 ApkTestUtil.getElement( 392 device, R.string.settingsUI_dialog_measurement_opt_in_title); 393 UiObject2 okButton = 394 ApkTestUtil.getElement(device, R.string.settingsUI_dialog_acknowledge); 395 assertNotNull(dialogOptInTitle, R.string.settingsUI_dialog_measurement_opt_in_title); 396 okButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 397 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 398 measurementToggle = getConsentSwitch(device); 399 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ true); 400 // then turn it off 401 measurementToggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 402 UiObject2 dialogOptOutTitle = 403 ApkTestUtil.getElement( 404 device, R.string.settingsUI_dialog_measurement_opt_out_title); 405 UiObject2 positiveButton = 406 ApkTestUtil.getElement( 407 device, R.string.settingsUI_dialog_opt_out_positive_text); 408 assertNotNull(dialogOptOutTitle, R.string.settingsUI_dialog_measurement_opt_out_title); 409 positiveButton.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 410 // Retrieve new instance to avoid android.support.test.uiautomator.StaleObjectException. 411 measurementToggle = getConsentSwitch(device); 412 ApkTestUtil.assertToggleState(measurementToggle, /* checked= */ false); 413 } 414 } 415 416 /** 417 * Tests whether the new PAS Fledge view has updated PAS text. 418 * 419 * @param device UiDevice 420 * @param flags AdServicesFlagsSetterRule used for setting the flags 421 * @throws RemoteException during screen rotation 422 */ fledgeViewTextPasEnabledTest( UiDevice device, AdServicesFlagsSetterRule flags)423 public static void fledgeViewTextPasEnabledTest( 424 UiDevice device, AdServicesFlagsSetterRule flags) throws RemoteException { 425 flags.setFlag(KEY_PAS_UX_ENABLED, true) 426 .setFlag(KEY_IS_EEA_DEVICE_FEATURE_ENABLED, true) 427 .setFlag(KEY_IS_EEA_DEVICE, false) 428 .setFlag(KEY_UI_TOGGLE_SPEED_BUMP_ENABLED, false) 429 .setDebugFlag(KEY_CONSENT_NOTIFICATION_DEBUG_MODE, true); 430 431 ApkTestUtil.launchSettingView(device, LAUNCH_TIMEOUT_MS); 432 // 1) disable Fledge API is enabled 433 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 434 device.waitForIdle(); 435 436 UiObject2 fledgeToggle = getConsentSwitch(device); 437 if (fledgeToggle.isChecked()) { 438 fledgeToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 439 } 440 assertWithMessage("fledge toggle checked").that(fledgeToggle.isChecked()).isFalse(); 441 device.pressBack(); 442 443 // 2) enable Fledge API 444 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 445 446 fledgeToggle = getConsentSwitch(device); 447 assertWithMessage("fledge toggle checked").that(fledgeToggle.isChecked()).isFalse(); 448 fledgeToggle.clickAndWait(Until.newWindow(), PRIMITIVE_UI_OBJECTS_LAUNCH_TIMEOUT_MS); 449 fledgeToggle = getConsentSwitch(device); 450 assertWithMessage("fledge toggle checked").that(fledgeToggle.isChecked()).isTrue(); 451 device.pressBack(); 452 453 // 3) check if Fledge API is enabled 454 ApkTestUtil.scrollToAndClick(device, R.string.settingsUI_apps_ga_title); 455 // rotate device to test rotating as well 456 device.setOrientationLeft(); 457 device.setOrientationNatural(); 458 fledgeToggle = getConsentSwitch(device); 459 assertWithMessage("fledge toggle checked").that(fledgeToggle.isChecked()).isTrue(); 460 461 // 4) check text is PAS text 462 UiObject2 bodyText = 463 ApkTestUtil.getElement(device, R.string.settingsUI_pas_apps_view_body_text); 464 assertNotNull(bodyText, R.string.settingsUI_pas_apps_view_body_text); 465 device.pressBack(); 466 } 467 checkSubtitleMatchesToggle( UiDevice device, String regexResId, int stringIdOfTitle)468 public static void checkSubtitleMatchesToggle( 469 UiDevice device, String regexResId, int stringIdOfTitle) { 470 UiObject2 subtitle = ApkTestUtil.scrollTo(device, regexResId); 471 if (subtitle.getText() 472 .equals(ApkTestUtil.getString(R.string.settingsUI_subtitle_consent_off))) { 473 ApkTestUtil.scrollToAndClick(device, stringIdOfTitle); 474 UiObject2 toggle = getConsentSwitch(device); 475 ApkTestUtil.assertToggleState(toggle, /* checked= */ false); 476 toggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 477 pressBack(device); 478 subtitle = ApkTestUtil.scrollTo(device, regexResId); 479 assertWithMessage("subtitle equals") 480 .that( 481 subtitle.getText() 482 .equals( 483 ApkTestUtil.getString( 484 R.string.settingsUI_subtitle_consent_off))) 485 .isFalse(); 486 } else { 487 ApkTestUtil.scrollToAndClick(device, stringIdOfTitle); 488 UiObject2 toggle = getConsentSwitch(device); 489 ApkTestUtil.assertToggleState(toggle, /* checked= */ true); 490 toggle.clickAndWait(Until.newWindow(), WINDOW_LAUNCH_TIMEOUT_MS); 491 pressBack(device); 492 subtitle = ApkTestUtil.scrollTo(device, regexResId); 493 assertWithMessage("subtitle equals") 494 .that( 495 subtitle.getText() 496 .equals( 497 ApkTestUtil.getString( 498 R.string.settingsUI_subtitle_consent_off))) 499 .isTrue(); 500 } 501 } 502 503 /** Presses the Back button. */ pressBack(UiDevice device)504 public static void pressBack(UiDevice device) { 505 Log.d(TAG, "pressBack()"); 506 device.pressBack(); 507 } 508 509 /** Check if intent has package and activity installed. */ isSettingsIntentInstalled()510 public static boolean isSettingsIntentInstalled() { 511 Intent intent = ApkTestUtil.getIntent(PRIVACY_SANDBOX_UI); 512 return ApkTestUtil.isIntentInstalled(intent); 513 } 514 515 /** check component enabled and wait for it before tests start */ setupBeforeTests()516 public static void setupBeforeTests() throws InterruptedException { 517 // Check intent component enabled, if not, sleep for 1 min for bootCompleteReceiver to get 518 // invoked on S 519 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && !isSettingsIntentInstalled()) { 520 TimeUnit.SECONDS.sleep(60); 521 } 522 } 523 } 524