• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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