• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 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.ondevicepersonalization.services.data.user;
18 
19 import android.adservices.common.AdServicesCommonManager;
20 import android.adservices.common.AdServicesCommonStates;
21 import android.adservices.common.AdServicesCommonStatesResponse;
22 import android.adservices.common.AdServicesOutcomeReceiver;
23 import android.annotation.NonNull;
24 import android.content.Context;
25 import android.os.Binder;
26 
27 import androidx.concurrent.futures.CallbackToFutureAdapter;
28 
29 import com.android.ondevicepersonalization.internal.util.LoggerFactory;
30 import com.android.ondevicepersonalization.services.FlagsFactory;
31 import com.android.ondevicepersonalization.services.OnDevicePersonalizationExecutors;
32 
33 import com.google.common.util.concurrent.FluentFuture;
34 import com.google.common.util.concurrent.Futures;
35 import com.google.common.util.concurrent.ListenableFuture;
36 import com.google.common.util.concurrent.MoreExecutors;
37 
38 import java.util.Objects;
39 import java.util.concurrent.TimeUnit;
40 
41 /**
42  * A wrapper for the AdServicesCommonStates API. Used by UserPrivacyStatus to
43  * fetch common states from AdServices.
44  */
45 class AdServicesCommonStatesWrapperImpl implements AdServicesCommonStatesWrapper {
46     private static final String TAG = AdServicesCommonStatesWrapperImpl.class.getSimpleName();
47     private static final LoggerFactory.Logger sLogger = LoggerFactory.getLogger();
48     private final Context mContext;
49 
AdServicesCommonStatesWrapperImpl(Context context)50     AdServicesCommonStatesWrapperImpl(Context context) {
51         mContext = Objects.requireNonNull(context);
52     }
53 
getCommonStates()54     @Override public ListenableFuture<CommonStatesResult> getCommonStates() {
55         try {
56             AdServicesCommonManager manager = getAdServicesCommonManager();
57             if (manager == null) {
58                 throw new NullAdServiceCommonManagerException();
59             }
60             sLogger.d(TAG + ": IPC getAdServicesCommonStates() started");
61             long origId = Binder.clearCallingIdentity();
62             long timeoutInMillis = FlagsFactory.getFlags().getAdservicesIpcCallTimeoutInMillis();
63             Binder.restoreCallingIdentity(origId);
64             ListenableFuture<AdServicesCommonStatesResponse> futureWithTimeout =
65                     Futures.withTimeout(
66                             getAdServicesResponse(manager),
67                             timeoutInMillis,
68                             TimeUnit.MILLISECONDS,
69                             OnDevicePersonalizationExecutors.getScheduledExecutor());
70 
71             return FluentFuture.from(futureWithTimeout)
72                     .transform(
73                             v -> getResultFromResponse(v),
74                             MoreExecutors.newDirectExecutorService());
75         } catch (Throwable e) {
76             return Futures.immediateFailedFuture(e);
77         }
78     }
79 
getAdServicesCommonManager()80     private AdServicesCommonManager getAdServicesCommonManager() throws NoClassDefFoundError {
81         return mContext.getSystemService(AdServicesCommonManager.class);
82     }
83 
getResultFromResponse( AdServicesCommonStatesResponse response)84     private static CommonStatesResult getResultFromResponse(
85             AdServicesCommonStatesResponse response) {
86         AdServicesCommonStates commonStates = response.getAdServicesCommonStates();
87         return new CommonStatesResult(
88                 commonStates.getPaState(), commonStates.getMeasurementState());
89     }
90 
getAdServicesResponse( @onNull AdServicesCommonManager adServicesCommonManager)91     private ListenableFuture<AdServicesCommonStatesResponse> getAdServicesResponse(
92                     @NonNull AdServicesCommonManager adServicesCommonManager) {
93         return CallbackToFutureAdapter.getFuture(
94                 completer -> {
95                     adServicesCommonManager.getAdservicesCommonStates(
96                             OnDevicePersonalizationExecutors.getBackgroundExecutor(),
97                             new AdServicesOutcomeReceiver<AdServicesCommonStatesResponse,
98                                     Exception>() {
99                                 @Override
100                                 public void onResult(AdServicesCommonStatesResponse result) {
101                                     sLogger.d(
102                                             TAG + ": IPC getAdServicesCommonStates() success");
103                                     completer.set(result);
104                                 }
105 
106                                 @Override
107                                 public void onError(Exception error) {
108                                     sLogger.e(error,
109                                             TAG + ": IPC getAdServicesCommonStates() error");
110                                     completer.setException(error);
111                                 }
112                             });
113                     // For debugging purpose only.
114                     return "getAdServicesCommonStates";
115                 }
116         );
117     }
118 }
119