• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.service.adselection;
18 
19 import androidx.annotation.NonNull;
20 
21 import com.android.adservices.LoggerFactory;
22 import com.android.adservices.data.adselection.AdSelectionEntryDao;
23 import com.android.adservices.data.adselection.AppInstallDao;
24 import com.android.adservices.data.adselection.FrequencyCapDao;
25 import com.android.adservices.service.Flags;
26 import com.android.adservices.service.common.BinderFlagReader;
27 import com.android.adservices.service.common.FrequencyCapAdDataValidator;
28 import com.android.adservices.service.common.FrequencyCapAdDataValidatorImpl;
29 import com.android.adservices.service.common.FrequencyCapAdDataValidatorNoOpImpl;
30 
31 import java.time.Clock;
32 import java.util.Objects;
33 
34 /** Factory for implementations of the ad filtering feature interfaces. */
35 public final class AdFilteringFeatureFactory {
36 
37     private static final LoggerFactory.Logger sLogger = LoggerFactory.getFledgeLogger();
38     private final boolean mIsFledgeFrequencyCapFilteringEnabled;
39     private final boolean mIsFledgeAppInstallFilteringEnabled;
40     private final int mHistogramAbsoluteMaxTotalEventCount;
41     private final int mHistogramLowerMaxTotalEventCount;
42     private final int mHistogramAbsoluteMaxPerBuyerEventCount;
43     private final int mHistogramLowerMaxPerBuyerEventCount;
44     private final AppInstallDao mAppInstallDao;
45     private final FrequencyCapDao mFrequencyCapDao;
46     private final boolean mShouldUseUnifiedTables;
47 
AdFilteringFeatureFactory( AppInstallDao appInstallDao, FrequencyCapDao frequencyCapDao, Flags flags)48     public AdFilteringFeatureFactory(
49             AppInstallDao appInstallDao, FrequencyCapDao frequencyCapDao, Flags flags) {
50         mIsFledgeFrequencyCapFilteringEnabled =
51                 BinderFlagReader.readFlag(flags::getFledgeFrequencyCapFilteringEnabled);
52         mIsFledgeAppInstallFilteringEnabled =
53                 BinderFlagReader.readFlag(flags::getFledgeAppInstallFilteringEnabled);
54         mHistogramAbsoluteMaxTotalEventCount =
55                 BinderFlagReader.readFlag(
56                         flags::getFledgeAdCounterHistogramAbsoluteMaxTotalEventCount);
57         mHistogramLowerMaxTotalEventCount =
58                 BinderFlagReader.readFlag(
59                         flags::getFledgeAdCounterHistogramLowerMaxTotalEventCount);
60         mHistogramAbsoluteMaxPerBuyerEventCount =
61                 BinderFlagReader.readFlag(
62                         flags::getFledgeAdCounterHistogramAbsoluteMaxPerBuyerEventCount);
63         mHistogramLowerMaxPerBuyerEventCount =
64                 BinderFlagReader.readFlag(
65                         flags::getFledgeAdCounterHistogramLowerMaxPerBuyerEventCount);
66         mShouldUseUnifiedTables =
67                 BinderFlagReader.readFlag(flags::getFledgeOnDeviceAuctionShouldUseUnifiedTables);
68 
69         mAppInstallDao = appInstallDao;
70         mFrequencyCapDao = frequencyCapDao;
71         sLogger.v(
72                 "Initializing AdFilteringFeatureFactory with frequency cap filtering %s and app"
73                         + " install filtering %s",
74                 mIsFledgeFrequencyCapFilteringEnabled ? "enabled" : "disabled",
75                 mIsFledgeAppInstallFilteringEnabled ? "enabled" : "disabled");
76     }
77 
78     /**
79      * Returns the correct {@link FrequencyCapAdFilterer} implementation to use based on the given
80      * {@link Flags}.
81      *
82      * @return an instance of {@link FrequencyCapAdFiltererImpl} if frequency cap filtering is
83      *     enabled and an instance of {@link FrequencyCapAdFiltererNoOpImpl} otherwise
84      */
getFrequencyCapAdFilterer()85     public FrequencyCapAdFilterer getFrequencyCapAdFilterer() {
86         if (mIsFledgeFrequencyCapFilteringEnabled) {
87             return new FrequencyCapAdFiltererImpl(mFrequencyCapDao, Clock.systemUTC());
88         } else {
89             return new FrequencyCapAdFiltererNoOpImpl();
90         }
91     }
92 
93     /**
94      * Returns the correct {@link AppInstallAdFilterer} implementation to use based on the given
95      * {@link Flags}.
96      *
97      * @return an instance of {@link AppInstallAdFiltererImpl} if app install filtering is enabled
98      *     and an instance of {@link AppInstallAdFiltererNoOpImpl} otherwise
99      */
getAppInstallAdFilterer()100     public AppInstallAdFilterer getAppInstallAdFilterer() {
101         if (mIsFledgeAppInstallFilteringEnabled) {
102             return new AppInstallAdFiltererImpl(mAppInstallDao, Clock.systemUTC());
103         } else {
104             return new AppInstallAdFiltererNoOpImpl();
105         }
106     }
107 
108     /**
109      * Gets the {@link AdCounterKeyCopier} implementation to use, dependent on whether the ad
110      * filtering features is enabled.
111      *
112      * @return an {@link AdCounterKeyCopierImpl} instance if the ad filtering feature is enabled, or
113      *     an {@link AdCounterKeyCopierNoOpImpl} instance otherwise
114      */
getAdCounterKeyCopier()115     public AdCounterKeyCopier getAdCounterKeyCopier() {
116         if (mIsFledgeFrequencyCapFilteringEnabled) {
117             return new AdCounterKeyCopierImpl();
118         } else {
119             return new AdCounterKeyCopierNoOpImpl();
120         }
121     }
122 
123     /**
124      * Gets the {@link FrequencyCapAdDataValidator} implementation to use, dependent on whether the
125      * ad filtering feature is enabled.
126      *
127      * @return a {@link FrequencyCapAdDataValidatorImpl} instance if the ad filtering feature is
128      *     enabled, or a {@link FrequencyCapAdDataValidatorNoOpImpl} instance otherwise
129      */
getFrequencyCapAdDataValidator()130     public FrequencyCapAdDataValidator getFrequencyCapAdDataValidator() {
131         if (mIsFledgeFrequencyCapFilteringEnabled) {
132             return new FrequencyCapAdDataValidatorImpl();
133         } else {
134             return new FrequencyCapAdDataValidatorNoOpImpl();
135         }
136     }
137 
138     /**
139      * Gets the {@link FrequencyCapDataClearer} implementation to use, dependent on whether the ad
140      * filtering feature is enabled.
141      *
142      * @return The desired {@link FrequencyCapDataClearer} to use.
143      */
getFrequencyCapDataClearer()144     public FrequencyCapDataClearer getFrequencyCapDataClearer() {
145         if (mIsFledgeFrequencyCapFilteringEnabled) {
146             return new FrequencyCapDataClearerImpl(mFrequencyCapDao);
147         } else {
148             return new FrequencyCapDataClearerNoOp();
149         }
150     }
151 
152     /**
153      * Gets the {@link AdCounterHistogramUpdater} implementation to use, dependent on whether the ad
154      * filtering feature is enabled.
155      *
156      * @return a {@link AdCounterHistogramUpdaterImpl} instance if the ad filtering feature is
157      *     enabled, or a {@link AdCounterHistogramUpdaterNoOpImpl} instance otherwise
158      */
getAdCounterHistogramUpdater( @onNull AdSelectionEntryDao adSelectionEntryDao, boolean auctionServerEnabledForUpdateHistogram)159     public AdCounterHistogramUpdater getAdCounterHistogramUpdater(
160             @NonNull AdSelectionEntryDao adSelectionEntryDao,
161             boolean auctionServerEnabledForUpdateHistogram) {
162         Objects.requireNonNull(adSelectionEntryDao);
163 
164         if (mIsFledgeFrequencyCapFilteringEnabled) {
165             return new AdCounterHistogramUpdaterImpl(
166                     adSelectionEntryDao,
167                     mFrequencyCapDao,
168                     mHistogramAbsoluteMaxTotalEventCount,
169                     mHistogramLowerMaxTotalEventCount,
170                     mHistogramAbsoluteMaxPerBuyerEventCount,
171                     mHistogramLowerMaxPerBuyerEventCount,
172                     auctionServerEnabledForUpdateHistogram,
173                     mShouldUseUnifiedTables);
174         } else {
175             return new AdCounterHistogramUpdaterNoOpImpl();
176         }
177     }
178 }
179