summaryrefslogtreecommitdiff
path: root/adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java')
-rw-r--r--adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java27
1 files changed, 27 insertions, 0 deletions
diff --git a/adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java b/adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java
index 0152eb87d4..3782c4aa48 100644
--- a/adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java
+++ b/adservices/service-core/java/com/android/adservices/service/adid/AdIdServiceImpl.java
@@ -19,6 +19,7 @@ import static android.adservices.common.AdServicesStatusUtils.STATUS_BACKGROUND_
import static android.adservices.common.AdServicesStatusUtils.STATUS_CALLER_NOT_ALLOWED;
import static android.adservices.common.AdServicesStatusUtils.STATUS_INTERNAL_ERROR;
import static android.adservices.common.AdServicesStatusUtils.STATUS_PERMISSION_NOT_REQUESTED;
+import static android.adservices.common.AdServicesStatusUtils.STATUS_RATE_LIMIT_REACHED;
import static android.adservices.common.AdServicesStatusUtils.STATUS_SUCCESS;
import static android.adservices.common.AdServicesStatusUtils.STATUS_UNAUTHORIZED;
@@ -45,6 +46,7 @@ import com.android.adservices.service.common.AppImportanceFilter;
import com.android.adservices.service.common.AppImportanceFilter.WrongCallingApplicationStateException;
import com.android.adservices.service.common.PermissionHelper;
import com.android.adservices.service.common.SdkRuntimeUtil;
+import com.android.adservices.service.common.Throttler;
import com.android.adservices.service.stats.AdServicesLogger;
import com.android.adservices.service.stats.AdServicesStatsLog;
import com.android.adservices.service.stats.ApiCallStats;
@@ -64,6 +66,7 @@ public class AdIdServiceImpl extends IAdIdService.Stub {
private final AdServicesLogger mAdServicesLogger;
private final Clock mClock;
private final Flags mFlags;
+ private final Throttler mThrottler;
private final AppImportanceFilter mAppImportanceFilter;
public AdIdServiceImpl(
@@ -72,12 +75,14 @@ public class AdIdServiceImpl extends IAdIdService.Stub {
AdServicesLogger adServicesLogger,
Clock clock,
Flags flags,
+ Throttler throttler,
AppImportanceFilter appImportanceFilter) {
mContext = context;
mAdIdWorker = adidWorker;
mAdServicesLogger = adServicesLogger;
mClock = clock;
mFlags = flags;
+ mThrottler = throttler;
mAppImportanceFilter = appImportanceFilter;
}
@@ -87,6 +92,8 @@ public class AdIdServiceImpl extends IAdIdService.Stub {
@NonNull CallerMetadata callerMetadata,
@NonNull IGetAdIdCallback callback) {
+ if (isThrottled(adIdParam, callback)) return;
+
final long startServiceTime = mClock.elapsedRealtime();
final String packageName = adIdParam.getAppPackageName();
final String sdkPackageName = adIdParam.getSdkPackageName();
@@ -138,6 +145,26 @@ public class AdIdServiceImpl extends IAdIdService.Stub {
});
}
+ // Throttle the AdId API.
+ // Return true if we should throttle (don't allow the API call).
+ private boolean isThrottled(GetAdIdParam adIdParam, IGetAdIdCallback callback) {
+ boolean throttled =
+ !mThrottler.tryAcquire(
+ Throttler.ApiKey.ADID_API_APP_PACKAGE_NAME, adIdParam.getAppPackageName());
+
+ if (throttled) {
+ LogUtil.e("Rate Limit Reached for ADID_API");
+ try {
+ callback.onError(STATUS_RATE_LIMIT_REACHED);
+ } catch (RemoteException e) {
+ LogUtil.e(e, "Fail to call the callback on Rate Limit Reached.");
+ } finally {
+ return true;
+ }
+ }
+ return false;
+ }
+
// Enforce whether caller is from foreground.
private void enforceForeground(int callingUid) {
// If caller calls Topics API from Sandbox, regard it as foreground.