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