[CrOS Hotspot] Add the 'Turn Wifi On' button to hotspot notification
A notification is displayed to the user when they turn on the hotspot while WiFi is enabled. This notification provides a button to the user to turn the WiFi on which will disable the hotspot as well. Screenshot: https://screenshot.googleplex.com/5zxNrqngmcez3dj Bug: b/269353987 Change-Id: Ic45e4d6687d47c15905859885dee698c0d1136d7 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4408388 Reviewed-by: Jason Zhang <jiajunz@google.com> Commit-Queue: Nikhil Nayunigari <nikhilcn@google.com> Cr-Commit-Position: refs/heads/main@{#1128234}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
e6be88bf31
commit
c8c9a42e75
@ -2581,6 +2581,9 @@ Connect your device to power.
|
||||
<message name="IDS_ASH_HOTSPOT_NOTIFICATION_TURN_ON_BUTTON" desc="The label used as the button to turn on hotspot.">
|
||||
Turn on hotspot
|
||||
</message>
|
||||
<message name="IDS_ASH_HOTSPOT_NOTIFICATION_WIFI_TURN_ON_BUTTON" desc="The label for button to turn WiFi on in the hotspot notification.">
|
||||
Turn on WiFi instead
|
||||
</message>
|
||||
<message name="IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE" desc="Message displayed in the system notification shown when WiFi is turned off upon enabling hotspot.">
|
||||
We've turned off the WiFi to start using Hotspot through Mobile data. This may incur data costs.
|
||||
</message>
|
||||
|
@ -0,0 +1 @@
|
||||
c702fbf5ed2c91d143dc713285e3c1440a8b9eda
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "ash/system/network/hotspot_notifier.h"
|
||||
#include "ash/public/cpp/hotspot_config_service.h"
|
||||
#include "ash/public/cpp/network_config_service.h"
|
||||
#include "ash/public/cpp/notification_utils.h"
|
||||
#include "ash/strings/grit/ash_strings.h"
|
||||
#include "ui/base/l10n/l10n_util.h"
|
||||
@ -35,18 +36,32 @@ HotspotNotifier::HotspotNotifier() {
|
||||
remote_cros_hotspot_config_.BindNewPipeAndPassReceiver());
|
||||
remote_cros_hotspot_config_->ObserveEnabledStateChanges(
|
||||
hotspot_enabled_state_observer_receiver_.BindNewPipeAndPassRemote());
|
||||
|
||||
GetNetworkConfigService(
|
||||
remote_cros_network_config_.BindNewPipeAndPassReceiver());
|
||||
remote_cros_network_config_->AddObserver(
|
||||
cros_network_config_observer_receiver_.BindNewPipeAndPassRemote());
|
||||
}
|
||||
|
||||
HotspotNotifier::~HotspotNotifier() = default;
|
||||
|
||||
void HotspotNotifier::OnHotspotTurnedOn(bool wifi_turned_off) {
|
||||
if (wifi_turned_off) {
|
||||
scoped_refptr<message_center::NotificationDelegate> delegate =
|
||||
base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
|
||||
base::BindRepeating(&HotspotNotifier::EnableWiFiHandler,
|
||||
weak_ptr_factory_.GetWeakPtr(),
|
||||
kWiFiTurnedOffNotificationId));
|
||||
|
||||
std::vector<message_center::ButtonInfo> notification_actions;
|
||||
std::unique_ptr<message_center::Notification> notification =
|
||||
CreateNotification(IDS_ASH_HOTSPOT_ON_TITLE,
|
||||
IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE,
|
||||
kWiFiTurnedOffNotificationId,
|
||||
/*delegate=*/nullptr);
|
||||
|
||||
kWiFiTurnedOffNotificationId, delegate);
|
||||
notification_actions.push_back(
|
||||
message_center::ButtonInfo(l10n_util::GetStringUTF16(
|
||||
IDS_ASH_HOTSPOT_NOTIFICATION_WIFI_TURN_ON_BUTTON)));
|
||||
notification->set_buttons(notification_actions);
|
||||
message_center::MessageCenter* message_center =
|
||||
message_center::MessageCenter::Get();
|
||||
message_center->RemoveNotification(kWiFiTurnedOffNotificationId,
|
||||
@ -139,6 +154,40 @@ void HotspotNotifier::EnableHotspotHandler(const char* notification_id,
|
||||
}
|
||||
}
|
||||
|
||||
void HotspotNotifier::EnableWiFiHandler(const char* notification_id,
|
||||
absl::optional<int> button_index) {
|
||||
if (!button_index) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (button_index.value() == 0) {
|
||||
remote_cros_network_config_->SetNetworkTypeEnabledState(
|
||||
chromeos::network_config::mojom::NetworkType::kWiFi, /*enabled=*/true,
|
||||
base::DoNothing());
|
||||
}
|
||||
}
|
||||
|
||||
void HotspotNotifier::OnDeviceStateListChanged() {
|
||||
remote_cros_network_config_->GetDeviceStateList(base::BindOnce(
|
||||
&HotspotNotifier::OnGetDeviceStateList, weak_ptr_factory_.GetWeakPtr()));
|
||||
}
|
||||
|
||||
void HotspotNotifier::OnGetDeviceStateList(
|
||||
std::vector<chromeos::network_config::mojom::DeviceStatePropertiesPtr>
|
||||
devices) {
|
||||
for (auto& device : devices) {
|
||||
if (device->type == chromeos::network_config::mojom::NetworkType::kWiFi &&
|
||||
device->device_state ==
|
||||
chromeos::network_config::mojom::DeviceStateType::kEnabled) {
|
||||
message_center::MessageCenter* message_center =
|
||||
message_center::MessageCenter::Get();
|
||||
message_center->RemoveNotification(kWiFiTurnedOffNotificationId,
|
||||
/*by_user=*/false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<message_center::Notification>
|
||||
HotspotNotifier::CreateNotification(
|
||||
const int title_id,
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h"
|
||||
#include "chromeos/services/network_config/public/cpp/cros_network_config_observer.h"
|
||||
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
|
||||
#include "mojo/public/cpp/bindings/receiver.h"
|
||||
#include "mojo/public/cpp/bindings/remote.h"
|
||||
#include "ui/message_center/message_center.h"
|
||||
@ -24,7 +25,8 @@ namespace ash {
|
||||
// - 4. In activity
|
||||
// - Hotspot is turned on and has 'n' active connections
|
||||
class ASH_EXPORT HotspotNotifier
|
||||
: public hotspot_config::mojom::HotspotEnabledStateObserver {
|
||||
: public hotspot_config::mojom::HotspotEnabledStateObserver,
|
||||
public chromeos::network_config::CrosNetworkConfigObserver {
|
||||
public:
|
||||
HotspotNotifier();
|
||||
HotspotNotifier(const HotspotNotifier&) = delete;
|
||||
@ -45,6 +47,13 @@ class ASH_EXPORT HotspotNotifier
|
||||
void OnHotspotTurnedOff(
|
||||
hotspot_config::mojom::DisableReason disable_reason) override;
|
||||
|
||||
// CrosNetworkConfigObserver:
|
||||
void OnDeviceStateListChanged() override;
|
||||
|
||||
void OnGetDeviceStateList(
|
||||
std::vector<chromeos::network_config::mojom::DeviceStatePropertiesPtr>
|
||||
devices);
|
||||
|
||||
std::unique_ptr<message_center::Notification> CreateNotification(
|
||||
const int title_id,
|
||||
const int message_id,
|
||||
@ -53,9 +62,15 @@ class ASH_EXPORT HotspotNotifier
|
||||
|
||||
void EnableHotspotHandler(const char* notification_id,
|
||||
absl::optional<int> index);
|
||||
void EnableWiFiHandler(const char* notification_id,
|
||||
absl::optional<int> index);
|
||||
|
||||
mojo::Remote<hotspot_config::mojom::CrosHotspotConfig>
|
||||
remote_cros_hotspot_config_;
|
||||
mojo::Remote<chromeos::network_config::mojom::CrosNetworkConfig>
|
||||
remote_cros_network_config_;
|
||||
mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver>
|
||||
cros_network_config_observer_receiver_{this};
|
||||
mojo::Receiver<hotspot_config::mojom::HotspotEnabledStateObserver>
|
||||
hotspot_enabled_state_observer_receiver_{this};
|
||||
|
||||
|
@ -11,8 +11,12 @@
|
||||
#include "chromeos/ash/components/network/hotspot_state_handler.h"
|
||||
#include "chromeos/ash/components/network/network_handler.h"
|
||||
#include "chromeos/ash/components/network/network_handler_test_helper.h"
|
||||
#include "chromeos/ash/components/network/network_state_test_helper.h"
|
||||
#include "chromeos/ash/services/hotspot_config/cros_hotspot_config.h"
|
||||
#include "chromeos/ash/services/hotspot_config/public/cpp/cros_hotspot_config_test_helper.h"
|
||||
#include "chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom.h"
|
||||
#include "chromeos/ash/services/network_config/public/cpp/cros_network_config_test_helper.h"
|
||||
#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
|
||||
|
||||
namespace ash {
|
||||
|
||||
@ -116,6 +120,8 @@ class HotspotNotifierTest : public NoSessionAshTestBase {
|
||||
cros_network_config_test_helper_;
|
||||
std::unique_ptr<hotspot_config::CrosHotspotConfigTestHelper>
|
||||
cros_hotspot_config_test_helper_;
|
||||
std::unique_ptr<HotspotNotifier> hotspot_notifier_;
|
||||
mojo::Remote<hotspot_config::mojom::CrosHotspotConfig> cros_hotspot_config_;
|
||||
};
|
||||
|
||||
TEST_F(HotspotNotifierTest, WiFiTurnedOff) {
|
||||
@ -129,6 +135,13 @@ TEST_F(HotspotNotifierTest, WiFiTurnedOff) {
|
||||
EnableHotspot();
|
||||
EXPECT_TRUE(message_center::MessageCenter::Get()->FindVisibleNotificationById(
|
||||
HotspotNotifier::kWiFiTurnedOffNotificationId));
|
||||
|
||||
message_center::MessageCenter::Get()->ClickOnNotificationButton(
|
||||
HotspotNotifier::kWiFiTurnedOffNotificationId, 0);
|
||||
base::RunLoop().RunUntilIdle();
|
||||
EXPECT_FALSE(
|
||||
message_center::MessageCenter::Get()->FindVisibleNotificationById(
|
||||
HotspotNotifier::kWiFiTurnedOffNotificationId));
|
||||
}
|
||||
|
||||
TEST_F(HotspotNotifierTest, AdminRestricted) {
|
||||
|
Reference in New Issue
Block a user