From 068361b73cab2dcb3dad870d3da556f248e7e318 Mon Sep 17 00:00:00 2001 From: Cris Barreiro Date: Wed, 8 Jul 2026 10:21:09 +0200 Subject: [PATCH] Add view stub for ad blocking menu actions --- .../menu/AdBlockingMenuBottomSheetDialog.kt | 56 +++++++++++++ .../impl/menu/AdBlockingMenuItemView.kt | 24 +++++- .../src/main/res/drawable/check.xml | 24 ++++++ .../layout/bottom_sheet_ad_blocking_menu.xml | 80 +++++++++++++++++++ .../src/main/res/values/donottranslate.xml | 5 ++ 5 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuBottomSheetDialog.kt create mode 100644 ad-blocking/ad-blocking-impl/src/main/res/drawable/check.xml create mode 100644 ad-blocking/ad-blocking-impl/src/main/res/layout/bottom_sheet_ad_blocking_menu.xml diff --git a/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuBottomSheetDialog.kt b/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuBottomSheetDialog.kt new file mode 100644 index 000000000000..b14e69600c0c --- /dev/null +++ b/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuBottomSheetDialog.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2026 DuckDuckGo + * + * 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.duckduckgo.adblocking.impl.menu + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import com.duckduckgo.adblocking.impl.databinding.BottomSheetAdBlockingMenuBinding +import com.google.android.material.bottomsheet.BottomSheetDialog + +@SuppressLint("NoBottomSheetDialog") +class AdBlockingMenuBottomSheetDialog(builderContext: Context) : BottomSheetDialog(builderContext) { + + interface EventListener { + fun onAlwaysOnClicked() + fun onDisableUntilRelaunchClicked() + fun onAlwaysOffClicked() + } + + var eventListener: EventListener? = null + + private val binding: BottomSheetAdBlockingMenuBinding = + BottomSheetAdBlockingMenuBinding.inflate(LayoutInflater.from(context)) + + init { + setContentView(binding.root) + + binding.adBlockingMenuCloseButton.setOnClickListener { dismiss() } + binding.adBlockingMenuAlwaysOn.setOnClickListener { + eventListener?.onAlwaysOnClicked() + dismiss() + } + binding.adBlockingMenuDisableUntilRelaunch.setOnClickListener { + eventListener?.onDisableUntilRelaunchClicked() + dismiss() + } + binding.adBlockingMenuAlwaysOff.setOnClickListener { + eventListener?.onAlwaysOffClicked() + dismiss() + } + } +} diff --git a/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuItemView.kt b/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuItemView.kt index a2bc0eaf82b1..792f528d606f 100644 --- a/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuItemView.kt +++ b/ad-blocking/ad-blocking-impl/src/main/java/com/duckduckgo/adblocking/impl/menu/AdBlockingMenuItemView.kt @@ -36,6 +36,7 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import logcat.logcat import javax.inject.Inject @InjectWith(ViewScope::class) @@ -77,7 +78,10 @@ class AdBlockingMenuItemView @JvmOverloads constructor( super.onAttachedToWindow() val url = this.url ?: return - menuItem.setOnClickListener { onHostClick?.invoke() } + menuItem.setOnClickListener { + showMenuBottomSheet() + onHostClick?.invoke() + } scope?.cancel() scope = CoroutineScope(SupervisorJob() + dispatcherProvider.main()).also { scope -> @@ -94,6 +98,24 @@ class AdBlockingMenuItemView @JvmOverloads constructor( super.onDetachedFromWindow() } + private fun showMenuBottomSheet() { + AdBlockingMenuBottomSheetDialog(context).apply { + eventListener = object : AdBlockingMenuBottomSheetDialog.EventListener { + override fun onAlwaysOnClicked() { + logcat { "AdBlocking menu: Always On" } + } + + override fun onDisableUntilRelaunchClicked() { + logcat { "AdBlocking menu: Disable Until Relaunch" } + } + + override fun onAlwaysOffClicked() { + logcat { "AdBlocking menu: Always Off" } + } + } + }.show() + } + private fun render(state: AdBlockingMenuState) { when (state) { AdBlockingMenuState.Hidden -> isGone = true diff --git a/ad-blocking/ad-blocking-impl/src/main/res/drawable/check.xml b/ad-blocking/ad-blocking-impl/src/main/res/drawable/check.xml new file mode 100644 index 000000000000..0e219b75818d --- /dev/null +++ b/ad-blocking/ad-blocking-impl/src/main/res/drawable/check.xml @@ -0,0 +1,24 @@ + + + + diff --git a/ad-blocking/ad-blocking-impl/src/main/res/layout/bottom_sheet_ad_blocking_menu.xml b/ad-blocking/ad-blocking-impl/src/main/res/layout/bottom_sheet_ad_blocking_menu.xml new file mode 100644 index 000000000000..70fdbf71e1fa --- /dev/null +++ b/ad-blocking/ad-blocking-impl/src/main/res/layout/bottom_sheet_ad_blocking_menu.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + diff --git a/ad-blocking/ad-blocking-impl/src/main/res/values/donottranslate.xml b/ad-blocking/ad-blocking-impl/src/main/res/values/donottranslate.xml index a06fec1df3a2..d143f37608f0 100644 --- a/ad-blocking/ad-blocking-impl/src/main/res/values/donottranslate.xml +++ b/ad-blocking/ad-blocking-impl/src/main/res/values/donottranslate.xml @@ -16,4 +16,9 @@ Disable YouTube Ad Blocking Enable YouTube Ad Blocking + YouTube Ad Blocking + Close + Always On + Disable Until Relaunch + Always Off