1 /* 2 * Copyright (C) 2022 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 package com.android.adservices.ui.notifications; 17 18 import android.content.Context; 19 import android.os.Build; 20 import android.os.Bundle; 21 22 import androidx.annotation.NonNull; 23 import androidx.annotation.RequiresApi; 24 import androidx.core.view.WindowCompat; 25 import androidx.fragment.app.FragmentActivity; 26 27 import com.android.adservices.LogUtil; 28 import com.android.adservices.api.R; 29 import com.android.adservices.service.FlagsFactory; 30 import com.android.adservices.service.stats.UiStatsLogger; 31 import com.android.adservices.ui.OTAResourcesManager; 32 33 /** 34 * Android application activity for controlling settings related to PP (Privacy Preserving) APIs. 35 */ 36 // TODO(b/269798827): Enable for R. 37 @RequiresApi(Build.VERSION_CODES.S) 38 public class ConsentNotificationActivity extends FragmentActivity { 39 40 public enum NotificationFragmentEnum { 41 LANDING_PAGE_DISPLAYED, 42 LANDING_PAGE_DISMISSED, 43 LANDING_PAGE_SCROLLED, 44 LANDING_PAGE_SCROLLED_TO_BOTTOM, 45 LANDING_PAGE_ADDITIONAL_INFO_CLICKED, 46 LANDING_PAGE_MORE_BUTTON_CLICKED, 47 LANDING_PAGE_SETTINGS_BUTTON_CLICKED, 48 LANDING_PAGE_OPT_IN_CLICKED, 49 LANDING_PAGE_OPT_OUT_CLICKED, 50 LANDING_PAGE_GOT_IT_CLICKED, 51 CONFIRMATION_PAGE_DISPLAYED, 52 CONFIRMATION_PAGE_DISMISSED, 53 CONFIRMATION_PAGE_OPT_IN_MORE_INFO_CLICKED, 54 CONFIRMATION_PAGE_OPT_OUT_MORE_INFO_CLICKED, 55 CONFIRMATION_PAGE_OPT_IN_SETTINGS_CLICKED, 56 CONFIRMATION_PAGE_OPT_OUT_SETTINGS_CLICKED, 57 CONFIRMATION_PAGE_OPT_IN_GOT_IT_BUTTON_CLICKED, 58 CONFIRMATION_PAGE_OPT_OUT_GOT_IT_BUTTON_CLICKED, 59 } 60 61 private static NotificationFragmentEnum sCurrentFragment; 62 private static boolean sLandingPageDismissed; 63 private static boolean sConfirmationPageDismissed; 64 private static boolean sLandingPageDisplayed; 65 private static boolean sLandingPageMoreButtonClicked; 66 private static boolean sLandingPageSettingsButtonClicked; 67 private static boolean sConfirmationPageDisplayed; 68 private static boolean sLandingPageScrolled; 69 private static boolean sLandingPageScrolledToBottom; 70 private static boolean sLandingPageAdditionalInfoClicked; 71 72 private static boolean sLandingPageOptInClicked; 73 private static boolean sLandingPageOptOutClicked; 74 private static boolean sLandingPageGotItClicked; 75 private static boolean sConfirmationPageOptInMoreInfoClicked; 76 private static boolean sConfirmationPageOptOutMoreInfoClicked; 77 private static boolean sConfirmationPageOptInSettingsClicked; 78 private static boolean sConfirmationPageOptOutSettingsClicked; 79 private static boolean sConfirmationPageOptInGotItClicked; 80 private static boolean sConfirmationPageOptOutGotItClicked; 81 82 @Override onCreate(Bundle savedInstanceState)83 protected void onCreate(Bundle savedInstanceState) { 84 super.onCreate(savedInstanceState); 85 86 WindowCompat.setDecorFitsSystemWindows(getWindow(), false); 87 if (FlagsFactory.getFlags().getUiOtaStringsFeatureEnabled()) { 88 OTAResourcesManager.applyOTAResources(getApplicationContext(), true); 89 } 90 91 if (FlagsFactory.getFlags().getGaUxFeatureEnabled()) { 92 if (FlagsFactory.getFlags().getEuNotifFlowChangeEnabled()) { 93 setContentView(R.layout.consent_notification_ga_v2_activity); 94 } else { 95 setContentView(R.layout.consent_notification_ga_activity); 96 } 97 } else { 98 setContentView(R.layout.consent_notification_activity); 99 } 100 } 101 102 @Override onSaveInstanceState(@onNull Bundle outBundle)103 protected void onSaveInstanceState(@NonNull Bundle outBundle) { 104 super.onSaveInstanceState(outBundle); 105 } 106 107 /** 108 * Notification fragments should call this when view is created. Used to keep track of user's 109 * current page and log correct page exit if user exits. 110 */ handleAction(NotificationFragmentEnum fragmentAction, Context context)111 public static void handleAction(NotificationFragmentEnum fragmentAction, Context context) { 112 switch (fragmentAction) { 113 case LANDING_PAGE_DISPLAYED: 114 sCurrentFragment = fragmentAction; 115 if (sLandingPageDisplayed) { 116 return; 117 } 118 LogUtil.v("LANDING_PAGE_DISPLAYED logged!"); 119 sLandingPageDisplayed = true; 120 UiStatsLogger.logLandingPageDisplayed(context); 121 break; 122 case LANDING_PAGE_DISMISSED: 123 if (sLandingPageDismissed 124 || sCurrentFragment != NotificationFragmentEnum.LANDING_PAGE_DISPLAYED) { 125 return; 126 } 127 sLandingPageDismissed = true; 128 LogUtil.v("LANDING_PAGE_DISMISSED logged!"); 129 UiStatsLogger.logLandingPageDismissed(context); 130 break; 131 case LANDING_PAGE_SCROLLED: 132 if (sLandingPageScrolled) { 133 return; 134 } 135 sLandingPageScrolled = true; 136 LogUtil.v("LANDING_PAGE_SCROLLED logged!"); 137 UiStatsLogger.logLandingPageScrolled(context); 138 break; 139 case LANDING_PAGE_SCROLLED_TO_BOTTOM: 140 if (sLandingPageScrolledToBottom) { 141 return; 142 } 143 sLandingPageScrolledToBottom = true; 144 LogUtil.v("LANDING_PAGE_SCROLLED_TO_BOTTOM logged!"); 145 UiStatsLogger.logLandingPageScrolledToBottom(context); 146 break; 147 case LANDING_PAGE_ADDITIONAL_INFO_CLICKED: 148 if (sLandingPageAdditionalInfoClicked) { 149 return; 150 } 151 sLandingPageAdditionalInfoClicked = true; 152 LogUtil.v("LANDING_PAGE_ADDITIONAL_INFO_CLICKED logged!"); 153 UiStatsLogger.logLandingPageAdditionalInfoClicked(context); 154 break; 155 case LANDING_PAGE_MORE_BUTTON_CLICKED: 156 if (sLandingPageMoreButtonClicked) { 157 return; 158 } 159 sLandingPageMoreButtonClicked = true; 160 LogUtil.v("LANDING_PAGE_MORE_BUTTON_CLICKED logged!"); 161 UiStatsLogger.logLandingPageMoreButtonClicked(context); 162 break; 163 case LANDING_PAGE_SETTINGS_BUTTON_CLICKED: 164 if (sLandingPageSettingsButtonClicked) { 165 return; 166 } 167 sLandingPageSettingsButtonClicked = true; 168 LogUtil.v("LANDING_PAGE_SETTINGS_BUTTON_CLICKED logged!"); 169 UiStatsLogger.logLandingPageSettingsButtonClicked(context); 170 break; 171 case LANDING_PAGE_OPT_IN_CLICKED: 172 if (sLandingPageOptInClicked) { 173 return; 174 } 175 sLandingPageOptInClicked = true; 176 LogUtil.v("LANDING_PAGE_OPT_IN_CLICKED logged!"); 177 UiStatsLogger.logLandingPageOptIn(context); 178 break; 179 case LANDING_PAGE_OPT_OUT_CLICKED: 180 if (sLandingPageOptOutClicked) { 181 return; 182 } 183 sLandingPageOptOutClicked = true; 184 LogUtil.v("LANDING_PAGE_OPT_OUT_CLICKED logged!"); 185 UiStatsLogger.logLandingPageOptOut(context); 186 break; 187 case LANDING_PAGE_GOT_IT_CLICKED: 188 if (sLandingPageGotItClicked) { 189 return; 190 } 191 sLandingPageGotItClicked = true; 192 LogUtil.v("LANDING_PAGE_GOT_IT_CLICKED logged!"); 193 UiStatsLogger.logLandingPageGotItButtonClicked(context); 194 break; 195 case CONFIRMATION_PAGE_DISPLAYED: 196 sCurrentFragment = fragmentAction; 197 if (sConfirmationPageDisplayed) { 198 return; 199 } 200 LogUtil.v("CONFIRMATION_PAGE_DISPLAYED logged!"); 201 sConfirmationPageDisplayed = true; 202 UiStatsLogger.logConfirmationPageDisplayed(context); 203 break; 204 case CONFIRMATION_PAGE_DISMISSED: 205 if (sConfirmationPageDismissed 206 || sCurrentFragment 207 != NotificationFragmentEnum.CONFIRMATION_PAGE_DISPLAYED) { 208 return; 209 } 210 sConfirmationPageDismissed = true; 211 LogUtil.v("CONFIRMATION_PAGE_DISMISSED logged!"); 212 UiStatsLogger.logConfirmationPageDismissed(context); 213 break; 214 case CONFIRMATION_PAGE_OPT_IN_MORE_INFO_CLICKED: 215 if (sConfirmationPageOptInMoreInfoClicked) { 216 return; 217 } 218 sConfirmationPageOptInMoreInfoClicked = true; 219 LogUtil.v("CONFIRMATION_PAGE_OPT_IN_MORE_INFO_CLICKED logged!"); 220 UiStatsLogger.logOptInConfirmationPageMoreInfoClicked(context); 221 break; 222 case CONFIRMATION_PAGE_OPT_OUT_MORE_INFO_CLICKED: 223 if (sConfirmationPageOptOutMoreInfoClicked) { 224 return; 225 } 226 sConfirmationPageOptOutMoreInfoClicked = true; 227 LogUtil.v("CONFIRMATION_PAGE_OPT_OUT_MORE_INFO_CLICKED logged!"); 228 UiStatsLogger.logOptOutConfirmationPageMoreInfoClicked(context); 229 break; 230 case CONFIRMATION_PAGE_OPT_IN_SETTINGS_CLICKED: 231 if (sConfirmationPageOptInSettingsClicked) { 232 return; 233 } 234 sConfirmationPageOptInSettingsClicked = true; 235 LogUtil.v("CONFIRMATION_PAGE_OPT_IN_SETTINGS_CLICKED logged!"); 236 UiStatsLogger.logOptInConfirmationPageSettingsClicked(context); 237 break; 238 case CONFIRMATION_PAGE_OPT_OUT_SETTINGS_CLICKED: 239 if (sConfirmationPageOptOutSettingsClicked) { 240 return; 241 } 242 sConfirmationPageOptOutSettingsClicked = true; 243 LogUtil.v("CONFIRMATION_PAGE_OPT_OUT_SETTINGS_CLICKED logged!"); 244 UiStatsLogger.logOptOutConfirmationPageSettingsClicked(context); 245 break; 246 case CONFIRMATION_PAGE_OPT_IN_GOT_IT_BUTTON_CLICKED: 247 if (sConfirmationPageOptInGotItClicked) { 248 return; 249 } 250 sConfirmationPageOptInGotItClicked = true; 251 LogUtil.v("CONFIRMATION_PAGE_OPT_IN_GOT_IT_BUTTON_CLICKED logged!"); 252 UiStatsLogger.logOptInConfirmationPageGotItClicked(context); 253 break; 254 case CONFIRMATION_PAGE_OPT_OUT_GOT_IT_BUTTON_CLICKED: 255 if (sConfirmationPageOptOutGotItClicked) { 256 return; 257 } 258 sConfirmationPageOptOutGotItClicked = true; 259 LogUtil.v("CONFIRMATION_PAGE_OPT_OUT_GOT_IT_BUTTON_CLICKED logged!"); 260 UiStatsLogger.logOptOutConfirmationPageGotItClicked(context); 261 break; 262 } 263 } 264 } 265