| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ash/system/gesture_education/gesture_education_notification_controller.h" |
| |
| #include "ash/public/cpp/ash_features.h" |
| #include "ash/public/cpp/ash_pref_names.h" |
| #include "ash/public/cpp/notification_utils.h" |
| #include "ash/public/cpp/shelf_config.h" |
| #include "ash/public/cpp/system_tray_client.h" |
| #include "ash/session/session_controller_impl.h" |
| #include "ash/shell.h" |
| #include "ash/strings/grit/ash_strings.h" |
| #include "ash/system/model/system_tray_model.h" |
| #include "components/prefs/pref_registry_simple.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/vector_icons/vector_icons.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/message_center/message_center.h" |
| #include "ui/message_center/public/cpp/notification.h" |
| |
| namespace ash { |
| |
| // static |
| const char GestureEducationNotificationController::kNotificationId[] = |
| "chrome://gesture_education"; |
| |
| GestureEducationNotificationController:: |
| GestureEducationNotificationController() { |
| Shell::Get()->session_controller()->AddObserver(this); |
| tablet_mode_observation_.Observe(Shell::Get()->tablet_mode_controller()); |
| } |
| |
| GestureEducationNotificationController:: |
| ~GestureEducationNotificationController() { |
| Shell::Get()->session_controller()->RemoveObserver(this); |
| tablet_mode_observation_.Reset(); |
| } |
| |
| void GestureEducationNotificationController::MaybeShowNotification() { |
| bool is_user_session_blocked = |
| Shell::Get()->session_controller()->IsUserSessionBlocked(); |
| if (features::IsHideShelfControlsInTabletModeEnabled() && |
| TabletModeController::Get()->InTabletMode() && !is_user_session_blocked && |
| (active_user_prefs_ && !active_user_prefs_->GetBoolean( |
| prefs::kGestureEducationNotificationShown)) && |
| !ShelfConfig::Get()->ShelfControlsForcedShownForAccessibility()) { |
| GenerateGestureEducationNotification(); |
| active_user_prefs_->SetBoolean(prefs::kGestureEducationNotificationShown, |
| true); |
| } |
| } |
| |
| void GestureEducationNotificationController::OnActiveUserPrefServiceChanged( |
| PrefService* prefs) { |
| active_user_prefs_ = prefs; |
| MaybeShowNotification(); |
| } |
| |
| void GestureEducationNotificationController::OnSessionStateChanged( |
| session_manager::SessionState state) { |
| MaybeShowNotification(); |
| } |
| |
| void GestureEducationNotificationController::OnTabletModeStarted() { |
| MaybeShowNotification(); |
| } |
| |
| void GestureEducationNotificationController::OnTabletControllerDestroyed() { |
| tablet_mode_observation_.Reset(); |
| } |
| |
| void GestureEducationNotificationController::RegisterProfilePrefs( |
| PrefRegistrySimple* registry, |
| bool for_test) { |
| // Some tests fail when the notification shows up. Use |for_test| |
| // as the default value so that it is true in test to suppress the |
| // notification there. |
| registry->RegisterBooleanPref(prefs::kGestureEducationNotificationShown, |
| for_test); |
| } |
| |
| void GestureEducationNotificationController:: |
| GenerateGestureEducationNotification() { |
| std::unique_ptr<message_center::Notification> notification = |
| CreateSystemNotification( |
| message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, |
| GetNotificationTitle(), GetNotificationMessage(), |
| std::u16string() /* display_source */, GURL(), |
| message_center::NotifierId( |
| message_center::NotifierType::SYSTEM_COMPONENT, kNotificationId), |
| message_center::RichNotificationData(), |
| base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( |
| base::BindRepeating(&GestureEducationNotificationController:: |
| HandleNotificationClick, |
| weak_ptr_factory_.GetWeakPtr())), |
| vector_icons::kSettingsIcon, |
| message_center::SystemNotificationWarningLevel::NORMAL); |
| |
| message_center::MessageCenter::Get()->AddNotification( |
| std::move(notification)); |
| } |
| |
| void GestureEducationNotificationController::HandleNotificationClick() { |
| Shell::Get()->system_tray_model()->client()->ShowGestureEducationHelp(); |
| } |
| |
| void GestureEducationNotificationController::ResetPrefForTest() { |
| if (active_user_prefs_) { |
| active_user_prefs_->SetBoolean(prefs::kGestureEducationNotificationShown, |
| false); |
| } |
| } |
| |
| std::u16string GestureEducationNotificationController::GetNotificationMessage() |
| const { |
| return l10n_util::GetStringUTF16(IDS_GESTURE_NOTIFICATION_MESSAGE_LEARN_MORE); |
| } |
| |
| std::u16string GestureEducationNotificationController::GetNotificationTitle() |
| const { |
| return l10n_util::GetStringUTF16(IDS_GESTURE_NOTIFICATION_TITLE); |
| } |
| |
| } // namespace ash |