blob: 2ded5babaa70333af29f100acda0cdfc9d8ea4d2 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.adservices.ui.settings;
import static com.android.adservices.ui.settings.fragments.AdServicesSettingsMainFragment.PRIVACY_SANDBOX_BETA_SWITCH_KEY;
import static com.android.adservices.ui.settings.fragments.AdServicesSettingsMainFragment.TOPICS_PREFERENCE_BUTTON_KEY;
import android.view.View;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.adservices.api.R;
import com.android.adservices.data.topics.Topic;
import com.android.adservices.ui.settings.fragments.AdServicesSettingsBlockedTopicsFragment;
import com.android.adservices.ui.settings.fragments.AdServicesSettingsMainFragment;
import com.android.adservices.ui.settings.fragments.AdServicesSettingsTopicsFragment;
import com.android.adservices.ui.settings.viewmodels.MainViewModel;
import com.android.adservices.ui.settings.viewmodels.TopicsViewModel;
import com.android.adservices.ui.settings.viewmodels.TopicsViewModel.TopicsViewModelUiEvent;
import java.util.Objects;
/**
* Delegate class that helps AdServices Settings fragments to respond to all view model/user events.
*/
public class ActionDelegate {
private final LifecycleOwner mLifecycleOwner;
private final FragmentManager mFragmentManager;
private final MainViewModel mMainViewModel;
private final TopicsViewModel mTopicsViewModel;
public ActionDelegate(
LifecycleOwner lifecycleOwner,
FragmentManager fragmentManager,
MainViewModel mainViewModel,
TopicsViewModel topicsViewModel) {
this.mLifecycleOwner = lifecycleOwner;
this.mFragmentManager = fragmentManager;
this.mMainViewModel = mainViewModel;
this.mTopicsViewModel = topicsViewModel;
listenToMainViewModelUiEvents();
listenToTopicsViewModelUiEvents();
}
// ---------------------------------------------------------------------------------------------
// UI Event Listeners
// ---------------------------------------------------------------------------------------------
private void listenToMainViewModelUiEvents() {
mMainViewModel
.getUiEvents()
.observe(
mLifecycleOwner,
event -> {
if (event == null) {
return;
}
switch (event) {
case SWITCH_ON_PRIVACY_SANDBOX_BETA:
mMainViewModel.setConsent(true);
break;
case SWITCH_OFF_PRIVACY_SANDBOX_BETA:
// TODO(b/235138016): confirmation for privacy sandbox consent
mMainViewModel.setConsent(false);
break;
case DISPLAY_TOPICS_FRAGMENT:
mFragmentManager
.beginTransaction()
.replace(
R.id.fragment_container_view,
AdServicesSettingsTopicsFragment.class,
null)
.setReorderingAllowed(true)
.addToBackStack(null)
.commit();
break;
}
});
}
private void listenToTopicsViewModelUiEvents() {
mTopicsViewModel
.getUiEvents()
.observe(
mLifecycleOwner,
eventTopicPair -> {
TopicsViewModelUiEvent event = eventTopicPair.first;
Topic topic = eventTopicPair.second;
if (event == null) {
return;
}
switch (event) {
case BLOCK_TOPIC:
// TODO(b/229721429): show confirmation for blocking a topic.
mTopicsViewModel.revokeTopicConsent(topic);
break;
case RESTORE_TOPIC:
// TODO(b/229721429): show confirmation for restoring a topic.
mTopicsViewModel.restoreTopicConsent(topic);
break;
case RESET_TOPICS:
// TODO(b/229721429): show confirmation for resetting topics.
mTopicsViewModel.resetTopics();
break;
case DISPLAY_BLOCKED_TOPICS_FRAGMENT:
mFragmentManager
.beginTransaction()
.replace(
R.id.fragment_container_view,
AdServicesSettingsBlockedTopicsFragment.class,
null)
.setReorderingAllowed(true)
.addToBackStack(null)
.commit();
break;
}
});
}
// ---------------------------------------------------------------------------------------------
// Main Fragment
// ---------------------------------------------------------------------------------------------
/**
* Configure all UI elements in {@link AdServicesSettingsMainFragment} to handle user actions.
*/
public void initMainFragment(AdServicesSettingsMainFragment fragment) {
configureConsentSwitch(fragment);
configureTopicsButton(fragment);
}
private void configureConsentSwitch(AdServicesSettingsMainFragment fragment) {
SwitchPreference switchPreference =
Objects.requireNonNull(fragment.findPreference(PRIVACY_SANDBOX_BETA_SWITCH_KEY));
mMainViewModel.getConsent().observe(fragment, switchPreference::setChecked);
switchPreference.setOnPreferenceClickListener(
preference -> {
mMainViewModel.consentSwitchClickHandler(
((SwitchPreference) preference).isChecked());
return true;
});
}
private void configureTopicsButton(AdServicesSettingsMainFragment fragment) {
Preference topicsButton =
Objects.requireNonNull(fragment.findPreference(TOPICS_PREFERENCE_BUTTON_KEY));
topicsButton.setOnPreferenceClickListener(
preference -> {
mMainViewModel.topicsButtonClickHandler();
return true;
});
}
// ---------------------------------------------------------------------------------------------
// Topics Fragment
// ---------------------------------------------------------------------------------------------
/**
* Configure all UI elements (except topics list) in {@link AdServicesSettingsTopicsFragment} to
* handle user actions.
*/
public void initTopicsFragment(AdServicesSettingsTopicsFragment fragment) {
configureBlockedTopicsFragmentButton(fragment);
configureResetTopicsButton(fragment);
}
private void configureBlockedTopicsFragmentButton(AdServicesSettingsTopicsFragment fragment) {
View blockedTopicsButton = fragment.requireView().findViewById(R.id.blocked_topics_button);
blockedTopicsButton.setOnClickListener(
view -> {
mTopicsViewModel.blockedTopicsFragmentButtonClickHandler();
});
}
private void configureResetTopicsButton(AdServicesSettingsTopicsFragment fragment) {
View resetTopicsButton = fragment.requireView().findViewById(R.id.reset_topics_button);
resetTopicsButton.setOnClickListener(
view -> {
mTopicsViewModel.resetTopicsButtonClickHandler();
});
}
}