diff options
Diffstat (limited to 'adservices/apk/java/com/android/adservices/ui/settings/DialogManager.java')
-rw-r--r-- | adservices/apk/java/com/android/adservices/ui/settings/DialogManager.java | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/adservices/apk/java/com/android/adservices/ui/settings/DialogManager.java b/adservices/apk/java/com/android/adservices/ui/settings/DialogManager.java new file mode 100644 index 0000000000..82c5326c95 --- /dev/null +++ b/adservices/apk/java/com/android/adservices/ui/settings/DialogManager.java @@ -0,0 +1,225 @@ +/* + * 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 android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; + +import androidx.annotation.NonNull; + +import com.android.adservices.api.R; +import com.android.adservices.data.topics.Topic; +import com.android.adservices.service.consent.App; +import com.android.adservices.service.topics.TopicsMapper; +import com.android.adservices.ui.settings.viewmodels.AppsViewModel; +import com.android.adservices.ui.settings.viewmodels.MainViewModel; +import com.android.adservices.ui.settings.viewmodels.TopicsViewModel; + +import java.io.IOException; +import java.util.concurrent.Semaphore; + +/** Creates and displays dialogs for the Privacy Sandbox application. */ +public class DialogManager { + public static Semaphore sSemaphore = new Semaphore(1); + + /** + * Shows the dialog for opting out of Privacy Sandbox. + * + * @param context Application context. + * @param mainViewModel {@link MainViewModel} + */ + public static void showOptOutDialog(@NonNull Context context, MainViewModel mainViewModel) { + if (!sSemaphore.tryAcquire()) return; + OnClickListener positiveOnClickListener = + (dialogInterface, buttonId) -> { + mainViewModel.setConsent(false); + sSemaphore.release(); + }; + new AlertDialog.Builder(context) + .setTitle(R.string.settingsUI_dialog_opt_out_title) + .setMessage(R.string.settingsUI_dialog_opt_out_message) + .setPositiveButton( + R.string.settingsUI_dialog_opt_out_positive_text, positiveOnClickListener) + .setNegativeButton( + R.string.settingsUI_dialog_negative_text, getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + /** + * Shows the dialog for blocking a topic. + * + * @param context Application context. + * @param topicsViewModel {@link TopicsViewModel} + * @param topic topic to block. + */ + public static void showBlockTopicDialog( + @NonNull Context context, TopicsViewModel topicsViewModel, Topic topic) { + if (!sSemaphore.tryAcquire()) return; + OnClickListener positiveOnClickListener = + (dialogInterface, buttonId) -> { + topicsViewModel.revokeTopicConsent(topic); + sSemaphore.release(); + }; + String topicName = context.getString(TopicsMapper.getResourceIdByTopic(topic, context)); + new AlertDialog.Builder(context) + .setTitle( + context.getString(R.string.settingsUI_dialog_block_topic_title, topicName)) + .setMessage(R.string.settingsUI_dialog_block_topic_message) + .setPositiveButton( + R.string.settingsUI_dialog_block_topic_positive_text, + positiveOnClickListener) + .setNegativeButton( + R.string.settingsUI_dialog_negative_text, getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + /** + * Shows the dialog for unblocking a topic. + * + * @param context Application context. + * @param topic topic to unblock. + */ + public static void showUnblockTopicDialog(@NonNull Context context, Topic topic) { + if (!sSemaphore.tryAcquire()) return; + String topicName = context.getString(TopicsMapper.getResourceIdByTopic(topic, context)); + new AlertDialog.Builder(context) + .setTitle( + context.getString( + R.string.settingsUI_dialog_unblock_topic_title, topicName)) + .setMessage(R.string.settingsUI_dialog_unblock_topic_message) + .setPositiveButton( + R.string.settingsUI_dialog_unblock_topic_positive_text, + getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + /** + * Shows the dialog for resetting topics. (reset does not reset blocked topics + * + * @param context Application context. + * @param topicsViewModel {@link TopicsViewModel} + */ + public static void showResetTopicDialog( + @NonNull Context context, TopicsViewModel topicsViewModel) { + if (!sSemaphore.tryAcquire()) return; + OnClickListener positiveOnClickListener = + (dialogInterface, buttonId) -> { + topicsViewModel.resetTopics(); + sSemaphore.release(); + }; + new AlertDialog.Builder(context) + .setTitle(R.string.settingsUI_dialog_reset_topic_title) + .setMessage(R.string.settingsUI_dialog_reset_topic_message) + .setPositiveButton( + R.string.settingsUI_dialog_reset_topic_positive_text, + positiveOnClickListener) + .setNegativeButton( + R.string.settingsUI_dialog_negative_text, getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + /** + * Shows the dialog for blocking an app from using FLEDGE. + * + * @param context Application context. + * @param appsViewModel {@link AppsViewModel} + * @param app the {@link App} to block. + */ + public static void showBlockAppDialog( + @NonNull Context context, AppsViewModel appsViewModel, App app) { + if (!sSemaphore.tryAcquire()) return; + OnClickListener positiveOnClickListener = + (dialogInterface, buttonId) -> { + try { + appsViewModel.revokeAppConsent(app); + } catch (IOException e) { + e.printStackTrace(); + } + sSemaphore.release(); + }; + String appName = app.getAppDisplayName(context.getPackageManager()); + new AlertDialog.Builder(context) + .setTitle(context.getString(R.string.settingsUI_dialog_block_app_title, appName)) + .setMessage(R.string.settingsUI_dialog_block_app_message) + .setPositiveButton( + R.string.settingsUI_dialog_block_app_positive_text, positiveOnClickListener) + .setNegativeButton( + R.string.settingsUI_dialog_negative_text, getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + /** + * Shows the dialog for unblocking an app from using FLEDGE. + * + * @param context Application context. + * @param app the {@link App} to unblock. + */ + public static void showUnblockAppDialog(@NonNull Context context, App app) { + if (!sSemaphore.tryAcquire()) return; + String appName = app.getAppDisplayName(context.getPackageManager()); + new AlertDialog.Builder(context) + .setTitle(context.getString(R.string.settingsUI_dialog_unblock_app_title, appName)) + .setMessage(R.string.settingsUI_dialog_unblock_app_message) + .setPositiveButton( + R.string.settingsUI_dialog_unblock_app_positive_text, + getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + /** + * Shows the dialog for resetting FLEDGE data. (reset does not reset blocked apps) + * + * @param context Application context. + * @param appsViewModel {@link AppsViewModel} + */ + public static void showResetAppDialog(@NonNull Context context, AppsViewModel appsViewModel) { + if (!sSemaphore.tryAcquire()) return; + OnClickListener positiveOnClickListener = + (dialogInterface, buttonId) -> { + try { + appsViewModel.resetApps(); + } catch (IOException e) { + e.printStackTrace(); + } + sSemaphore.release(); + }; + new AlertDialog.Builder(context) + .setTitle(R.string.settingsUI_dialog_reset_app_title) + .setMessage(R.string.settingsUI_dialog_reset_app_message) + .setPositiveButton( + R.string.settingsUI_dialog_reset_app_positive_text, positiveOnClickListener) + .setNegativeButton( + R.string.settingsUI_dialog_negative_text, getNegativeOnClickListener()) + .setOnDismissListener(getOnDismissListener()) + .show(); + } + + private static OnClickListener getNegativeOnClickListener() { + return (dialogInterface, buttonId) -> sSemaphore.release(); + } + + private static DialogInterface.OnDismissListener getOnDismissListener() { + return dialogInterface -> sSemaphore.release(); + } +} |