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