1 /*
2  * Copyright (C) 2023 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.tests.ui.libs;
18 
19 import static android.Manifest.permission.READ_DEVICE_CONFIG;
20 
21 import static com.android.adservices.tests.ui.libs.UiUtils.LAUNCH_TIMEOUT;
22 
23 import android.content.Context;
24 import android.content.Intent;
25 import android.content.pm.PackageManager;
26 import android.util.Log;
27 
28 import androidx.test.uiautomator.By;
29 import androidx.test.uiautomator.UiDevice;
30 import androidx.test.uiautomator.Until;
31 
32 import com.android.adservices.common.AdServicesFlagsSetterRule;
33 import com.android.adservices.tests.ui.libs.pages.NotificationPages;
34 import com.android.adservices.tests.ui.libs.pages.SettingsPages;
35 
36 public class AdservicesWorkflows {
37     private static final String NOTIFICATION_PACKAGE = "android.adservices.ui.NOTIFICATIONS";
38     private static final String SETTINGS_PACKAGE = "android.adservices.ui.SETTINGS";
39 
startNotificationActivity( Context context, UiDevice device, boolean isEUActivity, String packageName)40     public static void startNotificationActivity(
41             Context context, UiDevice device, boolean isEUActivity, String packageName) {
42         if (context.checkCallingOrSelfPermission(READ_DEVICE_CONFIG)
43                 != PackageManager.PERMISSION_GRANTED) {
44             Log.d("adservices", "this does not have read_device_config permission");
45         } else {
46             Log.d("adservices", "this has read_device_config permission");
47         }
48         Intent intent = new Intent(packageName);
49         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
50         intent.putExtra("isEUDevice", isEUActivity);
51         context.startActivity(intent);
52         device.wait(Until.hasObject(By.pkg(packageName).depth(0)), LAUNCH_TIMEOUT);
53     }
54 
startSettingsActivity(Context context, UiDevice device, String packageName)55     public static void startSettingsActivity(Context context, UiDevice device, String packageName) {
56         if (context.checkCallingOrSelfPermission(READ_DEVICE_CONFIG)
57                 != PackageManager.PERMISSION_GRANTED) {
58             Log.d("adservices", "this does not have read_device_config permission");
59         } else {
60             Log.d("adservices", "this has read_device_config permission");
61         }
62         // Launch the setting view.
63         Intent intent = new Intent(packageName);
64         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
65         context.startActivity(intent);
66         // Wait for the view to appear
67         device.wait(Until.hasObject(By.pkg(packageName).depth(0)), LAUNCH_TIMEOUT);
68     }
69 
testNotificationActivityFlow( Context context, UiDevice device, AdServicesFlagsSetterRule flags, boolean isEuDevice, UiConstants.UX ux, boolean isV2, boolean isGoSettings, boolean isOptin)70     public static void testNotificationActivityFlow(
71             Context context,
72             UiDevice device,
73             AdServicesFlagsSetterRule flags,
74             boolean isEuDevice,
75             UiConstants.UX ux,
76             boolean isV2,
77             boolean isGoSettings,
78             boolean isOptin)
79             throws Exception {
80         testNotificationActivityFlow(
81                 context,
82                 device,
83                 flags,
84                 NOTIFICATION_PACKAGE,
85                 isEuDevice,
86                 ux,
87                 isV2,
88                 isGoSettings,
89                 isOptin);
90     }
91 
testNotificationActivityFlow( Context context, UiDevice device, AdServicesFlagsSetterRule flags, String packageName, boolean isEuDevice, UiConstants.UX ux, boolean isV2, boolean isGoSettings, boolean isOptin)92     public static void testNotificationActivityFlow(
93             Context context,
94             UiDevice device,
95             AdServicesFlagsSetterRule flags,
96             String packageName,
97             boolean isEuDevice,
98             UiConstants.UX ux,
99             boolean isV2,
100             boolean isGoSettings,
101             boolean isOptin)
102             throws Exception {
103         if (isEuDevice) {
104             UiUtils.setAsEuDevice(flags);
105         } else {
106             UiUtils.setAsRowDevice(flags);
107         }
108         switch (ux) {
109             case GA_UX:
110                 UiUtils.enableGa(flags);
111                 break;
112             case BETA_UX:
113                 UiUtils.enableBeta(flags);
114                 break;
115             case U18_UX:
116                 UiUtils.enableGa(flags);
117                 UiUtils.enableU18(flags);
118                 break;
119         }
120 
121         UiUtils.setFlipFlow(flags, isV2);
122 
123         startNotificationActivity(context, device, isEuDevice, packageName);
124         notificationConfirmWorkflow(
125                 context, device, true, isEuDevice, ux, isV2, isGoSettings, isOptin);
126     }
127 
testSettingsPageFlow( Context context, UiDevice device, AdServicesFlagsSetterRule flags, UiConstants.UX ux, boolean isOptin, boolean flipConsent, boolean assertOptIn)128     public static void testSettingsPageFlow(
129             Context context,
130             UiDevice device,
131             AdServicesFlagsSetterRule flags,
132             UiConstants.UX ux,
133             boolean isOptin,
134             boolean flipConsent,
135             boolean assertOptIn)
136             throws Exception {
137         testSettingsPageFlow(
138                 context, device, flags, SETTINGS_PACKAGE, ux, isOptin, flipConsent, assertOptIn);
139     }
140 
testSettingsPageFlow( Context context, UiDevice device, AdServicesFlagsSetterRule flags, String packageName, UiConstants.UX ux, boolean isOptin, boolean flipConsent, boolean assertOptIn)141     public static void testSettingsPageFlow(
142             Context context,
143             UiDevice device,
144             AdServicesFlagsSetterRule flags,
145             String packageName,
146             UiConstants.UX ux,
147             boolean isOptin,
148             boolean flipConsent,
149             boolean assertOptIn)
150             throws Exception {
151         switch (ux) {
152             case GA_UX:
153                 UiUtils.enableGa(flags);
154                 break;
155             case BETA_UX:
156                 UiUtils.enableBeta(flags);
157                 break;
158             case U18_UX:
159                 UiUtils.enableGa(flags);
160                 UiUtils.enableU18(flags);
161                 break;
162         }
163         startSettingsActivity(context, device, packageName);
164         SettingsPages.testSettingsPageConsents(
165                 context, device, ux, isOptin, flipConsent, assertOptIn);
166     }
167 
verifyNotification( Context context, UiDevice device, boolean isDisplayed, boolean isEuDevice, UiConstants.UX ux)168     public static void verifyNotification(
169             Context context,
170             UiDevice device,
171             boolean isDisplayed,
172             boolean isEuDevice,
173             UiConstants.UX ux)
174             throws Exception {
175         NotificationPages.verifyNotification(
176                 context, device, isDisplayed, isEuDevice, ux, true, false, false);
177     }
178 
verifyNotification( Context context, UiDevice device, boolean isDisplayed, boolean isEuDevice, UiConstants.UX ux, boolean isV2)179     public static void verifyNotification(
180             Context context,
181             UiDevice device,
182             boolean isDisplayed,
183             boolean isEuDevice,
184             UiConstants.UX ux,
185             boolean isV2)
186             throws Exception {
187         NotificationPages.verifyNotification(
188                 context, device, isDisplayed, isEuDevice, ux, isV2, false, false);
189     }
190 
testClickNotificationFlow( Context context, UiDevice device, boolean isDisplayed, boolean isEuDevice, UiConstants.UX ux, boolean isV2, boolean isOptin)191     public static void testClickNotificationFlow(
192             Context context,
193             UiDevice device,
194             boolean isDisplayed,
195             boolean isEuDevice,
196             UiConstants.UX ux,
197             boolean isV2,
198             boolean isOptin)
199             throws Exception {
200         testClickNotificationFlow(
201                 context, device, isDisplayed, isEuDevice, ux, isV2, isOptin, false, false);
202     }
203 
testClickNotificationFlow( Context context, UiDevice device, boolean isDisplayed, boolean isEuDevice, UiConstants.UX ux, boolean isV2, boolean isOptin, boolean isPas, boolean isPasRenotify)204     public static void testClickNotificationFlow(
205             Context context,
206             UiDevice device,
207             boolean isDisplayed,
208             boolean isEuDevice,
209             UiConstants.UX ux,
210             boolean isV2,
211             boolean isOptin,
212             boolean isPas,
213             boolean isPasRenotify)
214             throws Exception {
215         NotificationPages.verifyNotification(
216                 context, device, isDisplayed, isEuDevice, ux, isV2, isPas, isPasRenotify);
217         // Only GA and row devices needs to got to settings page to set up consent.
218         boolean isGoSettings = !isEuDevice;
219         notificationConfirmWorkflow(
220                 context, device, isDisplayed, isEuDevice, ux, isV2, isGoSettings, isOptin);
221     }
222 
notificationConfirmWorkflow( Context context, UiDevice device, boolean isDisplayed, boolean isEuDevice, UiConstants.UX ux, boolean isV2, boolean isGoSettings, boolean isOptin)223     public static void notificationConfirmWorkflow(
224             Context context,
225             UiDevice device,
226             boolean isDisplayed,
227             boolean isEuDevice,
228             UiConstants.UX ux,
229             boolean isV2,
230             boolean isGoSettings,
231             boolean isOptin)
232             throws Exception {
233         if (!isDisplayed) {
234             return;
235         }
236         switch (ux) {
237             case GA_UX:
238                 if (!isEuDevice) {
239                     NotificationPages.rowNotificationLandingPage(context, device, isGoSettings);
240                 } else {
241                     if (isV2) {
242                         NotificationPages.euNotificationLandingPageMsmtAndFledgePage(
243                                 context, device, isGoSettings, isV2);
244                         if (!isGoSettings) {
245                             NotificationPages.euNotificationLandingPageTopicsPage(
246                                     context, device, isOptin, isV2);
247                         }
248                     } else {
249                         NotificationPages.euNotificationLandingPageTopicsPage(
250                                 context, device, isOptin, isV2);
251                         NotificationPages.euNotificationLandingPageMsmtAndFledgePage(
252                                 context, device, isGoSettings, isV2);
253                     }
254                 }
255                 break;
256             case BETA_UX:
257                 NotificationPages.betaNotificationPage(
258                         context, device, isEuDevice, isGoSettings, isOptin);
259                 if (isEuDevice) {
260                     NotificationPages.betaNotificationConfirmPage(context, device, isGoSettings);
261                 }
262                 break;
263             case U18_UX:
264                 NotificationPages.u18NotifiacitonLandingPage(context, device, isGoSettings);
265         }
266 
267         // if decide to go settings page, then we test settings page consent
268         if (isGoSettings) {
269             SettingsPages.testSettingsPageConsents(context, device, ux, isOptin, false, false);
270         }
271     }
272 }
273