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.settings.delegates;
17 
18 import android.os.Build;
19 import android.util.Log;
20 import android.util.Pair;
21 
22 import androidx.annotation.RequiresApi;
23 import androidx.lifecycle.Observer;
24 
25 import com.android.adservices.api.R;
26 import com.android.adservices.service.FlagsFactory;
27 import com.android.adservices.service.consent.App;
28 import com.android.adservices.service.stats.UiStatsLogger;
29 import com.android.adservices.ui.settings.DialogFragmentManager;
30 import com.android.adservices.ui.settings.DialogManager;
31 import com.android.adservices.ui.settings.activities.BlockedAppsActivity;
32 import com.android.adservices.ui.settings.fragments.AdServicesSettingsBlockedAppsFragment;
33 import com.android.adservices.ui.settings.viewmodels.BlockedAppsViewModel;
34 import com.android.adservices.ui.settings.viewmodels.BlockedAppsViewModel.BlockedAppsViewModelUiEvent;
35 
36 import java.io.IOException;
37 
38 /**
39  * Delegate class that helps AdServices Settings fragments to respond to all view model/user events.
40  */
41 @RequiresApi(Build.VERSION_CODES.S)
42 public class BlockedAppsActionDelegate {
43     private final BlockedAppsActivity mBlockedAppsActivity;
44     private final BlockedAppsViewModel mBlockedAppsViewModel;
45 
BlockedAppsActionDelegate( BlockedAppsActivity blockedAppsActivity, BlockedAppsViewModel blockedAppsViewModel)46     public BlockedAppsActionDelegate(
47             BlockedAppsActivity blockedAppsActivity, BlockedAppsViewModel blockedAppsViewModel) {
48         mBlockedAppsActivity = blockedAppsActivity;
49         mBlockedAppsViewModel = blockedAppsViewModel;
50         listenToBlockedAppsViewModelUiEvents();
51     }
52 
listenToBlockedAppsViewModelUiEvents()53     private void listenToBlockedAppsViewModelUiEvents() {
54         Observer<Pair<BlockedAppsViewModelUiEvent, App>> observer =
55                 eventAppPair -> {
56                     if (eventAppPair == null) {
57                         return;
58                     }
59                     BlockedAppsViewModelUiEvent event = eventAppPair.first;
60                     App app = eventAppPair.second;
61                     if (event == null) {
62                         return;
63                     }
64                     try {
65                         if (event == BlockedAppsViewModelUiEvent.RESTORE_APP) {
66                             UiStatsLogger.logUnblockAppSelected();
67                             mBlockedAppsViewModel.restoreAppConsent(app);
68                             if (FlagsFactory.getFlags().getUiDialogsFeatureEnabled()) {
69                                 if (FlagsFactory.getFlags().getUiDialogFragmentEnabled()) {
70                                     DialogFragmentManager.showUnblockAppDialog(
71                                             mBlockedAppsActivity, app);
72                                 } else {
73                                     DialogManager.showUnblockAppDialog(mBlockedAppsActivity, app);
74                                 }
75                             }
76                         } else {
77                             Log.e("AdservicesUI", "Unknown Action for UI Logging");
78                         }
79                     } catch (IOException e) {
80                         Log.e(
81                                 "AdServicesUI",
82                                 "Error while processing AppsViewModelUiEvent " + event + ":" + e);
83                     } finally {
84                         mBlockedAppsViewModel.uiEventHandled();
85                     }
86                 };
87         mBlockedAppsViewModel.getUiEvents().observe(mBlockedAppsActivity, observer);
88     }
89 
90     /**
91      * Configure all UI elements (except blocked apps list) in {@link
92      * AdServicesSettingsBlockedAppsFragment} to handle user actions.
93      */
initBlockedAppsFragment()94     public void initBlockedAppsFragment() {
95         mBlockedAppsActivity.setTitle(R.string.settingsUI_blocked_apps_ga_title);
96     }
97 }
98