| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ash/release_notes/release_notes_storage.h" |
| |
| #include "ash/constants/ash_features.h" |
| #include "base/command_line.h" |
| #include "base/version.h" |
| #include "chrome/browser/ash/profiles/profile_helper.h" |
| #include "chrome/browser/policy/profile_policy_connector.h" |
| #include "chrome/browser/profiles/chrome_version_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/channel_info.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| #include "chromeos/ash/components/login/login_state/login_state.h" |
| #include "components/prefs/pref_registry_simple.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/user_manager/user_manager.h" |
| #include "components/version_info/channel.h" |
| #include "components/version_info/version_info.h" |
| #include "content/public/common/content_switches.h" |
| #include "google_apis/gaia/gaia_auth_util.h" |
| |
| namespace { |
| |
| constexpr int kTimesToShowSuggestionChip = 3; |
| |
| int GetMilestone() { |
| return version_info::GetVersion().components()[0]; |
| } |
| |
| bool IsEligibleProfile(Profile* profile) { |
| // Do not show the notification for Ephemeral and Guest profiles. |
| if (ash::ProfileHelper::IsEphemeralUserProfile(profile)) |
| return false; |
| if (profile->IsGuestSession()) |
| return false; |
| |
| // Do not show the notification for managed profiles (e.g. Enterprise, |
| // Education), except for Googlers and Unicorn accounts. |
| |
| // Show the notification for Googlers. |
| if (gaia::IsGoogleInternalAccountEmail(profile->GetProfileUserName())) |
| return true; |
| |
| // Show the notification for Unicorn profiles. Education profiles are Regular |
| // profiles, so they will not pass this check. |
| if (profile->IsChild()) |
| return true; |
| |
| // After the above exceptions, do not show the notification for profiles |
| // managed by a policy. |
| if (profile->GetProfilePolicyConnector()->IsManaged()) |
| return false; |
| |
| // Otherwise, show the notification for Consumer profiles. |
| return ash::ProfileHelper::Get()->GetUserByProfile(profile)->HasGaiaAccount(); |
| } |
| |
| bool ShouldShowForCurrentChannel() { |
| return chrome::GetChannel() == version_info::Channel::STABLE || |
| base::FeatureList::IsEnabled( |
| ash::features::kReleaseNotesNotificationAllChannels); |
| } |
| |
| } // namespace |
| |
| namespace ash { |
| |
| // Called on every session startup. |
| void ReleaseNotesStorage::RegisterProfilePrefs(PrefRegistrySimple* registry) { |
| registry->RegisterIntegerPref( |
| prefs::kReleaseNotesSuggestionChipTimesLeftToShow, 0); |
| } |
| |
| ReleaseNotesStorage::ReleaseNotesStorage(Profile* profile) |
| : profile_(profile) {} |
| |
| ReleaseNotesStorage::~ReleaseNotesStorage() = default; |
| |
| bool ReleaseNotesStorage::ShouldNotify() { |
| // TODO(b/174514401): Make this server controlled. |
| if (base::FeatureList::IsEnabled( |
| ash::features::kReleaseNotesNotificationAlwaysEligible)) { |
| return true; |
| } |
| |
| if (!ShouldShowForCurrentChannel()) { |
| return false; |
| } |
| |
| if (!IsEligibleProfile(profile_)) |
| return false; |
| |
| int last_milestone = profile_->GetPrefs()->GetInteger( |
| prefs::kHelpAppNotificationLastShownMilestone); |
| if (profile_->GetPrefs() |
| ->FindPreference(prefs::kHelpAppNotificationLastShownMilestone) |
| ->IsDefaultValue()) { |
| // We don't know if the user has seen any notification before as we have |
| // never set which milestone was last seen. So use the version of chrome |
| // where the profile was created instead. |
| base::Version profile_version( |
| ChromeVersionService::GetVersion(profile_->GetPrefs())); |
| last_milestone = profile_version.components()[0]; |
| } |
| return last_milestone < kLastChromeVersionWithReleaseNotes; |
| } |
| |
| void ReleaseNotesStorage::MarkNotificationShown() { |
| profile_->GetPrefs()->SetInteger( |
| prefs::kHelpAppNotificationLastShownMilestone, GetMilestone()); |
| } |
| |
| void ReleaseNotesStorage::StartShowingSuggestionChip() { |
| profile_->GetPrefs()->SetInteger( |
| prefs::kReleaseNotesSuggestionChipTimesLeftToShow, |
| kTimesToShowSuggestionChip); |
| } |
| |
| bool ReleaseNotesStorage::ShouldShowSuggestionChip() { |
| const int times_left_to_show = profile_->GetPrefs()->GetInteger( |
| prefs::kReleaseNotesSuggestionChipTimesLeftToShow); |
| return times_left_to_show > 0; |
| } |
| |
| void ReleaseNotesStorage::DecreaseTimesLeftToShowSuggestionChip() { |
| const int times_left_to_show = profile_->GetPrefs()->GetInteger( |
| prefs::kReleaseNotesSuggestionChipTimesLeftToShow); |
| if (times_left_to_show == 0) |
| return; |
| profile_->GetPrefs()->SetInteger( |
| prefs::kReleaseNotesSuggestionChipTimesLeftToShow, |
| times_left_to_show - 1); |
| } |
| |
| void ReleaseNotesStorage::StopShowingSuggestionChip() { |
| profile_->GetPrefs()->SetInteger( |
| prefs::kReleaseNotesSuggestionChipTimesLeftToShow, 0); |
| } |
| |
| } // namespace ash |