birch: Add privacy nudge encouraging opening the context menu
The nudge encourages the user to open the context menu on a suggestion chip, which will allow the user to control which data types are used for suggestions. The nudge shows a maximum of 3 times, with a 24 hour interview between shows. I put the nudge logic in a small controller class as BirchBarView has a lot of existing logic. Bug: 353354153 Test: added to ash_unittests Change-Id: I82d7be9a9bca298468f9e32c7836d7087f763688 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5714776 Auto-Submit: James Cook <jamescook@chromium.org> Reviewed-by: Michele Fan <michelefan@chromium.org> Commit-Queue: Michele Fan <michelefan@chromium.org> Reviewed-by: Alex Newcomer <newcomer@chromium.org> Reviewed-by: Matthew Mourgos <mmourgos@chromium.org> Commit-Queue: James Cook <jamescook@chromium.org> Cr-Commit-Position: refs/heads/main@{#1329135}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
d7a4f9e76f
commit
fc8eae28b4
ash
tools/metrics/histograms/metadata/ash
@@ -2900,6 +2900,8 @@ component("ash") {
|
|||||||
"wm/overview/birch/birch_chip_context_menu_model.h",
|
"wm/overview/birch/birch_chip_context_menu_model.h",
|
||||||
"wm/overview/birch/birch_chip_loader_view.cc",
|
"wm/overview/birch/birch_chip_loader_view.cc",
|
||||||
"wm/overview/birch/birch_chip_loader_view.h",
|
"wm/overview/birch/birch_chip_loader_view.h",
|
||||||
|
"wm/overview/birch/birch_privacy_nudge_controller.cc",
|
||||||
|
"wm/overview/birch/birch_privacy_nudge_controller.h",
|
||||||
"wm/overview/cleanup_animation_observer.cc",
|
"wm/overview/cleanup_animation_observer.cc",
|
||||||
"wm/overview/cleanup_animation_observer.h",
|
"wm/overview/cleanup_animation_observer.h",
|
||||||
"wm/overview/delayed_animation_observer.h",
|
"wm/overview/delayed_animation_observer.h",
|
||||||
@@ -4318,6 +4320,7 @@ test("ash_unittests") {
|
|||||||
"wm/overlay_layout_manager_unittest.cc",
|
"wm/overlay_layout_manager_unittest.cc",
|
||||||
"wm/overview/birch/birch_bar_context_menu_model_unittest.cc",
|
"wm/overview/birch/birch_bar_context_menu_model_unittest.cc",
|
||||||
"wm/overview/birch/birch_bar_unittest.cc",
|
"wm/overview/birch/birch_bar_unittest.cc",
|
||||||
|
"wm/overview/birch/birch_privacy_nudge_controller_unittest.cc",
|
||||||
"wm/overview/cleanup_animation_observer_unittest.cc",
|
"wm/overview/cleanup_animation_observer_unittest.cc",
|
||||||
"wm/overview/delayed_animation_observer_impl_unittest.cc",
|
"wm/overview/delayed_animation_observer_impl_unittest.cc",
|
||||||
"wm/overview/overview_controller_unittest.cc",
|
"wm/overview/overview_controller_unittest.cc",
|
||||||
|
@@ -92,6 +92,7 @@
|
|||||||
#include "ash/wm/float/tablet_mode_tuck_education.h"
|
#include "ash/wm/float/tablet_mode_tuck_education.h"
|
||||||
#include "ash/wm/lock_state_controller.h"
|
#include "ash/wm/lock_state_controller.h"
|
||||||
#include "ash/wm/overview/birch/birch_bar_controller.h"
|
#include "ash/wm/overview/birch/birch_bar_controller.h"
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
#include "ash/wm/window_cycle/window_cycle_controller.h"
|
#include "ash/wm/window_cycle/window_cycle_controller.h"
|
||||||
#include "ash/wm/window_util.h"
|
#include "ash/wm/window_util.h"
|
||||||
#include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
|
#include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
|
||||||
@@ -124,6 +125,7 @@ void RegisterProfilePrefs(PrefRegistrySimple* registry,
|
|||||||
BirchBarController::RegisterProfilePrefs(registry);
|
BirchBarController::RegisterProfilePrefs(registry);
|
||||||
BirchItem::RegisterProfilePrefs(registry);
|
BirchItem::RegisterProfilePrefs(registry);
|
||||||
BirchModel::RegisterProfilePrefs(registry);
|
BirchModel::RegisterProfilePrefs(registry);
|
||||||
|
BirchPrivacyNudgeController::RegisterProfilePrefs(registry);
|
||||||
CalendarController::RegisterProfilePrefs(registry);
|
CalendarController::RegisterProfilePrefs(registry);
|
||||||
camera_app_prefs::RegisterProfilePrefs(registry);
|
camera_app_prefs::RegisterProfilePrefs(registry);
|
||||||
CameraEffectsController::RegisterProfilePrefs(registry);
|
CameraEffectsController::RegisterProfilePrefs(registry);
|
||||||
|
@@ -2342,6 +2342,18 @@ inline constexpr char kGameDashboardShowToolbar[] =
|
|||||||
static constexpr char kSoftwareScanningEnabled[] =
|
static constexpr char kSoftwareScanningEnabled[] =
|
||||||
"ash.nearby.software_scanning_enabled";
|
"ash.nearby.software_scanning_enabled";
|
||||||
|
|
||||||
|
// A boolean pref that tracks whether the Birch context menu has been shown.
|
||||||
|
inline constexpr char kBirchContextMenuShown[] = "ash.birch.context_menu_shown";
|
||||||
|
|
||||||
|
// An integer pref that tracks the number of times the Birch privacy nudge has
|
||||||
|
// been shown.
|
||||||
|
inline constexpr char kBirchPrivacyNudgeShownCount[] =
|
||||||
|
"ash.birch.privacy_nudge_shown_count";
|
||||||
|
|
||||||
|
// A time pref that stores the time the Birch privacy nudge was last shown.
|
||||||
|
inline constexpr char kBirchPrivacyNudgeLastShownTime[] =
|
||||||
|
"ash.birch.privacy_nudge_last_shown";
|
||||||
|
|
||||||
// A boolean pref indicating whether to show Birch suggestions in Overview mode.
|
// A boolean pref indicating whether to show Birch suggestions in Overview mode.
|
||||||
inline constexpr char kBirchShowSuggestions[] = "ash.birch.show_suggestions";
|
inline constexpr char kBirchShowSuggestions[] = "ash.birch.show_suggestions";
|
||||||
|
|
||||||
|
@@ -246,7 +246,8 @@ enum class NudgeCatalogName {
|
|||||||
kSixPackRemappingPressed = 32,
|
kSixPackRemappingPressed = 32,
|
||||||
kCapsLockShortcutPressed = 33,
|
kCapsLockShortcutPressed = 33,
|
||||||
kMahi = 34,
|
kMahi = 34,
|
||||||
kMaxValue = kMahi
|
kBirchPrivacy = 35,
|
||||||
|
kMaxValue = kBirchPrivacy
|
||||||
};
|
};
|
||||||
|
|
||||||
// A living catalog that registers toasts.
|
// A living catalog that registers toasts.
|
||||||
|
@@ -63,6 +63,7 @@
|
|||||||
#include "ash/wm/overview/birch/birch_bar_context_menu_model.h"
|
#include "ash/wm/overview/birch/birch_bar_context_menu_model.h"
|
||||||
#include "ash/wm/overview/birch/birch_bar_controller.h"
|
#include "ash/wm/overview/birch/birch_bar_controller.h"
|
||||||
#include "ash/wm/overview/birch/birch_bar_menu_model_adapter.h"
|
#include "ash/wm/overview/birch/birch_bar_menu_model_adapter.h"
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
#include "ash/wm/overview/overview_controller.h"
|
#include "ash/wm/overview/overview_controller.h"
|
||||||
#include "ash/wm/overview/overview_session.h"
|
#include "ash/wm/overview/overview_session.h"
|
||||||
#include "ash/wm/root_window_layout_manager.h"
|
#include "ash/wm/root_window_layout_manager.h"
|
||||||
@@ -845,6 +846,7 @@ void RootWindowController::ShowContextMenu(const gfx::Point& location_in_screen,
|
|||||||
OverviewController::Get()->InOverviewSession() &&
|
OverviewController::Get()->InOverviewSession() &&
|
||||||
!split_view_overview_session_) {
|
!split_view_overview_session_) {
|
||||||
root_window_menu_model_adapter_ = BuildBirchMenuModelAdapter(source_type);
|
root_window_menu_model_adapter_ = BuildBirchMenuModelAdapter(source_type);
|
||||||
|
BirchPrivacyNudgeController::DidShowContextMenu();
|
||||||
} else {
|
} else {
|
||||||
root_window_menu_model_adapter_ = BuildShelfMenuModelAdapter(source_type);
|
root_window_menu_model_adapter_ = BuildShelfMenuModelAdapter(source_type);
|
||||||
}
|
}
|
||||||
|
@@ -219,6 +219,7 @@
|
|||||||
#include "ash/wm/multi_display/multi_display_metrics_controller.h"
|
#include "ash/wm/multi_display/multi_display_metrics_controller.h"
|
||||||
#include "ash/wm/multi_display/persistent_window_controller.h"
|
#include "ash/wm/multi_display/persistent_window_controller.h"
|
||||||
#include "ash/wm/native_cursor_manager_ash.h"
|
#include "ash/wm/native_cursor_manager_ash.h"
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
#include "ash/wm/overview/overview_controller.h"
|
#include "ash/wm/overview/overview_controller.h"
|
||||||
#include "ash/wm/pip/pip_controller.h"
|
#include "ash/wm/pip/pip_controller.h"
|
||||||
#include "ash/wm/raster_scale/raster_scale_controller.h"
|
#include "ash/wm/raster_scale/raster_scale_controller.h"
|
||||||
@@ -833,6 +834,7 @@ Shell::~Shell() {
|
|||||||
shelf_controller_->Shutdown();
|
shelf_controller_->Shutdown();
|
||||||
shelf_config_->Shutdown();
|
shelf_config_->Shutdown();
|
||||||
|
|
||||||
|
birch_privacy_nudge_controller_.reset();
|
||||||
birch_model_.reset();
|
birch_model_.reset();
|
||||||
|
|
||||||
// Depends on `app_list_controller_` and `tablet_mode_controller_`.
|
// Depends on `app_list_controller_` and `tablet_mode_controller_`.
|
||||||
@@ -1609,6 +1611,8 @@ void Shell::Init(
|
|||||||
|
|
||||||
if (features::IsForestFeatureEnabled()) {
|
if (features::IsForestFeatureEnabled()) {
|
||||||
birch_model_ = std::make_unique<BirchModel>();
|
birch_model_ = std::make_unique<BirchModel>();
|
||||||
|
birch_privacy_nudge_controller_ =
|
||||||
|
std::make_unique<BirchPrivacyNudgeController>();
|
||||||
}
|
}
|
||||||
|
|
||||||
autoclick_controller_ = std::make_unique<AutoclickController>();
|
autoclick_controller_ = std::make_unique<AutoclickController>();
|
||||||
|
@@ -122,6 +122,7 @@ class BackGestureEventHandler;
|
|||||||
class BacklightsForcedOffSetter;
|
class BacklightsForcedOffSetter;
|
||||||
class BatterySaverController;
|
class BatterySaverController;
|
||||||
class BirchModel;
|
class BirchModel;
|
||||||
|
class BirchPrivacyNudgeController;
|
||||||
class BluetoothDeviceStatusUiHandler;
|
class BluetoothDeviceStatusUiHandler;
|
||||||
class BluetoothNotificationController;
|
class BluetoothNotificationController;
|
||||||
class BluetoothStateCache;
|
class BluetoothStateCache;
|
||||||
@@ -462,6 +463,9 @@ class ASH_EXPORT Shell : public SessionObserver,
|
|||||||
return battery_saver_controller_.get();
|
return battery_saver_controller_.get();
|
||||||
}
|
}
|
||||||
BirchModel* birch_model() { return birch_model_.get(); }
|
BirchModel* birch_model() { return birch_model_.get(); }
|
||||||
|
BirchPrivacyNudgeController* birch_privacy_nudge_controller() {
|
||||||
|
return birch_privacy_nudge_controller_.get();
|
||||||
|
}
|
||||||
BluetoothStateCache* bluetooth_state_cache() {
|
BluetoothStateCache* bluetooth_state_cache() {
|
||||||
return bluetooth_state_cache_.get();
|
return bluetooth_state_cache_.get();
|
||||||
}
|
}
|
||||||
@@ -1031,6 +1035,7 @@ class ASH_EXPORT Shell : public SessionObserver,
|
|||||||
std::unique_ptr<AutozoomControllerImpl> autozoom_controller_;
|
std::unique_ptr<AutozoomControllerImpl> autozoom_controller_;
|
||||||
std::unique_ptr<BacklightsForcedOffSetter> backlights_forced_off_setter_;
|
std::unique_ptr<BacklightsForcedOffSetter> backlights_forced_off_setter_;
|
||||||
std::unique_ptr<BirchModel> birch_model_;
|
std::unique_ptr<BirchModel> birch_model_;
|
||||||
|
std::unique_ptr<BirchPrivacyNudgeController> birch_privacy_nudge_controller_;
|
||||||
std::unique_ptr<BrightnessControlDelegate> brightness_control_delegate_;
|
std::unique_ptr<BrightnessControlDelegate> brightness_control_delegate_;
|
||||||
std::unique_ptr<CalendarController> calendar_controller_;
|
std::unique_ptr<CalendarController> calendar_controller_;
|
||||||
std::unique_ptr<CameraEffectsController> camera_effects_controller_;
|
std::unique_ptr<CameraEffectsController> camera_effects_controller_;
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "ash/wm/overview/birch/birch_bar_menu_model_adapter.h"
|
#include "ash/wm/overview/birch/birch_bar_menu_model_adapter.h"
|
||||||
#include "ash/wm/overview/birch/birch_bar_view.h"
|
#include "ash/wm/overview/birch/birch_bar_view.h"
|
||||||
#include "ash/wm/overview/birch/birch_chip_context_menu_model.h"
|
#include "ash/wm/overview/birch/birch_chip_context_menu_model.h"
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
#include "ash/wm/overview/overview_grid.h"
|
#include "ash/wm/overview/overview_grid.h"
|
||||||
#include "ash/wm/overview/overview_session.h"
|
#include "ash/wm/overview/overview_session.h"
|
||||||
#include "ash/wm/overview/overview_utils.h"
|
#include "ash/wm/overview/overview_utils.h"
|
||||||
@@ -152,6 +153,7 @@ void BirchBarController::ShowChipContextMenu(BirchChipButton* chip,
|
|||||||
weak_ptr_factory_.GetWeakPtr()),
|
weak_ptr_factory_.GetWeakPtr()),
|
||||||
Shell::Get()->IsInTabletMode());
|
Shell::Get()->IsInTabletMode());
|
||||||
chip_menu_model_adapter_->set_close_menu_on_customizing_suggestions(true);
|
chip_menu_model_adapter_->set_close_menu_on_customizing_suggestions(true);
|
||||||
|
BirchPrivacyNudgeController::DidShowContextMenu();
|
||||||
chip_menu_model_adapter_->Run(gfx::Rect(point, gfx::Size()),
|
chip_menu_model_adapter_->Run(gfx::Rect(point, gfx::Size()),
|
||||||
views::MenuAnchorPosition::kBubbleTopRight,
|
views::MenuAnchorPosition::kBubbleTopRight,
|
||||||
views::MenuRunner::CONTEXT_MENU |
|
views::MenuRunner::CONTEXT_MENU |
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
#include "ash/public/cpp/window_properties.h"
|
#include "ash/public/cpp/window_properties.h"
|
||||||
#include "ash/root_window_settings.h"
|
#include "ash/root_window_settings.h"
|
||||||
#include "ash/shelf/shelf.h"
|
#include "ash/shelf/shelf.h"
|
||||||
|
#include "ash/shell.h"
|
||||||
#include "ash/wm/overview/birch/birch_chip_loader_view.h"
|
#include "ash/wm/overview/birch/birch_chip_loader_view.h"
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
#include "ash/wm/window_properties.h"
|
#include "ash/wm/window_properties.h"
|
||||||
#include "base/containers/contains.h"
|
#include "base/containers/contains.h"
|
||||||
#include "base/containers/fixed_flat_set.h"
|
#include "base/containers/fixed_flat_set.h"
|
||||||
@@ -595,9 +597,23 @@ void BirchBarView::OnFadeOutAborted() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void BirchBarView::OnSetupEnded() {
|
void BirchBarView::OnSetupEnded() {
|
||||||
|
if (state_ == State::kLoading ||
|
||||||
|
state_ == State::kLoadingForInformedRestore) {
|
||||||
|
// Loading is finished, so possibly show a privacy nudge.
|
||||||
|
MaybeShowPrivacyNudge();
|
||||||
|
}
|
||||||
SetState(State::kNormal);
|
SetState(State::kNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BirchBarView::MaybeShowPrivacyNudge() {
|
||||||
|
if (chips_.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// The nudge is anchored on the first suggestion chip.
|
||||||
|
views::View* anchor_view = chips_[0];
|
||||||
|
Shell::Get()->birch_privacy_nudge_controller()->MaybeShowNudge(anchor_view);
|
||||||
|
}
|
||||||
|
|
||||||
BEGIN_METADATA(BirchBarView)
|
BEGIN_METADATA(BirchBarView)
|
||||||
END_METADATA
|
END_METADATA
|
||||||
|
|
||||||
|
@@ -163,6 +163,10 @@ class ASH_EXPORT BirchBarView : public views::BoxLayoutView {
|
|||||||
// Called after chips fading-out animations are done during shutting down.
|
// Called after chips fading-out animations are done during shutting down.
|
||||||
void OnShutdownEnded();
|
void OnShutdownEnded();
|
||||||
|
|
||||||
|
// Possibly show the privacy nudge about context menu options for
|
||||||
|
// controlling suggestion types.
|
||||||
|
void MaybeShowPrivacyNudge();
|
||||||
|
|
||||||
// Cached chip size.
|
// Cached chip size.
|
||||||
const gfx::Size chip_size_;
|
const gfx::Size chip_size_;
|
||||||
|
|
||||||
|
90
ash/wm/overview/birch/birch_privacy_nudge_controller.cc
Normal file
90
ash/wm/overview/birch/birch_privacy_nudge_controller.cc
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
// Copyright 2024 The Chromium Authors
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
|
|
||||||
|
#include "ash/constants/ash_pref_names.h"
|
||||||
|
#include "ash/constants/ash_switches.h"
|
||||||
|
#include "ash/constants/notifier_catalogs.h"
|
||||||
|
#include "ash/public/cpp/system/anchored_nudge_data.h"
|
||||||
|
#include "ash/shell.h"
|
||||||
|
#include "ash/system/toast/anchored_nudge_manager_impl.h"
|
||||||
|
#include "base/command_line.h"
|
||||||
|
#include "components/pref_registry/pref_registry_syncable.h"
|
||||||
|
#include "components/prefs/pref_registry_simple.h"
|
||||||
|
#include "components/prefs/pref_service.h"
|
||||||
|
|
||||||
|
namespace ash {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// Maximum number of times to show the nudge.
|
||||||
|
constexpr int kMaxShownCount = 3;
|
||||||
|
|
||||||
|
// Minimum time between shows.
|
||||||
|
constexpr base::TimeDelta kTimeBetweenShown = base::Hours(24);
|
||||||
|
|
||||||
|
PrefService* GetPrefService() {
|
||||||
|
return Shell::Get()->session_controller()->GetActivePrefService();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
BirchPrivacyNudgeController::BirchPrivacyNudgeController() = default;
|
||||||
|
|
||||||
|
BirchPrivacyNudgeController::~BirchPrivacyNudgeController() = default;
|
||||||
|
|
||||||
|
// static
|
||||||
|
void BirchPrivacyNudgeController::RegisterProfilePrefs(
|
||||||
|
PrefRegistrySimple* registry) {
|
||||||
|
registry->RegisterBooleanPref(prefs::kBirchContextMenuShown, false);
|
||||||
|
registry->RegisterIntegerPref(prefs::kBirchPrivacyNudgeShownCount, 0);
|
||||||
|
registry->RegisterTimePref(prefs::kBirchPrivacyNudgeLastShownTime,
|
||||||
|
base::Time());
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
void BirchPrivacyNudgeController::DidShowContextMenu() {
|
||||||
|
GetPrefService()->SetBoolean(prefs::kBirchContextMenuShown, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BirchPrivacyNudgeController::MaybeShowNudge(views::View* anchor_view) {
|
||||||
|
auto* prefs = GetPrefService();
|
||||||
|
|
||||||
|
// Don't show nudge if the user has already opened the context menu.
|
||||||
|
if (prefs->GetBoolean(prefs::kBirchContextMenuShown)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nudge has been shown three times. No need to educate anymore.
|
||||||
|
const int shown_count =
|
||||||
|
prefs->GetInteger(prefs::kBirchPrivacyNudgeShownCount);
|
||||||
|
if (shown_count >= kMaxShownCount) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't show nudge if it was shown within the last 24 hours.
|
||||||
|
const base::Time last_shown =
|
||||||
|
prefs->GetTime(prefs::kBirchPrivacyNudgeLastShownTime);
|
||||||
|
if (base::Time::Now() - last_shown < kTimeBetweenShown) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(b/353354153): Localize the string after UX writing provides final
|
||||||
|
// text.
|
||||||
|
AnchoredNudgeData nudge_data(
|
||||||
|
"BirchPrivacyId", NudgeCatalogName::kBirchPrivacy,
|
||||||
|
u"To customize suggestions, tap or press with two fingers (touchpad) or "
|
||||||
|
u"right-click (mouse) when hovering over a suggestion",
|
||||||
|
anchor_view);
|
||||||
|
nudge_data.arrow = views::BubbleBorder::BOTTOM_LEFT;
|
||||||
|
|
||||||
|
Shell::Get()->anchored_nudge_manager()->Show(nudge_data);
|
||||||
|
|
||||||
|
// Update nudge prefs.
|
||||||
|
prefs->SetInteger(prefs::kBirchPrivacyNudgeShownCount, shown_count + 1);
|
||||||
|
prefs->SetTime(prefs::kBirchPrivacyNudgeLastShownTime, base::Time::Now());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ash
|
42
ash/wm/overview/birch/birch_privacy_nudge_controller.h
Normal file
42
ash/wm/overview/birch/birch_privacy_nudge_controller.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Copyright 2024 The Chromium Authors
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ASH_WM_OVERVIEW_BIRCH_BIRCH_PRIVACY_NUDGE_CONTROLLER_H_
|
||||||
|
#define ASH_WM_OVERVIEW_BIRCH_BIRCH_PRIVACY_NUDGE_CONTROLLER_H_
|
||||||
|
|
||||||
|
#include "ash/ash_export.h"
|
||||||
|
|
||||||
|
class PrefRegistrySimple;
|
||||||
|
|
||||||
|
namespace views {
|
||||||
|
class View;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace ash {
|
||||||
|
|
||||||
|
// Controller for showing the privacy nudge for Birch suggestion chips. It
|
||||||
|
// encourages users to open the context menu to control suggestion data types.
|
||||||
|
class ASH_EXPORT BirchPrivacyNudgeController {
|
||||||
|
public:
|
||||||
|
BirchPrivacyNudgeController();
|
||||||
|
BirchPrivacyNudgeController(const BirchPrivacyNudgeController&) = delete;
|
||||||
|
BirchPrivacyNudgeController& operator=(const BirchPrivacyNudgeController&) =
|
||||||
|
delete;
|
||||||
|
~BirchPrivacyNudgeController();
|
||||||
|
|
||||||
|
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
|
||||||
|
|
||||||
|
// Records that the context menu was shown (and hence the nudge doesn't need
|
||||||
|
// to be shown any more).
|
||||||
|
static void DidShowContextMenu();
|
||||||
|
|
||||||
|
// Attempts to show the nudge. The nudge will show if it hasn't been shown in
|
||||||
|
// the past 24 hours, or if it has been shown less than three times. The
|
||||||
|
// nudge will be anchored to `anchor_view` if provided.
|
||||||
|
void MaybeShowNudge(views::View* anchor_view);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ash
|
||||||
|
|
||||||
|
#endif // ASH_WM_OVERVIEW_BIRCH_BIRCH_PRIVACY_NUDGE_CONTROLLER_H_
|
118
ash/wm/overview/birch/birch_privacy_nudge_controller_unittest.cc
Normal file
118
ash/wm/overview/birch/birch_privacy_nudge_controller_unittest.cc
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
// Copyright 2024 The Chromium Authors
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "ash/wm/overview/birch/birch_privacy_nudge_controller.h"
|
||||||
|
|
||||||
|
#include "ash/constants/ash_pref_names.h"
|
||||||
|
#include "ash/session/session_controller_impl.h"
|
||||||
|
#include "ash/shell.h"
|
||||||
|
#include "ash/system/toast/anchored_nudge_manager_impl.h"
|
||||||
|
#include "ash/test/ash_test_base.h"
|
||||||
|
#include "base/time/time.h"
|
||||||
|
#include "base/time/time_override.h"
|
||||||
|
#include "components/prefs/pref_service.h"
|
||||||
|
|
||||||
|
namespace ash {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
constexpr char kNudgeId[] = "BirchPrivacyId";
|
||||||
|
|
||||||
|
bool IsNudgeShown() {
|
||||||
|
return Shell::Get()->anchored_nudge_manager()->IsNudgeShown(kNudgeId);
|
||||||
|
}
|
||||||
|
|
||||||
|
class BirchPrivacyNudgeControllerTest : public AshTestBase {
|
||||||
|
public:
|
||||||
|
BirchPrivacyNudgeControllerTest()
|
||||||
|
: nudge_controller_(std::make_unique<BirchPrivacyNudgeController>()) {}
|
||||||
|
|
||||||
|
BirchPrivacyNudgeController* nudge_controller() {
|
||||||
|
return nudge_controller_.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
AnchoredNudgeManagerImpl* nudge_manager() {
|
||||||
|
return Shell::Get()->anchored_nudge_manager();
|
||||||
|
}
|
||||||
|
|
||||||
|
static base::Time GetTestTime() { return test_time_; }
|
||||||
|
static void SetTestTime(base::Time test_time) { test_time_ = test_time; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<BirchPrivacyNudgeController> nudge_controller_;
|
||||||
|
static base::Time test_time_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// static
|
||||||
|
base::Time BirchPrivacyNudgeControllerTest::test_time_;
|
||||||
|
|
||||||
|
// Tests that the nudge shows by default.
|
||||||
|
TEST_F(BirchPrivacyNudgeControllerTest, NudgeShows_ByDefault) {
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_TRUE(IsNudgeShown());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that the nudge does not show if the birch context menu has been
|
||||||
|
// opened.
|
||||||
|
TEST_F(BirchPrivacyNudgeControllerTest, NudgeDoesNotShow_WhenMenuWasOpened) {
|
||||||
|
BirchPrivacyNudgeController::DidShowContextMenu();
|
||||||
|
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that the nudge won't show if the time between shown threshold hasn't
|
||||||
|
// passed since it was last shown.
|
||||||
|
TEST_F(BirchPrivacyNudgeControllerTest, NudgeDoesNotShow_IfRecentlyShown) {
|
||||||
|
SetTestTime(base::Time::Now());
|
||||||
|
base::subtle::ScopedTimeClockOverrides clock_override(
|
||||||
|
/*time_override=*/&BirchPrivacyNudgeControllerTest::GetTestTime,
|
||||||
|
/*time_ticks_override=*/nullptr, /*thread_ticks_override=*/nullptr);
|
||||||
|
|
||||||
|
// Show the nudge once and close it.
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_TRUE(IsNudgeShown());
|
||||||
|
nudge_manager()->Cancel(kNudgeId);
|
||||||
|
|
||||||
|
// Attempt showing the nudge again immediately. It should not show.
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
|
||||||
|
// Attempt showing the nudge after some time but before its threshold time has
|
||||||
|
// fully passed. It should not show.
|
||||||
|
SetTestTime(GetTestTime() + base::Hours(23));
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
|
||||||
|
// Attempt showing the nudge after its "time between shown" threshold has
|
||||||
|
// passed. It should show.
|
||||||
|
SetTestTime(GetTestTime() + base::Hours(24));
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_TRUE(IsNudgeShown());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(BirchPrivacyNudgeControllerTest, NudgeDoesNotShow_IfMaxTimesShown) {
|
||||||
|
SetTestTime(base::Time::Now());
|
||||||
|
base::subtle::ScopedTimeClockOverrides clock_override(
|
||||||
|
/*time_override=*/&BirchPrivacyNudgeControllerTest::GetTestTime,
|
||||||
|
/*time_ticks_override=*/nullptr, /*thread_ticks_override=*/nullptr);
|
||||||
|
|
||||||
|
// Show the nudge its max number of times.
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_TRUE(IsNudgeShown());
|
||||||
|
nudge_manager()->Cancel(kNudgeId);
|
||||||
|
SetTestTime(GetTestTime() + base::Hours(24) + base::Minutes(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt showing the nudge once more. It should not show.
|
||||||
|
nudge_controller()->MaybeShowNudge(nullptr);
|
||||||
|
EXPECT_FALSE(IsNudgeShown());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace ash
|
@@ -1500,6 +1500,8 @@ ash/webui/personalization_app/mojom/personalization_app.mojom -->
|
|||||||
<int value="31" label="Search Plus Top Row Key Pressed Nudge"/>
|
<int value="31" label="Search Plus Top Row Key Pressed Nudge"/>
|
||||||
<int value="32" label="Six Pack Key Pressed Nudge"/>
|
<int value="32" label="Six Pack Key Pressed Nudge"/>
|
||||||
<int value="33" label="Switch Caps Lock Key Pressed Nudge"/>
|
<int value="33" label="Switch Caps Lock Key Pressed Nudge"/>
|
||||||
|
<int value="34" label="Help Me Read Nudge"/>
|
||||||
|
<int value="35" label="Birch Privacy Nudge"/>
|
||||||
</enum>
|
</enum>
|
||||||
|
|
||||||
<enum name="OnDeviceToServerSpeechRecognitionFallbackReason">
|
<enum name="OnDeviceToServerSpeechRecognitionFallbackReason">
|
||||||
|
Reference in New Issue
Block a user