0

Reland "[Privacy Hub] Add Privacy Hub button to combined notification"

This is a reland of commit ba83a8001b

Original change's description:
> [Privacy Hub] Add Privacy Hub button to combined notification
>
> Remove the behavior of clicking the notification text to open Privacy
> Hub as only the combined notification should have the interaction to
> open Privacy Hub. This interaction is supposed to be obvious to the user
> through the newly added button.
>
> Bug: b:262832229
> Change-Id: I0d8f7125625f64df0332b54f6762c6d6cc1aa173
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4270640
> Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
> Auto-Submit: Christoph Schlosser <cschlosser@chromium.org>
> Commit-Queue: Christoph Schlosser <cschlosser@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1108825}

Bug: b:262832229
Change-Id: I1b6634c31e611f1f0d31d835fe080d505bed1421
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4290330
Commit-Queue: Christoph Schlosser <cschlosser@chromium.org>
Reviewed-by: Xiyuan Xia <xiyuan@chromium.org>
Auto-Submit: Christoph Schlosser <cschlosser@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1112089}
This commit is contained in:
Christoph Schlosser
2023-03-02 07:51:05 +00:00
committed by Chromium LUCI CQ
parent 593f4a8451
commit c35050fb13
9 changed files with 146 additions and 88 deletions

@@ -5002,6 +5002,9 @@ Here are some things you can try to get started.
<message name="IDS_PRIVACY_HUB_MICROPHONE_AND_CAMERA_OFF_NOTIFICATION_BUTTON" desc="Label for an action button that enables microphone and camera."> <message name="IDS_PRIVACY_HUB_MICROPHONE_AND_CAMERA_OFF_NOTIFICATION_BUTTON" desc="Label for an action button that enables microphone and camera.">
Turn on access Turn on access
</message> </message>
<message name="IDS_PRIVACY_HUB_OPEN_SETTINGS_PAGE_BUTTON" desc="Label for an action button that opens the Privacy Hub settings page.">
Privacy controls
</message>
<!-- Strings for camera privacy hub switch notifications --> <!-- Strings for camera privacy hub switch notifications -->
<message name="IDS_PRIVACY_HUB_WANT_TO_TURN_OFF_CAMERA_NOTIFICATION_TITLE" desc="Title for a notification shown to the users when they disable camera via the hardware switch."> <message name="IDS_PRIVACY_HUB_WANT_TO_TURN_OFF_CAMERA_NOTIFICATION_TITLE" desc="Title for a notification shown to the users when they disable camera via the hardware switch.">

@@ -0,0 +1 @@
0015cb1b94d4edf0d0482d84f89112e719ce98a3

@@ -9,7 +9,6 @@
#include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_pref_names.h"
#include "ash/public/cpp/sensor_disabled_notification_delegate.h" #include "ash/public/cpp/sensor_disabled_notification_delegate.h"
#include "ash/public/cpp/test/test_system_tray_client.h"
#include "ash/session/session_controller_impl.h" #include "ash/session/session_controller_impl.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h" #include "ash/strings/grit/ash_strings.h"
@@ -403,24 +402,13 @@ TEST_F(PrivacyHubCameraControllerTests,
EXPECT_TRUE(FindNotificationById(kPrivacyHubCameraOffNotificationId)); EXPECT_TRUE(FindNotificationById(kPrivacyHubCameraOffNotificationId));
EXPECT_FALSE(GetUserPref()); EXPECT_FALSE(GetUserPref());
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 0);
EXPECT_EQ(histogram_tester_.GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
0);
// Enabling camera via clicking on the body should open the privacy hub // Enabling camera via clicking on the body should open the privacy hub
// settings page. // settings page.
message_center->ClickOnNotification(kPrivacyHubCameraOffNotificationId); message_center->ClickOnNotification(kPrivacyHubCameraOffNotificationId);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
// The user pref should not be changed. // The user pref should not be changed.
EXPECT_FALSE(GetUserPref()); EXPECT_FALSE(GetUserPref());
EXPECT_FALSE(FindNotificationById(kPrivacyHubCameraOffNotificationId)); EXPECT_FALSE(FindNotificationById(kPrivacyHubCameraOffNotificationId));
EXPECT_EQ(histogram_tester_.GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
1);
SetUserPref(true); SetUserPref(true);
@@ -439,25 +427,14 @@ TEST_F(PrivacyHubCameraControllerTests,
kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId)); kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId));
EXPECT_TRUE(GetUserPref()); EXPECT_TRUE(GetUserPref());
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(histogram_tester_.GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
1);
// Clicking on the body should open the privacy hub settings page. // Clicking on the body should open the privacy hub settings page.
message_center->ClickOnNotification( message_center->ClickOnNotification(
kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId); kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 2);
// The user pref should not be changed. // The user pref should not be changed.
EXPECT_TRUE(GetUserPref()); EXPECT_TRUE(GetUserPref());
EXPECT_FALSE(FindNotificationById( EXPECT_FALSE(FindNotificationById(
kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId)); kPrivacyHubHWCameraSwitchOffSWCameraSwitchOnNotificationId));
EXPECT_EQ(histogram_tester_.GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
2);
} }
TEST_F(PrivacyHubCameraControllerTests, TEST_F(PrivacyHubCameraControllerTests,

@@ -13,7 +13,6 @@
#include "ash/public/cpp/privacy_hub_delegate.h" #include "ash/public/cpp/privacy_hub_delegate.h"
#include "ash/public/cpp/sensor_disabled_notification_delegate.h" #include "ash/public/cpp/sensor_disabled_notification_delegate.h"
#include "ash/public/cpp/test/test_new_window_delegate.h" #include "ash/public/cpp/test/test_new_window_delegate.h"
#include "ash/public/cpp/test/test_system_tray_client.h"
#include "ash/session/session_controller_impl.h" #include "ash/session/session_controller_impl.h"
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h" #include "ash/strings/grit/ash_strings.h"
@@ -357,11 +356,6 @@ TEST_F(PrivacyHubMicrophoneControllerTest, SwMuteNotificationActionButton) {
ASSERT_TRUE(notification); ASSERT_TRUE(notification);
EXPECT_EQ(1u, notification->buttons().size()); EXPECT_EQ(1u, notification->buttons().size());
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::
kPrivacyHubMicrophoneEnabledFromNotificationHistogram,
true),
0);
// Clicking the action button should unmute device. // Clicking the action button should unmute device.
ClickOnNotificationButton(); ClickOnNotificationButton();
EXPECT_FALSE(CrasAudioHandler::Get()->IsInputMuted()); EXPECT_FALSE(CrasAudioHandler::Get()->IsInputMuted());
@@ -383,21 +377,10 @@ TEST_F(PrivacyHubMicrophoneControllerTest, SwMuteNotificationActionBody) {
ASSERT_TRUE(notification); ASSERT_TRUE(notification);
EXPECT_EQ(1u, notification->buttons().size()); EXPECT_EQ(1u, notification->buttons().size());
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
0);
// Clicking the action button should unmute device. // Clicking the action button should unmute device.
ClickOnNotificationBody(); ClickOnNotificationBody();
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_TRUE(CrasAudioHandler::Get()->IsInputMuted()); EXPECT_TRUE(CrasAudioHandler::Get()->IsInputMuted());
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
1);
EXPECT_FALSE(GetNotification()); EXPECT_FALSE(GetNotification());
} }

@@ -4,7 +4,6 @@
#include "ash/system/privacy_hub/privacy_hub_notification.h" #include "ash/system/privacy_hub/privacy_hub_notification.h"
#include "ash/system/privacy_hub/privacy_hub_notification_controller.h"
#include "base/containers/contains.h" #include "base/containers/contains.h"
#include "components/vector_icons/vector_icons.h" #include "components/vector_icons/vector_icons.h"
#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -29,22 +28,24 @@ bool HasNotification(const std::string& id) {
namespace ash { namespace ash {
PrivacyHubNotificationClickDelegate::PrivacyHubNotificationClickDelegate( PrivacyHubNotificationClickDelegate::PrivacyHubNotificationClickDelegate(
base::RepeatingClosure button_click) base::RepeatingClosure button_click) {
: button_callback_(std::move(button_click)) {} button_callbacks_[0] = std::move(button_click);
}
PrivacyHubNotificationClickDelegate::~PrivacyHubNotificationClickDelegate() = PrivacyHubNotificationClickDelegate::~PrivacyHubNotificationClickDelegate() =
default; default;
void PrivacyHubNotificationClickDelegate::Click( void PrivacyHubNotificationClickDelegate::Click(
const absl::optional<int>& button_index, const absl::optional<int>& button_index_opt,
const absl::optional<std::u16string>& reply) { const absl::optional<std::u16string>& reply) {
if (button_index.has_value()) { if (button_index_opt.has_value()) {
button_callback_.Run(); const unsigned int button_index = button_index_opt.value();
CHECK_GT(button_callbacks_.size(), button_index);
DCHECK(!button_callbacks_[button_index].is_null())
<< "button_index=" << button_index;
RunCallbackIfNotNull(button_callbacks_[button_index]);
} else { } else {
if (!message_callback_.is_null()) { RunCallbackIfNotNull(message_callback_);
message_callback_.Run();
}
PrivacyHubNotificationController::OpenPrivacyHubSettingsPage();
} }
} }
@@ -53,6 +54,18 @@ void PrivacyHubNotificationClickDelegate::SetMessageClickCallback(
message_callback_ = std::move(callback); message_callback_ = std::move(callback);
} }
void PrivacyHubNotificationClickDelegate::SetSecondButtonCallback(
base::RepeatingClosure callback) {
button_callbacks_[1] = std::move(callback);
}
void PrivacyHubNotificationClickDelegate::RunCallbackIfNotNull(
const base::RepeatingClosure& callback) {
if (!callback.is_null()) {
callback.Run();
}
}
PrivacyHubNotification::PrivacyHubNotification( PrivacyHubNotification::PrivacyHubNotification(
const std::string& id, const std::string& id,
const int title_id, const int title_id,
@@ -61,21 +74,21 @@ PrivacyHubNotification::PrivacyHubNotification(
const scoped_refptr<PrivacyHubNotificationClickDelegate> delegate, const scoped_refptr<PrivacyHubNotificationClickDelegate> delegate,
const ash::NotificationCatalogName catalog_name, const ash::NotificationCatalogName catalog_name,
const int button_id) const int button_id)
: id_(id), message_ids_(message_ids), sensors_for_apps_(sensors_for_apps) { : id_(id),
message_ids_(message_ids),
sensors_for_apps_(sensors_for_apps),
delegate_(delegate),
button_text_(l10n_util::GetStringUTF16(button_id)) {
DCHECK(!message_ids_.empty()); DCHECK(!message_ids_.empty());
DCHECK(message_ids_.size() < 2u || !sensors_for_apps_.Empty()) DCHECK(message_ids_.size() < 2u || !sensors_for_apps_.Empty())
<< "Specify at least one sensor when providing more than one message ID"; << "Specify at least one sensor when providing more than one message ID";
DCHECK(delegate); DCHECK(delegate);
message_center::RichNotificationData optional_fields;
optional_fields.remove_on_click = true;
optional_fields.buttons.emplace_back(l10n_util::GetStringUTF16(button_id));
builder_.SetId(id) builder_.SetId(id)
.SetCatalogName(catalog_name) .SetCatalogName(catalog_name)
.SetDelegate(std::move(delegate)) .SetDelegate(std::move(delegate))
.SetTitleId(title_id) .SetTitleId(title_id)
.SetOptionalFields(optional_fields) .SetOptionalFields(MakeOptionalFields())
.SetSmallImage(vector_icons::kSettingsIcon) .SetSmallImage(vector_icons::kSettingsIcon)
.SetWarningLevel(message_center::SystemNotificationWarningLevel::NORMAL); .SetWarningLevel(message_center::SystemNotificationWarningLevel::NORMAL);
} }
@@ -126,6 +139,14 @@ void PrivacyHubNotification::Update() {
} }
} }
void PrivacyHubNotification::SetSecondButton(base::RepeatingClosure callback,
int title_id) {
message_center::RichNotificationData optional_fields = MakeOptionalFields();
optional_fields.buttons.emplace_back(l10n_util::GetStringUTF16(title_id));
builder_.SetOptionalFields(optional_fields);
delegate_->SetSecondButtonCallback(std::move(callback));
}
std::vector<std::u16string> PrivacyHubNotification::GetAppsAccessingSensors() std::vector<std::u16string> PrivacyHubNotification::GetAppsAccessingSensors()
const { const {
std::vector<std::u16string> app_names; std::vector<std::u16string> app_names;
@@ -159,4 +180,13 @@ void PrivacyHubNotification::SetNotificationMessage() {
} }
} }
message_center::RichNotificationData
PrivacyHubNotification::MakeOptionalFields() const {
message_center::RichNotificationData optional_fields;
optional_fields.remove_on_click = true;
optional_fields.buttons.emplace_back(button_text_);
return optional_fields;
}
} // namespace ash } // namespace ash

@@ -38,10 +38,16 @@ class ASH_EXPORT PrivacyHubNotificationClickDelegate
// When clicking on the notification message execute this `callback`. // When clicking on the notification message execute this `callback`.
void SetMessageClickCallback(base::RepeatingClosure callback); void SetMessageClickCallback(base::RepeatingClosure callback);
// Set the `callback` for an additional button.
void SetSecondButtonCallback(base::RepeatingClosure callback);
private: private:
~PrivacyHubNotificationClickDelegate() override; ~PrivacyHubNotificationClickDelegate() override;
base::RepeatingClosure button_callback_; // Run `callback` if it's not null. Do nothing otherwise.
void RunCallbackIfNotNull(const base::RepeatingClosure& callback);
std::array<base::RepeatingClosure, 2> button_callbacks_;
base::RepeatingClosure message_callback_; base::RepeatingClosure message_callback_;
}; };
@@ -95,6 +101,11 @@ class ASH_EXPORT PrivacyHubNotification {
// again. // again.
void Update(); void Update();
// Add an additional button to the notification. The button title will be
// generated from the `title_id`. Clicking the button will invoke the
// `callback`. Only one additional button can be active at the same time.
void SetSecondButton(base::RepeatingClosure callback, int title_id);
// Get the underlying `SystemNotificationBuilder` to do modifications beyond // Get the underlying `SystemNotificationBuilder` to do modifications beyond
// what this wrapper allows you to do. If you change the ID of the message // what this wrapper allows you to do. If you change the ID of the message
// `Show()` and `Hide()` are not going to work reliably. // `Show()` and `Hide()` are not going to work reliably.
@@ -109,12 +120,18 @@ class ASH_EXPORT PrivacyHubNotification {
// `sensors_for_apps_`. // `sensors_for_apps_`.
void SetNotificationMessage(); void SetNotificationMessage();
// Create an object of optional data fields with the defaults applying to
// every Privacy Hub notification.
message_center::RichNotificationData MakeOptionalFields() const;
std::string id_; std::string id_;
SystemNotificationBuilder builder_; SystemNotificationBuilder builder_;
MessageIds message_ids_; MessageIds message_ids_;
SensorSet sensors_for_apps_; SensorSet sensors_for_apps_;
absl::optional<base::Time> last_time_shown_; absl::optional<base::Time> last_time_shown_;
base::OneShotTimer remove_timer_; base::OneShotTimer remove_timer_;
scoped_refptr<PrivacyHubNotificationClickDelegate> delegate_;
std::u16string button_text_;
}; };
} // namespace ash } // namespace ash

@@ -88,6 +88,11 @@ PrivacyHubNotificationController::PrivacyHubNotificationController() {
SensorDisabledNotificationDelegate::Sensor::kMicrophone}, SensorDisabledNotificationDelegate::Sensor::kMicrophone},
combined_delegate, NotificationCatalogName::kPrivacyHubMicAndCamera, combined_delegate, NotificationCatalogName::kPrivacyHubMicAndCamera,
IDS_PRIVACY_HUB_MICROPHONE_AND_CAMERA_OFF_NOTIFICATION_BUTTON); IDS_PRIVACY_HUB_MICROPHONE_AND_CAMERA_OFF_NOTIFICATION_BUTTON);
combined_notification_->SetSecondButton(
base::BindRepeating(
&PrivacyHubNotificationController::OpenPrivacyHubSettingsPage),
IDS_PRIVACY_HUB_OPEN_SETTINGS_PAGE_BUTTON);
} }
PrivacyHubNotificationController::~PrivacyHubNotificationController() = default; PrivacyHubNotificationController::~PrivacyHubNotificationController() = default;

@@ -113,10 +113,10 @@ class PrivacyHubNotificationControllerTest : public AshTestBase {
return nullptr; return nullptr;
} }
void ClickOnNotificationButton() const { void ClickOnNotificationButton(int button_index = 0) const {
message_center::MessageCenter::Get()->ClickOnNotificationButton( message_center::MessageCenter::Get()->ClickOnNotificationButton(
PrivacyHubNotificationController::kCombinedNotificationId, PrivacyHubNotificationController::kCombinedNotificationId,
/*button_index=*/0); button_index);
} }
void ClickOnNotificationBody() const { void ClickOnNotificationBody() const {
@@ -259,19 +259,8 @@ TEST_F(PrivacyHubNotificationControllerTest,
EXPECT_FALSE( EXPECT_FALSE(
GetNotification(MicrophonePrivacySwitchController::kNotificationId)); GetNotification(MicrophonePrivacySwitchController::kNotificationId));
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 0);
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
0);
ClickOnNotificationBody(); ClickOnNotificationBody();
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
1);
ExpectNoNotificationActive(); ExpectNoNotificationActive();
// Go to (quick)settings and enable microphone. // Go to (quick)settings and enable microphone.
@@ -330,12 +319,35 @@ TEST_F(PrivacyHubNotificationControllerTest, ClickOnNotificationButton) {
1); 1);
} }
TEST_F(PrivacyHubNotificationControllerTest, ClickOnSecondNotificationButton) {
ExpectNoNotificationActive();
ShowCombinedNotification();
EXPECT_TRUE(GetNotification());
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
0);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 0);
ClickOnNotificationButton(1);
WaitUntilNotificationRemoved(kPrivacyHubCameraOffNotificationId);
ExpectNoNotificationActive();
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
1);
}
TEST_F(PrivacyHubNotificationControllerTest, ClickOnNotificationBody) { TEST_F(PrivacyHubNotificationControllerTest, ClickOnNotificationBody) {
ExpectNoNotificationActive(); ExpectNoNotificationActive();
ShowCombinedNotification(); ShowCombinedNotification();
EXPECT_TRUE(GetNotification()); EXPECT_TRUE(GetNotification());
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 0);
EXPECT_EQ(histogram_tester().GetBucketCount( EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram, privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification), privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
@@ -346,11 +358,6 @@ TEST_F(PrivacyHubNotificationControllerTest, ClickOnNotificationBody) {
WaitUntilNotificationRemoved(kPrivacyHubCameraOffNotificationId); WaitUntilNotificationRemoved(kPrivacyHubCameraOffNotificationId);
ExpectNoNotificationActive(); ExpectNoNotificationActive();
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(histogram_tester().GetBucketCount(
privacy_hub_metrics::kPrivacyHubOpenedHistogram,
privacy_hub_metrics::PrivacyHubNavigationOrigin::kNotification),
1);
} }
TEST_F(PrivacyHubNotificationControllerTest, OpenPrivacyHubSettingsPage) { TEST_F(PrivacyHubNotificationControllerTest, OpenPrivacyHubSettingsPage) {

@@ -4,7 +4,6 @@
#include "ash/system/privacy_hub/privacy_hub_notification.h" #include "ash/system/privacy_hub/privacy_hub_notification.h"
#include "ash/public/cpp/test/test_system_tray_client.h"
#include "ash/strings/grit/ash_strings.h" #include "ash/strings/grit/ash_strings.h"
#include "ash/test/ash_test_base.h" #include "ash/test/ash_test_base.h"
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
@@ -146,20 +145,16 @@ TEST_F(PrivacyHubNotificationClickDelegateTest, Click) {
base::BindLambdaForTesting( base::BindLambdaForTesting(
[&button_clicked]() { button_clicked++; })); [&button_clicked]() { button_clicked++; }));
ASSERT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 0); // Clicking the message while no callback for it is added shouldn't result in
// a callback being executed.
// Without callback only Privacy Hub should be opened when clicking on the
// message.
delegate->Click(absl::nullopt, absl::nullopt); delegate->Click(absl::nullopt, absl::nullopt);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(button_clicked, 0u); EXPECT_EQ(button_clicked, 0u);
EXPECT_EQ(message_clicked, 0u); EXPECT_EQ(message_clicked, 0u);
// Click the button. // Click the button.
delegate->Click(0, absl::nullopt); delegate->Click(0, absl::nullopt);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(button_clicked, 1u); EXPECT_EQ(button_clicked, 1u);
EXPECT_EQ(message_clicked, 0u); EXPECT_EQ(message_clicked, 0u);
@@ -170,19 +165,39 @@ TEST_F(PrivacyHubNotificationClickDelegateTest, Click) {
// When clicking the button, only the button callback should be executed. // When clicking the button, only the button callback should be executed.
delegate->Click(0, absl::nullopt); delegate->Click(0, absl::nullopt);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 1);
EXPECT_EQ(button_clicked, 2u); EXPECT_EQ(button_clicked, 2u);
EXPECT_EQ(message_clicked, 0u); EXPECT_EQ(message_clicked, 0u);
// Clicking the message should open Privacy Hub and execute the message // Clicking the message should execute the message callback.
// callback.
delegate->Click(absl::nullopt, absl::nullopt); delegate->Click(absl::nullopt, absl::nullopt);
EXPECT_EQ(GetSystemTrayClient()->show_os_settings_privacy_hub_count(), 2);
EXPECT_EQ(button_clicked, 2u); EXPECT_EQ(button_clicked, 2u);
EXPECT_EQ(message_clicked, 1u); EXPECT_EQ(message_clicked, 1u);
} }
TEST(PrivacyHubNotificationClickDelegateDeathTest, AddButton) {
scoped_refptr<PrivacyHubNotificationClickDelegate> delegate =
base::MakeRefCounted<PrivacyHubNotificationClickDelegate>(
base::DoNothing());
if (DCHECK_IS_ON()) {
EXPECT_DEATH(
delegate->Click(1, absl::nullopt),
"Check failed: !button_callbacks_\\[button_index\\]\\.is_null\\(\\). "
"button_index=1");
}
}
// TODO(b/271280503): Reenable when the failing builder is fixed.
TEST(PrivacyHubNotificationClickDelegateDeathTest, DISABLED_AddButton2) {
scoped_refptr<PrivacyHubNotificationClickDelegate> delegate =
base::MakeRefCounted<PrivacyHubNotificationClickDelegate>(
base::DoNothing());
EXPECT_DEATH(delegate->Click(2, absl::nullopt),
"Check failed: button_callbacks_.size\\(\\) > button_index \\(2 "
"vs. 2\\)");
}
TEST_F(PrivacyHubNotificationTest, ShowAndHide) { TEST_F(PrivacyHubNotificationTest, ShowAndHide) {
EXPECT_FALSE(GetNotification()); EXPECT_FALSE(GetNotification());
@@ -253,6 +268,26 @@ TEST_F(PrivacyHubNotificationTest, UpdateNotification) {
EXPECT_FALSE(GetPopupNotification()); EXPECT_FALSE(GetPopupNotification());
} }
TEST_F(PrivacyHubNotificationTest, AddButton) {
notification().Show();
EXPECT_EQ(GetNotification()->rich_notification_data().buttons.size(), 1u);
int second_button_clicked = 0;
notification().SetSecondButton(
base::BindLambdaForTesting(
[&second_button_clicked]() { second_button_clicked++; }),
IDS_PRIVACY_HUB_OPEN_SETTINGS_PAGE_BUTTON);
notification().Update();
message_center::Notification* test_notification = GetNotification();
ASSERT_EQ(test_notification->rich_notification_data().buttons.size(), 2u);
EXPECT_EQ(second_button_clicked, 0);
test_notification->delegate()->Click(1, absl::nullopt);
EXPECT_EQ(second_button_clicked, 1);
}
TEST_F(PrivacyHubNotificationTest, WithApps) { TEST_F(PrivacyHubNotificationTest, WithApps) {
// No apps -> generic notification text. // No apps -> generic notification text.
notification().Show(); notification().Show();